From a22b7578bde5677cf06392cf3cfcfb66019b6373 Mon Sep 17 00:00:00 2001 From: JKlingen Date: Sun, 25 Jul 2010 08:48:59 +0000 Subject: [PATCH] moved all sources to trunk directory git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@693 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4 --- .../Greenshot-OCR-Plugin.csproj | 94 + Greenshot-OCR-Plugin/Language.cs | 47 + Greenshot-OCR-Plugin/LanguageKeys.cs | 29 + .../Languages/language_ocrplugin-de-DE.xml | 14 + .../Languages/language_ocrplugin-en-US.xml | 14 + .../Languages/language_ocrplugin-nl-NL.xml | 14 + Greenshot-OCR-Plugin/OCRPlugin.cs | 322 ++ .../Properties/AssemblyInfo.cs.template | 54 + Greenshot-OCR-Plugin/SettingsForm.Designer.cs | 138 + Greenshot-OCR-Plugin/SettingsForm.cs | 99 + Greenshot-OCR-Plugin/lib/GEN.BAT | 2 + Greenshot-OCR-Plugin/lib/MODI11.dll | Bin 0 -> 45056 bytes Greenshot-OCR-Plugin/lib/MODI12.dll | Bin 0 -> 45056 bytes .../lib/Office11/MDIVWCTL.DLL | Bin 0 -> 443904 bytes .../lib/Office12/MDIVWCTL.DLL | Bin 0 -> 524696 bytes Greenshot-RunAtOutput-Plugin/Configuration.cs | 66 + .../Greenshot-RunAtOutput-Plugin.csproj | 73 + .../Properties/AssemblyInfo.cs.template | 53 + Greenshot-RunAtOutput-Plugin/RunAtOutput.cs | 125 + .../SettingsForm.Designer.cs | 211 + Greenshot-RunAtOutput-Plugin/SettingsForm.cs | 98 + .../runatoutput.properties | 4 + Greenshot-TitleFix-Plugin/FixTitle.cs | 127 + .../Greenshot-TitleFix-Plugin.csproj | 66 + .../Properties/AssemblyInfo.cs.template | 54 + Greenshot/AssemblyInfo.cs | 51 + Greenshot/AssemblyInfo.cs.template | 51 + Greenshot/Configuration/AppConfig.cs | 320 ++ Greenshot/Configuration/Language.cs | 51 + Greenshot/Configuration/LanguageKeys.cs | 191 + Greenshot/Configuration/RuntimeConfig.cs | 37 + Greenshot/Controls/BindableToolStripButton.cs | 41 + .../Controls/BindableToolStripComboBox.cs | 44 + .../BindableToolStripDropDownButton.cs | 68 + Greenshot/Controls/ColorButton.cs | 82 + Greenshot/Controls/FontFamilyComboBox.cs | 62 + Greenshot/Controls/ToolStripColorButton.cs | 64 + Greenshot/Controls/ToolStripNumericUpDown.cs | 81 + Greenshot/Drawing/ArrowContainer.cs | 162 + Greenshot/Drawing/BitmapBuffer.cs | 322 ++ Greenshot/Drawing/BitmapContainer.cs | 109 + Greenshot/Drawing/CropContainer.cs | 57 + Greenshot/Drawing/CursorContainer.cs | 110 + Greenshot/Drawing/DrawableContainer.cs | 403 ++ Greenshot/Drawing/DrawableContainerList.cs | 255 ++ Greenshot/Drawing/EllipseContainer.cs | 92 + .../Drawing/Fields/AbstractFieldHolder.cs | 153 + .../Fields/AbstractFieldHolderWithChildren.cs | 126 + .../Binding/AbstractBindingConverter.cs | 47 + .../Fields/Binding/BidirectionalBinding.cs | 168 + .../DecimalDoublePercentageConverter.cs | 47 + .../Fields/Binding/DecimalFloatConverter.cs | 47 + .../Fields/Binding/DecimalIntConverter.cs | 47 + .../Fields/Binding/IBindingConverter.cs | 34 + .../Fields/Binding/IBindingValidator.cs | 35 + .../Fields/Binding/NotNullValidator.cs | 42 + Greenshot/Drawing/Fields/Field.cs | 122 + Greenshot/Drawing/Fields/FieldAggregator.cs | 186 + Greenshot/Drawing/Fields/FieldFactory.cs | 92 + Greenshot/Drawing/Fields/FieldType.cs | 117 + Greenshot/Drawing/Fields/IFieldHolder.cs | 53 + Greenshot/Drawing/FilterContainer.cs | 90 + Greenshot/Drawing/Filters/AbstractFilter.cs | 121 + Greenshot/Drawing/Filters/BlurFilter.cs | 241 + Greenshot/Drawing/Filters/BrightnessFilter.cs | 56 + Greenshot/Drawing/Filters/FastSmoothFilter.cs | 231 + Greenshot/Drawing/Filters/GrayscaleFilter.cs | 48 + Greenshot/Drawing/Filters/HighlightFilter.cs | 51 + Greenshot/Drawing/Filters/IFilter.cs | 37 + Greenshot/Drawing/Filters/MagnifierFilter.cs | 65 + .../Drawing/Filters/PixelizationFilter.cs | 82 + Greenshot/Drawing/HighlightContainer.cs | 83 + Greenshot/Drawing/HtmlContainer.cs | 124 + Greenshot/Drawing/IconContainer.cs | 108 + Greenshot/Drawing/LineContainer.cs | 107 + Greenshot/Drawing/MetafileContainer.cs | 123 + Greenshot/Drawing/ObfuscateContainer.cs | 70 + Greenshot/Drawing/RectangleContainer.cs | 90 + Greenshot/Drawing/RoundedRectangle.cs | 130 + Greenshot/Drawing/Surface.cs | 852 ++++ Greenshot/Drawing/TextContainer.cs | 300 ++ Greenshot/Drawing/UrlContainer.cs | 117 + Greenshot/Forms/AboutForm.Designer.cs | 255 ++ Greenshot/Forms/AboutForm.cs | 71 + Greenshot/Forms/AboutForm.resx | 503 ++ Greenshot/Forms/BugReportForm.Designer.cs | 118 + Greenshot/Forms/BugReportForm.cs | 70 + Greenshot/Forms/BugReportForm.resx | 386 ++ Greenshot/Forms/CaptureForm.Designer.cs | 84 + Greenshot/Forms/CaptureForm.cs | 826 ++++ Greenshot/Forms/ColorDialog.Designer.cs | 259 ++ Greenshot/Forms/ColorDialog.cs | 242 + Greenshot/Forms/ColorDialog.resx | 120 + Greenshot/Forms/ColorPickerToolStripButton.cs | 78 + Greenshot/Forms/FlashlightForm.Designer.cs | 71 + Greenshot/Forms/FlashlightForm.cs | 71 + Greenshot/Forms/ImageEditorForm.Designer.cs | 1592 +++++++ Greenshot/Forms/ImageEditorForm.cs | 909 ++++ Greenshot/Forms/ImageEditorForm.resx | 1112 +++++ Greenshot/Forms/JpegQualityDialog.Designer.cs | 135 + Greenshot/Forms/JpegQualityDialog.cs | 69 + Greenshot/Forms/JpegQualityDialog.resx | 379 ++ Greenshot/Forms/LanguageDialog.Designer.cs | 107 + Greenshot/Forms/LanguageDialog.cs | 69 + Greenshot/Forms/LanguageDialog.resx | 570 +++ Greenshot/Forms/MainForm.Designer.cs | 244 + Greenshot/Forms/MainForm.cs | 539 +++ Greenshot/Forms/MainForm.resx | 445 ++ .../Forms/PrintOptionsDialog.Designer.cs | 192 + Greenshot/Forms/PrintOptionsDialog.cs | 91 + Greenshot/Forms/PrintOptionsDialog.resx | 379 ++ Greenshot/Forms/SaveImageFileDialog.cs | 255 ++ Greenshot/Forms/SettingsForm.Designer.cs | 796 ++++ Greenshot/Forms/SettingsForm.cs | 316 ++ Greenshot/Forms/SettingsForm.resx | 382 ++ Greenshot/Forms/ToolStripMenuSelectList.cs | 220 + Greenshot/Greeenshot.zreproj | 13 + Greenshot/Greenshot.csproj | 297 ++ Greenshot/Greenshot.sln | 26 + Greenshot/Help/HelpBrowserForm.Designer.cs | 77 + Greenshot/Help/HelpBrowserForm.cs | 50 + Greenshot/Help/HelpBrowserForm.resx | 379 ++ Greenshot/Helpers/ClipboardHelper.cs | 246 + Greenshot/Helpers/Colors.cs | 55 + Greenshot/Helpers/CopyData.cs | 553 +++ Greenshot/Helpers/DrawingHelper.cs | 46 + Greenshot/Helpers/EnvironmentInfo.cs | 256 ++ Greenshot/Helpers/FilenameHelper.cs | 154 + Greenshot/Helpers/FormHelper.cs | 70 + Greenshot/Helpers/GuiRectangle.cs | 49 + Greenshot/Helpers/HotkeyHelper.cs | 87 + Greenshot/Helpers/HtmlFragment.cs | 262 ++ Greenshot/Helpers/ImageHelper.cs | 51 + Greenshot/Helpers/ImageOutput.cs | 220 + Greenshot/Helpers/Log4NET.cs | 19 + Greenshot/Helpers/LogHelper.cs | 30 + Greenshot/Helpers/MailHelper.cs | 787 ++++ Greenshot/Helpers/Objects.cs | 40 + Greenshot/Helpers/PluginHelper.cs | 276 ++ Greenshot/Helpers/PrintHelper.cs | 166 + Greenshot/Helpers/PropertyItemProvider.cs | 53 + Greenshot/Helpers/PropertyItemProvider.resx | 124 + Greenshot/Helpers/ScaleHelper.cs | 105 + Greenshot/Helpers/SoundHelper.cs | 98 + Greenshot/Helpers/StartupHelper.cs | 92 + Greenshot/Helpers/StringHelper.cs | 46 + Greenshot/Helpers/ToolStripItemEndisabler.cs | 100 + Greenshot/Helpers/WebToBitmap.cs | 116 + Greenshot/Helpers/WindowCapture.cs | 483 ++ Greenshot/Helpers/WindowsHelper.cs | 1081 +++++ Greenshot/Language.cs | 39 + Greenshot/Languages/help-de-DE.html | 355 ++ Greenshot/Languages/help-en-US.html | 337 ++ Greenshot/Languages/help-ru-RU.html | 339 ++ Greenshot/Languages/language-cs-CZ.xml | 527 +++ Greenshot/Languages/language-de-DE.xml | 531 +++ Greenshot/Languages/language-en-US.xml | 531 +++ Greenshot/Languages/language-es-ES.xml | 532 +++ Greenshot/Languages/language-fr-FR.xml | 514 +++ Greenshot/Languages/language-ja-JP.xml | 533 +++ Greenshot/Languages/language-nl-NL.xml | 523 +++ Greenshot/Languages/language-ru-RU.xml | 525 +++ Greenshot/Languages/language-zh-CN.xml | 525 +++ Greenshot/Languages/language-zh-TW.xml | 523 +++ Greenshot/Lib/log4net.dll | Bin 0 -> 270336 bytes Greenshot/Lib/nunit.framework.dll | Bin 0 -> 131072 bytes Greenshot/Sounds.resx | 399 ++ .../Drawing/Filters/BitmapByteBufferTest.cs | 197 + .../Properties/PropertyAggregatorTest.cs | 111 + .../Drawing/Properties/SerializationTest.cs | 101 + Greenshot/Test/SaveImageFileDialogTest.cs | 78 + Greenshot/UnmanagedHelpers/GDI32.cs | 81 + Greenshot/UnmanagedHelpers/User32.cs | 134 + Greenshot/UnmanagedHelpers/Win32Errors.cs | 141 + Greenshot/UnmanagedHelpers/WinMM.cs | 35 + Greenshot/icons/applicationIcon/16.ico | Bin 0 -> 2550 bytes Greenshot/icons/applicationIcon/16.png | Bin 0 -> 3185 bytes Greenshot/icons/applicationIcon/32.ico | Bin 0 -> 6518 bytes Greenshot/icons/applicationIcon/32.png | Bin 0 -> 3705 bytes Greenshot/icons/applicationIcon/48.ico | Bin 0 -> 13430 bytes Greenshot/icons/applicationIcon/48.png | Bin 0 -> 4588 bytes Greenshot/icons/applicationIcon/90.png | Bin 0 -> 8020 bytes Greenshot/icons/applicationIcon/icon.ico | Bin 0 -> 15227 bytes Greenshot/icons/arrow_redo.png | Bin 0 -> 349 bytes Greenshot/icons/arrow_rollback.png | Bin 0 -> 631 bytes Greenshot/icons/arrow_undo.png | Bin 0 -> 345 bytes Greenshot/icons/cancel.png | Bin 0 -> 587 bytes Greenshot/icons/cross.png | Bin 0 -> 655 bytes Greenshot/icons/cut.png | Bin 0 -> 648 bytes Greenshot/icons/delete.png | Bin 0 -> 715 bytes Greenshot/icons/filter_blur.png | Bin 0 -> 461 bytes Greenshot/icons/filter_pixelate.png | Bin 0 -> 236 bytes Greenshot/icons/folder_explore.png | Bin 0 -> 679 bytes Greenshot/icons/font_color.png | Bin 0 -> 194 bytes Greenshot/icons/fugue/arrow-resize.png | Bin 0 -> 401 bytes .../icons/fugue/clipboard-paste-image.png | Bin 0 -> 726 bytes Greenshot/icons/fugue/clipboard.png | Bin 0 -> 470 bytes Greenshot/icons/fugue/color-swatch.png | Bin 0 -> 537 bytes Greenshot/icons/fugue/cross.png | Bin 0 -> 476 bytes Greenshot/icons/fugue/cursor.png | Bin 0 -> 527 bytes Greenshot/icons/fugue/disk-black.png | Bin 0 -> 433 bytes Greenshot/icons/fugue/edit-blur.png | Bin 0 -> 3436 bytes Greenshot/icons/fugue/edit-bold.png | Bin 0 -> 258 bytes Greenshot/icons/fugue/edit-italic.png | Bin 0 -> 219 bytes Greenshot/icons/fugue/edit-pixelate.png | Bin 0 -> 2941 bytes Greenshot/icons/fugue/edit-underline.png | Bin 0 -> 260 bytes Greenshot/icons/fugue/filter_base.pdn | Bin 0 -> 11655 bytes .../icons/fugue/filter_highlight_area.png | Bin 0 -> 3441 bytes .../fugue/filter_highlight_grayscale.png | Bin 0 -> 3031 bytes .../icons/fugue/filter_highlight_text.png | Bin 0 -> 3054 bytes Greenshot/icons/fugue/gear.png | Bin 0 -> 721 bytes Greenshot/icons/fugue/highlighter-color.png | Bin 0 -> 458 bytes Greenshot/icons/fugue/highlighter-text.png | Bin 0 -> 594 bytes Greenshot/icons/fugue/image-blur.png | Bin 0 -> 590 bytes Greenshot/icons/fugue/image-pixelate.png | Bin 0 -> 3208 bytes Greenshot/icons/fugue/images.png | Bin 0 -> 657 bytes Greenshot/icons/fugue/layer-shape-arrow.png | Bin 0 -> 3150 bytes Greenshot/icons/fugue/layer-shape-ellipse.png | Bin 0 -> 740 bytes Greenshot/icons/fugue/layer-shape-line.png | Bin 0 -> 414 bytes Greenshot/icons/fugue/layer-shape-text.png | Bin 0 -> 612 bytes Greenshot/icons/fugue/layer-shape.png | Bin 0 -> 498 bytes Greenshot/icons/fugue/magnifier.png | Bin 0 -> 664 bytes Greenshot/icons/fugue/mail-open-image.png | Bin 0 -> 766 bytes Greenshot/icons/fugue/minus-circle.png | Bin 0 -> 623 bytes Greenshot/icons/fugue/money-coin.png | Bin 0 -> 689 bytes Greenshot/icons/fugue/paint-can-color-bg.png | Bin 0 -> 654 bytes Greenshot/icons/fugue/paint-can-color.png | Bin 0 -> 684 bytes Greenshot/icons/fugue/pencil-color-bg.png | Bin 0 -> 485 bytes Greenshot/icons/fugue/pencil-color.png | Bin 0 -> 561 bytes Greenshot/icons/fugue/printer.png | Bin 0 -> 722 bytes Greenshot/icons/fugue/question.png | Bin 0 -> 750 bytes Greenshot/icons/fugue/ruler-crop.png | Bin 0 -> 690 bytes Greenshot/icons/fugue/scissors.png | Bin 0 -> 676 bytes Greenshot/icons/fugue/slash.png | Bin 0 -> 752 bytes Greenshot/icons/fugue/tick.png | Bin 0 -> 634 bytes Greenshot/icons/help.png | Bin 0 -> 786 bytes Greenshot/icons/highlighter.png | Bin 0 -> 440 bytes Greenshot/icons/page_copy.png | Bin 0 -> 663 bytes Greenshot/icons/palette.png | Bin 0 -> 856 bytes Greenshot/icons/picture_save.png | Bin 0 -> 755 bytes Greenshot/icons/picture_saveas.png | Bin 0 -> 829 bytes Greenshot/icons/picture_to_clipboard.png | Bin 0 -> 672 bytes Greenshot/icons/printer.png | Bin 0 -> 731 bytes Greenshot/icons/propertyitemcontainer.gif | Bin 0 -> 75 bytes Greenshot/icons/ruler-crop.png | Bin 0 -> 690 bytes Greenshot/icons/shadow.png | Bin 0 -> 1289 bytes Greenshot/icons/shape_arrow_add.png | Bin 0 -> 468 bytes Greenshot/icons/shape_arrowheads.png | Bin 0 -> 298 bytes Greenshot/icons/shape_copy.png | Bin 0 -> 482 bytes Greenshot/icons/shape_ellipse_add.png | Bin 0 -> 652 bytes Greenshot/icons/shape_ellipse_delete.png | Bin 0 -> 657 bytes Greenshot/icons/shape_line.png | Bin 0 -> 455 bytes Greenshot/icons/shape_paste.png | Bin 0 -> 574 bytes Greenshot/icons/shape_square_add.png | Bin 0 -> 539 bytes Greenshot/icons/shape_square_bordercolor.png | Bin 0 -> 546 bytes Greenshot/icons/shape_square_delete.png | Bin 0 -> 537 bytes Greenshot/icons/shape_square_fillcolor.png | Bin 0 -> 551 bytes Greenshot/icons/text_bold.png | Bin 0 -> 304 bytes Greenshot/icons/text_dropcaps.png | Bin 0 -> 314 bytes Greenshot/icons/text_italic.png | Bin 0 -> 223 bytes Greenshot/icons/text_underline.png | Bin 0 -> 273 bytes Greenshot/icons/textfield_delete.png | Bin 0 -> 335 bytes Greenshot/icons/wrench.png | Bin 0 -> 610 bytes Greenshot/icons/wrench_orange.png | Bin 0 -> 584 bytes Greenshot/icons/zoom.png | Bin 0 -> 692 bytes Greenshot/log4net.xml | 38 + .../Greenshot-INSTALLER-0.8.0-0585.exe | Bin 0 -> 554782 bytes .../releases/Greenshot-INSTALLER-585.exe | Bin 0 -> 554537 bytes ...reenshot-INSTALLER-UNSTABLE-0.8.0-0552.exe | Bin 0 -> 553611 bytes .../Greenshot-NO-INSTALLER-0.8.0-0585.zip | Bin 0 -> 319343 bytes ...nshot-NO-INSTALLER-UNSTABLE-0.8.0-0552.zip | Bin 0 -> 318213 bytes Greenshot/releases/Greenshot-NO-INSTALLER.zip | Bin 0 -> 319331 bytes .../releases/additional_files/license.txt | 340 ++ .../releases/additional_files/readme.txt | 139 + Greenshot/releases/innosetup/setup-SVN.iss | 62 + Greenshot/releases/innosetup/setup.iss | 87 + Greenshot/sounds/camera.wav | Bin 0 -> 16428 bytes Greenshot/tools/7zip/7za.exe | Bin 0 -> 536064 bytes Greenshot/tools/FileVerifier++/COPYING.TXT | 340 ++ Greenshot/tools/FileVerifier++/Modules/md.dll | Bin 0 -> 37376 bytes .../tools/FileVerifier++/Modules/sha.dll | Bin 0 -> 234496 bytes Greenshot/tools/FileVerifier++/fvc.exe | Bin 0 -> 306688 bytes Greenshot/tools/FileVerifier++/libexpatw.dll | Bin 0 -> 151552 bytes Greenshot/tools/FileVerifier++/mingwm10.dll | Bin 0 -> 11362 bytes .../tools/TortoiseSVN/CyrusSASL License.txt | 44 + .../tools/TortoiseSVN/OpenSSL License.txt | 127 + Greenshot/tools/TortoiseSVN/SubWCRev.exe | Bin 0 -> 396040 bytes .../tools/TortoiseSVN/Subversion license.txt | 47 + .../tools/TortoiseSVN/TortoiseSVN License.txt | 340 ++ Greenshot/tools/TortoiseSVN/intl3_tsvn.dll | Bin 0 -> 63240 bytes Greenshot/tools/TortoiseSVN/libapr_tsvn.dll | Bin 0 -> 128776 bytes .../tools/TortoiseSVN/libaprutil_tsvn.dll | Bin 0 -> 186632 bytes Greenshot/tools/innosetup/Compil32.exe | Bin 0 -> 680960 bytes Greenshot/tools/innosetup/Default.isl | 317 ++ Greenshot/tools/innosetup/ISCC.exe | Bin 0 -> 58880 bytes Greenshot/tools/innosetup/ISCmplr.dll | Bin 0 -> 399360 bytes Greenshot/tools/innosetup/ISetup.chm | Bin 0 -> 369674 bytes .../tools/innosetup/Languages/Basque.isl | 318 ++ .../Languages/BrazilianPortuguese.isl | 341 ++ .../tools/innosetup/Languages/Catalan.isl | 302 ++ Greenshot/tools/innosetup/Languages/Czech.isl | 318 ++ .../tools/innosetup/Languages/Danish.isl | 315 ++ Greenshot/tools/innosetup/Languages/Dutch.isl | 297 ++ .../tools/innosetup/Languages/Finnish.isl | 296 ++ .../tools/innosetup/Languages/French.isl | 317 ++ .../tools/innosetup/Languages/German.isl | 306 ++ .../tools/innosetup/Languages/Hebrew.isl | 314 ++ .../tools/innosetup/Languages/Hungarian.isl | 339 ++ .../tools/innosetup/Languages/Italian.isl | 323 ++ .../tools/innosetup/Languages/Japanese.isl | 303 ++ .../tools/innosetup/Languages/Norwegian.isl | 312 ++ .../tools/innosetup/Languages/Polish.isl | 309 ++ .../tools/innosetup/Languages/Portuguese.isl | 301 ++ .../tools/innosetup/Languages/Russian.isl | 307 ++ .../tools/innosetup/Languages/Slovak.isl | 244 + .../tools/innosetup/Languages/Slovenian.isl | 307 ++ .../tools/innosetup/Languages/Spanish.isl | 316 ++ Greenshot/tools/innosetup/Setup.e32 | Bin 0 -> 711168 bytes Greenshot/tools/innosetup/SetupLdr.e32 | Bin 0 -> 54272 bytes .../tools/innosetup/WizModernImage-IS.bmp | Bin 0 -> 52574 bytes Greenshot/tools/innosetup/WizModernImage.bmp | Bin 0 -> 26494 bytes .../innosetup/WizModernSmallImage-IS.bmp | Bin 0 -> 4158 bytes .../tools/innosetup/WizModernSmallImage.bmp | Bin 0 -> 1658 bytes Greenshot/tools/innosetup/isbunzip.dll | Bin 0 -> 32768 bytes Greenshot/tools/innosetup/isbzip.dll | Bin 0 -> 36864 bytes Greenshot/tools/innosetup/isfaq.htm | 495 ++ Greenshot/tools/innosetup/islzma.dll | Bin 0 -> 74240 bytes Greenshot/tools/innosetup/islzma32.exe | Bin 0 -> 72192 bytes Greenshot/tools/innosetup/islzma64.exe | Bin 0 -> 99840 bytes Greenshot/tools/innosetup/isunzlib.dll | Bin 0 -> 13312 bytes Greenshot/tools/innosetup/iszlib.dll | Bin 0 -> 18432 bytes Greenshot/tools/innosetup/license.txt | 37 + Greenshot/tools/innosetup/whatsnew.htm | 923 ++++ Greenshot/web/htdocs/Help/index.de-DE.html | 106 + Greenshot/web/htdocs/Help/index.en-US.html | 100 + Greenshot/web/htdocs/favicon.ico | Bin 0 -> 2550 bytes Greenshot/web/htdocs/index.html | 44 + Greenshot/windowcontent.properties | 7 + GreenshotConfluencePlugin/Confluence.cs | 199 + .../ConfluencePluginBase.cs | 128 + .../Forms/ConfluenceForm.Designer.cs | 153 + .../Forms/ConfluenceForm.cs | 59 + .../Forms/ListViewColumnSorter.cs | 89 + .../Forms/LoginForm.Designer.cs | 154 + GreenshotConfluencePlugin/Forms/LoginForm.cs | 80 + .../GreenshotConfluencePlugin.csproj | 109 + GreenshotConfluencePlugin/Language.cs | 47 + GreenshotConfluencePlugin/LanguageKeys.cs | 35 + .../language_confluenceplugin-de-DE.xml | 32 + .../language_confluenceplugin-en-US.xml | 32 + .../language_confluenceplugin-nl-NL.xml | 32 + .../Properties/AssemblyInfo.cs.template | 54 + .../Web References/confluence/Reference.cs | 4052 +++++++++++++++++ .../Web References/confluence/Reference.map | 6 + .../confluence/confluenceservice-v1.wsdl | 3919 ++++++++++++++++ .../Forms/JiraForm.Designer.cs | 202 + GreenshotJiraPlugin/Forms/JiraForm.cs | 195 + .../Forms/ListViewColumnSorter.cs | 108 + .../Forms/LoginForm.Designer.cs | 153 + GreenshotJiraPlugin/Forms/LoginForm.cs | 80 + .../GreenshotJiraPlugin.csproj | 109 + GreenshotJiraPlugin/Jira.cs | 303 ++ GreenshotJiraPlugin/JiraPluginBase.cs | 129 + GreenshotJiraPlugin/Language.cs | 47 + GreenshotJiraPlugin/LanguageKeys.cs | 44 + .../Languages/language_jiraplugin-de-DE.xml | 59 + .../Languages/language_jiraplugin-en-US.xml | 59 + .../Languages/language_jiraplugin-nl-NL.xml | 59 + .../Properties/AssemblyInfo.cs.template | 54 + .../Web References/JiraSoap/Reference.cs | 3711 +++++++++++++++ GreenshotPlugin/Core/LanguageHelper.cs | 451 ++ GreenshotPlugin/Core/PropertyHelper.cs | 118 + GreenshotPlugin/GreenshotPlugin.csproj | 74 + GreenshotPlugin/Interfaces/Capture.cs | 177 + .../Interfaces/Drawing/Container.cs | 107 + .../Interfaces/Forms/ImageEditor.cs | 71 + GreenshotPlugin/Interfaces/Generic.cs | 103 + .../Interfaces/Plugin/PluginInterfaces.cs | 222 + GreenshotPlugin/Properties/AssemblyInfo.cs | 51 + .../Properties/AssemblyInfo.cs.template | 51 + .../bin/Release/GreenshotPlugin.dll | Bin 0 -> 24576 bytes GreenshotPlugin/bin/Release/log4net.dll | Bin 0 -> 270336 bytes ...reenshotPlugin.csproj.FileListAbsolute.txt | 4 + .../obj/x86/Release/GreenshotPlugin.dll | Bin 0 -> 24576 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 5889 bytes PluginExample/DrawingUtils.cs | 323 ++ PluginExample/PluginExample.cs | 194 + PluginExample/PluginExample.csproj | 74 + .../Properties/AssemblyInfo.cs.template | 54 + PluginExample/SettingsForm.Designer.cs | 101 + PluginExample/SettingsForm.cs | 52 + PluginExample/SettingsForm.resx | 120 + 392 files changed, 61489 insertions(+) create mode 100644 Greenshot-OCR-Plugin/Greenshot-OCR-Plugin.csproj create mode 100644 Greenshot-OCR-Plugin/Language.cs create mode 100644 Greenshot-OCR-Plugin/LanguageKeys.cs create mode 100644 Greenshot-OCR-Plugin/Languages/language_ocrplugin-de-DE.xml create mode 100644 Greenshot-OCR-Plugin/Languages/language_ocrplugin-en-US.xml create mode 100644 Greenshot-OCR-Plugin/Languages/language_ocrplugin-nl-NL.xml create mode 100644 Greenshot-OCR-Plugin/OCRPlugin.cs create mode 100644 Greenshot-OCR-Plugin/Properties/AssemblyInfo.cs.template create mode 100644 Greenshot-OCR-Plugin/SettingsForm.Designer.cs create mode 100644 Greenshot-OCR-Plugin/SettingsForm.cs create mode 100644 Greenshot-OCR-Plugin/lib/GEN.BAT create mode 100644 Greenshot-OCR-Plugin/lib/MODI11.dll create mode 100644 Greenshot-OCR-Plugin/lib/MODI12.dll create mode 100644 Greenshot-OCR-Plugin/lib/Office11/MDIVWCTL.DLL create mode 100644 Greenshot-OCR-Plugin/lib/Office12/MDIVWCTL.DLL create mode 100644 Greenshot-RunAtOutput-Plugin/Configuration.cs create mode 100644 Greenshot-RunAtOutput-Plugin/Greenshot-RunAtOutput-Plugin.csproj create mode 100644 Greenshot-RunAtOutput-Plugin/Properties/AssemblyInfo.cs.template create mode 100644 Greenshot-RunAtOutput-Plugin/RunAtOutput.cs create mode 100644 Greenshot-RunAtOutput-Plugin/SettingsForm.Designer.cs create mode 100644 Greenshot-RunAtOutput-Plugin/SettingsForm.cs create mode 100644 Greenshot-RunAtOutput-Plugin/runatoutput.properties create mode 100644 Greenshot-TitleFix-Plugin/FixTitle.cs create mode 100644 Greenshot-TitleFix-Plugin/Greenshot-TitleFix-Plugin.csproj create mode 100644 Greenshot-TitleFix-Plugin/Properties/AssemblyInfo.cs.template create mode 100644 Greenshot/AssemblyInfo.cs create mode 100644 Greenshot/AssemblyInfo.cs.template create mode 100644 Greenshot/Configuration/AppConfig.cs create mode 100644 Greenshot/Configuration/Language.cs create mode 100644 Greenshot/Configuration/LanguageKeys.cs create mode 100644 Greenshot/Configuration/RuntimeConfig.cs create mode 100644 Greenshot/Controls/BindableToolStripButton.cs create mode 100644 Greenshot/Controls/BindableToolStripComboBox.cs create mode 100644 Greenshot/Controls/BindableToolStripDropDownButton.cs create mode 100644 Greenshot/Controls/ColorButton.cs create mode 100644 Greenshot/Controls/FontFamilyComboBox.cs create mode 100644 Greenshot/Controls/ToolStripColorButton.cs create mode 100644 Greenshot/Controls/ToolStripNumericUpDown.cs create mode 100644 Greenshot/Drawing/ArrowContainer.cs create mode 100644 Greenshot/Drawing/BitmapBuffer.cs create mode 100644 Greenshot/Drawing/BitmapContainer.cs create mode 100644 Greenshot/Drawing/CropContainer.cs create mode 100644 Greenshot/Drawing/CursorContainer.cs create mode 100644 Greenshot/Drawing/DrawableContainer.cs create mode 100644 Greenshot/Drawing/DrawableContainerList.cs create mode 100644 Greenshot/Drawing/EllipseContainer.cs create mode 100644 Greenshot/Drawing/Fields/AbstractFieldHolder.cs create mode 100644 Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs create mode 100644 Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs create mode 100644 Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs create mode 100644 Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs create mode 100644 Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs create mode 100644 Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs create mode 100644 Greenshot/Drawing/Fields/Binding/IBindingConverter.cs create mode 100644 Greenshot/Drawing/Fields/Binding/IBindingValidator.cs create mode 100644 Greenshot/Drawing/Fields/Binding/NotNullValidator.cs create mode 100644 Greenshot/Drawing/Fields/Field.cs create mode 100644 Greenshot/Drawing/Fields/FieldAggregator.cs create mode 100644 Greenshot/Drawing/Fields/FieldFactory.cs create mode 100644 Greenshot/Drawing/Fields/FieldType.cs create mode 100644 Greenshot/Drawing/Fields/IFieldHolder.cs create mode 100644 Greenshot/Drawing/FilterContainer.cs create mode 100644 Greenshot/Drawing/Filters/AbstractFilter.cs create mode 100644 Greenshot/Drawing/Filters/BlurFilter.cs create mode 100644 Greenshot/Drawing/Filters/BrightnessFilter.cs create mode 100644 Greenshot/Drawing/Filters/FastSmoothFilter.cs create mode 100644 Greenshot/Drawing/Filters/GrayscaleFilter.cs create mode 100644 Greenshot/Drawing/Filters/HighlightFilter.cs create mode 100644 Greenshot/Drawing/Filters/IFilter.cs create mode 100644 Greenshot/Drawing/Filters/MagnifierFilter.cs create mode 100644 Greenshot/Drawing/Filters/PixelizationFilter.cs create mode 100644 Greenshot/Drawing/HighlightContainer.cs create mode 100644 Greenshot/Drawing/HtmlContainer.cs create mode 100644 Greenshot/Drawing/IconContainer.cs create mode 100644 Greenshot/Drawing/LineContainer.cs create mode 100644 Greenshot/Drawing/MetafileContainer.cs create mode 100644 Greenshot/Drawing/ObfuscateContainer.cs create mode 100644 Greenshot/Drawing/RectangleContainer.cs create mode 100644 Greenshot/Drawing/RoundedRectangle.cs create mode 100644 Greenshot/Drawing/Surface.cs create mode 100644 Greenshot/Drawing/TextContainer.cs create mode 100644 Greenshot/Drawing/UrlContainer.cs create mode 100644 Greenshot/Forms/AboutForm.Designer.cs create mode 100644 Greenshot/Forms/AboutForm.cs create mode 100644 Greenshot/Forms/AboutForm.resx create mode 100644 Greenshot/Forms/BugReportForm.Designer.cs create mode 100644 Greenshot/Forms/BugReportForm.cs create mode 100644 Greenshot/Forms/BugReportForm.resx create mode 100644 Greenshot/Forms/CaptureForm.Designer.cs create mode 100644 Greenshot/Forms/CaptureForm.cs create mode 100644 Greenshot/Forms/ColorDialog.Designer.cs create mode 100644 Greenshot/Forms/ColorDialog.cs create mode 100644 Greenshot/Forms/ColorDialog.resx create mode 100644 Greenshot/Forms/ColorPickerToolStripButton.cs create mode 100644 Greenshot/Forms/FlashlightForm.Designer.cs create mode 100644 Greenshot/Forms/FlashlightForm.cs create mode 100644 Greenshot/Forms/ImageEditorForm.Designer.cs create mode 100644 Greenshot/Forms/ImageEditorForm.cs create mode 100644 Greenshot/Forms/ImageEditorForm.resx create mode 100644 Greenshot/Forms/JpegQualityDialog.Designer.cs create mode 100644 Greenshot/Forms/JpegQualityDialog.cs create mode 100644 Greenshot/Forms/JpegQualityDialog.resx create mode 100644 Greenshot/Forms/LanguageDialog.Designer.cs create mode 100644 Greenshot/Forms/LanguageDialog.cs create mode 100644 Greenshot/Forms/LanguageDialog.resx create mode 100644 Greenshot/Forms/MainForm.Designer.cs create mode 100644 Greenshot/Forms/MainForm.cs create mode 100644 Greenshot/Forms/MainForm.resx create mode 100644 Greenshot/Forms/PrintOptionsDialog.Designer.cs create mode 100644 Greenshot/Forms/PrintOptionsDialog.cs create mode 100644 Greenshot/Forms/PrintOptionsDialog.resx create mode 100644 Greenshot/Forms/SaveImageFileDialog.cs create mode 100644 Greenshot/Forms/SettingsForm.Designer.cs create mode 100644 Greenshot/Forms/SettingsForm.cs create mode 100644 Greenshot/Forms/SettingsForm.resx create mode 100644 Greenshot/Forms/ToolStripMenuSelectList.cs create mode 100644 Greenshot/Greeenshot.zreproj create mode 100644 Greenshot/Greenshot.csproj create mode 100644 Greenshot/Greenshot.sln create mode 100644 Greenshot/Help/HelpBrowserForm.Designer.cs create mode 100644 Greenshot/Help/HelpBrowserForm.cs create mode 100644 Greenshot/Help/HelpBrowserForm.resx create mode 100644 Greenshot/Helpers/ClipboardHelper.cs create mode 100644 Greenshot/Helpers/Colors.cs create mode 100644 Greenshot/Helpers/CopyData.cs create mode 100644 Greenshot/Helpers/DrawingHelper.cs create mode 100644 Greenshot/Helpers/EnvironmentInfo.cs create mode 100644 Greenshot/Helpers/FilenameHelper.cs create mode 100644 Greenshot/Helpers/FormHelper.cs create mode 100644 Greenshot/Helpers/GuiRectangle.cs create mode 100644 Greenshot/Helpers/HotkeyHelper.cs create mode 100644 Greenshot/Helpers/HtmlFragment.cs create mode 100644 Greenshot/Helpers/ImageHelper.cs create mode 100644 Greenshot/Helpers/ImageOutput.cs create mode 100644 Greenshot/Helpers/Log4NET.cs create mode 100644 Greenshot/Helpers/LogHelper.cs create mode 100644 Greenshot/Helpers/MailHelper.cs create mode 100644 Greenshot/Helpers/Objects.cs create mode 100644 Greenshot/Helpers/PluginHelper.cs create mode 100644 Greenshot/Helpers/PrintHelper.cs create mode 100644 Greenshot/Helpers/PropertyItemProvider.cs create mode 100644 Greenshot/Helpers/PropertyItemProvider.resx create mode 100644 Greenshot/Helpers/ScaleHelper.cs create mode 100644 Greenshot/Helpers/SoundHelper.cs create mode 100644 Greenshot/Helpers/StartupHelper.cs create mode 100644 Greenshot/Helpers/StringHelper.cs create mode 100644 Greenshot/Helpers/ToolStripItemEndisabler.cs create mode 100644 Greenshot/Helpers/WebToBitmap.cs create mode 100644 Greenshot/Helpers/WindowCapture.cs create mode 100644 Greenshot/Helpers/WindowsHelper.cs create mode 100644 Greenshot/Language.cs create mode 100644 Greenshot/Languages/help-de-DE.html create mode 100644 Greenshot/Languages/help-en-US.html create mode 100644 Greenshot/Languages/help-ru-RU.html create mode 100644 Greenshot/Languages/language-cs-CZ.xml create mode 100644 Greenshot/Languages/language-de-DE.xml create mode 100644 Greenshot/Languages/language-en-US.xml create mode 100644 Greenshot/Languages/language-es-ES.xml create mode 100644 Greenshot/Languages/language-fr-FR.xml create mode 100644 Greenshot/Languages/language-ja-JP.xml create mode 100644 Greenshot/Languages/language-nl-NL.xml create mode 100644 Greenshot/Languages/language-ru-RU.xml create mode 100644 Greenshot/Languages/language-zh-CN.xml create mode 100644 Greenshot/Languages/language-zh-TW.xml create mode 100644 Greenshot/Lib/log4net.dll create mode 100644 Greenshot/Lib/nunit.framework.dll create mode 100644 Greenshot/Sounds.resx create mode 100644 Greenshot/Test/Drawing/Filters/BitmapByteBufferTest.cs create mode 100644 Greenshot/Test/Drawing/Properties/PropertyAggregatorTest.cs create mode 100644 Greenshot/Test/Drawing/Properties/SerializationTest.cs create mode 100644 Greenshot/Test/SaveImageFileDialogTest.cs create mode 100644 Greenshot/UnmanagedHelpers/GDI32.cs create mode 100644 Greenshot/UnmanagedHelpers/User32.cs create mode 100644 Greenshot/UnmanagedHelpers/Win32Errors.cs create mode 100644 Greenshot/UnmanagedHelpers/WinMM.cs create mode 100644 Greenshot/icons/applicationIcon/16.ico create mode 100644 Greenshot/icons/applicationIcon/16.png create mode 100644 Greenshot/icons/applicationIcon/32.ico create mode 100644 Greenshot/icons/applicationIcon/32.png create mode 100644 Greenshot/icons/applicationIcon/48.ico create mode 100644 Greenshot/icons/applicationIcon/48.png create mode 100644 Greenshot/icons/applicationIcon/90.png create mode 100644 Greenshot/icons/applicationIcon/icon.ico create mode 100644 Greenshot/icons/arrow_redo.png create mode 100644 Greenshot/icons/arrow_rollback.png create mode 100644 Greenshot/icons/arrow_undo.png create mode 100644 Greenshot/icons/cancel.png create mode 100644 Greenshot/icons/cross.png create mode 100644 Greenshot/icons/cut.png create mode 100644 Greenshot/icons/delete.png create mode 100644 Greenshot/icons/filter_blur.png create mode 100644 Greenshot/icons/filter_pixelate.png create mode 100644 Greenshot/icons/folder_explore.png create mode 100644 Greenshot/icons/font_color.png create mode 100644 Greenshot/icons/fugue/arrow-resize.png create mode 100644 Greenshot/icons/fugue/clipboard-paste-image.png create mode 100644 Greenshot/icons/fugue/clipboard.png create mode 100644 Greenshot/icons/fugue/color-swatch.png create mode 100644 Greenshot/icons/fugue/cross.png create mode 100644 Greenshot/icons/fugue/cursor.png create mode 100644 Greenshot/icons/fugue/disk-black.png create mode 100644 Greenshot/icons/fugue/edit-blur.png create mode 100644 Greenshot/icons/fugue/edit-bold.png create mode 100644 Greenshot/icons/fugue/edit-italic.png create mode 100644 Greenshot/icons/fugue/edit-pixelate.png create mode 100644 Greenshot/icons/fugue/edit-underline.png create mode 100644 Greenshot/icons/fugue/filter_base.pdn create mode 100644 Greenshot/icons/fugue/filter_highlight_area.png create mode 100644 Greenshot/icons/fugue/filter_highlight_grayscale.png create mode 100644 Greenshot/icons/fugue/filter_highlight_text.png create mode 100644 Greenshot/icons/fugue/gear.png create mode 100644 Greenshot/icons/fugue/highlighter-color.png create mode 100644 Greenshot/icons/fugue/highlighter-text.png create mode 100644 Greenshot/icons/fugue/image-blur.png create mode 100644 Greenshot/icons/fugue/image-pixelate.png create mode 100644 Greenshot/icons/fugue/images.png create mode 100644 Greenshot/icons/fugue/layer-shape-arrow.png create mode 100644 Greenshot/icons/fugue/layer-shape-ellipse.png create mode 100644 Greenshot/icons/fugue/layer-shape-line.png create mode 100644 Greenshot/icons/fugue/layer-shape-text.png create mode 100644 Greenshot/icons/fugue/layer-shape.png create mode 100644 Greenshot/icons/fugue/magnifier.png create mode 100644 Greenshot/icons/fugue/mail-open-image.png create mode 100644 Greenshot/icons/fugue/minus-circle.png create mode 100644 Greenshot/icons/fugue/money-coin.png create mode 100644 Greenshot/icons/fugue/paint-can-color-bg.png create mode 100644 Greenshot/icons/fugue/paint-can-color.png create mode 100644 Greenshot/icons/fugue/pencil-color-bg.png create mode 100644 Greenshot/icons/fugue/pencil-color.png create mode 100644 Greenshot/icons/fugue/printer.png create mode 100644 Greenshot/icons/fugue/question.png create mode 100644 Greenshot/icons/fugue/ruler-crop.png create mode 100644 Greenshot/icons/fugue/scissors.png create mode 100644 Greenshot/icons/fugue/slash.png create mode 100644 Greenshot/icons/fugue/tick.png create mode 100644 Greenshot/icons/help.png create mode 100644 Greenshot/icons/highlighter.png create mode 100644 Greenshot/icons/page_copy.png create mode 100644 Greenshot/icons/palette.png create mode 100644 Greenshot/icons/picture_save.png create mode 100644 Greenshot/icons/picture_saveas.png create mode 100644 Greenshot/icons/picture_to_clipboard.png create mode 100644 Greenshot/icons/printer.png create mode 100644 Greenshot/icons/propertyitemcontainer.gif create mode 100644 Greenshot/icons/ruler-crop.png create mode 100644 Greenshot/icons/shadow.png create mode 100644 Greenshot/icons/shape_arrow_add.png create mode 100644 Greenshot/icons/shape_arrowheads.png create mode 100644 Greenshot/icons/shape_copy.png create mode 100644 Greenshot/icons/shape_ellipse_add.png create mode 100644 Greenshot/icons/shape_ellipse_delete.png create mode 100644 Greenshot/icons/shape_line.png create mode 100644 Greenshot/icons/shape_paste.png create mode 100644 Greenshot/icons/shape_square_add.png create mode 100644 Greenshot/icons/shape_square_bordercolor.png create mode 100644 Greenshot/icons/shape_square_delete.png create mode 100644 Greenshot/icons/shape_square_fillcolor.png create mode 100644 Greenshot/icons/text_bold.png create mode 100644 Greenshot/icons/text_dropcaps.png create mode 100644 Greenshot/icons/text_italic.png create mode 100644 Greenshot/icons/text_underline.png create mode 100644 Greenshot/icons/textfield_delete.png create mode 100644 Greenshot/icons/wrench.png create mode 100644 Greenshot/icons/wrench_orange.png create mode 100644 Greenshot/icons/zoom.png create mode 100644 Greenshot/log4net.xml create mode 100644 Greenshot/releases/Greenshot-INSTALLER-0.8.0-0585.exe create mode 100644 Greenshot/releases/Greenshot-INSTALLER-585.exe create mode 100644 Greenshot/releases/Greenshot-INSTALLER-UNSTABLE-0.8.0-0552.exe create mode 100644 Greenshot/releases/Greenshot-NO-INSTALLER-0.8.0-0585.zip create mode 100644 Greenshot/releases/Greenshot-NO-INSTALLER-UNSTABLE-0.8.0-0552.zip create mode 100644 Greenshot/releases/Greenshot-NO-INSTALLER.zip create mode 100644 Greenshot/releases/additional_files/license.txt create mode 100644 Greenshot/releases/additional_files/readme.txt create mode 100644 Greenshot/releases/innosetup/setup-SVN.iss create mode 100644 Greenshot/releases/innosetup/setup.iss create mode 100644 Greenshot/sounds/camera.wav create mode 100644 Greenshot/tools/7zip/7za.exe create mode 100644 Greenshot/tools/FileVerifier++/COPYING.TXT create mode 100644 Greenshot/tools/FileVerifier++/Modules/md.dll create mode 100644 Greenshot/tools/FileVerifier++/Modules/sha.dll create mode 100644 Greenshot/tools/FileVerifier++/fvc.exe create mode 100644 Greenshot/tools/FileVerifier++/libexpatw.dll create mode 100644 Greenshot/tools/FileVerifier++/mingwm10.dll create mode 100644 Greenshot/tools/TortoiseSVN/CyrusSASL License.txt create mode 100644 Greenshot/tools/TortoiseSVN/OpenSSL License.txt create mode 100644 Greenshot/tools/TortoiseSVN/SubWCRev.exe create mode 100644 Greenshot/tools/TortoiseSVN/Subversion license.txt create mode 100644 Greenshot/tools/TortoiseSVN/TortoiseSVN License.txt create mode 100644 Greenshot/tools/TortoiseSVN/intl3_tsvn.dll create mode 100644 Greenshot/tools/TortoiseSVN/libapr_tsvn.dll create mode 100644 Greenshot/tools/TortoiseSVN/libaprutil_tsvn.dll create mode 100644 Greenshot/tools/innosetup/Compil32.exe create mode 100644 Greenshot/tools/innosetup/Default.isl create mode 100644 Greenshot/tools/innosetup/ISCC.exe create mode 100644 Greenshot/tools/innosetup/ISCmplr.dll create mode 100644 Greenshot/tools/innosetup/ISetup.chm create mode 100644 Greenshot/tools/innosetup/Languages/Basque.isl create mode 100644 Greenshot/tools/innosetup/Languages/BrazilianPortuguese.isl create mode 100644 Greenshot/tools/innosetup/Languages/Catalan.isl create mode 100644 Greenshot/tools/innosetup/Languages/Czech.isl create mode 100644 Greenshot/tools/innosetup/Languages/Danish.isl create mode 100644 Greenshot/tools/innosetup/Languages/Dutch.isl create mode 100644 Greenshot/tools/innosetup/Languages/Finnish.isl create mode 100644 Greenshot/tools/innosetup/Languages/French.isl create mode 100644 Greenshot/tools/innosetup/Languages/German.isl create mode 100644 Greenshot/tools/innosetup/Languages/Hebrew.isl create mode 100644 Greenshot/tools/innosetup/Languages/Hungarian.isl create mode 100644 Greenshot/tools/innosetup/Languages/Italian.isl create mode 100644 Greenshot/tools/innosetup/Languages/Japanese.isl create mode 100644 Greenshot/tools/innosetup/Languages/Norwegian.isl create mode 100644 Greenshot/tools/innosetup/Languages/Polish.isl create mode 100644 Greenshot/tools/innosetup/Languages/Portuguese.isl create mode 100644 Greenshot/tools/innosetup/Languages/Russian.isl create mode 100644 Greenshot/tools/innosetup/Languages/Slovak.isl create mode 100644 Greenshot/tools/innosetup/Languages/Slovenian.isl create mode 100644 Greenshot/tools/innosetup/Languages/Spanish.isl create mode 100644 Greenshot/tools/innosetup/Setup.e32 create mode 100644 Greenshot/tools/innosetup/SetupLdr.e32 create mode 100644 Greenshot/tools/innosetup/WizModernImage-IS.bmp create mode 100644 Greenshot/tools/innosetup/WizModernImage.bmp create mode 100644 Greenshot/tools/innosetup/WizModernSmallImage-IS.bmp create mode 100644 Greenshot/tools/innosetup/WizModernSmallImage.bmp create mode 100644 Greenshot/tools/innosetup/isbunzip.dll create mode 100644 Greenshot/tools/innosetup/isbzip.dll create mode 100644 Greenshot/tools/innosetup/isfaq.htm create mode 100644 Greenshot/tools/innosetup/islzma.dll create mode 100644 Greenshot/tools/innosetup/islzma32.exe create mode 100644 Greenshot/tools/innosetup/islzma64.exe create mode 100644 Greenshot/tools/innosetup/isunzlib.dll create mode 100644 Greenshot/tools/innosetup/iszlib.dll create mode 100644 Greenshot/tools/innosetup/license.txt create mode 100644 Greenshot/tools/innosetup/whatsnew.htm create mode 100644 Greenshot/web/htdocs/Help/index.de-DE.html create mode 100644 Greenshot/web/htdocs/Help/index.en-US.html create mode 100644 Greenshot/web/htdocs/favicon.ico create mode 100644 Greenshot/web/htdocs/index.html create mode 100644 Greenshot/windowcontent.properties create mode 100644 GreenshotConfluencePlugin/Confluence.cs create mode 100644 GreenshotConfluencePlugin/ConfluencePluginBase.cs create mode 100644 GreenshotConfluencePlugin/Forms/ConfluenceForm.Designer.cs create mode 100644 GreenshotConfluencePlugin/Forms/ConfluenceForm.cs create mode 100644 GreenshotConfluencePlugin/Forms/ListViewColumnSorter.cs create mode 100644 GreenshotConfluencePlugin/Forms/LoginForm.Designer.cs create mode 100644 GreenshotConfluencePlugin/Forms/LoginForm.cs create mode 100644 GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj create mode 100644 GreenshotConfluencePlugin/Language.cs create mode 100644 GreenshotConfluencePlugin/LanguageKeys.cs create mode 100644 GreenshotConfluencePlugin/Languages/language_confluenceplugin-de-DE.xml create mode 100644 GreenshotConfluencePlugin/Languages/language_confluenceplugin-en-US.xml create mode 100644 GreenshotConfluencePlugin/Languages/language_confluenceplugin-nl-NL.xml create mode 100644 GreenshotConfluencePlugin/Properties/AssemblyInfo.cs.template create mode 100644 GreenshotConfluencePlugin/Web References/confluence/Reference.cs create mode 100644 GreenshotConfluencePlugin/Web References/confluence/Reference.map create mode 100644 GreenshotConfluencePlugin/Web References/confluence/confluenceservice-v1.wsdl create mode 100644 GreenshotJiraPlugin/Forms/JiraForm.Designer.cs create mode 100644 GreenshotJiraPlugin/Forms/JiraForm.cs create mode 100644 GreenshotJiraPlugin/Forms/ListViewColumnSorter.cs create mode 100644 GreenshotJiraPlugin/Forms/LoginForm.Designer.cs create mode 100644 GreenshotJiraPlugin/Forms/LoginForm.cs create mode 100644 GreenshotJiraPlugin/GreenshotJiraPlugin.csproj create mode 100644 GreenshotJiraPlugin/Jira.cs create mode 100644 GreenshotJiraPlugin/JiraPluginBase.cs create mode 100644 GreenshotJiraPlugin/Language.cs create mode 100644 GreenshotJiraPlugin/LanguageKeys.cs create mode 100644 GreenshotJiraPlugin/Languages/language_jiraplugin-de-DE.xml create mode 100644 GreenshotJiraPlugin/Languages/language_jiraplugin-en-US.xml create mode 100644 GreenshotJiraPlugin/Languages/language_jiraplugin-nl-NL.xml create mode 100644 GreenshotJiraPlugin/Properties/AssemblyInfo.cs.template create mode 100644 GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs create mode 100644 GreenshotPlugin/Core/LanguageHelper.cs create mode 100644 GreenshotPlugin/Core/PropertyHelper.cs create mode 100644 GreenshotPlugin/GreenshotPlugin.csproj create mode 100644 GreenshotPlugin/Interfaces/Capture.cs create mode 100644 GreenshotPlugin/Interfaces/Drawing/Container.cs create mode 100644 GreenshotPlugin/Interfaces/Forms/ImageEditor.cs create mode 100644 GreenshotPlugin/Interfaces/Generic.cs create mode 100644 GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs create mode 100644 GreenshotPlugin/Properties/AssemblyInfo.cs create mode 100644 GreenshotPlugin/Properties/AssemblyInfo.cs.template create mode 100644 GreenshotPlugin/bin/Release/GreenshotPlugin.dll create mode 100644 GreenshotPlugin/bin/Release/log4net.dll create mode 100644 GreenshotPlugin/obj/x86/Release/GreenshotPlugin.csproj.FileListAbsolute.txt create mode 100644 GreenshotPlugin/obj/x86/Release/GreenshotPlugin.dll create mode 100644 GreenshotPlugin/obj/x86/Release/ResolveAssemblyReference.cache create mode 100644 PluginExample/DrawingUtils.cs create mode 100644 PluginExample/PluginExample.cs create mode 100644 PluginExample/PluginExample.csproj create mode 100644 PluginExample/Properties/AssemblyInfo.cs.template create mode 100644 PluginExample/SettingsForm.Designer.cs create mode 100644 PluginExample/SettingsForm.cs create mode 100644 PluginExample/SettingsForm.resx diff --git a/Greenshot-OCR-Plugin/Greenshot-OCR-Plugin.csproj b/Greenshot-OCR-Plugin/Greenshot-OCR-Plugin.csproj new file mode 100644 index 000000000..9a22173b5 --- /dev/null +++ b/Greenshot-OCR-Plugin/Greenshot-OCR-Plugin.csproj @@ -0,0 +1,94 @@ + + + {C6988EE8-2FEE-4349-9F09-F9628A0D8965} + Debug + x86 + Library + GreenshotOCR + Greenshot-OCR-Plugin + v2.0 + Properties + C:\Dokumente und Einstellungen\05018085\Anwendungsdaten\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis + False + False + 4 + false + OnBuildSuccess + + + x86 + False + Auto + 4194304 + 4096 + + + bin\Debug\ + true + Full + False + True + DEBUG;TRACE + + + bin\Release\ + False + None + True + False + TRACE + + + + + ..\Greenshot\Lib\log4net.dll + + + lib\MODI11.dll + + + lib\MODI12.dll + + + + + + + + + + + + + SettingsForm.cs + + + Always + + + Always + + + Always + + + + + + + + {5B924697-4DCD-4F98-85F1-105CB84B7341} + GreenshotPlugin + + + + + + "$(SolutionDir)\tools\TortoiseSVN\SubWCRev.exe" "$(ProjectDir)\" "$(ProjectDir)\Properties\AssemblyInfo.cs.template" "$(ProjectDir)\Properties\AssemblyInfo.cs" + mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\MODI*.dll" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*" +mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" + + \ No newline at end of file diff --git a/Greenshot-OCR-Plugin/Language.cs b/Greenshot-OCR-Plugin/Language.cs new file mode 100644 index 000000000..90788ff70 --- /dev/null +++ b/Greenshot-OCR-Plugin/Language.cs @@ -0,0 +1,47 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Diagnostics; +using System.Globalization; +using System.Resources; +using System.Threading; + +using GreenshotPlugin.Core; + +namespace GreenshotOCR { + /// + /// Wrapper for the language container for the Jira plugin. + /// + public class Language : LanguageContainer, ILanguage { + private static ILanguage uniqueInstance; + private const string LANGUAGE_FILENAME_PATTERN = @"language_ocrplugin-*.xml"; + + public static ILanguage GetInstance() { + if(uniqueInstance == null) { + uniqueInstance = new LanguageContainer(); + uniqueInstance.LanguageFilePattern = LANGUAGE_FILENAME_PATTERN; + uniqueInstance.Load(); + uniqueInstance.SetLanguage(Thread.CurrentThread.CurrentUICulture.Name); + } + return uniqueInstance; + } + } +} diff --git a/Greenshot-OCR-Plugin/LanguageKeys.cs b/Greenshot-OCR-Plugin/LanguageKeys.cs new file mode 100644 index 000000000..608cd638a --- /dev/null +++ b/Greenshot-OCR-Plugin/LanguageKeys.cs @@ -0,0 +1,29 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace GreenshotOCR { + public enum LangKey { + language, + orient_image, + straighten_image + } +} diff --git a/Greenshot-OCR-Plugin/Languages/language_ocrplugin-de-DE.xml b/Greenshot-OCR-Plugin/Languages/language_ocrplugin-de-DE.xml new file mode 100644 index 000000000..1cf74afca --- /dev/null +++ b/Greenshot-OCR-Plugin/Languages/language_ocrplugin-de-DE.xml @@ -0,0 +1,14 @@ + + + + + Sprache für OCR + + + Bild Orientieren + + + Bild Aufrichten + + + \ No newline at end of file diff --git a/Greenshot-OCR-Plugin/Languages/language_ocrplugin-en-US.xml b/Greenshot-OCR-Plugin/Languages/language_ocrplugin-en-US.xml new file mode 100644 index 000000000..9bdb7fda1 --- /dev/null +++ b/Greenshot-OCR-Plugin/Languages/language_ocrplugin-en-US.xml @@ -0,0 +1,14 @@ + + + + + Language for OCR + + + Orient image + + + Straighten image + + + \ No newline at end of file diff --git a/Greenshot-OCR-Plugin/Languages/language_ocrplugin-nl-NL.xml b/Greenshot-OCR-Plugin/Languages/language_ocrplugin-nl-NL.xml new file mode 100644 index 000000000..c60f48524 --- /dev/null +++ b/Greenshot-OCR-Plugin/Languages/language_ocrplugin-nl-NL.xml @@ -0,0 +1,14 @@ + + + + + Taal voor OCR + + + Beeld richten + + + Beeld vereffenen + + + \ No newline at end of file diff --git a/Greenshot-OCR-Plugin/OCRPlugin.cs b/Greenshot-OCR-Plugin/OCRPlugin.cs new file mode 100644 index 000000000..8917ed043 --- /dev/null +++ b/Greenshot-OCR-Plugin/OCRPlugin.cs @@ -0,0 +1,322 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Reflection; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Windows.Forms; + +using Greenshot.Plugin; +using GreenshotPlugin.Core; +using Microsoft.Win32; + +namespace GreenshotOCR { + /// + /// OCR Plugin Greenshot + /// + public class OcrPlugin : IGreenshotPlugin { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OcrPlugin)); + private const string CONFIG_FILENAME = "ocr-config.properties"; + + private const string MODI_OFFICE11 = @"Software\Microsoft\Office\11.0\MODI"; + private const string MODI_OFFICE12 = @"Software\Microsoft\Office\12.0\MODI"; + + private IGreenshotPluginHost host; + private ICaptureHost captureHost = null; + private PluginAttribute myAttributes; + private Properties config = new Properties(); + + public OcrPlugin() { } + + /// + /// Implementation of the IGreenshotPlugin.Initialize + /// + /// Use the IGreenshotPluginHost interface to register events + /// Use the ICaptureHost interface to register in the MainContextMenu + /// My own attributes + public void Initialize(IGreenshotPluginHost host, ICaptureHost captureHost, PluginAttribute myAttributes) { + LOG.Debug("Initialize called of " + myAttributes.Name); + this.host = (IGreenshotPluginHost)host; + this.captureHost = captureHost; + this.myAttributes = myAttributes; + + // Make sure the MODI-DLLs are found by adding a resolver + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyAssemblyResolver); + + if (!HasMODI()) { + LOG.Warn("No MODI found!"); + return; + } + LoadConfig(); + this.host.RegisterHotKey(3, 0x2C, new HotKeyHandler(MyHotkeyHandler)); + + // Here we can hang ourselves to the main context menu! + ToolStripMenuItem item = new ToolStripMenuItem(); + item.Text = "Region OCR"; + item.ShortcutKeyDisplayString = "Ctrl + Alt + Print"; + item.Click += new System.EventHandler(MainMenuClick); + + ContextMenuStrip contextMenu = host.MainMenu; + bool addedItem = false; + + for(int i=0; i < contextMenu.Items.Count; i++) { + if (contextMenu.Items[i].GetType() == typeof(ToolStripSeparator)) { + contextMenu.Items.Insert(i, item); + addedItem = true; + break; + } + } + if (!addedItem) { + contextMenu.Items.Add(item); + } + } + + /// + /// Implementation of the IGreenshotPlugin.Shutdown + /// + public void Shutdown() { + LOG.Debug("Shutdown of " + myAttributes.Name); + } + + /// + /// Implementation of the IPlugin.Configure + /// + public virtual void Configure() { + if (!HasMODI()) { + MessageBox.Show("Sorry, is seems that Microsoft Office Document Imaging (MODI) is not installed, therefor the OCR Plugin cannot work."); + return; + } + SettingsForm settingsForm = new SettingsForm(GetLanguages(),config); + DialogResult result = settingsForm.ShowDialog(); + if (result == DialogResult.OK) { + config.ChangeProperty("language", settingsForm.OCRLanguage); + config.ChangeBoolProperty("orientImage", settingsForm.OrientImage); + config.ChangeBoolProperty("straightenImage", settingsForm.StraightenImage);; + SaveConfig(); + } + } + + /// + /// This method helps to resolve the MODI DLL files + /// + /// object which is starting the resolve + /// ResolveEventArgs describing the Assembly that needs to be found + /// + private Assembly MyAssemblyResolver(object sender, ResolveEventArgs args) { + string dllPath = Path.GetDirectoryName(myAttributes.DllFile); + string dllFilename = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll"; + LOG.Debug("Resolving: " + dllFilename); + if (dllFilename.StartsWith("MODI")) { + return Assembly.LoadFile(Path.Combine(dllPath, dllFilename)); + } + return null; + } + + private void LoadConfig() { + string filename = Path.Combine(host.ConfigurationPath, CONFIG_FILENAME); + if (File.Exists(filename)) { + LOG.Debug("Loading configuration from: " + filename); + config = Properties.read(filename); + } + bool changed = false; + if (config == null) { + config = new Properties(); + changed = true; + } + if (!config.ContainsKey("language")) { + config.AddProperty("language", "miLANG_ENGLISH"); + changed = true; + } + if (!config.ContainsKey("straightenImage")) { + config.AddBoolProperty("straightenImage", false); + changed = true; + } + if (!config.ContainsKey("orientImage")) { + config.AddBoolProperty("orientImage", false); + changed = true; + } + if (changed) { + SaveConfig(); + } + + } + + private void SaveConfig() { + string filename = Path.Combine(host.ConfigurationPath, CONFIG_FILENAME); + LOG.Debug("Saving configuration to: " + filename); + config.write(filename, "# The configuration file for the Greenshot OCR Plugin"); + } + + private void StartOCRRegion() { + LOG.Debug("Starting OCR!"); + captureHost.MakeCapture(CaptureMode.Region, false, new CaptureHandler(DoOCR)); + } + + private void MyHotkeyHandler() { + StartOCRRegion(); + } + /// + /// Is called when the OCR menu is selected + /// + /// ContextMenu + /// EventArgs from ContextMenu + private void MainMenuClick(object sender, EventArgs e) { + StartOCRRegion(); + } + + /// + /// Handling of the CaptureTaken "event" from the ICaptureHost + /// We do the OCR here! + /// + /// Has the Image and the capture details + private const int MIN_WIDTH = 130; + private const int MIN_HEIGHT = 130; + private void DoOCR(object sender, CaptureTakenEventArgs eventArgs) { + if (eventArgs.Capture.Image == null) { + return; + } + string file = host.GetFilename("bmp", eventArgs.Capture.CaptureDetails); + string filePath = Path.Combine(Path.GetTempPath(),file); + + using (FileStream stream = File.Create(filePath)) { + Image capturedImage = eventArgs.Capture.Image; + if (capturedImage.Width < MIN_WIDTH || capturedImage.Height < MIN_HEIGHT) { + LOG.Debug("Image not big enough, copying to bigger image"); + int newWidth = Math.Max(capturedImage.Width, MIN_WIDTH); + int newHeight = Math.Max(capturedImage.Height, MIN_HEIGHT); + using (Image tmpImage = new Bitmap(newWidth, newHeight, capturedImage.PixelFormat)) { + using (Graphics graphics = Graphics.FromImage(tmpImage)) { + graphics.Clear(Color.White); + graphics.DrawImage(capturedImage, Point.Empty); + } + host.SaveToStream(tmpImage, stream, "bmp", 100); + } + } else { + host.SaveToStream(capturedImage, stream, "bmp", 100); + } + } + + LOG.Debug("Saved tmp file to: " + filePath); + + string text = ""; + + try { + + switch (CheckModiVersion()) { + case ModiVersion.MODI11: + // Instantiate the MODI.Document object + MODI11.Document modi11Document = new MODI11.Document(); + // The Create method grabs the picture from disk snd prepares for OCR. + modi11Document.Create(filePath); + + // Add progress bar here: + //md.OnOCRProgress += ; + + // Do the OCR. + modi11Document.OCR((MODI11.MiLANGUAGES)Enum.Parse(typeof(MODI11.MiLANGUAGES), config.GetProperty("language")), config.GetBoolProperty("orientImage"), config.GetBoolProperty("straightenImage")); + // Get the first (and only image) + MODI11.Image modi11Image = (MODI11.Image)modi11Document.Images[0]; + // Get the layout. + MODI11.Layout modi11layout = modi11Image.Layout; + text = modi11layout.Text; + // Close the MODI.Document object. + modi11Document.Close(false); + break; + case ModiVersion.MODI12: + // Instantiate the MODI.Document object + MODI12.Document modi12Document = new MODI12.Document(); + // The Create method grabs the picture from disk snd prepares for OCR. + modi12Document.Create(filePath); + + // Add progress bar here: + //md.OnOCRProgress += ; + + // Do the OCR. + modi12Document.OCR((MODI12.MiLANGUAGES)Enum.Parse(typeof(MODI12.MiLANGUAGES), config.GetProperty("language")), config.GetBoolProperty("orientImage"), config.GetBoolProperty("straightenImage")); + // Get the first (and only image) + MODI12.Image modi12Image = (MODI12.Image)modi12Document.Images[0]; + // Get the layout. + MODI12.Layout modi12layout = modi12Image.Layout; + text = modi12layout.Text; + // Close the MODI.Document object. + modi12Document.Close(false); + break; + default: + LOG.Error("Unknown MODI version!"); + break; + } + + // Paste to Clipboard (the Plugin currently doesn't have access to the ClipboardHelper from Greenshot + IDataObject ido = new DataObject(); + ido.SetData(DataFormats.Text, true, text); + Clipboard.SetDataObject(ido, true); + } catch (Exception e) { + string message = "A problem occured while trying to OCR the region, this plugin is still in a experimental stage!!"; + LOG.Error(message, e); + MessageBox.Show(message); + } finally { + if (File.Exists(filePath)) { + LOG.Debug("Cleaning up tmp file: " + filePath); + File.Delete(filePath); + } + } + } + + private string [] GetLanguages() { + string [] languages = null; + switch (CheckModiVersion()) { + case ModiVersion.MODI11: + languages = Enum.GetNames(typeof(MODI11.MiLANGUAGES)); + break; + case ModiVersion.MODI12: + languages =Enum.GetNames(typeof(MODI12.MiLANGUAGES)); + break; + } + return languages; + } + + private enum ModiVersion { None, MODI11, MODI12 }; + + private ModiVersion CheckModiVersion() { + using (RegistryKey key = Registry.CurrentUser.OpenSubKey(MODI_OFFICE11, false)) { + if (key != null) { + LOG.Debug("Found Modi V11 in registry: " + key.Name); + return ModiVersion.MODI11; + } + } + using (RegistryKey key = Registry.CurrentUser.OpenSubKey(MODI_OFFICE12, false)) { + if (key != null) { + LOG.Debug("Found Modi V12 in registry: " + key.Name); + return ModiVersion.MODI12; + } + } + return ModiVersion.None; + } + + private bool HasMODI() { + return CheckModiVersion() != ModiVersion.None; + } + } +} \ No newline at end of file diff --git a/Greenshot-OCR-Plugin/Properties/AssemblyInfo.cs.template b/Greenshot-OCR-Plugin/Properties/AssemblyInfo.cs.template new file mode 100644 index 000000000..2e833d825 --- /dev/null +++ b/Greenshot-OCR-Plugin/Properties/AssemblyInfo.cs.template @@ -0,0 +1,54 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#region Using directives + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Plugin; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GreenshotOCR")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GreenshotOCR")] +[assembly: AssemblyCopyright("Copyright 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// The PluginAttribute describes the "entryType" and if the plugin is configurable +[assembly: PluginAttribute("GreenshotOCR.OcrPlugin", true)] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all the values or you can use the default the Revision and +// Build Numbers by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.$WCREV$")] diff --git a/Greenshot-OCR-Plugin/SettingsForm.Designer.cs b/Greenshot-OCR-Plugin/SettingsForm.Designer.cs new file mode 100644 index 000000000..005b98d3a --- /dev/null +++ b/Greenshot-OCR-Plugin/SettingsForm.Designer.cs @@ -0,0 +1,138 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace GreenshotOCR +{ + partial class SettingsForm + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.comboBox_languages = new System.Windows.Forms.ComboBox(); + this.checkBox_orientImage = new System.Windows.Forms.CheckBox(); + this.checkBox_straightenImage = new System.Windows.Forms.CheckBox(); + this.label_language = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // comboBox_languages + // + this.comboBox_languages.FormattingEnabled = true; + this.comboBox_languages.Items.AddRange(new object[] { + "English", + "Deutsch"}); + this.comboBox_languages.Location = new System.Drawing.Point(74, 12); + this.comboBox_languages.Name = "comboBox_languages"; + this.comboBox_languages.Size = new System.Drawing.Size(153, 21); + this.comboBox_languages.TabIndex = 0; + // + // checkBox_orientImage + // + this.checkBox_orientImage.Location = new System.Drawing.Point(13, 41); + this.checkBox_orientImage.Name = "checkBox_orientImage"; + this.checkBox_orientImage.Size = new System.Drawing.Size(104, 24); + this.checkBox_orientImage.TabIndex = 1; + this.checkBox_orientImage.Text = "Orient image"; + this.checkBox_orientImage.UseVisualStyleBackColor = true; + // + // checkBox_straightenImage + // + this.checkBox_straightenImage.Location = new System.Drawing.Point(123, 41); + this.checkBox_straightenImage.Name = "checkBox_straightenImage"; + this.checkBox_straightenImage.Size = new System.Drawing.Size(109, 24); + this.checkBox_straightenImage.TabIndex = 2; + this.checkBox_straightenImage.Text = "Straighten image"; + this.checkBox_straightenImage.UseVisualStyleBackColor = true; + // + // label_language + // + this.label_language.Location = new System.Drawing.Point(13, 15); + this.label_language.Name = "label_language"; + this.label_language.Size = new System.Drawing.Size(55, 23); + this.label_language.TabIndex = 3; + this.label_language.Text = "Language"; + // + // buttonOK + // + this.buttonOK.Location = new System.Drawing.Point(13, 72); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(104, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.ButtonOKClick); + // + // buttonCancel + // + this.buttonCancel.Location = new System.Drawing.Point(123, 72); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(104, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // SettingsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(244, 111); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.label_language); + this.Controls.Add(this.checkBox_straightenImage); + this.Controls.Add(this.checkBox_orientImage); + this.Controls.Add(this.comboBox_languages); + this.Name = "SettingsForm"; + this.Text = "SettingsForm"; + this.ResumeLayout(false); + } + private System.Windows.Forms.Label label_language; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.CheckBox checkBox_orientImage; + private System.Windows.Forms.CheckBox checkBox_straightenImage; + private System.Windows.Forms.ComboBox comboBox_languages; + } +} diff --git a/Greenshot-OCR-Plugin/SettingsForm.cs b/Greenshot-OCR-Plugin/SettingsForm.cs new file mode 100644 index 000000000..5b481c21e --- /dev/null +++ b/Greenshot-OCR-Plugin/SettingsForm.cs @@ -0,0 +1,99 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +using GreenshotPlugin.Core; + +namespace GreenshotOCR { + /// + /// Description of SettingsForm. + /// + public partial class SettingsForm : Form { + private ILanguage language = Language.GetInstance(); + private string selectedLanguage; + private bool orientImage; + private bool straightenImage; + + public SettingsForm(string [] languages, Properties config) { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + language.SynchronizeLanguageToCulture(); + initializeComponentText(); + + comboBox_languages.Items.Clear(); + int index=0; + foreach(string availableLanguage in languages) { + string displayLanguage = cleanLanguage(availableLanguage); + comboBox_languages.Items.Add(displayLanguage); + if (availableLanguage.Equals(config["language"])) { + comboBox_languages.SelectedIndex = index; + } + index++; + } + checkBox_orientImage.Checked = config.GetBoolProperty("orientImage"); + checkBox_straightenImage.Checked = config.GetBoolProperty("straightenImage"); + } + private void initializeComponentText() { + this.label_language.Text = language.GetString(LangKey.language); + this.checkBox_orientImage.Text = language.GetString(LangKey.orient_image); + } + + private string cleanLanguage(string suppliedLanguage) { + string displayLanguage = ""; + if (suppliedLanguage != null) { + displayLanguage = suppliedLanguage.Replace("miLANG_","").Replace("_"," "); + displayLanguage = displayLanguage.Substring(0, 1).ToUpper() + displayLanguage.Substring(1).ToLower(); + } + return displayLanguage; + } + + public string OCRLanguage { + get {return selectedLanguage;} + } + public bool OrientImage { + get {return orientImage;} + } + public bool StraightenImage { + get {return straightenImage;} + } + + void ButtonCancelClick(object sender, EventArgs e) { + DialogResult = DialogResult.Cancel; + } + + void ButtonOKClick(object sender, EventArgs e) { + string selectedString = (string) comboBox_languages.SelectedItem; + if (selectedString != null) { + selectedLanguage = "miLANG_" + selectedString.ToUpper().Replace(" ", "_"); + } + orientImage = checkBox_orientImage.Checked; + straightenImage = checkBox_straightenImage.Checked; + + DialogResult = DialogResult.OK; + + } + } +} diff --git a/Greenshot-OCR-Plugin/lib/GEN.BAT b/Greenshot-OCR-Plugin/lib/GEN.BAT new file mode 100644 index 000000000..9d6898394 --- /dev/null +++ b/Greenshot-OCR-Plugin/lib/GEN.BAT @@ -0,0 +1,2 @@ +tlbimp Office12\MDIVWCTL.DLL /namespace:MODI12 /out:MODI12.dll +tlbimp Office11\MDIVWCTL.DLL /namespace:MODI11 /out:MODI11.dll \ No newline at end of file diff --git a/Greenshot-OCR-Plugin/lib/MODI11.dll b/Greenshot-OCR-Plugin/lib/MODI11.dll new file mode 100644 index 0000000000000000000000000000000000000000..ce731f96525fd7d1f368f1cddfe610e5db6163a4 GIT binary patch literal 45056 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 R12Y+z$-qno{{PIt{{UI3ldS*% literal 0 HcmV?d00001 diff --git a/Greenshot-OCR-Plugin/lib/MODI12.dll b/Greenshot-OCR-Plugin/lib/MODI12.dll new file mode 100644 index 0000000000000000000000000000000000000000..ce03e65a3171aa4cb6f726948f2d565e73ae6971 GIT binary patch literal 45056 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%0DV;(^mzI`4pXwn$GQ&d0QH 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 z zr;XAyv@$)9B5xhLGOH-hog_)iSXow4t{Z=qqPbZ`IqqjrZ=5kN} zQZ@Csn!Ycs)I#t&GnaF^W#}> z2o-G>+G}|sybDA_jPMTzn$@F~447BD-ls>D2B8}1&5hh;&}BEQBXN~g39kGBuTPy$bEoJ=k+zD1>c{HDKhB8`|28ytp}2um+Q_V!ymxYS1C#r!H|q< zgE`NzAkn!ag^%$&vZiUI@DVP?W*+%1H~LR8PzQ5WYtP7%TbqY(?r0vqMhUEN6^2+} zyHLE z8eUO(WMFv9qLJ2HkL(`aQakd%R(-R6(eRdrp#viih>e$w$Gr-b_{i!>=Y^36^euO( z?jKOw1YQ{4NOPql4?L(R+w93B_M~HY%dLvqZL&oY{frb=GO&?tYIgXV;-Qy+_R8?Q zseuQEZ3tuM49}}%DBch$9MG)h9XU3#WYh2ki)g`~M8kGp>)#iCa>j7s8YXeih{ZD; z{&0Bs=J4<(O`6I~dxf72j})qC=;h(r`?YLGsBhDELFSvceb8o|Nu<^n^iUrxyzMs&?tflG34Vr7l2B}Zj&WNr9p zBs{XV_-LePWNqcqNb$(pMMongBWr7qMoLH4HXMzVjjSy_8Yv%HTfXkOGK-`zlIwkX zBv&oxMwt(wOX1sdS<%5628*Qpe*9zEy9wa(AmBS1#xy`%DkIO^=6S$&WH&O(R{%1t z_ShN2R|o>RwdM3PG>vR~kT!U0_`|?D&u(O?Gtac*SC8v^J4R6}*h@et7npse*^?jZOB3UuTOI-Qd@$?`UUrS#S?PhG*Z(gP-m8JLE)4 zp*c;@uh=}r$)$Ozn*D?InBS&uPhd|@w1Q6yekHYAO#-1j3~W!eR5ud(s)U4Xk>aB~ z3XZJr82bogmOX${N7qwgK+gkoFu$?1rg4&

kAmaZd7d5?8=J%P1| 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

=lb8O5#N~5eHtsv+Jb3k; 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%0Aa0tZ#xd0mBs7gZdYBF)}jZm3MIS@(<*& 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

C?Jx@XB#Z!hs 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 QyI)}9l!iTLI2io@2RvS>UH||9 literal 0 HcmV?d00001 diff --git a/Greenshot-RunAtOutput-Plugin/Configuration.cs b/Greenshot-RunAtOutput-Plugin/Configuration.cs new file mode 100644 index 000000000..2919f8872 --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/Configuration.cs @@ -0,0 +1,66 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Xml; +using System.Xml.Serialization; + +namespace RunAtOutput { + /// + /// Description of Configuration. + /// + [XmlRoot("RunAtOutput")] + public class Configuration { + public Configuration() { + Commands = new List(); + } + [XmlElement("Commando")] + public List Commands { + get; + set; + } + } + + public class Commando { + public Commando() { + } + [XmlAttribute("Name")] + public string Name { + get; + set; + } + [XmlElement("Commandline")] + public string Commandline { + get; + set; + } + [XmlElement("Arguments")] + public string Arguments { + get; + set; + } + [XmlAttribute("Active")] + public bool Active{ + get; + set; + } + } +} diff --git a/Greenshot-RunAtOutput-Plugin/Greenshot-RunAtOutput-Plugin.csproj b/Greenshot-RunAtOutput-Plugin/Greenshot-RunAtOutput-Plugin.csproj new file mode 100644 index 000000000..03bfc7759 --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/Greenshot-RunAtOutput-Plugin.csproj @@ -0,0 +1,73 @@ + + + {47F23C86-604E-4CC3-8767-B3D4088F30BB} + Debug + x86 + Library + Greenshot_RunAtOutput_Plugin + Greenshot-RunAtOutput-Plugin + v2.0 + Properties + C:\Users\Robin\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis + False + False + 4 + false + OnBuildSuccess + + + x86 + False + Auto + 4194304 + 4096 + + + bin\Debug\ + true + Full + False + True + DEBUG;TRACE + + + bin\Release\ + False + None + True + False + TRACE + + + + + ..\Greenshot\Lib\log4net.dll + + + + + + + + + + + + + SettingsForm.cs + + + + + + "$(SolutionDir)\tools\TortoiseSVN\SubWCRev.exe" "$(ProjectDir)\" "$(ProjectDir)\Properties\AssemblyInfo.cs.template" "$(ProjectDir)\Properties\AssemblyInfo.cs" + mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" + + + + {5B924697-4DCD-4F98-85F1-105CB84B7341} + GreenshotPlugin + + + \ No newline at end of file diff --git a/Greenshot-RunAtOutput-Plugin/Properties/AssemblyInfo.cs.template b/Greenshot-RunAtOutput-Plugin/Properties/AssemblyInfo.cs.template new file mode 100644 index 000000000..a088e1b28 --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/Properties/AssemblyInfo.cs.template @@ -0,0 +1,53 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#region Using directives + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Plugin; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Greenshot-RunAtOutput-Plugin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Greenshot-RunAtOutput-Plugin")] +[assembly: AssemblyCopyright("Copyright 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: PluginAttribute("RunAtOutput.RunAtOutputPlugin", true)] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all the values or you can use the default the Revision and +// Build Numbers by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.$WCREV$")] diff --git a/Greenshot-RunAtOutput-Plugin/RunAtOutput.cs b/Greenshot-RunAtOutput-Plugin/RunAtOutput.cs new file mode 100644 index 000000000..e0b1e9c07 --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/RunAtOutput.cs @@ -0,0 +1,125 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; + +using Greenshot.Plugin; + +namespace RunAtOutput { + /// + /// An Plugin to run commands after an image was written + /// + public class RunAtOutputPlugin : IGreenshotPlugin { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(RunAtOutputPlugin)); + private IGreenshotPluginHost host; + private ICaptureHost captureHost = null; + private PluginAttribute myAttributes; + private Configuration config = new Configuration(); + + public RunAtOutputPlugin() { + } + + /// + /// Implementation of the IGreenshotPlugin.Initialize + /// + /// Use the IGreenshotPluginHost interface to register events + /// Use the ICaptureHost interface to register in the MainContextMenu + /// My own attributes + public virtual void Initialize(IGreenshotPluginHost pluginHost, ICaptureHost captureHost, PluginAttribute myAttributes) { + LOG.Debug("Initialize called of " + myAttributes.Name); + + this.host = (IGreenshotPluginHost)pluginHost; + this.captureHost = captureHost; + this.myAttributes = myAttributes; + this.host.OnImageOutput += new OnImageOutputHandler(ImageOutput); + + LoadConfig(); + } + + public virtual void Shutdown() { + LOG.Debug("Shutdown of " + myAttributes.Name); + this.host.OnImageOutput -= new OnImageOutputHandler(ImageOutput); + } + + /// + /// Implementation of the IPlugin.Configure + /// + public virtual void Configure() { + LOG.Debug("Configure called"); + SettingsForm settingsForm = new SettingsForm(config); + if (settingsForm.ShowDialog() == DialogResult.OK) { + SaveConfig(); + } + settingsForm.Dispose(); + } + + private void LoadConfig() { + XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration)); + string filename = Path.Combine(host.ConfigurationPath, "RunAtOutputPlugin.xml"); + if (File.Exists(filename)) { + using (TextReader reader = new StreamReader(filename)) { + config = (Configuration)xmlSerializer.Deserialize(reader); + } + } + } + + private void SaveConfig() { + XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration)); + string filename = Path.Combine(host.ConfigurationPath, "RunAtOutputPlugin.xml"); + using (TextWriter writer = new StreamWriter(filename)) { + xmlSerializer.Serialize(writer, config); + } + } + + /// + /// Handling of the OnImageOutputHandler event from the IGreenshotPlugin + /// + /// Has the FullPath to the image + private void ImageOutput(object sender, ImageOutputEventArgs eventArgs) { + LOG.Debug("ImageOutput called with full path: " + eventArgs.FullPath); + foreach(Commando commando in config.Commands) { + if (commando.Active) { + if (commando.Commandline != null && commando.Commandline.Length > 0) { + Process p = new Process(); + p.StartInfo.FileName = commando.Commandline; + p.StartInfo.Arguments = String.Format(commando.Arguments, eventArgs.FullPath); + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + LOG.Info("Starting : " + p.StartInfo.FileName + " " + p.StartInfo.Arguments); + p.Start(); + string output = p.StandardOutput.ReadToEnd(); + if (output != null && output.Trim().Length > 0) { + LOG.Info("Output:\n" + output); + } + LOG.Info("Finished : " + p.StartInfo.FileName + " " + p.StartInfo.Arguments); + } + } + } + } + } +} \ No newline at end of file diff --git a/Greenshot-RunAtOutput-Plugin/SettingsForm.Designer.cs b/Greenshot-RunAtOutput-Plugin/SettingsForm.Designer.cs new file mode 100644 index 000000000..f3bde520e --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/SettingsForm.Designer.cs @@ -0,0 +1,211 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace RunAtOutput { + partial class SettingsForm { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.textBox_commandline = new System.Windows.Forms.TextBox(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOk = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox_arguments = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox_name = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // textBox_commandline + // + this.textBox_commandline.Location = new System.Drawing.Point(229, 245); + this.textBox_commandline.Name = "textBox_commandline"; + this.textBox_commandline.Size = new System.Drawing.Size(184, 20); + this.textBox_commandline.TabIndex = 2; + // + // buttonCancel + // + this.buttonCancel.Location = new System.Drawing.Point(339, 302); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 7; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + this.buttonCancel.Click += new System.EventHandler(this.ButtonCancelClick); + // + // buttonOk + // + this.buttonOk.Location = new System.Drawing.Point(258, 302); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 6; + this.buttonOk.Text = "OK"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.ButtonOkClick); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(153, 248); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(56, 17); + this.label1.TabIndex = 3; + this.label1.Text = "Command"; + // + // textBox_arguments + // + this.textBox_arguments.Location = new System.Drawing.Point(229, 271); + this.textBox_arguments.Name = "textBox_arguments"; + this.textBox_arguments.Size = new System.Drawing.Size(184, 20); + this.textBox_arguments.TabIndex = 3; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(153, 274); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(70, 17); + this.label2.TabIndex = 5; + this.label2.Text = "Arguments"; + // + // listView1 + // + this.listView1.CheckBoxes = true; + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.listView1.FullRowSelect = true; + this.listView1.Location = new System.Drawing.Point(13, 13); + this.listView1.MultiSelect = false; + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(400, 183); + this.listView1.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.ListView1ItemChecked); + this.listView1.SelectedIndexChanged += new System.EventHandler(this.ListView1ItemSelectionChanged); + // + // columnHeader1 + // + this.columnHeader1.Text = "Active"; + // + // columnHeader2 + // + this.columnHeader2.Text = "Name"; + this.columnHeader2.Width = 311; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(13, 202); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 4; + this.button1.Text = "Add"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.ButtonAddClick); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 231); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 5; + this.button2.Text = "Delete"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.ButtonDeleteClick); + // + // label3 + // + this.label3.Location = new System.Drawing.Point(154, 222); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(56, 17); + this.label3.TabIndex = 10; + this.label3.Text = "Name"; + // + // textBox_name + // + this.textBox_name.Location = new System.Drawing.Point(230, 219); + this.textBox_name.Name = "textBox_name"; + this.textBox_name.Size = new System.Drawing.Size(184, 20); + this.textBox_name.TabIndex = 1; + // + // SettingsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(426, 336); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox_name); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.listView1); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox_arguments); + this.Controls.Add(this.label1); + this.Controls.Add(this.buttonOk); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.textBox_commandline); + this.Name = "SettingsForm"; + this.Text = "Command Editor"; + this.ResumeLayout(false); + this.PerformLayout(); + } + private System.Windows.Forms.TextBox textBox_name; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.TextBox textBox_arguments; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox_commandline; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.Button buttonCancel; + } +} diff --git a/Greenshot-RunAtOutput-Plugin/SettingsForm.cs b/Greenshot-RunAtOutput-Plugin/SettingsForm.cs new file mode 100644 index 000000000..258f66fa7 --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/SettingsForm.cs @@ -0,0 +1,98 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace RunAtOutput { + /// + /// Description of SettingsForm. + /// + public partial class SettingsForm : Form { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SettingsForm)); + private Configuration config; + + public SettingsForm(Configuration config) { + this.config = config; + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + UpdateView(); + } + + void ButtonOkClick(object sender, EventArgs e) { + DialogResult = DialogResult.OK; + } + + void ButtonCancelClick(object sender, EventArgs e) { + DialogResult = DialogResult.Cancel; + } + + void ShowSelectedItem() { + foreach ( ListViewItem item in listView1.SelectedItems ) { + Commando commando = item.Tag as Commando; + textBox_arguments.Text = commando.Arguments; + textBox_commandline.Text = commando.Commandline; + textBox_name.Text = commando.Name; + } + } + + void ButtonAddClick(object sender, EventArgs e) { + Commando commando = new Commando(); + commando.Arguments = textBox_arguments.Text; + commando.Commandline = textBox_commandline.Text; + commando.Name = textBox_name.Text; + config.Commands.Add(commando); + UpdateView(); + } + + void ButtonDeleteClick(object sender, EventArgs e) { + foreach ( ListViewItem item in listView1.SelectedItems ) { + Commando commando = item.Tag as Commando; + config.Commands.Remove(commando); + } + UpdateView(); + } + + void UpdateView() { + listView1.Items.Clear(); + foreach(Commando commando in config.Commands) { + ListViewItem item = new ListViewItem(""); + item.SubItems.Add(commando.Name); + item.Checked = commando.Active; + item.Tag = commando; + listView1.Items.Add(item); + } + } + + + void ListView1ItemSelectionChanged(object sender, EventArgs e) { + ShowSelectedItem(); + } + + void ListView1ItemChecked(object sender, ItemCheckedEventArgs e) { + Commando commando = e.Item.Tag as Commando; + LOG.Debug("ItemChecked " + commando.Name + " to " + e.Item.Checked); + commando.Active = e.Item.Checked; + } + } +} diff --git a/Greenshot-RunAtOutput-Plugin/runatoutput.properties b/Greenshot-RunAtOutput-Plugin/runatoutput.properties new file mode 100644 index 000000000..826cb81e5 --- /dev/null +++ b/Greenshot-RunAtOutput-Plugin/runatoutput.properties @@ -0,0 +1,4 @@ +active=OptiPNG,Paint.NET +command.Paint.NET=C:\Programme\Paint.NET\PaintDotNet.exe {0} +pattern.OptiPNG=*.png +command.OptiPNG=D:\05018085\downloads\optipng-0.6.4-exe\optipng.exe {0} diff --git a/Greenshot-TitleFix-Plugin/FixTitle.cs b/Greenshot-TitleFix-Plugin/FixTitle.cs new file mode 100644 index 000000000..4a88196df --- /dev/null +++ b/Greenshot-TitleFix-Plugin/FixTitle.cs @@ -0,0 +1,127 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +using Greenshot.Plugin; +using GreenshotPlugin.Core; + +namespace FixTitle { + /// + /// An example Plugin so developers can see how they can develop their own plugin + /// + public class FixTitle : IGreenshotPlugin { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(FixTitle)); + private const string CONFIG_FILE_NAME = "titlefix.properties"; + private const string ACTIVE_PROPERTY = "active"; + private const string REGEXP_PROPERTY = ".regexp"; + private const string REPLACE_PROPERTY = ".replace"; + + private IGreenshotPluginHost host; + private ICaptureHost captureHost = null; + private PluginAttribute myAttributes; + private Properties config = null; + + public FixTitle() { + } + + /// + /// Implementation of the IGreenshotPlugin.Initialize + /// + /// Use the IGreenshotPluginHost interface to register events + /// Use the ICaptureHost interface to register in the MainContextMenu + /// My own attributes + public virtual void Initialize(IGreenshotPluginHost pluginHost, ICaptureHost captureHost, PluginAttribute myAttributes) { + LOG.Debug("Initialize called of " + myAttributes.Name); + + this.host = (IGreenshotPluginHost)pluginHost; + this.captureHost = captureHost; + this.myAttributes = myAttributes; + + LoadConfig(); + + if (config != null) { + this.host.OnCaptureTaken += new OnCaptureTakenHandler(CaptureTaken); + } else { + LOG.Warn("Not registering FixTitle plugin due to missing configuration"); + } + + } + + public virtual void Shutdown() { + LOG.Debug("Shutdown of " + myAttributes.Name); + this.host.OnCaptureTaken -= new OnCaptureTakenHandler(CaptureTaken); + } + + /// + /// Implementation of the IPlugin.Configure + /// + public virtual void Configure() { + LOG.Debug("Configure called"); + } + + /// + /// Implementation of the OnCaptureTaken event + /// + private void CaptureTaken(object sender, CaptureTakenEventArgs eventArgs) { + string title = eventArgs.Capture.CaptureDetails.Title; + LOG.Debug("Title before: " + title); + if (title != null && title.Length > 0) { + title = title.Trim(); + foreach(string titleIdentifier in config.GetPropertyAsArray(ACTIVE_PROPERTY)) { + string regexpString = config.GetProperty(titleIdentifier + REGEXP_PROPERTY); + string replaceString = config.GetProperty(titleIdentifier + REPLACE_PROPERTY); + if (regexpString != null && regexpString.Length > 0) { + Regex regex = new Regex(regexpString); + title = regex.Replace(title, replaceString); + } + } + } + LOG.Debug("Title after: " + title); + eventArgs.Capture.CaptureDetails.Title = title; + } + + private void LoadConfig() { + string configfilename = Path.Combine(host.ConfigurationPath, CONFIG_FILE_NAME); + if (File.Exists(configfilename)) { + config = Properties.read(configfilename); + } else { + config = new Properties(); + } + // Check if we have a configuration + if (!config.ContainsKey(ACTIVE_PROPERTY)) { + // Create default with FireFox + config.AddProperty("Firefox"+REGEXP_PROPERTY, " - Mozilla Firefox.*"); + config.AddProperty("Firefox"+REPLACE_PROPERTY, ""); + // and IE + config.AddProperty("IE"+REGEXP_PROPERTY, " - Microsoft Internet Explorer.*"); + config.AddProperty("IE"+REPLACE_PROPERTY, ""); + // Activate both + config.AddProperty(ACTIVE_PROPERTY, "IE,Firefox"); + config.write(configfilename); + } + } + } +} \ No newline at end of file diff --git a/Greenshot-TitleFix-Plugin/Greenshot-TitleFix-Plugin.csproj b/Greenshot-TitleFix-Plugin/Greenshot-TitleFix-Plugin.csproj new file mode 100644 index 000000000..938eac514 --- /dev/null +++ b/Greenshot-TitleFix-Plugin/Greenshot-TitleFix-Plugin.csproj @@ -0,0 +1,66 @@ + + + {0A07500E-7404-48D7-8789-7EB2A23E0DD5} + Debug + x86 + Library + Greenshot_TitleFix_Plugin + Greenshot-TitleFix-Plugin + v2.0 + Properties + C:\Dokumente und Einstellungen\05018085\Anwendungsdaten\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis + False + False + 4 + false + OnBuildSuccess + + + x86 + False + Auto + 4194304 + 4096 + + + bin\Debug\ + true + Full + False + True + DEBUG;TRACE + + + bin\Release\ + False + None + True + False + TRACE + + + + + ..\Greenshot\Lib\log4net.dll + + + + + + + + + + + mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" + + "$(SolutionDir)\tools\TortoiseSVN\SubWCRev.exe" "$(SolutionDir)\" "$(ProjectDir)\Properties\AssemblyInfo.cs.template" "$(ProjectDir)\Properties\AssemblyInfo.cs" + + + + {5B924697-4DCD-4F98-85F1-105CB84B7341} + GreenshotPlugin + + + \ No newline at end of file diff --git a/Greenshot-TitleFix-Plugin/Properties/AssemblyInfo.cs.template b/Greenshot-TitleFix-Plugin/Properties/AssemblyInfo.cs.template new file mode 100644 index 000000000..ea4281eef --- /dev/null +++ b/Greenshot-TitleFix-Plugin/Properties/AssemblyInfo.cs.template @@ -0,0 +1,54 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#region Using directives + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Plugin; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Greenshot-TitleFix-Plugin")] +[assembly: AssemblyDescription("A plugin to fix captured Window Titles")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Greenshot-TitleFix-Plugin")] +[assembly: AssemblyCopyright("Copyright 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// The PluginAttribute describes the "entryType" and if the plugin is configurable +[assembly: PluginAttribute("FixTitle.FixTitle", false)] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all the values or you can use the default the Revision and +// Build Numbers by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.$WCREV$")] diff --git a/Greenshot/AssemblyInfo.cs b/Greenshot/AssemblyInfo.cs new file mode 100644 index 000000000..3aac15d4b --- /dev/null +++ b/Greenshot/AssemblyInfo.cs @@ -0,0 +1,51 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("Greenshot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Greenshot")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("0.8.0.0")] diff --git a/Greenshot/AssemblyInfo.cs.template b/Greenshot/AssemblyInfo.cs.template new file mode 100644 index 000000000..206669e41 --- /dev/null +++ b/Greenshot/AssemblyInfo.cs.template @@ -0,0 +1,51 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("Greenshot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Greenshot")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("0.8.0.$WCREV$")] diff --git a/Greenshot/Configuration/AppConfig.cs b/Greenshot/Configuration/AppConfig.cs new file mode 100644 index 000000000..f89338a03 --- /dev/null +++ b/Greenshot/Configuration/AppConfig.cs @@ -0,0 +1,320 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Reflection; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Threading; +using System.Windows.Forms; + +using Greenshot.Drawing; +using Greenshot.Drawing.Fields; +using GreenshotPlugin.Core; + +namespace Greenshot.Configuration { + public enum ScreenshotDestinations {Editor=1, FileDefault=2, FileWithDialog=4, Clipboard=8, Printer=16, EMail=32} + + /// + /// AppConfig is used for loading and saving the configuration. All public fields + /// in this class are serialized with the BinaryFormatter and then saved to the + /// config file. After loading the values from file, SetDefaults iterates over + /// all public fields an sets fields set to null to the default value. + /// + [Serializable] + public class AppConfig { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(AppConfig)); + + //private static string loc = Assembly.GetExecutingAssembly().Location; + //private static string oldFilename = Path.Combine(loc.Substring(0,loc.LastIndexOf(@"\")),"config.dat"); + private const string CONFIG_FILE_NAME = "config.dat"; + private static string configfilepath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),@"Greenshot\"); + private static AppConfig instance = null; + + public Dictionary LastUsedFieldValues = new Dictionary(); + + // the configuration part - all public vars are stored in the config file + // don't use "null" and "0" as default value! + + #region general application config + public bool? General_RegisterHotkeys = true; + public bool? General_IsFirstLaunch = true; + #endregion + + #region capture config + public bool? Capture_Mousepointer = true; + public bool? Capture_Windows_Interactive = false; + public int Capture_Wait_Time = 100; + public bool? Capture_Complete_Window = false; + public bool? Capture_Window_Content = false; + #endregion + + #region user interface config + public string Ui_Language = ""; + public bool? Ui_Effects_Flashlight = false; + public bool? Ui_Effects_CameraSound = true; + #endregion + + #region output config + public ScreenshotDestinations Output_Destinations = ScreenshotDestinations.Editor; + + + public string Output_File_Path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + public string Output_File_FilenamePattern = "%title%_%YYYY%-%MM%-%DD%_%hh%-%mm%-%ss%"; + public string Output_File_Format = ImageFormat.Png.ToString(); + public bool? Output_File_CopyPathToClipboard = false; + public int Output_File_JpegQuality = 80; + public bool? Output_File_PromptJpegQuality = false; + public int Output_File_IncrementingNumber = 1; + + public string Output_FileAs_Fullpath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"dummy.png"); + + public bool? Output_Print_PromptOptions = true; + public bool? Output_Print_AllowRotate = true; + public bool? Output_Print_AllowEnlarge = true; + public bool? Output_Print_AllowShrink = true; + public bool? Output_Print_Center = true; + public bool? Output_Print_Timestamp = true; + #endregion + + #region editor config + public Size Editor_WindowSize = new Size(540, 380); + public Point Editor_WindowLocation = new Point(100, 100); + public String Editor_WindowState = "Normal"; + public Rectangle Editor_Previous_Screenbounds = Rectangle.Empty; + public Color[] Editor_RecentColors = new Color[12]; + public Font Editor_Font = null; + + #endregion + + /// + /// a private constructor because this is a singleton + /// + private AppConfig() { + } + + /// + /// get an instance of AppConfig + /// + /// + public static AppConfig GetInstance() { + if (instance == null) { + instance = Load(); + } + return instance; + } + + public static void Reload() { + AppConfig newInstance = Load(); + instance.Copy(newInstance); + } + + /// + /// loads the configuration from the config file + /// + /// an instance of AppConfig with all values set from the config file + private static AppConfig Load() { + AppConfig conf; + CheckConfigFile(); + string configfilename = Path.Combine(configfilepath, CONFIG_FILE_NAME); + try { + LOG.Debug("Loading configuration from: " + configfilename); + using (FileStream fileStream = File.Open(configfilename, FileMode.Open, FileAccess.Read)) { + BinaryFormatter binaryFormatter = new BinaryFormatter(); + conf = (AppConfig) binaryFormatter.Deserialize(fileStream); + } + conf.SetDefaults(); + return conf; + } catch (SerializationException e) { + LOG.Error("Problem loading configuration from: " + configfilename, e); + AppConfig config = new AppConfig(); + config.Store(); + return config; + } catch (Exception e) { + LOG.Error("Problem loading configuration from: " + configfilename, e); + MessageBox.Show(String.Format("Could not load Greenshot's configuration file. Please check access permissions for '{0}'.\n",configfilename),"Error"); + Process.GetCurrentProcess().Kill(); + } + return null; + } + + /// + /// Checks for the existence of a configuration file. + /// First in greenshot's Applicationdata folder (where it is stored since 0.6), + /// then (if it cannot be found there) in greenshot's program directory (where older + /// versions might have stored it). + /// If the latter is the case, the file is moved to the new location, so that a user does not lose + /// their configuration after upgrading. + /// If there is no file in both locations, a virgin config file is created. + /// + private static void CheckConfigFile() { + // check if file is in the same location as started from, if this is the case + // we will use this file instead of the Applicationdate folder + // Done for Feature Request #2741508 + if (File.Exists(Path.Combine(Application.StartupPath, CONFIG_FILE_NAME))) { + configfilepath = Application.StartupPath; + } else if (!File.Exists(Path.Combine(configfilepath, CONFIG_FILE_NAME))) { + Directory.CreateDirectory(configfilepath); + new AppConfig().Store(); + } + } + + /// + /// saves the configuration values to the supplied config file + /// + public void Store() { + Store(configfilepath); + } + + /// + /// saves the configuration values to the config path + /// + public void Store(string configpath) { + string configfilename = Path.Combine(configpath, CONFIG_FILE_NAME); + try { + LOG.Debug("Saving configuration to: " + configfilename); + using (FileStream fileStream = File.Open(configfilename, FileMode.Create)) { + BinaryFormatter formatter = new BinaryFormatter(); + formatter.Serialize(fileStream, this); + } + } catch (UnauthorizedAccessException e) { + LOG.Error("Problem saving configuration to: " + configfilename, e); + MessageBox.Show(Language.GetInstance().GetFormattedString(LangKey.config_unauthorizedaccess_write,configfilename),Language.GetInstance().GetString(LangKey.error)); + } + } + + /// + /// when new fields are added to this class, they are instanced + /// with null by default. this method iterates over all public + /// fields and uses reflection to set them to the proper default value. + /// + public void SetDefaults() { + Type type = this.GetType(); + FieldInfo[] fieldInfos = type.GetFields(); + foreach (FieldInfo fi in fieldInfos) { + object o = fi.GetValue(this); + int i; + if (o == null || (int.TryParse(o.ToString(), out i) && i == 0)) { + // found field with value null. setting to default. + AppConfig tmpConf = new AppConfig(); + Type tmpType = tmpConf.GetType(); + FieldInfo defaultField = tmpType.GetField(fi.Name); + fi.SetValue(this, defaultField.GetValue(tmpConf)); + } + } + } + + private void Copy(AppConfig newConfig) { + Type type = this.GetType(); + + // Copy fields + FieldInfo[] fieldInfos = type.GetFields(); + foreach (FieldInfo fi in fieldInfos) { + object newValue = fi.GetValue(newConfig); + fi.SetValue(this, newValue); + } + // Update language + if (newConfig.Ui_Language != null && !newConfig.Ui_Language.Equals(Language.GetInstance().CurrentLanguage)) { + string newLang = Language.GetInstance().SetLanguage(newConfig.Ui_Language); + // check if the language was not wat was supplied (near match) + if (newConfig.Ui_Language.Equals(newLang)) { + // Store change + this.Store(); + } + } + } + + public static Properties GetAvailableProperties() { + Properties properties = new Properties(); + Type type = typeof(AppConfig); + FieldInfo[] fieldInfos = type.GetFields(); + foreach (FieldInfo fi in fieldInfos) { + Type fieldType = fi.FieldType; + if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { + // We are dealing with a generic type that is nullable + fieldType = Nullable.GetUnderlyingType(fieldType); + } + if (fieldType == typeof(string) || fieldType == typeof(bool) || fieldType == typeof(int)) { + properties.AddProperty(fi.Name, fieldType.Name); + } + } + return properties; + } + + public void SetProperties(Properties properties) { + Type type = this.GetType(); + FieldInfo[] fieldInfos = type.GetFields(); + foreach(string key in properties.Keys) { + FieldInfo currentField = type.GetField(key); + if (currentField != null) { + object currentValue = currentField.GetValue(this); + LOG.Debug("Before: " + currentField.Name + "=" + currentValue); + if (currentField.FieldType == typeof(string)) { + currentField.SetValue(this, properties.GetProperty(key)); + } else if (currentField.FieldType == typeof(bool) ||currentField.FieldType == typeof(bool?)) { + currentField.SetValue(this, properties.GetBoolProperty(key)); + } else if (currentField.FieldType == typeof(int) || currentField.FieldType == typeof(int?)) { + currentField.SetValue(this, properties.GetIntProperty(key)); + } + LOG.Debug("After: " + currentField.Name + "=" + currentField.GetValue(this)); + } else { + LOG.Warn("Configuration for " + key + " not found! (Incorrect key?)"); + } + } + } + + public void UpdateLastUsedFieldValue(Field f) { + if(f.Value != null) { + string key = GetKeyForField(f); + LastUsedFieldValues[key] = f.Value; + } + } + + public Field GetLastUsedValueForField(Field f, object preferredDefaultValue) { + string key = GetKeyForField(f); + if(LastUsedFieldValues.ContainsKey(key)) { + f.Value = LastUsedFieldValues[key]; + } else if(preferredDefaultValue != null) { + f.Value = preferredDefaultValue; + }else { + f.Value = f.FieldType.DefaultValue; + } + return f; + } + + /// + /// + /// + /// the key under which last used value for the Field can be stored/retrieved + private string GetKeyForField(Field f) { + if(f.Scope == null) { + return f.FieldType.Name; + } else { + return f.FieldType.Name + "-" + f.Scope; + } + } + } +} diff --git a/Greenshot/Configuration/Language.cs b/Greenshot/Configuration/Language.cs new file mode 100644 index 000000000..cbf3d8d40 --- /dev/null +++ b/Greenshot/Configuration/Language.cs @@ -0,0 +1,51 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using System.Xml; + +using GreenshotPlugin.Core; + +namespace Greenshot.Configuration { + /// + /// Wrapper for the language container for the Greenshot base. + /// + public class Language : LanguageContainer, ILanguage { + private static ILanguage uniqueInstance; + private const string LANGUAGE_FILENAME_PATTERN = @"language-*.xml"; + + public static ILanguage GetInstance() { + if(uniqueInstance == null) { + uniqueInstance = new LanguageContainer(); + uniqueInstance.LanguageFilePattern = LANGUAGE_FILENAME_PATTERN; + uniqueInstance.Load(); + uniqueInstance.SetLanguage(AppConfig.GetInstance().Ui_Language); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(uniqueInstance.CurrentLanguage); + } + return uniqueInstance; + } + } +} diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs new file mode 100644 index 000000000..f7d04132e --- /dev/null +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -0,0 +1,191 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Configuration { + public enum LangKey { + about_bugs, + about_donations, + about_host, + about_icons, + about_license, + about_title, + about_translation, + application_title, + bugreport_cancel, + bugreport_info, + bugreport_title, + clipboard_error, + clipboard_inuse, + colorpicker_alpha, + colorpicker_apply, + colorpicker_blue, + colorpicker_green, + colorpicker_htmlcolor, + colorpicker_recentcolors, + colorpicker_red, + colorpicker_title, + colorpicker_transparent, + config_unauthorizedaccess_write, + contextmenu_about, + contextmenu_capturearea, + contextmenu_captureclipboard, + contextmenu_capturefullscreen, + contextmenu_capturelastregion, + contextmenu_capturewindow, + contextmenu_donate, + contextmenu_exit, + contextmenu_help, + contextmenu_openfile, + contextmenu_quicksettings, + contextmenu_settings, + editor_arrange, + editor_arrowheads, + editor_arrowheads_both, + editor_arrowheads_end, + editor_arrowheads_none, + editor_arrowheads_start, + editor_backcolor, + editor_blur_radius, + editor_bold, + editor_brightness, + editor_cancel, + editor_clipboardfailed, + editor_close, + editor_close_on_save, + editor_close_on_save_title, + editor_confirm, + editor_copyimagetoclipboard, + editor_copypathtoclipboard, + editor_copytoclipboard, + editor_crop, + editor_cursortool, + editor_cuttoclipboard, + editor_deleteelement, + editor_downonelevel, + editor_downtobottom, + editor_drawarrow, + editor_drawellipse, + editor_drawhighlighter, + editor_drawline, + editor_drawrectangle, + editor_drawtextbox, + editor_duplicate, + editor_edit, + editor_email, + editor_file, + editor_fontsize, + editor_forecolor, + editor_highlight_area, + editor_highlight_grayscale, + editor_highlight_mode, + editor_highlight_text, + editor_highlight_magnify, + editor_pixel_size, + editor_imagesaved, + editor_italic, + editor_load_objects, + editor_magnification_factor, + editor_obfuscate, + editor_obfuscate_blur, + editor_obfuscate_mode, + editor_obfuscate_pixelize, + editor_object, + editor_opendirinexplorer, + editor_pastefromclipboard, + editor_preview_quality, + editor_print, + editor_save, + editor_save_objects, + editor_saveas, + editor_selectall, + editor_senttoprinter, + editor_shadow, + editor_storedtoclipboard, + editor_thickness, + editor_title, + editor_uponelevel, + editor_uptotop, + error, + error_multipleinstances, + error_nowriteaccess, + error_openfile, + error_openlink, + error_save, + help_title, + jpegqualitydialog_choosejpegquality, + jpegqualitydialog_dontaskagain, + jpegqualitydialog_title, + print_error, + printoptions_allowcenter, + printoptions_allowenlarge, + printoptions_allowrotate, + printoptions_allowshrink, + printoptions_dontaskagain, + printoptions_timestamp, + printoptions_title, + quicksettings_destination_file, + settings_alwaysshowjpegqualitydialog, + settings_alwaysshowprintoptionsdialog, + settings_applicationsettings, + settings_autostartshortcut, + settings_capture, + settings_capture_mousepointer, + settings_capture_windows_interactive, + settings_capture_window_full, + settings_capture_window_content, + settings_copypathtoclipboard, + settings_destination, + settings_destination_clipboard, + settings_destination_editor, + settings_destination_email, + settings_destination_file, + settings_destination_fileas, + settings_destination_printer, + settings_filenamepattern, + settings_general, + settings_jpegquality, + settings_jpegsettings, + settings_language, + settings_message_filenamepattern, + settings_output, + settings_playsound, + settings_preferredfilesettings, + settings_primaryimageformat, + settings_printer, + settings_printoptions, + settings_registerhotkeys, + settings_showflashlight, + settings_skipimageeditor, + settings_storagelocation, + settings_title, + settings_tooltip_filenamepattern, + settings_tooltip_language, + settings_tooltip_primaryimageformat, + settings_tooltip_registerhotkeys, + settings_tooltip_storagelocation, + settings_visualization, + settings_waittime, + tooltip_firststart, + warning, + warning_hotkeys + } +} diff --git a/Greenshot/Configuration/RuntimeConfig.cs b/Greenshot/Configuration/RuntimeConfig.cs new file mode 100644 index 000000000..3f9edf51c --- /dev/null +++ b/Greenshot/Configuration/RuntimeConfig.cs @@ -0,0 +1,37 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System.Drawing.Imaging; +using System.Drawing; +using System.Windows.Forms; +using System; + +namespace Greenshot.Configuration { + /// + /// Greenshot's runtime configuration + /// abstract, all properties are public and static + /// + public abstract class RuntimeConfig { + public static string[] SupportedLanguages = {"en-US","de-DE"}; + public static string[] SupportedImageFormats = {ImageFormat.Jpeg.ToString(),ImageFormat.Gif.ToString(),ImageFormat.Png.ToString(),ImageFormat.Bmp.ToString()}; + public static string BugTrackerUrl = "https://sourceforge.net/tracker/?func=postadd&group_id=191585&atid=937972&summary=%SUMMARY%&details=%DETAILS%"; + public static Rectangle LastCapturedRegion = Rectangle.Empty; + } +} diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs new file mode 100644 index 000000000..ce7a509de --- /dev/null +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -0,0 +1,41 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Greenshot.Controls { + /// + /// Description of BindableToolStripButton. + /// + public class BindableToolStripButton : ToolStripButton, INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + public BindableToolStripButton() :base() { + this.CheckedChanged += new EventHandler(BindableToolStripButton_CheckedChanged); + } + + void BindableToolStripButton_CheckedChanged(object sender, EventArgs e) { + if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Checked")); + } + } +} diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs new file mode 100644 index 000000000..1dfcbf945 --- /dev/null +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -0,0 +1,44 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Greenshot.Controls { + /// + /// A simple ToolStripComboBox implementing INotifyPropertyChanged for data binding + /// + public class BindableToolStripComboBox : ToolStripComboBox, INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + public BindableToolStripComboBox() :base() { + this.SelectedIndexChanged += new EventHandler(BindableToolStripComboBox_SelectedIndexChanged); + } + + void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) { + if(PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); + + } + } + } +} diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs new file mode 100644 index 000000000..87078a30d --- /dev/null +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -0,0 +1,68 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Greenshot.Controls { + /// + /// A simple ToolStripDropDownButton implementing INotifyPropertyChanged for data binding. + /// Also, when a DropDownItem is selected, the DropDownButton adops its Tag and Image. + /// The selected tag can be accessed via SelectedTag property. + /// + public class BindableToolStripDropDownButton : ToolStripDropDownButton, INotifyPropertyChanged { + + public event PropertyChangedEventHandler PropertyChanged; + + public BindableToolStripDropDownButton() { + } + + public object SelectedTag { + get { if(Tag==null && DropDownItems.Count>0) Tag=DropDownItems[0].Tag; return Tag; } + set { AdoptFromTag(value); } + } + + protected override void OnDropDownItemClicked(ToolStripItemClickedEventArgs e) { + ToolStripItem clickedItem = e.ClickedItem; + if(Tag == null || !Tag.Equals(clickedItem.Tag)) { + Tag = clickedItem.Tag; + Image = clickedItem.Image; + if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SelectedTag")); + } + base.OnDropDownItemClicked(e); + } + + private void AdoptFromTag(object tag) { + if(Tag == null || !Tag.Equals(tag)) { + Tag = tag; + foreach(ToolStripItem item in DropDownItems) { + if(item.Tag != null && item.Tag.Equals(tag)) { + Image = item.Image; + break; + } + } + Tag = tag; + if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SelectedTag")); + } + } + } +} diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs new file mode 100644 index 000000000..80a9ac8d8 --- /dev/null +++ b/Greenshot/Controls/ColorButton.cs @@ -0,0 +1,82 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.ComponentModel; +using System.Windows.Forms; +using Greenshot.Configuration; + +namespace Greenshot.Controls { + public class ColorButton : ToolStripButton, INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + private Color selectedColor = Color.Transparent; + + public ColorButton() { + Bitmap bmp = new Bitmap(1,1); + bmp.SetPixel(0,0, selectedColor); + this.Image = bmp; + this.BackgroundImageLayout = ImageLayout.Tile; + Click+= new EventHandler(ColorButtonClick); + } + + public Color SelectedColor { + get {return selectedColor;} + set { + //(Image as Bitmap).SetPixel(0,0, value); + selectedColor = value; + + Brush brush; + if(value != Color.Transparent) { + brush = new SolidBrush(value); + } else { + brush = new HatchBrush(HatchStyle.Percent50,Color.White, Color.Gray); + } + + using (Graphics graphics = Graphics.FromImage(Image)) { + graphics.FillRectangle(brush, new Rectangle(0,13,16,3)); + } + // cleanup GDI Object + brush.Dispose(); + Invalidate(); + } + } + + void ColorButtonClick(object sender, EventArgs e) { + + ColorDialog colorDialog = ColorDialog.GetInstance(); + colorDialog.Color = SelectedColor; + colorDialog.ShowDialog(); + if (colorDialog.DialogResult != DialogResult.Cancel) { + if(!colorDialog.Color.Equals(SelectedColor)) { + AppConfig conf = AppConfig.GetInstance(); + conf.Editor_RecentColors = colorDialog.RecentColors; + conf.Store(); + SelectedColor = colorDialog.Color; + if(PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs("SelectedColor")); + } + } + } + } + } +} diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs new file mode 100644 index 000000000..a77154ccc --- /dev/null +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -0,0 +1,62 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Drawing; + +namespace Greenshot.Controls { + /// + /// ToolStripComboBox containing installed font families, + /// implementing INotifyPropertyChanged for data binding + /// + public class FontFamilyComboBox : ToolStripComboBox, INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + + public FontFamily FontFamily { + get { return (FontFamily)SelectedItem; } + set { + if(!SelectedItem.Equals(value)) { + SelectedItem = value; + } + } + } + + public FontFamilyComboBox() : base() + { + ComboBox.DataSource = FontFamily.Families; + ComboBox.DisplayMember = "Name"; + this.SelectedIndexChanged += new EventHandler(BindableToolStripComboBox_SelectedIndexChanged); + } + + void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + if(PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs("Text")); + PropertyChanged(this, new PropertyChangedEventArgs("FontFamily")); + PropertyChanged(this, new PropertyChangedEventArgs("SelectedIndex")); + PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); + + } + } + } +} diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs new file mode 100644 index 000000000..8c26eef57 --- /dev/null +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -0,0 +1,64 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Drawing; + +namespace Greenshot.Controls { + + /*[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)] + public class ToolStripColorButton : ToolStripControlHost + { + public event EventHandler ValueChanged; + + public ToolStripColorButton() :base(new ColorButton()) + { + } + + public ColorButton ColorButton + { + get {return Control as ColorButton;} + } + + public Color SelectedColor + { + get { return ColorButton.SelectedColor; } + set { ColorButton.SelectedColor = value;} + } + + protected override void OnSubscribeControlEvents(Control control) + { + base.OnSubscribeControlEvents(control); + ColorButton.SelectedColorChanged += OnSelectedColorChanged; + } + protected override void OnUnsubscribeControlEvents(Control control) + { + base.OnUnsubscribeControlEvents(control); + ColorButton.SelectedColorChanged -= OnSelectedColorChanged; + } + + private void OnSelectedColorChanged(object sender, EventArgs e) + { + if(ValueChanged != null) ValueChanged(sender, e); + } + }*/ +} diff --git a/Greenshot/Controls/ToolStripNumericUpDown.cs b/Greenshot/Controls/ToolStripNumericUpDown.cs new file mode 100644 index 000000000..0797cfad2 --- /dev/null +++ b/Greenshot/Controls/ToolStripNumericUpDown.cs @@ -0,0 +1,81 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Greenshot.Controls { + + [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)] + public class ToolStripNumericUpDown : ToolStripControlHost, INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public ToolStripNumericUpDown() : base(new NumericUpDown()) + { + } + + public NumericUpDown NumericUpDown + { + get {return Control as NumericUpDown;} + } + + public decimal Value + { + get { return NumericUpDown.Value; } + set { NumericUpDown.Value = value;} + } + public decimal Minimum { + get { return NumericUpDown.Minimum; } + set { NumericUpDown.Minimum = value; } + } + + public decimal Maximum { + get { return NumericUpDown.Maximum; } + set { NumericUpDown.Maximum = value; } + } + + public decimal Increment { + get { return NumericUpDown.Increment; } + set { NumericUpDown.Increment = value; } + } + + public int DecimalPlaces { + get { return NumericUpDown.DecimalPlaces; } + set { NumericUpDown.DecimalPlaces = value; } + } + + + protected override void OnSubscribeControlEvents(Control control) { + base.OnSubscribeControlEvents(control); + NumericUpDown.ValueChanged += _valueChanged; + } + protected override void OnUnsubscribeControlEvents(Control control) { + base.OnUnsubscribeControlEvents(control); + NumericUpDown.ValueChanged -= _valueChanged; + } + + private void _valueChanged(object sender, EventArgs e) { + if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Value")); + } + } +} diff --git a/Greenshot/Drawing/ArrowContainer.cs b/Greenshot/Drawing/ArrowContainer.cs new file mode 100644 index 000000000..3235924e7 --- /dev/null +++ b/Greenshot/Drawing/ArrowContainer.cs @@ -0,0 +1,162 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of LineContainer. + /// + [Serializable()] + public class ArrowContainer : LineContainer { + + public enum ArrowHeadCombination { NONE, START_POINT, END_POINT, BOTH }; + + private static readonly AdjustableArrowCap ARROW_CAP = new AdjustableArrowCap(4, 6); + + public ArrowContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.ARROWHEADS)); + } + + public override void Draw(Graphics g, RenderMode rm) { + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + ArrowHeadCombination heads = (ArrowHeadCombination)GetFieldValue(FieldType.ARROWHEADS);; + + if ( shadow && lineThickness > 0 ) { + //draw shadow first + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = 1; + while ( currentStep <= steps ) { + using (Pen shadowCapPen = new Pen(Color.FromArgb(alpha, 100, 100, 100))) { + shadowCapPen.Width = lineThickness; + + if ( heads == ArrowHeadCombination.BOTH || heads == ArrowHeadCombination.START_POINT ) shadowCapPen.CustomStartCap = ARROW_CAP; + if ( heads == ArrowHeadCombination.BOTH || heads == ArrowHeadCombination.END_POINT ) shadowCapPen.CustomEndCap = ARROW_CAP; + + g.DrawLine(shadowCapPen, + this.Left + currentStep, + this.Top + currentStep, + this.Left + currentStep + this.Width, + this.Top + currentStep + this.Height); + + currentStep++; + alpha = alpha - (basealpha / steps); + } + } + } + + using (Pen pen = new Pen(lineColor)) { + pen.Width = lineThickness; + + if ( pen.Width > 0 ) { + if ( heads == ArrowHeadCombination.BOTH || heads == ArrowHeadCombination.START_POINT ) pen.CustomStartCap = ARROW_CAP; + if ( heads == ArrowHeadCombination.BOTH || heads == ArrowHeadCombination.END_POINT ) pen.CustomEndCap = ARROW_CAP; + + g.DrawLine(pen, this.Left, this.Top, this.Left + this.Width, this.Top + this.Height); + } + + } + } + + public override bool ClickableAt(int x, int y) { + bool ret = false; + ret = base.ClickableAt(x, y); + if(!ret) { + // line has not been clicked, check arrow heads + ArrowHeadCombination heads = (ArrowHeadCombination)GetFieldValue(FieldType.ARROWHEADS); + if(!ArrowHeadCombination.NONE.Equals(heads)) { + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + double arrowCapHalfWidth = ARROW_CAP.Width * lineThickness / 2; + double arrowCapHeight = ARROW_CAP.Height * lineThickness; + // we have to check only if arrow heads are wider than tolerated area of LineContainer + if(arrowCapHalfWidth > MAX_CLICK_DISTANCE_TOLERANCE) { + double mouseToLineDist = DrawingHelper.CalculateLinePointDistance(Left, Top, Left+Width, Top+Height, x, y); + if(mouseToLineDist > -1) { // point next to line at all? + if(heads.Equals(ArrowHeadCombination.END_POINT) || heads.Equals(ArrowHeadCombination.BOTH)) { + // calculate a perpendicular line at arrow tip to hittest arrow head easily + int p1x = Left + Width + Height; + int p1y = Top + Height - Width; + int p2x = Left + Width - Height; + int p2y = Top + Height + Width; + + double mouseToPerpDist = DrawingHelper.CalculateLinePointDistance(p1x,p1y,p2x,p2y, x, y); + if( + // point located within rectangular area of width/height of arrowhead? + mouseToLineDist <= arrowCapHalfWidth + && mouseToPerpDist <= arrowCapHeight + // point located within arrowhead? (nearer to line than to perp * w/h-factor) + && mouseToLineDist < mouseToPerpDist * arrowCapHalfWidth / arrowCapHeight) { + return true; + } + } + if(heads.Equals(ArrowHeadCombination.START_POINT) || heads.Equals(ArrowHeadCombination.BOTH)) { + // calculate a perpendicular line at arrow tip to hittest arrow head easily + int p1x = Left - Height; + int p1y = Top + Width; + int p2x = Left + Height; + int p2y = Top - Width; + + double mouseToPerpDist = DrawingHelper.CalculateLinePointDistance(p1x,p1y,p2x,p2y, x, y); + if( + // point located within rectangular area of width/height of arrowhead? + mouseToLineDist <= arrowCapHalfWidth + && mouseToPerpDist <= arrowCapHeight + // point located within arrowhead? (nearer to line than to perp * w/h-factor) + && mouseToLineDist < mouseToPerpDist * arrowCapHalfWidth / arrowCapHeight) { + return true; + } + + + } + } + + } + } + + } + + return ret; + + /*int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + double distance = DrawingHelper.CalculateLinePointDistance(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height, x, y); + if (distance < 0) { + return false; + } + return distance <= Math.Max(lineThickness / 2, 10);*/ + } + + } +} diff --git a/Greenshot/Drawing/BitmapBuffer.cs b/Greenshot/Drawing/BitmapBuffer.cs new file mode 100644 index 000000000..9eddc97c6 --- /dev/null +++ b/Greenshot/Drawing/BitmapBuffer.cs @@ -0,0 +1,322 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +namespace Greenshot.Drawing { + /// + /// The BitmapBuffer is exactly what it says, it buffers a Bitmap. + /// And it is possible to Draw on the Bitmap with direct memory access for better performance + /// + [Serializable()] + public unsafe class BitmapBuffer : IDisposable { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(BitmapBuffer)); + private Bitmap bitmap; + public Bitmap Bitmap { + get {return bitmap;} + } + [NonSerialized] + private BitmapData bmData; + [NonSerialized] + private Rectangle rect; + [NonSerialized] + private byte* pointer; + [NonSerialized] + private int stride; /* bytes per pixel row */ + [NonSerialized] + private int aIndex = -1; + [NonSerialized] + private int rIndex = -1; + [NonSerialized] + private int gIndex = -1; + [NonSerialized] + private int bIndex = -1; + [NonSerialized] + private int bytesPerPixel; + [NonSerialized] + private bool bitsLocked = false; + + public Size Size { + get {return rect.Size;} + } + public int Length { + get {return rect.Width*rect.Height;} + } + public int Width { + get {return rect.Width;} + } + public int Height { + get {return rect.Height;} + } + + /** + * Constructor with just a Bitmap, the Rectangle is the Bitmap itself + */ + public BitmapBuffer(Bitmap bmp) : this(bmp, Rectangle.Empty) { + } + + /** + * Create a BitmapBuffer from a Bitmap and a Rectangle specifying what part from the Bitmap to take + */ + public BitmapBuffer(Bitmap sourceBmp, Rectangle applyRect) { + Rectangle sourceRect = new Rectangle(applyRect.X, applyRect.Y, applyRect.Width, applyRect.Height); + Rectangle bitmapRect = new Rectangle(0,0, sourceBmp.Width, sourceBmp.Height); + + if(sourceRect.Equals(Rectangle.Empty)) { + sourceRect = bitmapRect; + } else { + sourceRect.Intersect(bitmapRect); + } + // Does the rect have any pixels? + if (sourceRect.Height <= 0 || sourceRect.Width <= 0) { + return; + } + + if (SupportsPixelFormat(sourceBmp)) { + // Create copy with supported format + this.bitmap = sourceBmp.Clone(sourceRect, sourceBmp.PixelFormat); + } else { + // When sourceRect is the whole bitmap there is a GDI+ bug in Clone + // Clone will than return the same PixelFormat as the source + // a quick workaround is using new Bitmap which uses a default of Format32bppArgb + if (sourceRect.Equals(bitmapRect)) { + this.bitmap = new Bitmap(sourceBmp); + } else { + this.bitmap = sourceBmp.Clone(sourceRect, PixelFormat.Format24bppRgb); + } + } + // Set "this" rect to location 0,0 + // as the Cloned Bitmap is only the part we want to work with + this.rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + } + + /** + * Destructor + */ + ~BitmapBuffer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + Unlock(); + if (disposing) { + if (bitmap != null) { + bitmap.Dispose(); + } + } + bitmap = null; + bmData = null; + pointer = null; + } + + /** + * This is called when deserializing the object + */ + public BitmapBuffer(SerializationInfo info, StreamingContext ctxt) { + this.bitmap = (Bitmap)info.GetValue("bitmap", typeof(Bitmap)); + this.rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + // The rest will be set when Lock is called + } + + /** + * This is called when serializing the object + */ + public void GetObjectData(SerializationInfo info, StreamingContext ctxt) { + Unlock(); + info.AddValue("bitmap", this.bitmap); + } + + /** + * Lock the bitmap so we have direct access to the memory + */ + public void Lock() { + if(rect.Width > 0 && rect.Height > 0) { + bmData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat); + bitsLocked = true; + + System.IntPtr Scan0 = bmData.Scan0; + pointer = (byte*)(void*)Scan0; + + PrepareForPixelFormat(); + stride = bmData.Stride; + } + } + + /** + * Unlock the System Memory + */ + private void Unlock() { + if(bitsLocked) { + bitmap.UnlockBits(bmData); + bitsLocked = false; + } + } + + /** + * Draw the stored bitmap to the destionation bitmap at the supplied point + */ + public void DrawTo(Graphics graphics, Point destination) { + DrawTo(graphics, null, destination); + } + + /** + * Draw the stored Bitmap on the Destination bitmap with the specified rectangle + * Be aware that the stored bitmap will be resized to the specified rectangle!! + */ + public void DrawTo(Graphics graphics, Rectangle destinationRect) { + DrawTo(graphics, destinationRect, null); + } + + /** + * private helper to draw the bitmap + */ + private void DrawTo(Graphics graphics, Rectangle? destinationRect, Point? destination) { + if (destinationRect.HasValue) { + // Does the rect have any pixels? + if (destinationRect.Value.Height <= 0 || destinationRect.Value.Width <= 0) { + return; + } + } + // Make sure this.bitmap is unlocked + Unlock(); + + + if (destinationRect.HasValue) { + LOG.Debug(String.Format("Drawing at: {0},{1} {2},{3}", destinationRect.Value.X, destinationRect.Value.Y, destinationRect.Value.Width, destinationRect.Value.Height)); + graphics.DrawImage(this.bitmap, destinationRect.Value); + } else if (destination.HasValue) { + LOG.Debug(String.Format("Drawing at: {0},{1}", destination.Value.X, destination.Value.Y)); + graphics.DrawImage(this.bitmap, destination.Value); + } + } + + /** + * Retrieve the color at location x,y + * Before the first time this is called the Lock() should be called once! + */ + public Color GetColorAt(int x, int y) { + if(x>=0 && y>=0 && x=0 && y>=0 && x=0 && y>=0 && x=0 && y>=0 && x. + */ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of BitmapContainer. + /// + [Serializable()] + public class BitmapContainer : DrawableContainer, IBitmapContainer { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(BitmapContainer)); + + protected Bitmap bitmap; + + public BitmapContainer(Surface parent, string filename) : this(parent) { + Load(filename); + } + + public BitmapContainer(Surface parent) : base(parent) { + } + + + public Bitmap Bitmap { + set { + if (bitmap != null) { + bitmap.Dispose(); + } + bitmap = (Bitmap)value.Clone(); + Width = value.Width; + Height = value.Height; + } + get { return bitmap; } + } + + /** + * Destructor + */ + ~BitmapContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public new void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if (bitmap != null) { + bitmap.Dispose(); + } + } + bitmap = null; + } + + public void Load(string filename) { + if (File.Exists(filename)) { + using (Bitmap fileBitmap = new Bitmap(filename)) { + Bitmap = fileBitmap; + LOG.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); + } + } + } + + public override void Draw(Graphics g, RenderMode rm) { + if (bitmap != null) { + g.DrawImage(bitmap, Bounds); + } + } + } +} diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs new file mode 100644 index 000000000..84c61db56 --- /dev/null +++ b/Greenshot/Drawing/CropContainer.cs @@ -0,0 +1,57 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Helpers; +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of CropContainer. + /// + public class CropContainer : DrawableContainer { + public CropContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateFieldWithValue(FieldType.FLAGS, FieldType.Flag.CONFIRMABLE)); + } + + public override void Draw(Graphics g, RenderMode rm) { + using (Brush cropBrush = new SolidBrush(Color.FromArgb(100, 150, 150, 100))) { + Rectangle r = GuiRectangle.GetGuiRectangle(this.Left, this.Top, this.Width, this.Height); + Rectangle selectionRect = new Rectangle(r.Left - 1, r.Top - 1, r.Width + 1, r.Height + 1); + + DrawSelectionBorder(g, selectionRect); + + // top + g.FillRectangle(cropBrush, new Rectangle(0, 0, parent.Width, r.Top)); + // left + g.FillRectangle(cropBrush, new Rectangle(0, r.Top, r.Left, r.Height)); + // right + g.FillRectangle(cropBrush, new Rectangle(r.Left + r.Width, r.Top, parent.Width - (r.Left + r.Width), r.Height)); + // bottom + g.FillRectangle(cropBrush, new Rectangle(0, r.Top + r.Height, parent.Width, parent.Height - (r.Top + r.Height))); + } + } + } +} diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs new file mode 100644 index 000000000..5c2d3f12f --- /dev/null +++ b/Greenshot/Drawing/CursorContainer.cs @@ -0,0 +1,110 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.IO; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of CursorContainer. + /// + [Serializable()] + public class CursorContainer : DrawableContainer, ICursorContainer { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(CursorContainer)); + + protected Cursor cursor; + + public CursorContainer(Surface parent) : base(parent) { + } + + public CursorContainer(Surface parent, string filename) : base(parent) { + Load(filename); + } + + public Cursor Cursor { + set { + if (cursor != null) { + cursor.Dispose(); + } + // Clone cursor (is this correct??) + cursor = new Cursor(value.CopyHandle()); + Width = value.Size.Width; + Height = value.Size.Height; + } + get { return cursor; } + } + + /** + * Destructor + */ + ~CursorContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public new void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if (cursor != null) { + cursor.Dispose(); + } + } + cursor = null; + } + + public void Load(string filename) { + if (File.Exists(filename)) { + using (Cursor fileCursor = new Cursor(filename)) { + Cursor = fileCursor; + LOG.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); + } + } + } + + public override void Draw(Graphics graphics, RenderMode rm) { + if (cursor != null) { + cursor.DrawStretched(graphics, Bounds); + } + } + } +} diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs new file mode 100644 index 000000000..747ebe585 --- /dev/null +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -0,0 +1,403 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Controls; +using Greenshot.Drawing.Fields; +using Greenshot.Drawing.Filters; +using Greenshot.Helpers; +using Greenshot.Plugin; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// represents a rectangle, ellipse, label or whatever. Can contain filters, too. + /// serializable for clipboard support + /// Subclasses should fulfill INotifyPropertyChanged contract, i.e. call + /// OnPropertyChanged whenever a public property has been changed. + /// + [Serializable()] + public abstract class DrawableContainer : AbstractFieldHolderWithChildren, INotifyPropertyChanged, IDrawableContainer { + + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DrawableContainer)); + + [NonSerialized] + private PropertyChangedEventHandler propertyChanged; + public event PropertyChangedEventHandler PropertyChanged { + add { propertyChanged += value; } + remove{ propertyChanged -= value; } + } + + + +// public List filters = new List(); + public List Filters { + get { + List ret = new List(); + foreach(IFieldHolder c in Children) { + if(c is IFilter) ret.Add(c as IFilter); + } + return ret; + } + } + + [NonSerialized] + protected Surface parent; + public ISurface Parent { + get { return parent; } + set { SwitchParent((Surface)value); } + } + [NonSerialized] + protected Label[] grippers; + private bool layoutSuspended = false; + [NonSerialized] + protected Label childLabel; + + [NonSerialized] + private bool selected = false; + public bool Selected { + get {return selected;} + set {selected = value; OnPropertyChanged("Selected"); } + } + + [NonSerialized] + public EditStatus Status = EditStatus.UNDRAWN; + + private int left = 0; + public int Left { + get { return left; } + set { left = value; DoLayout(); OnPropertyChanged("Left"); } + } + + private int top = 0; + public int Top { + get { return top; } + set { top = value; DoLayout(); OnPropertyChanged("Top"); } + } + + private int width = 0; + public int Width { + get { return width; } + set { width = value; DoLayout(); OnPropertyChanged("Width"); } + } + + private int height = 0; + public int Height { + get { return height; } + set { height = value; DoLayout(); OnPropertyChanged("Height"); } + } + + public Rectangle Bounds { + get { return GuiRectangle.GetGuiRectangle(left, top, width, height); } + } + + public DrawableContainer(Surface parent) { + this.parent = parent; + InitControls(); + } + + public void Add(IFilter filter) { + AddChild(filter); + } + + public void Remove(IFilter filter) { + RemoveChild(filter); + } + + public Label GetLabel() { + return childLabel; + } + + public void AlignToParent(HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment) { + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + if (horizontalAlignment == HorizontalAlignment.Left) { + Left = lineThickness/2; + } + if (horizontalAlignment == HorizontalAlignment.Right) { + Left = parent.Width - this.Width - lineThickness/2; + } + if (horizontalAlignment == HorizontalAlignment.Center) { + Left = (parent.Width / 2) - (this.Width / 2) - lineThickness/2; + } + + if (verticalAlignment == VerticalAlignment.TOP) { + Top = lineThickness/2; + } + if (verticalAlignment == VerticalAlignment.BOTTOM) { + Top = parent.Height - this.Height - lineThickness/2; + } + if (verticalAlignment == VerticalAlignment.CENTER) { + Top = (parent.Height / 2) - (this.Height / 2) - lineThickness/2; + } + } + + public virtual bool InitContent() { return true; } + + public virtual void OnDoubleClick() {} + + private void InitControls() { + InitGrippers(); + childLabel = new Label(); + childLabel.BackColor = Color.Transparent; + childLabel.BorderStyle = BorderStyle.None; + childLabel.Cursor = Cursors.SizeAll; + childLabel.MouseDown += new MouseEventHandler(gripperMouseDown); + childLabel.MouseUp += new MouseEventHandler(gripperMouseUp); + childLabel.MouseMove += new MouseEventHandler(childLabelMouseMove); + + DoLayout(); + } + + void InitGrippers() { + grippers = new Label[8]; + for(int i=0; i grippers[4].Left && grippers[0].Top > grippers[4].Top) { + grippers[0].Cursor = Cursors.SizeNWSE; + grippers[2].Cursor = Cursors.SizeNESW; + grippers[4].Cursor = Cursors.SizeNWSE; + grippers[6].Cursor = Cursors.SizeNESW; + } else if((grippers[0].Left > grippers[4].Left && grippers[0].Top < grippers[4].Top) || + grippers[0].Left < grippers[4].Left && grippers[0].Top > grippers[4].Top) { + grippers[0].Cursor = Cursors.SizeNESW; + grippers[2].Cursor = Cursors.SizeNWSE; + grippers[4].Cursor = Cursors.SizeNESW; + grippers[6].Cursor = Cursors.SizeNWSE; + } else if (grippers[0].Left == grippers[4].Left) { + grippers[0].Cursor = Cursors.SizeNS; + grippers[4].Cursor = Cursors.SizeNS; + } else if (grippers[0].Top == grippers[4].Top) { + grippers[0].Cursor = Cursors.SizeWE; + grippers[4].Cursor = Cursors.SizeWE; + } + + childLabel.Left = this.Left; + childLabel.Top = this.Top; + childLabel.Width = this.Width; + childLabel.Height = this.Height; + } + } + + public virtual void Dispose() { + for(int i=0; i= 4 && gripperIndex <= 6) { // bottom row + this.Height += e.Y - my; + } + if(gripperIndex >=2 && gripperIndex <= 4) { // right row + this.Width += e.X - mx; + } else if(gripperIndex >=6 || gripperIndex == 0) { // left row + this.Left += e.X - mx; + this.Width -= e.X - mx; + } + ResumeLayout(); + parent.Invalidate(); + } + } + + private void childLabelMouseMove(object sender, MouseEventArgs e) { + if (Status.Equals(EditStatus.RESIZING)) { + SuspendLayout(); + this.Left += e.X - mx; + this.Top += e.Y - my; + ResumeLayout(); + parent.Invalidate(); + } + } + + public abstract void Draw(Graphics graphics, RenderMode renderMode); + + public virtual void DrawContent(Graphics graphics, Bitmap bmp, RenderMode renderMode) { + //if(LOG.IsDebugEnabled) LOG.Debug("Drawing container "+this+" with bounds "+Bounds+" and " + Children.Count + " children and status: "+Status); + if(Children.Count>0) { + if(!Status.Equals(EditStatus.IDLE)) { + DrawSelectionBorder(graphics, Bounds); + } else { + Rectangle effRect = Bounds; + + if(!effRect.IsEmpty) { + foreach(IFilter filter in Filters) { + //if(LOG.IsDebugEnabled) LOG.Debug("Applying filter "+filter+" with bounds "+effRect); + filter.Apply(graphics, bmp, effRect, renderMode); + } + } + + } + } + Draw(graphics, RenderMode.EDIT); + } + + public virtual bool Contains(int x, int y) { + return Bounds.Contains(x,y); + } + + public virtual bool ClickableAt(int x, int y) { + Rectangle r = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + r.Inflate(5, 5); + return r.Contains(x, y); + } + + protected void DrawSelectionBorder(Graphics g, Rectangle rect) { + using (Pen pen = new Pen(Color.MediumSeaGreen)) { + pen.DashPattern = new float[]{1,2}; + pen.Width = 1; + g.DrawRectangle(pen, rect); + } + } + + public void ShowGrippers() { + for(int i=0; i. + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +using Greenshot.Drawing.Fields; +using Greenshot.Plugin; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Dispatches most of a DrawableContainer's public properties and methods to a list of DrawableContainers. + /// + [Serializable()] + public class DrawableContainerList : List { + + public DrawableContainerList() { + } + + public EditStatus Status { + get { + return this[Count-1].Status; + } + set { + foreach(DrawableContainer dc in this) dc.Status = value; + } + } + + /// + /// Gets or sets the selection status of the elements. + /// If several elements are in the list, true is only returned when all elements are selected. + /// + public bool Selected { + get { + bool ret = true; + foreach(DrawableContainer dc in this) ret &= dc.Selected; + return ret; + } + set { + foreach(DrawableContainer dc in this) dc.Selected = value; + } + } + + /// + /// Gets or sets the parent control of the elements in the list. + /// If there are several elements, the parent control of the last added is returned. + /// + public ISurface Parent { + get { + if(Count > 0) return this[Count-1].Parent; + return null; + } + set { + foreach(DrawableContainer dc in this) dc.Parent = value; + } + } + + /// + /// Moves all elements in the list by the given amount of pixels. + /// + /// pixels to move horizontally + /// pixels to move vertically + public void MoveBy(int dx, int dy) { + foreach(DrawableContainer dc in this) { + dc.Left += dx; + dc.Top += dy; + } + } + + /// + /// Hides the grippers of all elements in the list. + /// + public void HideGrippers() { + foreach(DrawableContainer dc in this) { + dc.HideGrippers(); + } + } + + /// + /// Shows the grippers of all elements in the list. + /// + public void ShowGrippers() { + foreach(DrawableContainer dc in this) { + dc.ShowGrippers(); + } + } + + /// + /// Indicates whether on of the elements is clickable at the given location + /// + /// x coordinate to be checked + /// y coordinate to be checked + /// true if one of the elements in the list is clickable at the given location, false otherwise + public bool ClickableAt(int x, int y) { + bool ret = false; + foreach(DrawableContainer dc in this) { + ret |= dc.ClickableAt(x, y); + } + return ret; + } + + /// + /// retrieves the topmost element being clickable at the given location + /// + /// x coordinate to be checked + /// y coordinate to be checked + /// the topmost element from the list being clickable at the given location, null if there is no clickable element + public DrawableContainer ClickableElementAt(int x, int y) { + for(int i=Count-1; i>=0; i--) { + if(this[i].ClickableAt(x,y)) return this[i]; + } + return null; + } + + /// + /// Dispatches OnDoubleClick to all elements in the list. + /// + public void OnDoubleClick() { + foreach(DrawableContainer dc in this) { + dc.OnDoubleClick(); + } + } + + /// + /// Triggers all elements in the list ot be redrawn. + /// + /// the related Graphics object + /// the rendermode in which the element is to be drawn + public void Draw(Graphics g, Bitmap bitmap, RenderMode rm) { + foreach(DrawableContainer dc in this) { + dc.DrawContent(g, bitmap, rm); + } + } + + /// + /// Indicates whether the given list of elements can be pulled up, + /// i.e. whether there is at least one unselected element higher in hierarchy + /// + /// list of elements to pull up + /// true if the elements could be pulled up + public bool CanPullUp(DrawableContainerList elements) { + if(elements.Count == 0 || elements.Count == this.Count) return false; + foreach(DrawableContainer element in elements) { + if(this.IndexOf(element) < this.Count - elements.Count) return true; + } + return false; + } + + /// + /// Pulls one or several elements up one level in hierarchy (z-index). + /// + /// list of elements to pull up + public void PullElementsUp(DrawableContainerList elements) { + for(int i=this.Count-1; i>=0; i--) { + DrawableContainer dc = this[i]; + if(elements.Contains(dc)) { + if(Count > (i+1) && !elements.Contains(this[i+1])) SwapElements(i,i+1); + } + } + } + + /// + /// Pulls one or several elements up to the topmost level(s) in hierarchy (z-index). + /// + /// of elements to pull to top + public void PullElementsToTop(DrawableContainerList elements) { + DrawableContainer[] dcs = this.ToArray(); + for(int i=0; i + /// Indicates whether the given list of elements can be pushed down, + /// i.e. whether there is at least one unselected element lower in hierarchy + /// + /// list of elements to push down + /// true if the elements could be pushed down + public bool CanPushDown(DrawableContainerList elements) { + if(elements.Count == 0 || elements.Count == this.Count) return false; + foreach(DrawableContainer element in elements) { + if(this.IndexOf(element) >= elements.Count) return true; + } + return false; + } + + /// + /// Pushes one or several elements down one level in hierarchy (z-index). + /// + /// list of elements to push down + public void PushElementsDown(DrawableContainerList elements) { + for(int i=0; i0) && !elements.Contains(this[i-1])) SwapElements(i,i-1); + } + } + } + + /// + /// Pushes one or several elements down to the bottommost level(s) in hierarchy (z-index). + /// + /// of elements to push to bottom + public void PushElementsToBottom(DrawableContainerList elements) { + DrawableContainer[] dcs = this.ToArray(); + for(int i=dcs.Length-1; i>=0; i--) { + DrawableContainer dc = dcs[i]; + if(elements.Contains(dc)) { + this.Remove(dc); + this.Insert(0, dc); + } + } + } + + /// + /// swaps two elements in hierarchy (z-index), + /// checks both indices to be in range + /// + /// index of the 1st element + /// index of the 2nd element + private void SwapElements(int index1, int index2) { + if(index1 >= 0 && index1 < Count && index2 >= 0 && index2 < Count && index1 != index2) { + DrawableContainer dc = this[index1]; + this[index1] = this[index2]; + this[index2] = dc; + } + } + + } +} diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs new file mode 100644 index 000000000..4711e6853 --- /dev/null +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -0,0 +1,92 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of EllipseContainer. + /// + [Serializable()] + public class EllipseContainer : DrawableContainer { + + public EllipseContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.LINE_THICKNESS)); + AddField(FieldFactory.CreateField(FieldType.LINE_COLOR)); + AddField(FieldFactory.CreateField(FieldType.FILL_COLOR)); + AddField(FieldFactory.CreateField(FieldType.SHADOW)); + } + + public override void Draw(Graphics graphics, RenderMode renderMode) { + graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + // draw shadow before anything else + if (shadow && (lineVisible || Colors.IsVisible(fillColor))) { + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = lineVisible ? 1 : 0; + while (currentStep <= steps) { + using (Pen shadowPen = new Pen(Color.FromArgb(alpha, 100, 100, 100))) { + shadowPen.Width = lineVisible ? lineThickness : 1; + Rectangle shadowRect = GuiRectangle.GetGuiRectangle(Left + currentStep, Top + currentStep, Width, Height); + graphics.DrawEllipse(shadowPen, shadowRect); + currentStep++; + alpha = alpha - basealpha / steps; + } + } + } + + //draw the original shape + Rectangle rect = GuiRectangle.GetGuiRectangle(this.Left, this.Top, this.Width, this.Height); + + using (Brush brush = new SolidBrush(fillColor)) { + graphics.FillEllipse(brush, rect); + } + + using (Pen pen = new Pen(lineColor)) { + pen.Width = lineThickness; + if (pen.Width > 0) { + graphics.DrawEllipse(pen, rect); + } + } + } + + public override bool Contains(int x, int y) { + double xDistanceFromCenter = x - (Left+Width/2); + double yDistanceFromCenter = y - (Top+Height/2); + // ellipse: x^2/a^2 + y^2/b^2 = 1 + return Math.Pow(xDistanceFromCenter,2)/Math.Pow(Width/2,2) + Math.Pow(yDistanceFromCenter,2)/Math.Pow(Height/2,2) < 1; + } + } +} diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs new file mode 100644 index 000000000..dd5cac654 --- /dev/null +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -0,0 +1,153 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.Runtime.Serialization; + +using Greenshot.Helpers; + +namespace Greenshot.Drawing.Fields { + /// + /// Basic IFieldHolder implementation, providing access to a set of fields + /// + [Serializable()] + public abstract class AbstractFieldHolder : IFieldHolder { + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(AbstractFieldHolder)); + + /// + /// called when a field's value has changed + /// + [NonSerialized] + private FieldChangedEventHandler fieldChanged; + public event FieldChangedEventHandler FieldChanged { + add { fieldChanged += value; } + remove{ fieldChanged -= value; } + } + + // we keep to Coolections of our fields, dictionary for quick access, list for serialization + // this allows us to use default serialization + [NonSerialized] + private Dictionary fieldsByType = new Dictionary(); + private List fields = new List(); + + + + + public AbstractFieldHolder() {} + + [OnDeserializedAttribute()] + private void OnDeserialized(StreamingContext context) { + fieldsByType = new Dictionary(); + // listen to changing properties + foreach(Field field in fields) { + field.PropertyChanged += delegate { if(fieldChanged != null) fieldChanged(this, new FieldChangedEventArgs(field)); }; + fieldsByType[field.FieldType] = field; + } + } + + public virtual void AddField(Field field) { + if(fieldsByType != null && fieldsByType.ContainsKey(field.FieldType)) { + if(LOG.IsDebugEnabled) LOG.Debug("A field with of type '"+field.FieldType+"' already exists in this "+GetType()+", will overwrite."); + } + + fields.Add(field); + fieldsByType[field.FieldType] = field; + field.PropertyChanged += delegate { if(fieldChanged != null) fieldChanged(this, new FieldChangedEventArgs(field)); }; + } + + public void RemoveField(Field field) { + fields.Remove(field); + fieldsByType.Remove(field.FieldType); + field.PropertyChanged -= delegate { if(fieldChanged != null) fieldChanged(this, new FieldChangedEventArgs(field)); }; + } + + public List GetFields() { + return fields; + } + + + public Field GetField(FieldType fieldType) { + try { + return fieldsByType[fieldType]; + } catch(KeyNotFoundException e) { + throw new ArgumentException("Field '"+fieldType+"' does not exist in " + GetType(), e); + } + } + + public object GetFieldValue(FieldType fieldType) { + return GetField(fieldType).Value; + } + + #region convenience methods to save us some casts outside + public string GetFieldValueAsString(FieldType fieldType) { + return (string)GetFieldValue(fieldType); + } + + public int GetFieldValueAsInt(FieldType fieldType) { + return (int)GetFieldValue(fieldType); + } + + public decimal GetFieldValueAsDecimal(FieldType fieldType) { + return (decimal)GetFieldValue(fieldType); + } + + public double GetFieldValueAsDouble(FieldType fieldType) { + return (double)GetFieldValue(fieldType); + } + + public float GetFieldValueAsFloat(FieldType fieldType) { + return (float)GetFieldValue(fieldType); + } + + public bool GetFieldValueAsBool(FieldType fieldType) { + return (bool)GetFieldValue(fieldType); + } + + public Color GetFieldValueAsColor(FieldType fieldType) { + return (Color)GetFieldValue(fieldType); + } + #endregion + + public bool HasField(FieldType fieldType) { + return fieldsByType.ContainsKey(fieldType); + } + + public bool HasFieldValue(FieldType fieldType) { + return HasField(fieldType) && fieldsByType[fieldType].HasValue; + } + + public void SetFieldValue(FieldType fieldType, object value) { + try { + fieldsByType[fieldType].Value = value; + } catch(KeyNotFoundException e) { + throw new ArgumentException("Field '"+fieldType+"' does not exist in " + GetType(), e); + } + } + + protected void OnFieldChanged(object sender, FieldChangedEventArgs e){ + if(fieldChanged != null) fieldChanged(sender, e); + } + + } +} diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs new file mode 100644 index 000000000..8254ed35e --- /dev/null +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -0,0 +1,126 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.Runtime.Serialization; + +using Greenshot.Helpers; + +namespace Greenshot.Drawing.Fields { + /// + /// Basic IFieldHolderWithChildren implementation. Similar to IFieldHolder, + /// but has a List of children. + /// Field values are passed to and from children as well. + /// + [Serializable()] + public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder { + + FieldChangedEventHandler fieldChangedEventHandler; + + [NonSerialized] + private EventHandler childrenChanged; + public event EventHandler ChildrenChanged { + add { childrenChanged += value; } + remove { childrenChanged -= value; } + } + + public List Children = new List(); + + public AbstractFieldHolderWithChildren() { + fieldChangedEventHandler = new FieldChangedEventHandler(OnFieldChanged); + } + + [OnDeserializedAttribute()] + private void OnDeserialized(StreamingContext context) { + // listen to changing properties + foreach(IFieldHolder fieldHolder in Children) { + fieldHolder.FieldChanged += fieldChangedEventHandler; + } + if(childrenChanged != null) childrenChanged(this, EventArgs.Empty); + } + + public void AddChild(IFieldHolder fieldHolder) { + Children.Add(fieldHolder); + fieldHolder.FieldChanged += fieldChangedEventHandler; + if(childrenChanged != null) childrenChanged(this, EventArgs.Empty); + } + + public void RemoveChild(IFieldHolder fieldHolder) { + Children.Remove(fieldHolder); + fieldHolder.FieldChanged -= fieldChangedEventHandler; + if(childrenChanged != null) childrenChanged(this, EventArgs.Empty); + } + + public new List GetFields() { + List ret = new List(); + ret.AddRange(base.GetFields()); + foreach(IFieldHolder fh in Children) { + ret.AddRange(fh.GetFields()); + } + return ret; + } + + public new Field GetField(FieldType fieldType) { + Field ret = null; + if(base.HasField(fieldType)) { + ret = base.GetField(fieldType); + } else { + foreach(IFieldHolder fh in Children) { + if(fh.HasField(fieldType)) { + ret = fh.GetField(fieldType); + break; + } + } + } + if(ret == null) { + throw new ArgumentException("Field '"+fieldType+"' does not exist in " + GetType()); + } + return ret; + } + + public new bool HasField(FieldType fieldType) { + bool ret = base.HasField(fieldType); + if(!ret) { + foreach(IFieldHolder fh in Children) { + if(fh.HasField(fieldType)) { + ret = true; + break; + } + } + } + return ret; + } + + public new bool HasFieldValue(FieldType fieldType) { + Field f = GetField(fieldType); + return f != null && f.HasValue; + } + + public new void SetFieldValue(FieldType fieldType, object value) { + Field f = GetField(fieldType); + if(f != null) f.Value = value; + } + + } +} diff --git a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs new file mode 100644 index 000000000..0454450c3 --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs @@ -0,0 +1,47 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + /// + /// Basic IBindingConverter implementation + /// + public abstract class AbstractBindingConverter : IBindingConverter + { + public AbstractBindingConverter() {} + + public object convert(object o) { + if(o == null) { + return null; + } else if(o is T1) { + return convert((T1)o); + } else if(o is T2) { + return convert((T2)o); + } else { + throw new ArgumentException("Cannot handle argument of type "+o.GetType()); + } + } + + protected abstract T2 convert(T1 o); + protected abstract T1 convert(T2 o); + + } +} diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs new file mode 100644 index 000000000..2175a7a4b --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -0,0 +1,168 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Reflection; + +namespace Greenshot.Drawing.Fields.Binding { + /// + /// Bidirectional binding of properties of two INotifyPropertyChanged instances. + /// This implementation synchronizes null values, too. If you do not want this + /// behavior (e.g. when binding to a + /// + public class BidirectionalBinding + { + private INotifyPropertyChanged object1; + private INotifyPropertyChanged object2; + private string property1; + private string property2; + private bool updatingObject1 = false; + private bool updatingObject2 = false; + private IBindingConverter converter; + private IBindingValidator validator; + + /// + /// Whether or not null values are passed on to the other object. + /// + protected bool AllowSynchronizeNull = true; + + /// + /// Bind properties of two objects bidirectionally + /// + /// Object containing 1st property to bind + /// Property of 1st object to bind + /// Object containing 2nd property to bind + /// Property of 2nd object to bind + public BidirectionalBinding(INotifyPropertyChanged object1, string property1, INotifyPropertyChanged object2, string property2) + { + this.object1 = object1; + this.object2 = object2; + this.property1 = property1; + this.property2 = property2; + + this.object1.PropertyChanged += new PropertyChangedEventHandler(Property1Changed); + this.object2.PropertyChanged += new PropertyChangedEventHandler(Property2Changed); + } + + /// + /// Bind properties of two objects bidirectionally, converting the values using a converter + /// + /// Object containing 1st property to bind + /// Property of 1st object to bind + /// Object containing 2nd property to bind + /// Property of 2nd object to bind + /// taking care of converting the synchronzied value to the correct target format and back + public BidirectionalBinding(INotifyPropertyChanged object1, string property1, INotifyPropertyChanged object2, string property2, IBindingConverter converter) : this(object1, property1, object2, property2) + { + this.converter = converter; + } + + /// + /// Bind properties of two objects bidirectionally, converting the values using a converter. + /// Synchronization can be intercepted by adding a validator. + /// + /// Object containing 1st property to bind + /// Property of 1st object to bind + /// Object containing 2nd property to bind + /// Property of 2nd object to bind + /// validator to intercept synchronisation if the value does not match certain criteria + public BidirectionalBinding(INotifyPropertyChanged object1, string property1, INotifyPropertyChanged object2, string property2, IBindingValidator validator) : this(object1, property1, object2, property2) + { + this.validator = validator; + } + + /// + /// Bind properties of two objects bidirectionally, converting the values using a converter. + /// Synchronization can be intercepted by adding a validator. + /// + /// Object containing 1st property to bind + /// Property of 1st object to bind + /// Object containing 2nd property to bind + /// Property of 2nd object to bind + /// taking care of converting the synchronzied value to the correct target format and back + /// validator to intercept synchronisation if the value does not match certain criteria + public BidirectionalBinding(INotifyPropertyChanged object1, string property1, INotifyPropertyChanged object2, string property2, IBindingConverter converter, IBindingValidator validator) : this(object1, property1, object2, property2, converter) + { + this.validator = validator; + } + + public void Property1Changed(object sender, PropertyChangedEventArgs e) + { + if(!updatingObject1 && e.PropertyName.Equals(property1)) + { + updatingObject2 = true; + synchronize(object1, property1, object2, property2); + updatingObject2 = false; + } + } + + public void Property2Changed(object sender, PropertyChangedEventArgs e) + { + if(!updatingObject2 && e.PropertyName.Equals(property2)) + { + updatingObject1 = true; + synchronize(object2, property2, object1, property1); + updatingObject1 = false; + } + } + + private void synchronize(INotifyPropertyChanged sourceObject, string sourceProperty, INotifyPropertyChanged targetObject, string targetProperty) + { + PropertyInfo targetPropertyInfo = resolvePropertyInfo(targetObject, targetProperty); + PropertyInfo sourcePropertyInfo = resolvePropertyInfo(sourceObject, sourceProperty); + + if(sourcePropertyInfo != null && targetPropertyInfo != null && targetPropertyInfo.CanWrite) + { + object bValue = sourcePropertyInfo.GetValue(sourceObject, null); + if(converter != null && bValue != null) bValue = converter.convert(bValue); + try { + if(validator == null || validator.validate(bValue)) { + targetPropertyInfo.SetValue(targetObject, bValue, null); + } + } catch (Exception e) { + throw new MemberAccessException("Could not set property '"+targetProperty+"' to '"+bValue+"' ["+((bValue!=null)?bValue.GetType().Name:"")+"] on "+targetObject+". Probably other type than expected, IBindingCoverter to the rescue.", e); + } + + } + } + + private PropertyInfo resolvePropertyInfo(object obj, string property) { + PropertyInfo ret = null; + string[] properties = property.Split(".".ToCharArray()); + for(int i=0; i. + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + /// + /// Converts decimal to double (%) and vice versa, e.g. 95f <---> 0.95d + /// + public class DecimalDoublePercentageConverter : AbstractBindingConverter + { + private static DecimalDoublePercentageConverter uniqueInstance; + + private DecimalDoublePercentageConverter() {} + + protected override decimal convert(double o) { + return Convert.ToDecimal(o)*100; + } + + protected override double convert(decimal o) { + return Convert.ToDouble(o)/100; + } + + public static DecimalDoublePercentageConverter GetInstance() { + if(uniqueInstance == null) uniqueInstance = new DecimalDoublePercentageConverter(); + return uniqueInstance; + } + + } +} diff --git a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs new file mode 100644 index 000000000..74e9cc4b7 --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs @@ -0,0 +1,47 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + /// + /// Converts decimal to float and vice versa. + /// + public class DecimalFloatConverter : AbstractBindingConverter + { + private static DecimalFloatConverter uniqueInstance; + + private DecimalFloatConverter() {} + + protected override decimal convert(float o) { + return Convert.ToDecimal(o); + } + + protected override float convert(decimal o) { + return Convert.ToInt16(o); + } + + public static DecimalFloatConverter GetInstance() { + if(uniqueInstance == null) uniqueInstance = new DecimalFloatConverter(); + return uniqueInstance; + } + + } +} diff --git a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs new file mode 100644 index 000000000..fe5d4f586 --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs @@ -0,0 +1,47 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + /// + /// Converts decimal to int and vice versa. + /// + public class DecimalIntConverter : AbstractBindingConverter + { + private static DecimalIntConverter uniqueInstance; + + private DecimalIntConverter() {} + + protected override decimal convert(int o) { + return Convert.ToDecimal(o); + } + + protected override int convert(decimal o) { + return Convert.ToInt16(o); + } + + public static DecimalIntConverter GetInstance() { + if(uniqueInstance == null) uniqueInstance = new DecimalIntConverter(); + return uniqueInstance; + } + + } +} diff --git a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs new file mode 100644 index 000000000..e2cfc3369 --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs @@ -0,0 +1,34 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + + /// + /// Interface for a bidirectional converter, for use with BidirectionalBinding. + /// convert(object) implementation must deal with both directions. + /// see DecimalIntConverter + /// + public interface IBindingConverter { + object convert(object o); + } + +} diff --git a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs new file mode 100644 index 000000000..5d568ca49 --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs @@ -0,0 +1,35 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + + /// + /// Interface for a bidirectional validator, for use with BidirectionalBinding. + /// Useful if you do not want to synchronize values which would be illegal on + /// one of the bound objects (e.g. null value on some form components) + /// see NotNullValidator + /// + public interface IBindingValidator { + bool validate(object o); + } + +} diff --git a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs new file mode 100644 index 000000000..1a67621aa --- /dev/null +++ b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs @@ -0,0 +1,42 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; + +namespace Greenshot.Drawing.Fields.Binding { + /// + /// Validates a value not to be null. + /// + public class NotNullValidator : IBindingValidator { + private static NotNullValidator uniqueInstance; + + private NotNullValidator() { + } + + public bool validate(object o) { + return o != null; + } + + public static NotNullValidator GetInstance() { + if(uniqueInstance == null) uniqueInstance = new NotNullValidator(); + return uniqueInstance; + } + } +} diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs new file mode 100644 index 000000000..1b05b9143 --- /dev/null +++ b/Greenshot/Drawing/Fields/Field.cs @@ -0,0 +1,122 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; + +namespace Greenshot.Drawing.Fields { + /// + /// Represents a single field of a drawable element, i.e. + /// line thickness of a rectangle. + /// + [Serializable] + public class Field : INotifyPropertyChanged { + [field:NonSerialized] + public event PropertyChangedEventHandler PropertyChanged; + + public object myValue; + public object Value { + get { return myValue; } + set { if(!object.Equals(myValue,value)) { + myValue = value; + if(PropertyChanged!=null) PropertyChanged(this, new PropertyChangedEventArgs("Value")); } + } + } + public FieldType FieldType; + public string Scope; + + /// + /// Constructs a new Field instance, usually you should be using FieldFactory + /// to create Fields. + /// + /// FieldType of the Field to be created + /// The scope to which the value of this Field is relevant. + /// Depending on the scope the Field's value may be shared for other elements + /// containing the same FieldType for defaulting to the last used value. + /// When scope is set to a Type (e.g. typeof(RectangleContainer)), its value + /// should not be reused for FieldHolders of another Type (e.g. typeof(EllipseContainer)) + /// + public Field(FieldType fieldType, Type scope) { + FieldType = fieldType; + Scope = scope.FullName; + } + public Field(FieldType fieldType, string scope) { + FieldType = fieldType; + Scope = scope; + } + public Field(FieldType fieldType) { + FieldType = fieldType; + } + /// + /// Returns true if this field holds a value other than null. + /// + public bool HasValue { + get{ return Value != null; } + } + + /// + /// Creates a flat clone of this Field. The fields value itself is not cloned. + /// + /// + public Field Clone() { + Field ret = new Field(FieldType, Scope); + ret.Value = Value; + return ret; + } + + public override int GetHashCode() { + int hashCode = 0; + unchecked { + hashCode += 1000000009 * FieldType.GetHashCode(); + if (Scope != null) + hashCode += 1000000021 * Scope.GetHashCode(); + } + return hashCode; + } + + public override bool Equals(object obj) { + Field other = obj as Field; + if (other == null) { + return false; + } + return this.FieldType == other.FieldType && object.Equals(this.Scope, other.Scope); + } + + public override string ToString() { + return string.Format("[Field FieldType={1} Value={0} Scope={2}]", this.myValue, this.FieldType, this.Scope); + } + } + + + /// + /// EventHandler to be used when a field value changes + /// + public delegate void FieldChangedEventHandler(object sender, FieldChangedEventArgs e); + + /// + /// EventArgs to be used with FieldChangedEventHandler + /// + public class FieldChangedEventArgs : EventArgs { + public readonly Field Field; + public FieldChangedEventArgs(Field field) { + this.Field = field; + } + } +} diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs new file mode 100644 index 000000000..5bd8e8a7e --- /dev/null +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -0,0 +1,186 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Reflection; +using System.ComponentModel; +using System.Collections.Generic; +using Greenshot.Configuration; +using Greenshot.Drawing.Filters; +using Greenshot.Helpers; + +namespace Greenshot.Drawing.Fields { + /// + /// Represents the current set of properties for the editor. + /// When one of EditorProperties' properties is updated, the change will be promoted + /// to all bound elements. + /// * If an element is selected: + /// This class represents the element's properties + /// * I n>1 elements are selected: + /// This class represents the properties of all elements. + /// Properties that do not apply for ALL selected elements are null (or 0 respectively) + /// If the property values of the selected elements differ, the value of the last bound element wins. + /// + public class FieldAggregator : AbstractFieldHolder { + + private List boundContainers; + private bool internalUpdateRunning = false; + + enum Status {IDLE, BINDING, UPDATING}; + + private Status status; + + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(FieldAggregator)); + + public FieldAggregator() { + List fields = FieldFactory.GetDefaultFields(); + foreach(Field field in fields) { + AddField(field); + } + boundContainers = new List(); + } + + + public override void AddField(Field field) { + base.AddField(field); + field.PropertyChanged += new PropertyChangedEventHandler(OwnPropertyChanged); + } + + public void BindElements(DrawableContainerList dcs) { + foreach(DrawableContainer dc in dcs) { + BindElement(dc); + } + } + public void BindElement(DrawableContainer dc) { + status = Status.BINDING; + if(LOG.IsDebugEnabled) LOG.Debug("Binding element of type "+dc.GetType()); + if(!boundContainers.Contains(dc)) { + boundContainers.Add(dc); + status = Status.IDLE; + dc.ChildrenChanged += delegate { UpdateFromBoundElements(); }; + UpdateFromBoundElements(); + } + } + + public void BindAndUpdateElement(DrawableContainer dc) { + UpdateElement(dc); + BindElement(dc); + } + + public void UpdateElement(DrawableContainer dc) { + if(LOG.IsDebugEnabled) LOG.Debug("Updating element of type "+dc.GetType()); + internalUpdateRunning = true; + foreach(Field field in GetFields()) { + if(dc.HasField(field.FieldType) && field.HasValue) { + //if(LOG.IsDebugEnabled) LOG.Debug(" "+field+ ": "+field.Value); + dc.SetFieldValue(field.FieldType, field.Value); + } + } + internalUpdateRunning = false; + } + + public void UnbindElement(DrawableContainer dc) { + if(boundContainers.Contains(dc)) { + if(LOG.IsDebugEnabled) LOG.Debug("Unbinding element of type "+dc.GetType()); + boundContainers.Remove(dc); + UpdateFromBoundElements(); + } + } + + public void Clear() { + ClearFields(); + boundContainers.Clear(); + UpdateFromBoundElements(); + } + + /// + /// sets all field values to null, however does not remove fields + /// + private void ClearFields() { + internalUpdateRunning = true; + //if(LOG.IsDebugEnabled) LOG.Debug("Clearing fields internally"); + foreach(Field field in GetFields()) { + field.Value = null; + //if(LOG.IsDebugEnabled) LOG.Debug(" "+field.GetType()+ ": "+field.Value); + } + internalUpdateRunning = false; + } + + /// + /// Updates this instance using the respective fields from the bound elements. + /// Fields that do not apply to every bound element are set to null, or 0 respectively. + /// All other fields will be set to the field value of the least bound element. + /// + private void UpdateFromBoundElements() { + if(LOG.IsDebugEnabled) LOG.Debug("Updating from bound elements, status = "+status); + status = Status.UPDATING; + ClearFields(); + internalUpdateRunning = true; + foreach(Field f in FindCommonFields()) { + SetFieldValue(f.FieldType,f.Value); + //if(LOG.IsDebugEnabled) LOG.Debug("Updating own field: "+f.FieldType+": "+GetField(f.FieldType).Value); + } + internalUpdateRunning = false; + status = Status.IDLE; + } + + private List FindCommonFields() { + List ret = null; + if(boundContainers.Count > 0) { + // take all fields from the least selected container... + ret = boundContainers[boundContainers.Count-1].GetFields(); + for(int i=0;i fieldsToRemove = new List(); + foreach(Field f in ret) { + // ... throw out those that do not apply to one of the other containers + if(!dc.HasField(f.FieldType)) fieldsToRemove.Add(f); + } + foreach(Field f in fieldsToRemove) { + ret.Remove(f); + } + } + } + if(ret == null) ret = new List(); + return ret; + } + + public void OwnPropertyChanged(object sender, PropertyChangedEventArgs ea) { + Field f = (Field) sender; + if(!internalUpdateRunning && f.Value!=null) { + + foreach(DrawableContainer dc in boundContainers) { + if(f.Scope == null || dc.GetType().FullName.Equals(f.Scope)) { + if(LOG.IsDebugEnabled) LOG.Debug("Updating field: "+f.FieldType+": "+f.Value); + if(dc.HasField(f.FieldType)) { + Field dcf = dc.GetField(f.FieldType); + dcf.Value = f.Value; + // update last used from DC field, so that scope is honored + AppConfig.GetInstance().UpdateLastUsedFieldValue(dcf); + } + + } + } + } + } + + } +} diff --git a/Greenshot/Drawing/Fields/FieldFactory.cs b/Greenshot/Drawing/Fields/FieldFactory.cs new file mode 100644 index 000000000..92e195382 --- /dev/null +++ b/Greenshot/Drawing/Fields/FieldFactory.cs @@ -0,0 +1,92 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Collections.Generic; +using Greenshot.Configuration; + +namespace Greenshot.Drawing.Fields { + + /// + /// In charge for creating Fields for DrawableContainers or Filters. + /// Add new FieldTypes in FieldType.cs + /// + public class FieldFactory { + + private FieldFactory() {} + + /// FieldType of the field to construct + /// a new Field of the given fieldType + public static Field CreateField(FieldType fieldType) { + return CreateField(fieldType, null, null); + } + + /// FieldType of the field to construct + /// overwrites the original default value being defined in FieldType + /// a new Field of the given fieldType and initialValue + public static Field CreateField(FieldType fieldType, object preferredDefaultValue) { + return CreateField(fieldType, null, preferredDefaultValue); + } + + /// FieldType of the field to construct + /// the value to be inserted, regardless of last used value or default value for this field + /// a new Field of the given fieldType and initialValue + public static Field CreateFieldWithValue(FieldType fieldType, object forcedValue) { + Field ret = new Field(fieldType); + ret.Value = forcedValue; + return ret; + + } + + /// FieldType of the field to construct + /// FieldType of the field to construct + /// a new Field of the given fieldType, with the scope of it's value being restricted to the Type scope + public static Field CreateField(FieldType fieldType, Type scope) { + return CreateField(fieldType, scope, null); + } + + /// FieldType of the field to construct + /// overwrites the original default value being defined in FieldType + /// a new Field of the given fieldType and preferredDefaultValue, with the scope of it's value being restricted to the Type scope + public static Field CreateField(FieldType fieldType, Type scope, object preferredDefaultValue) { + Field ret = null; + if (scope != null) { + ret = new Field(fieldType, scope); + } else { + ret = new Field(fieldType); + } + AppConfig.GetInstance().GetLastUsedValueForField(ret, preferredDefaultValue); + return ret; + } + + /// a List of all available fields with their respective default value + public static List GetDefaultFields() { + List ret = new List(); + foreach(FieldType ft in FieldType.Values) { + Field f = CreateField(ft); + f.Value = ft.DefaultValue; + ret.Add(f); + } + return ret; + } + } + +} diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs new file mode 100644 index 000000000..d0c404532 --- /dev/null +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -0,0 +1,117 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; + +namespace Greenshot.Drawing.Fields { + /// + /// Defines all FieldTypes + their default value. + /// (The additional value is why this is not an enum) + /// + [Serializable] + public class FieldType { + + public static readonly FieldType ARROWHEADS = new FieldType("ARROWHEADS", Greenshot.Drawing.ArrowContainer.ArrowHeadCombination.END_POINT); + public static readonly FieldType BLUR_RADIUS = new FieldType("BLUR_RADIUS", 3); + public static readonly FieldType BRIGHTNESS = new FieldType("BRIGHTNESS", 0.9d); + public static readonly FieldType FILL_COLOR = new FieldType("FILL_COLOR", Color.Transparent); + public static readonly FieldType FONT_BOLD = new FieldType("FONT_BOLD", false); + public static readonly FieldType FONT_FAMILY = new FieldType("FONT_FAMILY", FontFamily.GenericSansSerif.Name); + public static readonly FieldType FONT_ITALIC = new FieldType("FONT_ITALIC", false); + public static readonly FieldType FONT_SIZE = new FieldType("FONT_SIZE", 11f); + public static readonly FieldType HIGHLIGHT_COLOR = new FieldType("HIGHLIGHT_COLOR", Color.Yellow); + public static readonly FieldType LINE_COLOR = new FieldType("LINE_COLOR", Color.Red); + public static readonly FieldType LINE_THICKNESS = new FieldType("LINE_THICKNESS", 1); + public static readonly FieldType MAGNIFICATION_FACTOR = new FieldType("MAGNIFICATION_FACTOR", 2); + public static readonly FieldType PIXEL_SIZE = new FieldType("PIXEL_SIZE", 5); + public static readonly FieldType PREVIEW_QUALITY = new FieldType("PREVIEW_QUALITY", 1.0d); + public static readonly FieldType SHADOW = new FieldType("SHADOW", false); + public static readonly FieldType PREPARED_FILTER_OBFUSCATE = new FieldType("PREPARED_FILTER_OBFUSCATE", FilterContainer.PreparedFilter.PIXELIZE); + public static readonly FieldType PREPARED_FILTER_HIGHLIGHT = new FieldType("PREPARED_FILTER_HIGHLIGHT", FilterContainer.PreparedFilter.TEXT_HIGHTLIGHT); + public static readonly FieldType FLAGS = new FieldType("FLAGS", null); + + public static FieldType[] Values = new FieldType[]{ + ARROWHEADS, + BLUR_RADIUS, + BRIGHTNESS, + FILL_COLOR, + FONT_BOLD, + FONT_FAMILY, + FONT_ITALIC, + FONT_SIZE, + HIGHLIGHT_COLOR, + LINE_COLOR, + LINE_THICKNESS, + MAGNIFICATION_FACTOR, + PIXEL_SIZE, + PREVIEW_QUALITY, + SHADOW, + PREPARED_FILTER_OBFUSCATE, + PREPARED_FILTER_HIGHLIGHT, + FLAGS + }; + + [Flags] + public enum Flag { + NONE = 0, + CONFIRMABLE = 1 + } + + + public object DefaultValue; + public string Name; + private FieldType(string name, object defaultValue) { + Name = name; + DefaultValue=defaultValue; + } + public override string ToString() { + return this.Name; + } + public override int GetHashCode() + { + int hashCode = 0; + unchecked { + if (Name != null) + hashCode += 1000000009 * Name.GetHashCode(); + } + return hashCode; + } + + public override bool Equals(object obj) + { + FieldType other = obj as FieldType; + if (other == null) + return false; + return object.Equals(this.Name,other.Name); + } + + public static bool operator ==(FieldType a, FieldType b) { + return object.Equals(a,b); + } + + public static bool operator !=(FieldType a, FieldType b) { + return !object.Equals(a,b); + } + + } + + +} diff --git a/Greenshot/Drawing/Fields/IFieldHolder.cs b/Greenshot/Drawing/Fields/IFieldHolder.cs new file mode 100644 index 000000000..4a2050b93 --- /dev/null +++ b/Greenshot/Drawing/Fields/IFieldHolder.cs @@ -0,0 +1,53 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; + +namespace Greenshot.Drawing.Fields { + /// + /// Any element holding Fields must provide access to it. + /// AbstractFieldHolder is the basic implementation. + /// If you need the fieldHolder to have child fieldHolders, + /// you should consider using IFieldHolderWithChildren. + /// + public interface IFieldHolder { + + event FieldChangedEventHandler FieldChanged; + + void AddField(Field field); + void RemoveField(Field field); + List GetFields(); + Field GetField(FieldType fieldType); + bool HasField(FieldType fieldType); + void SetFieldValue(FieldType fieldType, object value); + } + + /// + /// Extended fieldHolder which has fieldHolder children. + /// Implementations should pass field values to and from + /// their children. + /// AbstractFieldHolderWithChildren is the basic implementation. + /// + public interface IFieldHolderWithChildren : IFieldHolder { + void AddChild(IFieldHolder fieldHolder); + void RemoveChild(IFieldHolder fieldHolder); + } +} diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs new file mode 100644 index 000000000..acd472bd2 --- /dev/null +++ b/Greenshot/Drawing/FilterContainer.cs @@ -0,0 +1,90 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Drawing.Fields; +using Greenshot.Drawing.Filters; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// empty container for filter-only elements + /// + [Serializable()] + public class FilterContainer : DrawableContainer { + + public enum PreparedFilterMode {OBFUSCATE, HIGHLIGHT}; + public enum PreparedFilter {BLUR, PIXELIZE, TEXT_HIGHTLIGHT, AREA_HIGHLIGHT, GRAYSCALE, MAGNIFICATION}; + + public PreparedFilter Filter { + get { return (PreparedFilter)GetFieldValue(FieldType.PREPARED_FILTER_HIGHLIGHT); } + } + + public FilterContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.LINE_THICKNESS, GetType())); + AddField(FieldFactory.CreateField(FieldType.LINE_COLOR, GetType())); + AddField(FieldFactory.CreateField(FieldType.SHADOW)); + } + + public override void Draw(Graphics g, RenderMode rm) { + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + if (shadow && lineVisible) { + //draw shadow first + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = lineVisible ? 1 : 0; + while (currentStep <= steps) { + using (Pen shadowPen = new Pen(Color.FromArgb(alpha, 100, 100, 100))) { + shadowPen.Width = lineVisible ? lineThickness : 1; + Rectangle shadowRect = GuiRectangle.GetGuiRectangle( + this.Left + currentStep, + this.Top + currentStep, + this.Width, + this.Height); + g.DrawRectangle(shadowPen, shadowRect); + currentStep++; + alpha = alpha - (basealpha / steps); + } + } + } + + Rectangle rect = GuiRectangle.GetGuiRectangle(this.Left, this.Top, this.Width, this.Height); + + using (Pen pen = new Pen(lineColor)) { + pen.Width = lineThickness; + if(pen.Width > 0) { + g.DrawRectangle(pen, rect); + } + } + + } + } +} diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs new file mode 100644 index 000000000..cea7224b8 --- /dev/null +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -0,0 +1,121 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.Serialization; + +using Greenshot.Drawing; +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +/// +/// Graphical filter which can be added to DrawableContainer. +/// Subclasses should fulfill INotifyPropertyChanged contract, i.e. call +/// OnPropertyChanged whenever a public property has been changed. +/// +namespace Greenshot.Drawing.Filters { + [Serializable()] + public abstract class AbstractFilter : AbstractFieldHolder, IFilter { + + [NonSerialized] + private PropertyChangedEventHandler propertyChanged; + public event PropertyChangedEventHandler PropertyChanged { + add { propertyChanged += value; } + remove{ propertyChanged -= value; } + } + + private bool invert = false; + public bool Invert { + get { return invert; } + set { invert=value; OnPropertyChanged("Invert"); } + } + protected BitmapBuffer bbb; + protected Rectangle applyRect; + protected DrawableContainer parent; + public DrawableContainer Parent { + get {return parent;} + set {parent = value;} + } + + public AbstractFilter(DrawableContainer parent) { + this.parent = parent; + } + + public DrawableContainer GetParent() { + return parent; + } + + /** + * This method fixes the problem that we can't apply a filter outside the target bitmap, + * therefor the filtered-bitmap will be shifted if we try to draw it outside the target bitmap. + * It will also account for the Invert flag. + */ + protected Rectangle IntersectRectangle(Size applySize, Rectangle rect) { + Rectangle myRect; + if (Invert) { + myRect = new Rectangle(0, 0, applySize.Width, applySize.Height); + } else { + Rectangle applyRect = new Rectangle(0,0, applySize.Width, applySize.Height); + myRect = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height); + myRect.Intersect(applyRect); + } + return myRect; + } + + public virtual void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { + applyRect = IntersectRectangle(applyBitmap.Size, rect); + + if (applyRect.Width == 0 || applyRect.Height == 0) { + // nothing to do + return; + } + + bbb = new BitmapBuffer(applyBitmap, applyRect); + try { + bbb.Lock(); + for(int y=0;y +/// Parts of this class were taken from BlurEffect.cs of Paint.NET 3.0.1, +/// which was released under MIT license. +/// http://www.getpaint.net +/// Some of this code has been adapted for integration with Greenshot. +/// See Paint.NET copyright notice below. +/// + +///////////////////////////////////////////////////////////////////////////////// +// Paint.NET // +// Copyright (C) Rick Brewster, Tom Jackson, and past contributors. // +// Portions Copyright (C) Microsoft Corporation. All Rights Reserved. // +// See src/Resources/Files/License.txt for full licensing and attribution // +// details. // +// . // +///////////////////////////////////////////////////////////////////////////////// + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Drawing.Filters; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + [Serializable()] + public class BlurFilter : AbstractFilter { + public double previewQuality; + public double PreviewQuality { + get { return previewQuality; } + set { previewQuality = value; OnPropertyChanged("PreviewQuality"); } + } + + public BlurFilter(DrawableContainer parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.BLUR_RADIUS, GetType())); + AddField(FieldFactory.CreateField(FieldType.PREVIEW_QUALITY)); + } + + public static int[] CreateGaussianBlurRow(int amount) { + int size = 1 + (amount * 2); + int[] weights = new int[size]; + + for (int i = 0; i <= amount; ++i) + { + // 1 + aa - aa + 2ai - ii + weights[i] = 16 * (i + 1); + weights[weights.Length - i - 1] = weights[i]; + } + + return weights; + } + + public unsafe override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { + applyRect = IntersectRectangle(applyBitmap.Size, rect); + + if (applyRect.Height <= 0 || applyRect.Width <= 0) { + return; + } + + int blurRadius = GetFieldValueAsInt(FieldType.BLUR_RADIUS); + double previewQuality = GetFieldValueAsDouble(FieldType.PREVIEW_QUALITY); + + // do nothing when nothing can be done! + if (blurRadius < 1) { + return; + } + + using (BitmapBuffer bbbDest = new BitmapBuffer(applyBitmap, applyRect)) { + bbbDest.Lock(); + using (BitmapBuffer bbbSrc = new BitmapBuffer(applyBitmap, applyRect)) { + bbbSrc.Lock(); + Random rand = new Random(); + + int r = blurRadius; + int[] w = CreateGaussianBlurRow(r); + int wlen = w.Length; + + for (int y = 0; y < applyRect.Height; ++y) { + long* waSums = stackalloc long[wlen]; + long* wcSums = stackalloc long[wlen]; + long* aSums = stackalloc long[wlen]; + long* bSums = stackalloc long[wlen]; + long* gSums = stackalloc long[wlen]; + long* rSums = stackalloc long[wlen]; + long waSum = 0; + long wcSum = 0; + long aSum = 0; + long bSum = 0; + long gSum = 0; + long rSum = 0; + + for (int wx = 0; wx < wlen; ++wx) { + int srcX = wx - r; + waSums[wx] = 0; + wcSums[wx] = 0; + aSums[wx] = 0; + bSums[wx] = 0; + gSums[wx] = 0; + rSums[wx] = 0; + + if (srcX >= 0 && srcX < bbbDest.Width) { + for (int wy = 0; wy < wlen; ++wy) { + int srcY = y + wy - r; + + if (srcY >= 0 && srcY < bbbDest.Height) { + int[] colors = bbbSrc.GetColorArrayAt(srcX, srcY); + int wp = w[wy]; + + waSums[wx] += wp; + wp *= colors[0] + (colors[0] >> 7); + wcSums[wx] += wp; + wp >>= 8; + + aSums[wx] += wp * colors[0]; + bSums[wx] += wp * colors[3]; + gSums[wx] += wp * colors[2]; + rSums[wx] += wp * colors[1]; + } + } + + int wwx = w[wx]; + waSum += wwx * waSums[wx]; + wcSum += wwx * wcSums[wx]; + aSum += wwx * aSums[wx]; + bSum += wwx * bSums[wx]; + gSum += wwx * gSums[wx]; + rSum += wwx * rSums[wx]; + } + } + + wcSum >>= 8; + + if (waSum == 0 || wcSum == 0) { + SetColorAt(bbbDest, 0, y, new int[]{0,0,0,0}); + } else { + int alpha = (int)(aSum / waSum); + int blue = (int)(bSum / wcSum); + int green = (int)(gSum / wcSum); + int red = (int)(rSum / wcSum); + + SetColorAt(bbbDest, 0, y, new int[]{alpha, red, green, blue}); + } + + for (int x = 1; x < applyRect.Width; ++x) { + for (int i = 0; i < wlen - 1; ++i) { + waSums[i] = waSums[i + 1]; + wcSums[i] = wcSums[i + 1]; + aSums[i] = aSums[i + 1]; + bSums[i] = bSums[i + 1]; + gSums[i] = gSums[i + 1]; + rSums[i] = rSums[i + 1]; + } + + waSum = 0; + wcSum = 0; + aSum = 0; + bSum = 0; + gSum = 0; + rSum = 0; + + int wx; + for (wx = 0; wx < wlen - 1; ++wx) { + long wwx = (long)w[wx]; + waSum += wwx * waSums[wx]; + wcSum += wwx * wcSums[wx]; + aSum += wwx * aSums[wx]; + bSum += wwx * bSums[wx]; + gSum += wwx * gSums[wx]; + rSum += wwx * rSums[wx]; + } + + wx = wlen - 1; + + waSums[wx] = 0; + wcSums[wx] = 0; + aSums[wx] = 0; + bSums[wx] = 0; + gSums[wx] = 0; + rSums[wx] = 0; + + int srcX = x + wx - r; + + if (srcX >= 0 && srcX < applyRect.Width) { + for (int wy = 0; wy < wlen; ++wy) { + int srcY = y + wy - r; + // only when in EDIT mode, ignore some pixels depending on preview quality + if ((renderMode==RenderMode.EXPORT || rand.NextDouble()= 0 && srcY < applyRect.Height) { + int[] colors = bbbSrc.GetColorArrayAt(srcX, srcY); + int wp = w[wy]; + + waSums[wx] += wp; + wp *= colors[0] + (colors[0] >> 7); + wcSums[wx] += wp; + wp >>= 8; + + aSums[wx] += wp * (long)colors[0]; + bSums[wx] += wp * (long)colors[3]; + gSums[wx] += wp * (long)colors[2]; + rSums[wx] += wp * (long)colors[1]; + } + } + + int wr = w[wx]; + waSum += (long)wr * waSums[wx]; + wcSum += (long)wr * wcSums[wx]; + aSum += (long)wr * aSums[wx]; + bSum += (long)wr * bSums[wx]; + gSum += (long)wr * gSums[wx]; + rSum += (long)wr * rSums[wx]; + } + + wcSum >>= 8; + + if (waSum == 0 || wcSum == 0) { + SetColorAt(bbbDest, x, y, new int[]{0,0,0,0}); + } else { + int alpha = (int)(aSum / waSum); + int blue = (int)(bSum / wcSum); + int green = (int)(gSum / wcSum); + int red = (int)(rSum / wcSum); + + SetColorAt(bbbDest, x, y, new int[]{alpha, red, green, blue}); + } + } + } + } + bbbDest.DrawTo(graphics, applyRect.Location); + } + } + + private void SetColorAt(BitmapBuffer bbb, int x, int y, int[] colors) { + if(parent.Contains(applyRect.Left+x, applyRect.Top+y) ^ Invert) { + bbb.SetColorArrayAt(x, y, colors); + } + } + } +} diff --git a/Greenshot/Drawing/Filters/BrightnessFilter.cs b/Greenshot/Drawing/Filters/BrightnessFilter.cs new file mode 100644 index 000000000..383ba55b7 --- /dev/null +++ b/Greenshot/Drawing/Filters/BrightnessFilter.cs @@ -0,0 +1,56 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + [Serializable()] + public class BrightnessFilter : AbstractFilter { + + private double brightness; + + public BrightnessFilter(DrawableContainer parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.BRIGHTNESS, GetType())); + } + + protected override void IteratePixel(int x, int y) { + Color color = bbb.GetColorAt(x, y); + int r = Convert.ToInt16(color.R*brightness); + int g = Convert.ToInt16(color.G*brightness); + int b = Convert.ToInt16(color.B*brightness); + r = (r>255) ? 255 : r; + g = (g>255) ? 255 : g; + b = (b>255) ? 255 : b; + bbb.SetColorAt(x, y, Color.FromArgb(color.A, r, g, b)); + } + + public override void Apply(Graphics graphics, Bitmap bmp, Rectangle rect, RenderMode renderMode) { + brightness = GetFieldValueAsDouble(FieldType.BRIGHTNESS); + base.Apply(graphics, bmp, rect, renderMode); + } + } +} diff --git a/Greenshot/Drawing/Filters/FastSmoothFilter.cs b/Greenshot/Drawing/Filters/FastSmoothFilter.cs new file mode 100644 index 000000000..6db3372fc --- /dev/null +++ b/Greenshot/Drawing/Filters/FastSmoothFilter.cs @@ -0,0 +1,231 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + [Serializable()] + public class FastSmoothFilter : AbstractFilter { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(FastSmoothFilter)); + + public FastSmoothFilter(DrawableContainer parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.BLUR_RADIUS, GetType())); + } + + public unsafe override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle applyRect, RenderMode renderMode) { + Rectangle sourceRect = new Rectangle(applyRect.X, applyRect.Y, applyRect.Width, applyRect.Height); + Rectangle bitmapRect = new Rectangle(0,0, applyBitmap.Width, applyBitmap.Height); + + if(sourceRect.Equals(Rectangle.Empty)) { + sourceRect = bitmapRect; + } else { + sourceRect.Intersect(bitmapRect); + } + // Does the rect have any pixels? + if (sourceRect.Height <= 0 || sourceRect.Width <= 0) { + return; + } + + int blurRadius = GetFieldValueAsInt(FieldType.BLUR_RADIUS); + + // Calculate new sourceRect to include the matrix size if possible + + int leftOffset = Math.Min(sourceRect.X, blurRadius); + int rightOffset = Math.Min(applyBitmap.Width - (sourceRect.X + sourceRect.Width), blurRadius); + int topOffset = Math.Min(sourceRect.Y, blurRadius); + int bottomOffset = Math.Min(applyBitmap.Height - (sourceRect.Y + sourceRect.Height), blurRadius); + LOG.Debug(String.Format("Offsets: {0},{1},{2},{3}", leftOffset, rightOffset, topOffset, bottomOffset)); + LOG.Debug(String.Format("SourceRect before: {0},{1},{2},{3}", sourceRect.X, sourceRect.Width, sourceRect.Y, sourceRect.Height)); + sourceRect.X -= leftOffset; + sourceRect.Width += leftOffset + rightOffset; + sourceRect.Y -= topOffset; + sourceRect.Height += topOffset + bottomOffset; + LOG.Debug(String.Format("SourceRect after: {0},{1},{2},{3}", sourceRect.X, sourceRect.Width, sourceRect.Y, sourceRect.Height)); + // Make a copy of the applyBitmap for reading + + using (Bitmap sourceBitmap = applyBitmap.Clone(sourceRect, applyBitmap.PixelFormat)) { + ApplySmooth(sourceBitmap, applyBitmap, sourceRect, blurRadius); + } + } + + public static bool ApplySmooth(Bitmap sourceBitmap, Bitmap destinationBitmap, Rectangle destRectangle, int blurRadius) { + if (blurRadius < 1) { + return false; + } + + BitmapData destbitmapData = destinationBitmap.LockBits(destRectangle, ImageLockMode.WriteOnly, destinationBitmap.PixelFormat); + BitmapData srcBitmapData = sourceBitmap.LockBits(new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height), + ImageLockMode.ReadOnly, + sourceBitmap.PixelFormat); + + int destStride = destbitmapData.Stride; + int srcStride = srcBitmapData.Stride; + + IntPtr destScan0 = destbitmapData.Scan0; + IntPtr srcScan0 = srcBitmapData.Scan0; + + int bIndex; + int gIndex; + int rIndex; + //int aIndex; + int bytesPerPixel; + switch(destinationBitmap.PixelFormat) { + case PixelFormat.Format32bppArgb: + // GDI+ lies to us - the return format is BGR, NOT RGB. + bIndex = 0; + gIndex = 1; + rIndex = 2; + //aIndex = 3; + bytesPerPixel = 4; + break; + case PixelFormat.Format32bppRgb: + // GDI+ lies to us - the return format is BGR, NOT RGB. + bIndex = 0; + gIndex = 1; + rIndex = 2; + bytesPerPixel = 4; + break; + case PixelFormat.Format24bppRgb: + // GDI+ lies to us - the return format is BGR, NOT RGB. + bIndex = 0; + gIndex = 1; + rIndex = 2; + bytesPerPixel = 3; + break; + default: + throw new FormatException("Bitmap.Pixelformat."+destinationBitmap.PixelFormat+" is currently not supported. Supported: Format32bpp(A)Rgb, Format24bppRgb"); + } + long ticks = DateTime.Now.Ticks; + unsafe { + int width = destRectangle.Width - (blurRadius*2); + int height = destRectangle.Height - (blurRadius*2); + int diameter = (2 * blurRadius) + 1; + int mid = ((diameter-1)/2) + 1; + int midPixel = mid * bytesPerPixel; + int midLine = (mid - 1) * destStride; + int writeRPixelOffset = midLine + midPixel + rIndex; + int writeGPixelOffset = midLine + midPixel + gIndex; + int writeBPixelOffset = midLine + midPixel + bIndex; + int readRPixelOffset = diameter * bytesPerPixel + rIndex; + int readGPixelOffset = diameter * bytesPerPixel + gIndex; + int readBPixelOffset = diameter * bytesPerPixel + bIndex; + + int destOffset = destStride - (width*bytesPerPixel); + int srcOffset = srcStride - (width*bytesPerPixel); + int factor = diameter * diameter; + + byte *destBitmapPointer = (byte *)(void *)destScan0; + byte *srcBitmapPointer = (byte *)(void *)srcScan0; + int pixel, lineOffset; + + int rTotal, gTotal, bTotal; + int [,]r = new int[diameter,diameter]; + int [,]g = new int[diameter,diameter]; + int [,]b = new int[diameter,diameter]; + for (int y=0; y < height; y++) { + // Reset totals + rTotal = gTotal = bTotal = 0; + + // Intial load: Do the complete radius, fill the arrays with their values + lineOffset = 0; // Offset relative to the srcBitmapPointer + // Vertical loop + for (int v = 0; v < diameter; v++) { + // Start at beginning of the current line + int index = lineOffset; + // Horizontal loop + for (int currentRow = 0; currentRow < diameter; currentRow++) { + // Get & add values + rTotal += r[v,currentRow] = srcBitmapPointer[index + rIndex]; + gTotal += g[v,currentRow] = srcBitmapPointer[index + gIndex]; + bTotal += b[v,currentRow] = srcBitmapPointer[index + bIndex]; + // Move 1px to the right + index += bytesPerPixel; + } + // Move to next line + lineOffset += srcStride; + } + + // Now loop the complete line from left to right + for (int x=0; x < width; x++ ) { + // Draw Pixel with calculated values + pixel = rTotal / factor; + if (pixel < 0) pixel = 0; + if (pixel > 255) pixel = 255; + destBitmapPointer[writeRPixelOffset]= (byte)pixel; + + pixel = gTotal / factor; + if (pixel < 0) pixel = 0; + if (pixel > 255) pixel = 255; + destBitmapPointer[writeGPixelOffset]= (byte)pixel; + + pixel = bTotal / factor; + if (pixel < 0) pixel = 0; + if (pixel > 255) pixel = 255; + destBitmapPointer[writeBPixelOffset]= (byte)pixel; + + // Update values with next "row" + int oldRow = x % diameter; + srcBitmapPointer += bytesPerPixel; + lineOffset = 0; + // Vertical Loop, subtract the stored value and add the new value + for (int v = 0; v < diameter; v++) { + // Subtrace the first value, so we can add the new later + rTotal -= r[v, oldRow]; + gTotal -= g[v, oldRow]; + bTotal -= b[v, oldRow]; + + // Get & add the next values + rTotal += r[v, oldRow] = srcBitmapPointer[readRPixelOffset + lineOffset]; + gTotal += g[v, oldRow] = srcBitmapPointer[readGPixelOffset + lineOffset]; + bTotal += b[v, oldRow] = srcBitmapPointer[readBPixelOffset + lineOffset]; + + // Goto next line + lineOffset += srcStride; + } + destBitmapPointer += bytesPerPixel; + } + srcBitmapPointer += srcOffset; + destBitmapPointer += destOffset; + } + } + LOG.Info("Ticks = " + (DateTime.Now.Ticks - ticks)); + + destinationBitmap.UnlockBits(destbitmapData); + sourceBitmap.UnlockBits(srcBitmapData); + return true; + } + + /** + * Checks if the supplied Bitmap has a PixelFormat we support + */ + private bool SupportsPixelFormat(Bitmap bitmap) { + return (bitmap.PixelFormat.Equals(PixelFormat.Format32bppArgb) || + bitmap.PixelFormat.Equals(PixelFormat.Format32bppRgb) || + bitmap.PixelFormat.Equals(PixelFormat.Format24bppRgb)); + } + + } +} diff --git a/Greenshot/Drawing/Filters/GrayscaleFilter.cs b/Greenshot/Drawing/Filters/GrayscaleFilter.cs new file mode 100644 index 000000000..3eb568bba --- /dev/null +++ b/Greenshot/Drawing/Filters/GrayscaleFilter.cs @@ -0,0 +1,48 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + /// + /// Description of GrayscaleFilter. + /// + [Serializable()] + public class GrayscaleFilter : AbstractFilter { + public GrayscaleFilter(DrawableContainer parent) : base(parent) { + } + + protected override void IteratePixel(int x, int y) { + Color color = bbb.GetColorAt(x, y); + int luma = (int)((0.3*color.R) + (0.59*color.G) + (0.11*color.B)); + color = Color.FromArgb(luma, luma, luma); + bbb.SetColorAt(x, y, color); + } + + public override void Apply(Graphics graphics, Bitmap bmp, Rectangle rect, RenderMode renderMode) { + base.Apply(graphics, bmp, rect, renderMode); + } + } +} diff --git a/Greenshot/Drawing/Filters/HighlightFilter.cs b/Greenshot/Drawing/Filters/HighlightFilter.cs new file mode 100644 index 000000000..3922a8ab2 --- /dev/null +++ b/Greenshot/Drawing/Filters/HighlightFilter.cs @@ -0,0 +1,51 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + [Serializable()] + public class HighlightFilter : AbstractFilter { + [NonSerialized] + private Color highlightColor; + + public HighlightFilter(DrawableContainer parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.FILL_COLOR, GetType(), Color.Yellow)); + } + + protected override void IteratePixel(int x, int y) { + Color color = bbb.GetColorAt(x, y); + color = Color.FromArgb(color.A, Math.Min(highlightColor.R,color.R), Math.Min(highlightColor.G,color.G), Math.Min(highlightColor.B,color.B)); + bbb.SetColorAt(x, y, color); + } + + public override void Apply(Graphics graphics, Bitmap bmp, Rectangle rect, RenderMode renderMode) { + highlightColor = GetFieldValueAsColor(FieldType.FILL_COLOR); + base.Apply(graphics, bmp, rect, renderMode); + } + } +} diff --git a/Greenshot/Drawing/Filters/IFilter.cs b/Greenshot/Drawing/Filters/IFilter.cs new file mode 100644 index 000000000..a556dd998 --- /dev/null +++ b/Greenshot/Drawing/Filters/IFilter.cs @@ -0,0 +1,37 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; + +using Greenshot.Drawing; +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + public interface IFilter : INotifyPropertyChanged, IFieldHolder { + DrawableContainer Parent {get; set; } + void Apply(Graphics graphics, Bitmap bmp, RenderMode renderMode); + void Apply(Graphics graphics, Bitmap bmp, Rectangle rect, RenderMode renderMode); + DrawableContainer GetParent(); + } +} diff --git a/Greenshot/Drawing/Filters/MagnifierFilter.cs b/Greenshot/Drawing/Filters/MagnifierFilter.cs new file mode 100644 index 000000000..98678c931 --- /dev/null +++ b/Greenshot/Drawing/Filters/MagnifierFilter.cs @@ -0,0 +1,65 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + [Serializable()] + public class MagnifierFilter : AbstractFilter { + + private BitmapBuffer bbbSrc; + private int magnificationFactor; + + public MagnifierFilter(DrawableContainer parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.MAGNIFICATION_FACTOR)); + } + + public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { + magnificationFactor = GetFieldValueAsInt(FieldType.MAGNIFICATION_FACTOR); + applyRect = IntersectRectangle(applyBitmap.Size, rect); + + bbbSrc = new BitmapBuffer(applyBitmap, applyRect); + try { + bbbSrc.Lock(); + base.Apply(graphics, applyBitmap, applyRect, renderMode); + } finally { + bbbSrc.Dispose(); + bbbSrc = null; + } + } + + protected override void IteratePixel(int x, int y) { + int halfWidth = bbb.Size.Width/2; + int halfHeight = bbb.Size.Height/2; + int yDistanceFromCenter = halfHeight-y; + int xDistanceFromCenter = halfWidth-x; + Color color = bbbSrc.GetColorAt(halfWidth-xDistanceFromCenter/magnificationFactor,halfHeight-yDistanceFromCenter/magnificationFactor); + bbb.SetColorAt(x, y, color); + } + } + +} diff --git a/Greenshot/Drawing/Filters/PixelizationFilter.cs b/Greenshot/Drawing/Filters/PixelizationFilter.cs new file mode 100644 index 000000000..31f3a965a --- /dev/null +++ b/Greenshot/Drawing/Filters/PixelizationFilter.cs @@ -0,0 +1,82 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Serialization; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing.Filters { + [Serializable()] + public class PixelizationFilter : AbstractFilter { + + public PixelizationFilter(DrawableContainer parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.PIXEL_SIZE)); + } + + public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { + applyRect = IntersectRectangle(applyBitmap.Size, rect); + + int pixelSize = GetFieldValueAsInt(FieldType.PIXEL_SIZE); + if(pixelSize <= 1 || applyRect.Width == 0 || applyRect.Height == 0) { + // Nothing to do + return; + } + if(applyRect.Width < pixelSize) pixelSize = applyRect.Width; + if(applyRect.Height < pixelSize) pixelSize = applyRect.Height; + + using (BitmapBuffer bbbDest = new BitmapBuffer(applyBitmap, applyRect)) { + bbbDest.Lock(); + using(BitmapBuffer bbbSrc = new BitmapBuffer(applyBitmap, applyRect)) { + bbbSrc.Lock(); + List colors = new List(); + int halbPixelSize = pixelSize/2; + for(int y=-halbPixelSize;y=0 && yy < bbbSrc.Height) { + for(int xx=x;xx=0 && yy < bbbSrc.Height) { + for(int xx=x;xx<=x+pixelSize;xx++) { + bbbDest.SetColorAt(xx, yy, currentAvgColor); + } + } + } + } + } + } + bbbDest.DrawTo(graphics, applyRect.Location); + } + } + } +} diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs new file mode 100644 index 000000000..cc526d1b7 --- /dev/null +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -0,0 +1,83 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Runtime.Serialization; +using Greenshot.Drawing.Fields; +using Greenshot.Drawing.Filters; + +namespace Greenshot.Drawing { + /// + /// Description of ObfuscateContainer. + /// + [Serializable()] + public class HighlightContainer : FilterContainer { + public HighlightContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.PREPARED_FILTER_HIGHLIGHT)); + init(); + } + + [OnDeserializedAttribute()] + private void OnDeserialized(StreamingContext context) { + init(); + } + + private void init() { + FieldChanged += HighlightContainer_OnFieldChanged; + ConfigurePreparedFilters(); + } + + protected void HighlightContainer_OnFieldChanged(object sender, FieldChangedEventArgs e) { + if(sender.Equals(this)) { + if (e.Field.FieldType == FieldType.PREPARED_FILTER_HIGHLIGHT) { + ConfigurePreparedFilters(); + } + } + } + + private void ConfigurePreparedFilters() { + PreparedFilter preset = (PreparedFilter)GetFieldValue(FieldType.PREPARED_FILTER_HIGHLIGHT); + while(Filters.Count>0) { + Remove(Filters[0]); + } + switch(preset) { + case PreparedFilter.TEXT_HIGHTLIGHT: + Add(new HighlightFilter(this)); + break; + case PreparedFilter.AREA_HIGHLIGHT: + AbstractFilter bf = new BrightnessFilter(this); + bf.Invert = true; + Add(bf); + bf = new BlurFilter(this); + bf.Invert = true; + Add(bf); + break; + case PreparedFilter.GRAYSCALE: + AbstractFilter f = new GrayscaleFilter(this); + f.Invert = true; + Add(f); + break; + case PreparedFilter.MAGNIFICATION: + Add(new MagnifierFilter(this)); + break; + } + } + } +} diff --git a/Greenshot/Drawing/HtmlContainer.cs b/Greenshot/Drawing/HtmlContainer.cs new file mode 100644 index 000000000..a00ebfdf5 --- /dev/null +++ b/Greenshot/Drawing/HtmlContainer.cs @@ -0,0 +1,124 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of BitmapContainer. + /// + [Serializable()] + public class HtmlContainer : DrawableContainer { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(HtmlContainer)); + private const string SCRIPT_PATTERN = ""; + private string html = null; + private Bitmap bitmap = null; + private Size lastSize = new Size(0,0); + + public HtmlContainer(Surface parent, string html) : this(parent) { + Html = html; + } + + public HtmlContainer(Surface parent) : base(parent) { + Width = 100; + Height = 100; + } + + private void removeScripts() { + Regex regExRemoveScript = new Regex(SCRIPT_PATTERN); + html = regExRemoveScript.Replace(html, ""); + } + + public string Html { + set { + html = value; + removeScripts(); + lastSize = new Size(0, 0); + RedrawIfNeeded(); + } + get { return html; } + } + + /** + * Destructor + */ + ~HtmlContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public new void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if (bitmap != null) { + bitmap.Dispose(); + } + } + bitmap = null; + } + + protected void RedrawIfNeeded() { + if (html == null) { + if (bitmap != null) { + bitmap.Dispose(); + } + bitmap = null; + return; + } + if (bitmap == null || lastSize.Height != Height || lastSize.Width != Width) { + bitmap = WebsiteImageGenerator.GetImageFromHTML(html); + if (bitmap != null) { + lastSize = new Size(bitmap.Width, bitmap.Height); + } + } + } + + public override void Draw(Graphics g, RenderMode rm) { + RedrawIfNeeded(); + if (bitmap != null) { + g.DrawImage(bitmap, Bounds); + } + } + } +} diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs new file mode 100644 index 000000000..b1063aaf2 --- /dev/null +++ b/Greenshot/Drawing/IconContainer.cs @@ -0,0 +1,108 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of IconContainer. + /// + [Serializable()] + public class IconContainer : DrawableContainer, IIconContainer { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(IconContainer)); + + protected Icon icon; + + public IconContainer(Surface parent) : base(parent) { + } + + public IconContainer(Surface parent, string filename) : base(parent) { + Load(filename); + } + + public Icon Icon { + set { + if (icon != null) { + icon.Dispose(); + } + icon = (Icon)value.Clone(); + Width = value.Width; + Height = value.Height; + } + get { return icon; } + } + + /** + * Destructor + */ + ~IconContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public new void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if (icon != null) { + icon.Dispose(); + } + } + icon = null; + } + + public void Load(string filename) { + if (File.Exists(filename)) { + using (Icon fileIcon = new Icon(filename)) { + Icon = fileIcon; + LOG.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); + } + } + } + + public override void Draw(Graphics graphics, RenderMode rm) { + if (icon != null) { + graphics.DrawIcon(icon, Bounds); + } + } + } +} diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs new file mode 100644 index 000000000..637135e1d --- /dev/null +++ b/Greenshot/Drawing/LineContainer.cs @@ -0,0 +1,107 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of LineContainer. + /// + [Serializable()] + public class LineContainer : DrawableContainer { + + public static readonly int MAX_CLICK_DISTANCE_TOLERANCE = 10; + + public LineContainer(Surface parent) : base(parent) { + Init(); + AddField(FieldFactory.CreateField(FieldType.LINE_THICKNESS)); + AddField(FieldFactory.CreateField(FieldType.LINE_COLOR)); + AddField(FieldFactory.CreateField(FieldType.SHADOW)); + } + + private void Init() { + grippers[1].Enabled = false; + grippers[2].Enabled = false; + grippers[3].Enabled = false; + grippers[5].Enabled = false; + grippers[6].Enabled = false; + grippers[7].Enabled = false; + } + + public override void Draw(Graphics g, RenderMode rm) { + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + + if ( shadow && lineThickness > 0 ) { + //draw shadow first + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = 1; + while (currentStep <= steps) { + using (Pen shadowCapPen = new Pen(Color.FromArgb(alpha, 100, 100, 100))) { + shadowCapPen.Width = lineThickness; + + g.DrawLine(shadowCapPen, + this.Left + currentStep, + this.Top + currentStep, + this.Left + currentStep + this.Width, + this.Top + currentStep + this.Height); + + currentStep++; + alpha = alpha - (basealpha / steps); + } + } + } + + + using (Pen pen = new Pen(lineColor)) { + pen.Width = lineThickness; + + if(pen.Width > 0) { + g.DrawLine(pen, this.Left, this.Top, this.Left + this.Width, this.Top + this.Height); + } + } + } + + public override bool ClickableAt(int x, int y) { + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + double distance = DrawingHelper.CalculateLinePointDistance(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height, x, y); + if (distance < 0) { + return false; + } + return distance <= Math.Max(lineThickness / 2, MAX_CLICK_DISTANCE_TOLERANCE); + } + + } +} diff --git a/Greenshot/Drawing/MetafileContainer.cs b/Greenshot/Drawing/MetafileContainer.cs new file mode 100644 index 000000000..840150848 --- /dev/null +++ b/Greenshot/Drawing/MetafileContainer.cs @@ -0,0 +1,123 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of MetafileContainer. + /// + [Serializable()] + public class MetafileContainer : DrawableContainer, IMetafileContainer { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(MetafileContainer)); + + protected Metafile metafile; + + public MetafileContainer(Surface parent) : base(parent) { + } + + public MetafileContainer(Surface parent, string filename) : base(parent) { + Load(filename); + } + + public Metafile Metafile { + set { + if (metafile != null) { + metafile.Dispose(); + } + metafile = (Metafile)value.Clone(); + Height = Math.Abs(value.Height); + if (Height == 0 ) { + Height = 100; + } + Width = Math.Abs(value.Width); + if (Width == 0 ) { + Width = 100; + } + while (Height > parent.Height) { + Height = Height / 4; + Width = Width / 4; + } + while (Width > parent.Width) { + Height = Height / 4; + Width = Width / 4; + } + } + get { return metafile; } + } + + /** + * Destructor + */ + ~MetafileContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public new void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if (metafile != null) { + metafile.Dispose(); + } + } + metafile = null; + } + + public void Load(string filename) { + if (File.Exists(filename)) { + using (Metafile fileMetafile = new Metafile(filename)) { + Metafile = fileMetafile; + LOG.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); + } + } + } + + public override void Draw(Graphics graphics, RenderMode rm) { + if (metafile != null) { + graphics.DrawImage(metafile, Bounds); + } + } + } +} diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs new file mode 100644 index 000000000..70297af48 --- /dev/null +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -0,0 +1,70 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Runtime.Serialization; +using Greenshot.Drawing.Fields; +using Greenshot.Drawing.Filters; + +namespace Greenshot.Drawing { + /// + /// Description of ObfuscateContainer. + /// + [Serializable()] + public class ObfuscateContainer : FilterContainer { + public ObfuscateContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.PREPARED_FILTER_OBFUSCATE)); + init(); + } + + [OnDeserializedAttribute()] + private void OnDeserialized(StreamingContext context) { + init(); + } + + private void init() { + FieldChanged += ObfuscateContainer_OnFieldChanged; + ConfigurePreparedFilters(); + } + + protected void ObfuscateContainer_OnFieldChanged(object sender, FieldChangedEventArgs e) { + if(sender.Equals(this)) { + if(e.Field.FieldType == FieldType.PREPARED_FILTER_OBFUSCATE) { + ConfigurePreparedFilters(); + } + } + } + + private void ConfigurePreparedFilters() { + PreparedFilter preset = (PreparedFilter)GetFieldValue(FieldType.PREPARED_FILTER_OBFUSCATE); + while(Filters.Count>0) { + Remove(Filters[0]); + } + switch(preset) { + case PreparedFilter.BLUR: + Add(new BlurFilter(this)); + break; + case PreparedFilter.PIXELIZE: + Add(new PixelizationFilter(this)); + break; + } + } + } +} diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs new file mode 100644 index 000000000..e80741d99 --- /dev/null +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -0,0 +1,90 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Represents a rectangular shape on the Surface + /// + [Serializable()] + public class RectangleContainer : DrawableContainer { + + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(RectangleContainer)); + + public RectangleContainer(Surface parent) : base(parent) { + AddField(FieldFactory.CreateField(FieldType.LINE_THICKNESS)); + AddField(FieldFactory.CreateField(FieldType.LINE_COLOR)); + AddField(FieldFactory.CreateField(FieldType.FILL_COLOR)); + AddField(FieldFactory.CreateField(FieldType.SHADOW)); + } + + + public override void Draw(Graphics g, RenderMode rm) { + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + if (shadow && (lineVisible || Colors.IsVisible(fillColor))) { + //draw shadow first + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = lineVisible ? 1 : 0; + while (currentStep <= steps) { + using (Pen shadowPen = new Pen(Color.FromArgb(alpha, 100, 100, 100))) { + shadowPen.Width = lineVisible ? lineThickness : 1; + Rectangle shadowRect = GuiRectangle.GetGuiRectangle( + this.Left + currentStep, + this.Top + currentStep, + this.Width, + this.Height); + g.DrawRectangle(shadowPen, shadowRect); + currentStep++; + alpha = alpha - (basealpha / steps); + } + } + } + + Rectangle rect = GuiRectangle.GetGuiRectangle(this.Left, this.Top, this.Width, this.Height); + + using (Brush brush = new SolidBrush(fillColor)) { + g.FillRectangle(brush, rect); + } + + using (Pen pen = new Pen(lineColor)) { + pen.Width = lineThickness; + if(pen.Width > 0) { + g.DrawRectangle(pen, rect); + } + } + } + + } +} diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs new file mode 100644 index 000000000..228b989bb --- /dev/null +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -0,0 +1,130 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace Greenshot.Drawing { + public abstract class RoundedRectangle { + public enum RectangleCorners { + None = 0, TopLeft = 1, TopRight = 2, + BottomLeft = 4, BottomRight = 8, + All = TopLeft | TopRight | BottomLeft | BottomRight + } + + public static GraphicsPath Create2(int x, int y, int width, int height, int radius) { + GraphicsPath gp = new GraphicsPath(); + gp.AddLine(x + radius, y, x + width - (radius * 2), y); // Line + gp.AddArc(x + width - (radius * 2), y, radius * 2, radius * 2, 270, 90); // Corner + gp.AddLine(x + width, y + radius, x + width, y + height - (radius * 2)); // Line + gp.AddArc(x + width - (radius * 2), y + height - (radius * 2), radius * 2, radius * 2, 0, 90); // Corner + gp.AddLine(x + width - (radius * 2), y + height, x + radius, y + height); // Line + gp.AddArc(x, y + height - (radius * 2), radius * 2, radius * 2, 90, 90); // Corner + gp.AddLine(x, y + height - (radius * 2), x, y + radius); // Line + gp.AddArc(x, y, radius * 2, radius * 2, 180, 90); // Corner + gp.CloseFigure(); + + return gp; + } + + public static GraphicsPath Create(int x, int y, int width, int height, int radius, RectangleCorners corners) { + int xw = x + width; + int yh = y + height; + int xwr = xw - radius; + int yhr = yh - radius; + int xr = x + radius; + int yr = y + radius; + int r2 = radius * 2; + int xwr2 = xw - r2; + int yhr2 = yh - r2; + + GraphicsPath p = new GraphicsPath(); + p.StartFigure(); + + //Top Left Corner + if ((RectangleCorners.TopLeft & corners) == RectangleCorners.TopLeft) { + p.AddArc(x, y, r2, r2, 180, 90); + } else { + p.AddLine(x, yr, x, y); + p.AddLine(x, y, xr, y); + } + + //Top Edge + p.AddLine(xr, y, xwr, y); + + //Top Right Corner + if ((RectangleCorners.TopRight & corners) == RectangleCorners.TopRight) { + p.AddArc(xwr2, y, r2, r2, 270, 90); + } else { + p.AddLine(xwr, y, xw, y); + p.AddLine(xw, y, xw, yr); + } + + //Right Edge + p.AddLine(xw, yr, xw, yhr); + + //Bottom Right Corner + if ((RectangleCorners.BottomRight & corners) == RectangleCorners.BottomRight) { + p.AddArc(xwr2, yhr2, r2, r2, 0, 90); + } else { + p.AddLine(xw, yhr, xw, yh); + p.AddLine(xw, yh, xwr, yh); + } + + //Bottom Edge + p.AddLine(xwr, yh, xr, yh); + + //Bottom Left Corner + if ((RectangleCorners.BottomLeft & corners) == RectangleCorners.BottomLeft) { + p.AddArc(x, yhr2, r2, r2, 90, 90); + } else { + p.AddLine(xr, yh, x, yh); + p.AddLine(x, yh, x, yhr); + } + + //Left Edge + p.AddLine(x, yhr, x, yr); + + p.CloseFigure(); + return p; + } + + public static GraphicsPath Create(Rectangle rect, int radius, RectangleCorners corners) { + return Create(rect.X, rect.Y, rect.Width, rect.Height, radius, corners); + } + + public static GraphicsPath Create(int x, int y, int width, int height, int radius) { + return Create(x, y, width, height, radius, RectangleCorners.All); + } + + public static GraphicsPath Create(Rectangle rect, int radius) { + return Create(rect.X, rect.Y, rect.Width, rect.Height, radius); + } + + public static GraphicsPath Create(int x, int y, int width, int height) { + return Create(x, y, width, height, 5); + } + + public static GraphicsPath Create(Rectangle rect) { + return Create(rect.X, rect.Y, rect.Width, rect.Height); + } + } +} diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs new file mode 100644 index 000000000..ddf2dd306 --- /dev/null +++ b/Greenshot/Drawing/Surface.cs @@ -0,0 +1,852 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Drawing.Filters; +using Greenshot.Helpers; +using Greenshot.Plugin; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + public delegate void SurfaceElementEventHandler(object source, DrawableContainerList element); + public delegate void SurfaceDrawingModeEventHandler(object source, DrawingModes drawingMode); + + public enum DrawingModes { None, Rect, Ellipse, Text, Line, Arrow, Crop, Highlight, Obfuscate, Bitmap } + /// + /// Description of Surface. + /// + public class Surface : PictureBox, ISurface { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(Surface)); + public event SurfaceElementEventHandler MovingElementChanged; + public event SurfaceDrawingModeEventHandler DrawingModeChanged; + + public FieldAggregator FieldAggregator = new FieldAggregator(); + + private AppConfig conf = AppConfig.GetInstance(); + private ICaptureDetails captureDetails = null; + + private int mX; + private int mY; + private bool mouseDown = false; + private bool draggingInProgress = false; + private DrawableContainer mouseDownElement = null; + + private Image originalImage; + + private DrawableContainerList elements = new DrawableContainerList(); + + private DrawableContainerList selectedElements = new DrawableContainerList(); + private DrawableContainer drawingElement = null; + private DrawableContainer undrawnElement = null; + private DrawableContainer cropContainer = null; + + public bool KeysLocked = false; + + private DrawingModes drawingMode = DrawingModes.None; + public DrawingModes DrawingMode { + get {return drawingMode;} + set { + drawingMode = value; + DrawingModeChanged.Invoke(this, drawingMode); + DeselectAllElements(); + CreateUndrawnElement(); + } + } + + public Image OriginalImage { + get { return originalImage; } + } + + public ICaptureDetails CaptureDetails { + get {return captureDetails;} + set {captureDetails = value;} + } + + public Surface() { + LOG.Debug("Creating a surface!"); + SizeMode = PictureBoxSizeMode.AutoSize; + this.MouseDown += new MouseEventHandler(SurfaceMouseDown); + this.MouseUp += new MouseEventHandler(SurfaceMouseUp); + this.MouseMove += new MouseEventHandler(SurfaceMouseMove); + this.MouseDoubleClick += new MouseEventHandler(SurfaceDoubleClick); + this.Paint += new PaintEventHandler(SurfacePaint); + this.AllowDrop = true; + this.DragDrop += new DragEventHandler(OnDragDrop); + this.DragEnter += new DragEventHandler(OnDragEnter); + } + + private void SetImage(Image image) { + if (originalImage != null) { + originalImage.Dispose(); + } + if (Image != null) { + Image.Dispose(); + } + originalImage = new Bitmap(image); + Image = new Bitmap(image); + } + + public Surface(Image image) : this() { + LOG.Debug("Got image with dimensions " + image.Width + "," + image.Height + " bpp: " + image.PixelFormat); + SetImage(image); + } + + public Surface(ICapture capture) : this(capture.Image) { + if (capture.Cursor != null && capture.CursorVisible) { + SelectElement(AddIconContainer(capture.Cursor, capture.CursorLocation.X, capture.CursorLocation.Y)); + } + captureDetails = capture.CaptureDetails; + } + + public void SaveElementsToStream(Stream streamWrite) { + try { + BinaryFormatter binaryWrite = new BinaryFormatter(); + binaryWrite.Serialize(streamWrite, elements); + } catch (Exception e) { + LOG.Error("Error serializing elements to stream.", e); + } + } + + public void LoadElementsFromStream(Stream streamRead) { + try { + BinaryFormatter binaryRead = new BinaryFormatter(); + DrawableContainerList loadedElements = (DrawableContainerList) binaryRead.Deserialize(streamRead); + if (loadedElements != null) { + loadedElements.Parent = this; + DeselectAllElements(); + AddElements(loadedElements); + SelectElements(loadedElements); + FieldAggregator.BindElements(loadedElements); + } + } catch (Exception e) { + LOG.Error("Error serializing elements from stream.", e); + } + } + + private void CreateUndrawnElement() { + if(undrawnElement != null) { + FieldAggregator.UnbindElement(undrawnElement); + } + switch (DrawingMode) { + case DrawingModes.Rect: + undrawnElement = new RectangleContainer(this); + break; + case DrawingModes.Ellipse: + undrawnElement = new EllipseContainer(this); + break; + case DrawingModes.Text: + undrawnElement = new TextContainer(this); + break; + case DrawingModes.Line: + undrawnElement = new LineContainer(this); + break; + case DrawingModes.Arrow: + undrawnElement = new ArrowContainer(this); + break; + case DrawingModes.Highlight: + undrawnElement = new HighlightContainer(this); + break; + case DrawingModes.Obfuscate: + undrawnElement = new ObfuscateContainer(this); + break; + case DrawingModes.Crop: + cropContainer = new CropContainer(this); + undrawnElement = cropContainer; + break; + case DrawingModes.Bitmap: + undrawnElement = new BitmapContainer(this); + break; + case DrawingModes.None: + undrawnElement = null; + break; + } + if (undrawnElement != null) { + FieldAggregator.BindElement(undrawnElement); + } + } + + #region Plugin interface implementations + public IBitmapContainer AddBitmapContainer(Bitmap bitmap, int x, int y) { + BitmapContainer bitmapContainer = new BitmapContainer(this); + bitmapContainer.Bitmap = bitmap; + bitmapContainer.Left = x; + bitmapContainer.Top = y; + AddElement(bitmapContainer); + return bitmapContainer; + } + private HtmlContainer AddHtmlContainer(string html, int x, int y) { + HtmlContainer htmlContainer = new HtmlContainer(this); + htmlContainer.Left = x; + htmlContainer.Top = y; + htmlContainer.Html = html; + AddElement(htmlContainer); + return htmlContainer; + } + private UrlContainer AddUrlContainer(string url, int x, int y) { + UrlContainer urlContainer = new UrlContainer(this); + urlContainer.Left = x; + urlContainer.Top = y; + urlContainer.Url = url; + AddElement(urlContainer); + return urlContainer; + } + public IBitmapContainer AddBitmapContainer(string filename, int x, int y) { + BitmapContainer bitmapContainer = new BitmapContainer(this); + bitmapContainer.Load(filename); + bitmapContainer.Left = x; + bitmapContainer.Top = y; + AddElement(bitmapContainer); + return bitmapContainer; + } + public IIconContainer AddIconContainer(Icon icon, int x, int y) { + IconContainer iconContainer = new IconContainer(this); + iconContainer.Icon = icon; + iconContainer.Left = x; + iconContainer.Top = y; + AddElement(iconContainer); + return iconContainer; + } + public IIconContainer AddIconContainer(string filename, int x, int y) { + IconContainer iconContainer = new IconContainer(this); + iconContainer.Load(filename); + iconContainer.Left = x; + iconContainer.Top = y; + AddElement(iconContainer); + return iconContainer; + } + public ICursorContainer AddCursorContainer(Cursor cursor, int x, int y) { + CursorContainer cursorContainer = new CursorContainer(this); + cursorContainer.Cursor = cursor; + cursorContainer.Left = x; + cursorContainer.Top = y; + AddElement(cursorContainer); + return cursorContainer; + } + public ICursorContainer AddCursorContainer(string filename, int x, int y) { + CursorContainer cursorContainer = new CursorContainer(this); + cursorContainer.Load(filename); + cursorContainer.Left = x; + cursorContainer.Top = y; + AddElement(cursorContainer); + return cursorContainer; + } + public IMetafileContainer AddMetafileContainer(string filename, int x, int y) { + MetafileContainer metafileContainer = new MetafileContainer(this); + metafileContainer.Load(filename); + metafileContainer.Left = x; + metafileContainer.Top = y; + AddElement(metafileContainer); + return metafileContainer; + } + public IMetafileContainer AddMetafileContainer(Metafile metafile, int x, int y) { + MetafileContainer metafileContainer = new MetafileContainer(this); + metafileContainer.Metafile = metafile; + metafileContainer.Left = x; + metafileContainer.Top = y; + AddElement(metafileContainer); + return metafileContainer; + } + + public ITextContainer AddTextContainer(string text, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, FontFamily family, float size, bool italic, bool bold, bool shadow, int borderSize, Color color, Color fillColor) { + TextContainer textContainer = new TextContainer(this); + textContainer.Text = text; + textContainer.SetFieldValue(FieldType.FONT_FAMILY, family.Name); + textContainer.SetFieldValue(FieldType.FONT_BOLD, bold); + textContainer.SetFieldValue(FieldType.FONT_ITALIC, italic); + textContainer.SetFieldValue(FieldType.FONT_SIZE, size); + textContainer.SetFieldValue(FieldType.FILL_COLOR, fillColor); + textContainer.SetFieldValue(FieldType.LINE_COLOR, color); + textContainer.SetFieldValue(FieldType.LINE_THICKNESS, borderSize); + textContainer.SetFieldValue(FieldType.SHADOW, shadow); + // Make sure the Text fits + textContainer.FitToText(); + // Align to Surface + textContainer.AlignToParent(horizontalAlignment, verticalAlignment); + + //AggregatedProperties.UpdateElement(textContainer); + AddElement(textContainer); + return textContainer; + } + #endregion + + #region DragDrop + private List GetFilenames(DragEventArgs e) { + List filenames = new List(); + string[] dropFileNames = (string[])e.Data.GetData(DataFormats.FileDrop); + if (dropFileNames != null && dropFileNames.Length > 0) { + foreach(string filename in dropFileNames) { + LOG.Debug("Found filename: " + filename); + string ext=Path.GetExtension(filename).ToLower(); + if ((ext==".jpg") || (ext==".gif") || (ext==".png") || (ext==".bmp")) { + filenames.Add(filename); + } + } + } + return filenames; + } + + private void OnDragEnter(object sender, DragEventArgs e) { + if(LOG.IsDebugEnabled) { + LOG.Debug("DragEnter got following formats: "); + foreach(string format in e.Data.GetFormats()) { + LOG.Debug(format); + } + } + if (draggingInProgress || (e.AllowedEffect & DragDropEffects.Copy) != DragDropEffects.Copy) { + e.Effect=DragDropEffects.None; + } else { + List filenames = GetFilenames(e); + if ( (filenames != null && filenames.Count > 0) + || e.Data.GetDataPresent(DataFormats.Bitmap, true) + //|| e.Data.GetDataPresent(DataFormats.EnhancedMetafile, true) + ) { + e.Effect=DragDropEffects.Copy; + } else { + e.Effect=DragDropEffects.None; + } + } + } + + private void OnDragDrop(object sender, DragEventArgs e) { + List filenames = GetFilenames(e); + Point mouse = this.PointToClient(new Point(e.X, e.Y)); + if ((filenames != null && filenames.Count > 0)) { + foreach(string filename in filenames) { + LOG.Debug("Drop - filename: " + filename); + AddBitmapContainer(filename, mouse.X, mouse.Y); + mouse.Offset(10, 10); + } + } else if (e.Data.GetDataPresent(DataFormats.Bitmap)) { + AddBitmapContainer((Bitmap)e.Data.GetData(DataFormats.Bitmap, true), mouse.X, mouse.Y); +// } else if (e.Data.GetDataPresent(DataFormats.EnhancedMetafile)) { +// AddBitmapContainer((Image)e.Data.GetData(DataFormats.EnhancedMetafile, true), mouse.X, mouse.Y); + } + } + +// private void QueryContinueDragDrop(object sender, QueryContinueDragEventArgs e) { +// LOG.Debug("QueryContinueDrag: " + e.Action); +// if (e.EscapePressed) { +// e.Action = DragAction.Cancel; +// } +// } +// +// private void GiveFeedbackDragDrop(object sender, GiveFeedbackEventArgs e) { +// e.UseDefaultCursors = true; +// } + #endregion + + void ApplyCrop() { + Rectangle r = cropContainer.Bounds; + r = Helpers.GuiRectangle.GetGuiRectangle(r.Left, r.Top, r.Width, r.Height); + if (r.Left < 0) r = new Rectangle(0, r.Top, r.Width + r.Left, r.Height); + if (r.Top < 0) r = new Rectangle(r.Left, 0, r.Width, r.Height + r.Top); + if (r.Left + r.Width > Width) r = new Rectangle(r.Left, r.Top, Width - r.Left, r.Height); + if (r.Top + r.Height > Height) r = new Rectangle(r.Left, r.Top, r.Width, Height - r.Top); + + if (r.Height > 0 && r.Width > 0) { + // we should not forget to Dispose the images!! + using (Bitmap tmpImage = ((Bitmap)originalImage).Clone(r, originalImage.PixelFormat)) { + tmpImage.SetResolution(originalImage.HorizontalResolution, originalImage.VerticalResolution); + SetImage(tmpImage); + elements.MoveBy(-r.Left, -r.Top); + } + } + } + + void SurfaceMouseDown(object sender, MouseEventArgs e) { + mX = e.X; mY = e.Y; + mouseDown = true; + + if (cropContainer != null && ((undrawnElement == null) || (undrawnElement != null && DrawingMode != DrawingModes.Crop))) { + RemoveElement(cropContainer); + cropContainer = null; + drawingElement = null; + } + + if(drawingElement == null && DrawingMode != DrawingModes.None) { + if (undrawnElement == null) { + DeselectAllElements(); + if(undrawnElement == null) { + CreateUndrawnElement(); + } + } + drawingElement = undrawnElement; + drawingElement.Status = EditStatus.DRAWING; + undrawnElement = null; + // if a new element has been drawn, set location and register it + if (drawingElement != null) { + drawingElement.PropertyChanged += ElementPropertyChanged; + drawingElement.Left = e.X; + drawingElement.Top = e.Y; + AddElement(drawingElement); + drawingElement.Selected = true; + } + } else { + // check whether an existing element was clicked + // we save mouse down element separately from selectedElements (checked on mouse up), + // since it could be moved around before it is actually selected + mouseDownElement = elements.ClickableElementAt(e.X, e.Y); + if(mouseDownElement != null) { + mouseDownElement.Status = EditStatus.MOVING; + } + } + } + + void SurfaceMouseUp(object sender, MouseEventArgs e) { + elements.Status = EditStatus.IDLE; + if(mouseDownElement != null) { + mouseDownElement.Status = EditStatus.IDLE; + } + mouseDown = false; + mouseDownElement = null; + if(DrawingMode == DrawingModes.None) { // check whether an existing element was clicked + DrawableContainer element = elements.ClickableElementAt(e.X, e.Y); + bool shiftModifier = (Control.ModifierKeys & Keys.Shift) == Keys.Shift; + if(element != null) { + bool alreadySelected = selectedElements.Contains(element); + if(shiftModifier) { + if(alreadySelected) DeselectElement(element); + else SelectElement(element); + } else { + if(!alreadySelected) { + DeselectAllElements(); + SelectElement(element); + } + } + } else if(!shiftModifier) { + DeselectAllElements(); + } + } + + if (selectedElements.Count > 0) { + selectedElements.ShowGrippers(); + selectedElements.Selected = true; + } + + if (drawingElement != null) { + if (!drawingElement.InitContent()) { + elements.Remove(drawingElement); + Invalidate(); + } else { + if (Math.Abs(drawingElement.Width) < 5 && Math.Abs(drawingElement.Height) < 5) { + drawingElement.Width = 25; + drawingElement.Height = 25; + } + SelectElement(drawingElement); + drawingElement.Selected = true; + } + drawingElement = null; + } + Invalidate(); + } + + void SurfaceMouseMove(object sender, MouseEventArgs e) { + if (DrawingMode != DrawingModes.None) { + Cursor = Cursors.Cross; + } else { + Cursor = Cursors.Default; + } + + if(mouseDown) { + if(mouseDownElement != null) { // an element is currently dragged + selectedElements.HideGrippers(); + if(mouseDownElement.Selected) { // dragged element has been selected before -> move all + selectedElements.MoveBy(e.X - mX, e.Y - mY); + } else { // dragged element is not among selected elements -> just move dragged one + mouseDownElement.MoveBy(e.X - mX, e.Y - mY); + } + mX = e.X; mY = e.Y; + Invalidate(); + } else if(drawingElement != null) { // an element is currently drawn + drawingElement.Width = e.X - drawingElement.Left; + drawingElement.Height = e.Y - drawingElement.Top; + Invalidate(); +// } else { +// // Enable DragDrop +// using (Bitmap bitmapToDrag = GetImageForExport()) { +// +// IDataObject dataObj = new DataObject(); +// string filename = Path.GetTempFileName() + ".png"; +// try { +// bitmapToDrag.Save(filename, ImageFormat.Png); +// LOG.Debug("FileDrop : " + filename); +// dataObj.SetData("HTML Format", true, ""); +// //dataObj.SetData(DataFormats.FileDrop, new string[] {filename}); +// LOG.Debug("Starting DoDragDrop"); +// draggingInProgress = true; +// DoDragDrop(dataObj, DragDropEffects.Copy); +// LOG.Debug("Finished DoDragDrop"); +// draggingInProgress = false; +// mouseDown = false; +// } catch (Exception ex) { +// LOG.Error("Error in DragDrop: ", ex); +// } finally { +// File.Delete(filename); +// } +// } + } + } + } + + void SurfaceDoubleClick(object sender, MouseEventArgs e) { + selectedElements.OnDoubleClick(); + Invalidate(); + } + + private Image GetImage(RenderMode renderMode) { + Image clone = new Bitmap(Image); + // This actually generates a copy of the original image with a dpi equal to the default... + // otherwise we would have a problem drawing the image to the surface... :( + using (Graphics graphics = Graphics.FromImage(clone)) { + graphics.DrawImage(originalImage, Point.Empty); + elements.Draw(graphics, (Bitmap)clone, renderMode); + } + return clone; + } + + public Image GetImageForExport() { + return GetImage(RenderMode.EXPORT); + } + + void SurfacePaint(object sender, PaintEventArgs e) { + Graphics graphics = e.Graphics; + using (Image image = GetImage(RenderMode.EDIT)) { + graphics.DrawImage(image, Point.Empty); + } + // Should be something like this, but due to the filter structure this won't work + //graphics.DrawImage(originalImage, Point.Empty); + //elements.Draw(graphics, (Bitmap)Image, RenderMode.EDIT); + } + + public void AddElement(DrawableContainer element) { + elements.Add(element); + element.FieldChanged += element_FieldChanged; + element.PropertyChanged += ElementPropertyChanged; + if(element.Status == EditStatus.UNDRAWN) element.Status = EditStatus.IDLE; + Invalidate(); + } + + public void RemoveElement(DrawableContainer element) { + DeselectElement(element); + elements.Remove(element); + element.FieldChanged -= element_FieldChanged; + element.PropertyChanged -= ElementPropertyChanged; + element.Dispose(); + Invalidate(); + } + + public void AddElements(DrawableContainerList elementsToAdd) { + elements.AddRange(elementsToAdd); + foreach(DrawableContainer element in elementsToAdd) { + element.FieldChanged += element_FieldChanged; + element.PropertyChanged += ElementPropertyChanged; + if(element.Status == EditStatus.UNDRAWN) element.Status = EditStatus.IDLE; + } + Invalidate(); + } + + public bool HasSelectedElements() { + return (selectedElements != null && selectedElements.Count > 0); + } + + public void RemoveSelectedElements() { + if (HasSelectedElements()) { + foreach (DrawableContainer element in selectedElements) { + elements.Remove(element); + element.FieldChanged -= element_FieldChanged; + element.PropertyChanged -= ElementPropertyChanged; + element.Dispose(); + } + selectedElements.Clear(); + MovingElementChanged(this, selectedElements); + Invalidate(); + } + } + + public void CutSelectedElements() { + if (HasSelectedElements()) { + ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), selectedElements); + RemoveSelectedElements(); + } + } + + public void CopySelectedElements() { + if (HasSelectedElements()) { + ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), selectedElements); + } + } + + public void ConfirmSelectedConfirmableElements(bool confirm){ + // create new collection so that we can iterate safely (selectedElements might change due with confirm/cancel) + List selectedDCs = new List(selectedElements); + foreach(DrawableContainer dc in selectedDCs){ + if(dc.Equals(cropContainer)){ + if(confirm) { + ApplyCrop(); + } + DrawingMode = DrawingModes.None; + RemoveElement(cropContainer); + cropContainer.Dispose(); + } + } + } + + public void PasteElementFromClipboard() { + List formats = ClipboardHelper.GetFormats(); + if (formats == null || formats.Count == 0) { + return; + } + if (LOG.IsDebugEnabled) { + LOG.Debug("List of clipboard formats available for pasting:"); + foreach(string format in formats) { + LOG.Debug("\tgot format: " + format); + } + } + + if (formats.Contains(typeof(DrawableContainerList).FullName)) { + DrawableContainerList dcs = (DrawableContainerList)ClipboardHelper.GetClipboardData(typeof(DrawableContainerList)); + if (dcs != null) { + dcs.Parent = this; + dcs.MoveBy(10,10); + AddElements(dcs); + FieldAggregator.BindElements(dcs); + DeselectAllElements(); + SelectElements(dcs); + } + } else if (Clipboard.ContainsImage()) { + using (Image image = Clipboard.GetImage()) { + if (image != null) { + DeselectAllElements(); + IBitmapContainer bitmapContainer = AddBitmapContainer(image as Bitmap, 0, 0); + SelectElement(bitmapContainer); + } + } + } else if ( ClipboardHelper.GetFormats().Contains("HTML Format")) { + HtmlFragment htmlFragment = HtmlFragment.FromClipboard(); + DeselectAllElements(); + HtmlContainer htmlContainer = AddHtmlContainer(htmlFragment.Fragment, 0, 0); + SelectElement(htmlContainer); + } else if (Clipboard.ContainsText()) { + string text = Clipboard.GetText(); + if (text != null) { + if (text.StartsWith("http://")) { + DeselectAllElements(); + UrlContainer urlContainer = AddUrlContainer(text, 0, 0); + SelectElement(urlContainer); + } else { + DeselectAllElements(); + ITextContainer textContainer = AddTextContainer(text, HorizontalAlignment.Center, VerticalAlignment.CENTER, + FontFamily.GenericSansSerif, 12f, false, false, false, 2, Color.Black, Color.Transparent); + SelectElement(textContainer); + } + } + } + } + + public void DuplicateSelectedElements() { + if(LOG.IsDebugEnabled) LOG.Debug("Duplicating "+selectedElements.Count+" selected elements"); + DrawableContainerList dcs = (DrawableContainerList)Objects.DeepClone(selectedElements); + dcs.Parent = this; + dcs.MoveBy(10,10); + AddElements(dcs); + DeselectAllElements(); + SelectElements(dcs); + } + + public void DeselectElement(IDrawableContainer container) { + DrawableContainer element = container as DrawableContainer; + element.HideGrippers(); + element.Selected = false; + selectedElements.Remove(element); + FieldAggregator.UnbindElement(element); + if (MovingElementChanged != null) { + MovingElementChanged(this, selectedElements); + } + } + + public void DeselectAllElements() { + if (HasSelectedElements()) { + while(selectedElements.Count > 0) { + DrawableContainer element = selectedElements[0]; + element.HideGrippers(); + element.Selected = false; + selectedElements.Remove(element); + FieldAggregator.UnbindElement(element); + } + if (MovingElementChanged != null) { + MovingElementChanged(this, selectedElements); + } + } + } + + public void SelectElement(IDrawableContainer container) { + DrawableContainer element = container as DrawableContainer; + if(!selectedElements.Contains(element)) { + selectedElements.Add(element); + element.ShowGrippers(); + element.Selected = true; + FieldAggregator.BindElement(element); + if (MovingElementChanged != null) { + MovingElementChanged(this, selectedElements); + } + Invalidate(); + } + } + + public void SelectAllElements() { + SelectElements(elements); + } + + public void SelectElements(DrawableContainerList elements) { + foreach(DrawableContainer element in elements) { + SelectElement(element); + } + } + + public void ProcessCmdKey(Keys k) { + if (selectedElements.Count > 0) { + int px = (k == Keys.Shift) ? 10 : 1; + switch (k) { + case Keys.Left: + selectedElements.MoveBy(-1,0); + break; + case Keys.Left | Keys.Shift: + selectedElements.MoveBy(-10,0); + break; + case Keys.Up: + selectedElements.MoveBy(0,-1); + break; + case Keys.Up | Keys.Shift: + selectedElements.MoveBy(0,-10); + break; + case Keys.Right: + selectedElements.MoveBy(1,0); + break; + case Keys.Right | Keys.Shift: + selectedElements.MoveBy(10,0); + break; + case Keys.Down: + selectedElements.MoveBy(0,1); + break; + case Keys.Down | Keys.Shift: + selectedElements.MoveBy(0,10); + break; + case Keys.PageUp: + elements.PullElementsUp(selectedElements); + break; + case Keys.PageDown: + elements.PushElementsDown(selectedElements); + break; + case Keys.Home: + elements.PullElementsToTop(selectedElements); + break; + case Keys.End: + elements.PushElementsToBottom(selectedElements); + break; + case Keys.Enter: + ConfirmSelectedConfirmableElements(true); + break; + case Keys.Escape: + ConfirmSelectedConfirmableElements(false); + break; + /*case Keys.Delete: + RemoveSelectedElements(); + break;*/ + default: + return; + } + Invalidate(); + } + } + + /// + /// pulls selected elements up one level in hierarchy + /// + public void PullElementsUp() { + elements.PullElementsUp(selectedElements); + Invalidate(); + } + + /// + /// pushes selected elements up to top in hierarchy + /// + public void PullElementsToTop() { + elements.PullElementsToTop(selectedElements); + Invalidate(); + } + + /// + /// pushes selected elements down one level in hierarchy + /// + public void PushElementsDown() { + elements.PushElementsDown(selectedElements); + Invalidate(); + } + + /// + /// pushes selected elements down to bottom in hierarchy + /// + public void PushElementsToBottom() { + elements.PushElementsToBottom(selectedElements); + Invalidate(); + } + + /// + /// indicates whether the selected elements could be pulled up in hierarchy + /// + /// true if selected elements could be pulled up, false otherwise + public bool CanPullSelectionUp() { + return elements.CanPullUp(selectedElements); + } + + /// + /// indicates whether the selected elements could be pushed down in hierarchy + /// + /// true if selected elements could be pushed down, false otherwise + public bool CanPushSelectionDown() { + return elements.CanPushDown(selectedElements); + } + + public new void Dispose() { + LOG.Debug("Disposing a surface!"); + originalImage.Dispose(); + base.Dispose(); + } + + public void ElementPropertyChanged(object sender, PropertyChangedEventArgs e) { + Invalidate(); + } + + public void element_FieldChanged(object sender, FieldChangedEventArgs e) { + Invalidate(); + } + } +} diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs new file mode 100644 index 000000000..2a0159d40 --- /dev/null +++ b/Greenshot/Drawing/TextContainer.cs @@ -0,0 +1,300 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Text; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Represents a textbox (extends RectangleContainer for border/background support + /// + [Serializable()] + public class TextContainer : RectangleContainer, ITextContainer { + + private bool fontInvalidated = true; + private Font font; + + private string text; + public string Text { + get { return text; } + set { + if((text == null && value != null) || !text.Equals(value)) { + text = value; + OnPropertyChanged("Text"); + } + } + } + + [NonSerialized] + private TextBox textBox; + + public TextContainer(Surface parent) : base(parent) { + Init(); + Field field = FieldFactory.CreateField(FieldType.FONT_BOLD); + //field.PropertyChanged += FontPropertyChanged; + AddField(field); + AddField(FieldFactory.CreateField(FieldType.FONT_ITALIC)); + AddField(FieldFactory.CreateField(FieldType.FONT_FAMILY)); + AddField(FieldFactory.CreateField(FieldType.FONT_SIZE)); + AddField(FieldFactory.CreateField(FieldType.LINE_COLOR, GetType())); + AddField(FieldFactory.CreateField(FieldType.LINE_THICKNESS, GetType())); + AddField(FieldFactory.CreateField(FieldType.FILL_COLOR, GetType())); + AddField(FieldFactory.CreateField(FieldType.SHADOW)); + } + + [OnDeserializedAttribute()] + private void OnDeserialized(StreamingContext context) { + Init(); + UpdateFont(); + } + + /** + * Destructor + */ + ~TextContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public override void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if(textBox != null) textBox.Dispose(); + if(font != null) font.Dispose(); + } + textBox = null; + font = null; + } + + private void Init() { + CreateTextBox(); + this.PropertyChanged += new PropertyChangedEventHandler(TextContainer_PropertyChanged); + this.FieldChanged += new FieldChangedEventHandler(TextContainer_FieldChanged); + } + + public void FitToText() { + UpdateFont(); + Size textSize = TextRenderer.MeasureText(text, font); + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Width = textSize.Width + lineThickness; + Height = textSize.Height + lineThickness; + } + + void TextContainer_PropertyChanged(object sender, PropertyChangedEventArgs e) { + if(e.PropertyName.Equals("Selected")) { + if(!Selected && textBox.Visible) HideTextBox(); + else if(Selected && Status==EditStatus.DRAWING) { + ShowTextBox(); + } + //else if(!textBox.Visible) ShowTextBox(); + } + if(textBox.Visible) { + UpdateTextBoxPosition(); + UpdateTextBoxFormat(); + textBox.Invalidate(); + } + } + + void TextContainer_FieldChanged(object sender, FieldChangedEventArgs e) + { + if(textBox.Visible) { + UpdateTextBoxFormat(); + textBox.Invalidate(); + } else { + UpdateFont(); + //Invalidate(); + } + font.Dispose(); + font = null; + fontInvalidated = true; + } + + public override void OnDoubleClick() { + ShowTextBox(); + } + + private void CreateTextBox() { + textBox = new TextBox(); + textBox.Multiline = true; + textBox.AcceptsTab = false; + textBox.AcceptsReturn = false; + textBox.DataBindings.Add("Text", this, "Text", false, DataSourceUpdateMode.OnPropertyChanged); + textBox.LostFocus += new EventHandler(textBox_LostFocus); + textBox.KeyDown += new KeyEventHandler(textBox_KeyDown); + textBox.BorderStyle = BorderStyle.FixedSingle; + textBox.Visible = false; + } + + private void ShowTextBox() { + childLabel.Hide(); + parent.KeysLocked = true; + parent.Controls.Add(textBox); + textBox.Show(); + textBox.Focus(); + } + + private void HideTextBox() { + childLabel.Show(); + parent.Focus(); + textBox.Hide(); + parent.KeysLocked = false; + parent.Controls.Remove(textBox); + } + + private void UpdateFont() { + string fontFamily = GetFieldValueAsString(FieldType.FONT_FAMILY); + bool fontBold = GetFieldValueAsBool(FieldType.FONT_BOLD); + bool fontItalic = GetFieldValueAsBool(FieldType.FONT_ITALIC); + float fontSize = GetFieldValueAsFloat(FieldType.FONT_SIZE); + + if(fontInvalidated && fontFamily != null && fontSize != 0) { + FontStyle fs = FontStyle.Regular; + + bool hasStyle = false; + using(FontFamily fam = new FontFamily(fontFamily)) { + bool boldAvailable = fam.IsStyleAvailable(FontStyle.Bold); + if(fontBold && boldAvailable) { + fs |= FontStyle.Bold; + hasStyle = true; + } + + bool italicAvailable = fam.IsStyleAvailable(FontStyle.Italic); + if(fontItalic && italicAvailable) { + fs |= FontStyle.Italic; + hasStyle = true; + } + + if(!hasStyle) { + bool regularAvailable = fam.IsStyleAvailable(FontStyle.Regular); + if(regularAvailable) { + fs = FontStyle.Regular; + } else { + if(boldAvailable) { + fs = FontStyle.Bold; + } else if(italicAvailable) { + fs = FontStyle.Italic; + } + } + } + + font = new Font(fam, fontSize, fs, GraphicsUnit.Pixel); + } + fontInvalidated = false; + + } + } + + private void UpdateTextBoxPosition() { + textBox.Left = this.Left; + textBox.Top = this.Top; + textBox.Width = this.Width; + textBox.Height = this.Height; + + } + + private void UpdateTextBoxFormat() { + UpdateFont(); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + textBox.ForeColor = lineColor; + textBox.Font = font; + } + + void textBox_KeyDown(object sender, KeyEventArgs e) { + // ESC and Enter/Return (w/o Shift) hide text editor + if(e.KeyCode == Keys.Escape || ((e.KeyCode == Keys.Return || e.KeyCode == Keys.Enter) && e.Modifiers != Keys.Shift)) { + HideTextBox(); + e.SuppressKeyPress = true; + } + } + + void textBox_LostFocus(object sender, EventArgs e) { + HideTextBox(); + } + + public override void Draw(Graphics g, RenderMode rm) { + base.Draw(g, rm); + UpdateFont(); + + Rectangle rect = GuiRectangle.GetGuiRectangle(this.Left, this.Top, this.Width, this.Height); + if (Selected && !rm.Equals(RenderMode.EXPORT)) { + DrawSelectionBorder(g, rect); + } + + if (text == null || text.Length == 0 ) { + return; + } + + // we only draw the shadow if there is no background + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + int textOffset = (lineThickness>0) ? (int)Math.Ceiling(lineThickness/2d) : 0; + // draw shadow before anything else + if ( shadow && (fillColor == Color.Transparent || fillColor == Color.Empty)) { + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = 1; + while (currentStep <= steps) { + int offset = currentStep; + Rectangle shadowRect = GuiRectangle.GetGuiRectangle(Left + offset, Top + offset, Width, Height); + if(lineThickness>0) shadowRect.Inflate(-textOffset, -textOffset); + using (Brush fontBrush = new SolidBrush(Color.FromArgb(alpha, 100, 100, 100))) { + g.DrawString(text, font, fontBrush, shadowRect); + currentStep++; + alpha = alpha - basealpha / steps; + } + } + } + + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + Rectangle fontRect = rect; + if(lineThickness>0) fontRect.Inflate(-textOffset,-textOffset); + using (Brush fontBrush = new SolidBrush(lineColor)) { + g.DrawString(text, font, fontBrush, fontRect); + } + + } + + + } +} diff --git a/Greenshot/Drawing/UrlContainer.cs b/Greenshot/Drawing/UrlContainer.cs new file mode 100644 index 000000000..dd171f84e --- /dev/null +++ b/Greenshot/Drawing/UrlContainer.cs @@ -0,0 +1,117 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.Serialization; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing.Fields; +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Drawing { + /// + /// Description of BitmapContainer. + /// + [Serializable()] + public class UrlContainer : DrawableContainer { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(UrlContainer)); + + protected Bitmap bitmap = null; + protected string url = null; + private Size lastSize = new Size(0, 0); + + public UrlContainer(Surface parent, string url) : this(parent) { + Url = url; + } + + public UrlContainer(Surface parent) : base(parent) { + Width = 100; + Height = 100; + } + + public string Url { + set { + url = value; + lastSize = new Size(0, 0); + RedrawIfNeeded(); + } + get { return url; } + } + + /** + * Destructor + */ + ~UrlContainer() { + Dispose(false); + } + + /** + * The public accessible Dispose + * Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice + */ + public new void Dispose() { + Dispose(true); + base.Dispose(); + GC.SuppressFinalize(this); + } + + // The bulk of the clean-up code is implemented in Dispose(bool) + + /** + * This Dispose is called from the Dispose and the Destructor. + * When disposing==true all non-managed resources should be freed too! + */ + protected virtual void Dispose(bool disposing) { + if (disposing) { + if (bitmap != null) { + bitmap.Dispose(); + } + } + bitmap = null; + } + + protected void RedrawIfNeeded() { + if (url == null) { + if (bitmap != null) { + bitmap.Dispose(); + } + bitmap = null; + return; + } + if (bitmap == null || lastSize.Height != Height || lastSize.Width != Width) { + bitmap = WebsiteImageGenerator.GetImageFromURL(url); + if (bitmap != null) { + lastSize = new Size(bitmap.Width, bitmap.Height); + } + } + } + + public override void Draw(Graphics g, RenderMode rm) { + RedrawIfNeeded(); + if (bitmap != null) { + g.DrawImage(bitmap, Bounds); + } + } + } +} diff --git a/Greenshot/Forms/AboutForm.Designer.cs b/Greenshot/Forms/AboutForm.Designer.cs new file mode 100644 index 000000000..6bb42c061 --- /dev/null +++ b/Greenshot/Forms/AboutForm.Designer.cs @@ -0,0 +1,255 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Windows.Forms; +using Greenshot.Configuration; + +namespace Greenshot { + partial class AboutForm { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm)); + this.lblTitle = new System.Windows.Forms.Label(); + this.lblLicense = new System.Windows.Forms.Label(); + this.lblHost = new System.Windows.Forms.Label(); + this.linkLblLicense = new System.Windows.Forms.LinkLabel(); + this.linkLblHost = new System.Windows.Forms.LinkLabel(); + this.linkLblBugs = new System.Windows.Forms.LinkLabel(); + this.lblBugs = new System.Windows.Forms.Label(); + this.linkLblDonations = new System.Windows.Forms.LinkLabel(); + this.lblDonations = new System.Windows.Forms.Label(); + this.linkLblIcons = new System.Windows.Forms.LinkLabel(); + this.lblIcons = new System.Windows.Forms.Label(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.lblTranslation = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblTitle.Location = new System.Drawing.Point(108, 12); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(227, 19); + this.lblTitle.TabIndex = 2; + this.lblTitle.Text = "Greenshot x.x.xxx"; + // + // lblLicense + // + this.lblLicense.Location = new System.Drawing.Point(109, 34); + this.lblLicense.Name = "lblLicense"; + this.lblLicense.Size = new System.Drawing.Size(369, 68); + this.lblLicense.TabIndex = 3; + this.lblLicense.Text = "Copyright (C) 2007 Thomas Braun, Jens Klingen"; + // + // lblHost + // + this.lblHost.Location = new System.Drawing.Point(12, 109); + this.lblHost.Name = "lblHost"; + this.lblHost.Size = new System.Drawing.Size(466, 23); + this.lblHost.TabIndex = 4; + this.lblHost.Text = "Greenshot is hosted by sourceforge.net at"; + // + // linkLblLicense + // + this.linkLblLicense.Location = new System.Drawing.Point(109, 85); + this.linkLblLicense.Name = "linkLblLicense"; + this.linkLblLicense.Size = new System.Drawing.Size(369, 23); + this.linkLblLicense.TabIndex = 5; + this.linkLblLicense.TabStop = true; + this.linkLblLicense.Text = "http://www.gnu.org/licenses/gpl.html"; + this.linkLblLicense.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); + // + // linkLblHost + // + this.linkLblHost.Location = new System.Drawing.Point(13, 124); + this.linkLblHost.Name = "linkLblHost"; + this.linkLblHost.Size = new System.Drawing.Size(465, 23); + this.linkLblHost.TabIndex = 6; + this.linkLblHost.TabStop = true; + this.linkLblHost.Text = "http://sourceforge.net/projects/greenshot/"; + this.linkLblHost.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); + // + // linkLblBugs + // + this.linkLblBugs.Location = new System.Drawing.Point(13, 162); + this.linkLblBugs.Name = "linkLblBugs"; + this.linkLblBugs.Size = new System.Drawing.Size(465, 23); + this.linkLblBugs.TabIndex = 8; + this.linkLblBugs.TabStop = true; + this.linkLblBugs.Text = "http://sourceforge.net/tracker/?group_id=191585&atid=937972"; + this.linkLblBugs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); + // + // lblBugs + // + this.lblBugs.Location = new System.Drawing.Point(12, 147); + this.lblBugs.Name = "lblBugs"; + this.lblBugs.Size = new System.Drawing.Size(466, 23); + this.lblBugs.TabIndex = 7; + this.lblBugs.Text = "Please report bugs to"; + // + // linkLblDonations + // + this.linkLblDonations.Location = new System.Drawing.Point(13, 201); + this.linkLblDonations.Name = "linkLblDonations"; + this.linkLblDonations.Size = new System.Drawing.Size(465, 23); + this.linkLblDonations.TabIndex = 10; + this.linkLblDonations.TabStop = true; + this.linkLblDonations.Text = "http://getgreenshot.org/support/"; + this.linkLblDonations.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); + // + // lblDonations + // + this.lblDonations.Location = new System.Drawing.Point(12, 186); + this.lblDonations.Name = "lblDonations"; + this.lblDonations.Size = new System.Drawing.Size(466, 23); + this.lblDonations.TabIndex = 9; + this.lblDonations.Text = "If you like Greenshot, you might consider donating a dime or two at"; + // + // linkLblIcons + // + this.linkLblIcons.Location = new System.Drawing.Point(13, 239); + this.linkLblIcons.Name = "linkLblIcons"; + this.linkLblIcons.Size = new System.Drawing.Size(279, 23); + this.linkLblIcons.TabIndex = 12; + this.linkLblIcons.TabStop = true; + this.linkLblIcons.Text = "http://p.yusukekamiyamane.com"; + this.linkLblIcons.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); + // + // lblIcons + // + this.lblIcons.Location = new System.Drawing.Point(12, 224); + this.lblIcons.Name = "lblIcons"; + this.lblIcons.Size = new System.Drawing.Size(466, 23); + this.lblIcons.TabIndex = 11; + this.lblIcons.Text = "Greenshot uses icons from / derived from Mark James\' splendid Silk Icon Set on"; + // + // linkLabel1 + // + this.linkLabel1.Location = new System.Drawing.Point(304, 8); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(203, 23); + this.linkLabel1.TabIndex = 13; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "http://getgreenshot.org"; + this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(12, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(90, 90); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 14; + this.pictureBox1.TabStop = false; + // + // lblTranslation + // + this.lblTranslation.Location = new System.Drawing.Point(12, 262); + this.lblTranslation.Name = "lblTranslation"; + this.lblTranslation.Size = new System.Drawing.Size(466, 23); + this.lblTranslation.TabIndex = 15; + this.lblTranslation.Text = "English translation by YOUR_NAME"; + // + // AboutForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(519, 293); + this.Controls.Add(this.lblTranslation); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.linkLblIcons); + this.Controls.Add(this.lblIcons); + this.Controls.Add(this.linkLblDonations); + this.Controls.Add(this.lblDonations); + this.Controls.Add(this.linkLblBugs); + this.Controls.Add(this.lblBugs); + this.Controls.Add(this.linkLblHost); + this.Controls.Add(this.linkLblLicense); + this.Controls.Add(this.lblHost); + this.Controls.Add(this.lblLicense); + this.Controls.Add(this.lblTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "AboutForm"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + } + private System.Windows.Forms.Label lblTranslation; + private System.Windows.Forms.LinkLabel linkLabel1; + private System.Windows.Forms.Label lblHost; + private System.Windows.Forms.LinkLabel linkLblHost; + private System.Windows.Forms.Label lblDonations; + private System.Windows.Forms.LinkLabel linkLblDonations; + private System.Windows.Forms.Label lblBugs; + private System.Windows.Forms.LinkLabel linkLblBugs; + private System.Windows.Forms.LinkLabel linkLblLicense; + private System.Windows.Forms.LinkLabel linkLblIcons; + private System.Windows.Forms.Label lblIcons; + private System.Windows.Forms.Label lblLicense; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.PictureBox pictureBox1; + + void LinkLabelClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) { + openLink((LinkLabel)sender); + } + + private void openLink(LinkLabel link) { + try { + link.LinkVisited = true; + System.Diagnostics.Process.Start(link.Text); + } catch (Exception) { + MessageBox.Show(lang.GetString(LangKey.error_openlink),lang.GetString(LangKey.error)); + } + } + } +} diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs new file mode 100644 index 000000000..50ffb2f1a --- /dev/null +++ b/Greenshot/Forms/AboutForm.cs @@ -0,0 +1,71 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Reflection; +using System.Windows.Forms; + +using Greenshot.Configuration; +using GreenshotPlugin.Core; + +namespace Greenshot { + /// + /// Description of AboutForm. + /// + public partial class AboutForm : Form { + private ILanguage lang; + + public AboutForm() { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + + Version v = Assembly.GetExecutingAssembly().GetName().Version; + // Format is like this: AssemblyVersion("Major.Minor.Build.Revision")] + lblTitle.Text = "Greenshot " + v.Major + "." + v.Minor + "." + v.Build + " Build " + v.Revision.ToString("0000"); + lang = Language.GetInstance(); + updateUI(); + } + + void updateUI() { + this.Text = lang.GetString(LangKey.about_title); + this.lblLicense.Text = lang.GetString(LangKey.about_license); + this.lblHost.Text = lang.GetString(LangKey.about_host); + this.lblBugs.Text = lang.GetString(LangKey.about_bugs); + this.lblDonations.Text = lang.GetString(LangKey.about_donations); + this.lblIcons.Text = lang.GetString(LangKey.about_icons); + this.lblTranslation.Text = lang.GetString(LangKey.about_translation); + } + + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { + try { + if (msg.WParam.ToInt32() == (int)Keys.Escape) { + this.Close(); + } else { + return base.ProcessCmdKey(ref msg, keyData); + } + } catch (Exception) { + } + return base.ProcessCmdKey(ref msg,keyData); + } + } +} diff --git a/Greenshot/Forms/AboutForm.resx b/Greenshot/Forms/AboutForm.resx new file mode 100644 index 000000000..2d77e47ca --- /dev/null +++ b/Greenshot/Forms/AboutForm.resx @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + DhT/B6rDw1pTOdhMAAAAAElFTkSuQmCC + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPSkpKSisCAAAAAAAAAQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFTg9JgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAgAAAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIA + AAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAA + AKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIA + AAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAA + AKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIA + AAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAA + AKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCKAAAACAAAABA + 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 + + + \ No newline at end of file diff --git a/Greenshot/Forms/BugReportForm.Designer.cs b/Greenshot/Forms/BugReportForm.Designer.cs new file mode 100644 index 000000000..902783476 --- /dev/null +++ b/Greenshot/Forms/BugReportForm.Designer.cs @@ -0,0 +1,118 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace Greenshot.Forms { + partial class BugReportForm { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BugReportForm)); + this.labelBugReportInfo = new System.Windows.Forms.Label(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.btnClose = new System.Windows.Forms.Button(); + this.linkLblBugs = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // labelBugReportInfo + // + this.labelBugReportInfo.Location = new System.Drawing.Point(12, 9); + this.labelBugReportInfo.Name = "labelBugReportInfo"; + this.labelBugReportInfo.Size = new System.Drawing.Size(481, 141); + this.labelBugReportInfo.TabIndex = 0; + this.labelBugReportInfo.Text = resources.GetString("labelBugReportInfo.Text"); + // + // textBoxDescription + // + this.textBoxDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxDescription.Location = new System.Drawing.Point(12, 179); + this.textBoxDescription.Multiline = true; + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxDescription.Size = new System.Drawing.Size(504, 232); + this.textBoxDescription.TabIndex = 1; + // + // btnClose + // + this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnClose.Location = new System.Drawing.Point(377, 417); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(139, 23); + this.btnClose.TabIndex = 2; + this.btnClose.Text = "Close"; + this.btnClose.UseVisualStyleBackColor = true; + // + // linkLblBugs + // + this.linkLblBugs.Location = new System.Drawing.Point(12, 153); + this.linkLblBugs.Name = "linkLblBugs"; + this.linkLblBugs.Size = new System.Drawing.Size(465, 23); + this.linkLblBugs.TabIndex = 9; + this.linkLblBugs.TabStop = true; + this.linkLblBugs.Text = "http://sourceforge.net/tracker/?group_id=191585&atid=937972"; + this.linkLblBugs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLblBugsLinkClicked); + // + // BugReportForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.ClientSize = new System.Drawing.Size(528, 452); + this.Controls.Add(this.linkLblBugs); + this.Controls.Add(this.btnClose); + this.Controls.Add(this.textBoxDescription); + this.Controls.Add(this.labelBugReportInfo); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "BugReportForm"; + this.Text = "Error"; + this.ResumeLayout(false); + this.PerformLayout(); + } + private System.Windows.Forms.LinkLabel linkLblBugs; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.TextBox textBoxDescription; + private System.Windows.Forms.Label labelBugReportInfo; + } +} diff --git a/Greenshot/Forms/BugReportForm.cs b/Greenshot/Forms/BugReportForm.cs new file mode 100644 index 000000000..fd165b5fa --- /dev/null +++ b/Greenshot/Forms/BugReportForm.cs @@ -0,0 +1,70 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Drawing; +using System.Net; +using System.Web; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Helpers; +using GreenshotPlugin.Core; + +namespace Greenshot.Forms { + public partial class BugReportForm : Form { + private ILanguage lang; + private BugReportForm() { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + lang = Language.GetInstance(); + UpdateUI(); + } + + + public BugReportForm(string bugText) { + InitializeComponent(); + lang = Language.GetInstance(); + UpdateUI(); + this.textBoxDescription.Text = bugText; + } + + void UpdateUI() { + this.Text = lang.GetString(LangKey.bugreport_title); + this.labelBugReportInfo.Text = lang.GetString(LangKey.bugreport_info); + this.btnClose.Text = lang.GetString(LangKey.bugreport_cancel); + } + + void LinkLblBugsLinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) { + openLink((LinkLabel)sender); + } + + private void openLink(LinkLabel link) { + try { + link.LinkVisited = true; + System.Diagnostics.Process.Start(link.Text); + } catch (Exception) { + MessageBox.Show(lang.GetString(LangKey.error_openlink),lang.GetString(LangKey.error)); + } + } + } +} diff --git a/Greenshot/Forms/BugReportForm.resx b/Greenshot/Forms/BugReportForm.resx new file mode 100644 index 000000000..489a8d3e9 --- /dev/null +++ b/Greenshot/Forms/BugReportForm.resx @@ -0,0 +1,386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Sorry, an unexpected error occured. + +The good news is: you can help us getting rid of it by filing a bug report. +Please visit the URL below, create a new bug report and paste the contents from the text area into the description. +Also, we would highly appreciate if you could add a short description about the circumstances under which the error occurred. + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPSkpKSisCAAAAAAAAAQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFTg9JgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAgAAAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIA + AAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAA + AKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIA + AAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAA + AKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIA + AAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAA + AKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCAAAAAAAApEIAAAAAAACkQgAAAAAAAKRCKAAAACAAAABA + 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 + + + \ No newline at end of file diff --git a/Greenshot/Forms/CaptureForm.Designer.cs b/Greenshot/Forms/CaptureForm.Designer.cs new file mode 100644 index 000000000..d71ed66b3 --- /dev/null +++ b/Greenshot/Forms/CaptureForm.Designer.cs @@ -0,0 +1,84 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace Greenshot.Forms { + partial class CaptureForm { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.Windows.Forms.PictureBox pictureBox; + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() { + this.pictureBox = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox + // + this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox.Location = new System.Drawing.Point(0, 0); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(0, 0); + this.pictureBox.TabIndex = 1; + this.pictureBox.TabStop = false; + this.pictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PictureBoxMouseMove); + this.pictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PictureBoxMouseDown); + this.pictureBox.Paint += new System.Windows.Forms.PaintEventHandler(this.PictureBoxPaint); + this.pictureBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.PictureBoxMouseUp); + // + // CaptureForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(0, 0); + this.Controls.Add(this.pictureBox); + this.Cursor = System.Windows.Forms.Cursors.Cross; + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "CaptureForm"; + this.ShowInTaskbar = false; + this.TopMost = true; + this.VisibleChanged += new System.EventHandler(this.CaptureFormVisibleChanged); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.CaptureFormKeyDown); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.Visible = false; + this.ResumeLayout(false); + } + } +} diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs new file mode 100644 index 000000000..2820ef44a --- /dev/null +++ b/Greenshot/Forms/CaptureForm.cs @@ -0,0 +1,826 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Drawing.Printing; +using System.IO; +using System.Text; +using System.Windows.Forms; + +using Greenshot.Configuration; +using Greenshot.Drawing; +using Greenshot.Helpers; +using Greenshot.Plugin; +using Greenshot.UnmanagedHelpers; +using GreenshotPlugin.Core; + +namespace Greenshot.Forms { + /// + /// Description of CaptureForm. + /// + public partial class CaptureForm : Form, ICaptureHost { + private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(CaptureForm)); + + private int mX; + private int mY; + private Point cursorPos = Point.Empty; + // TODO: dispose Brush & Pen, not very important as we only instanciate this once + private Brush OverlayBrush = new SolidBrush(Color.FromArgb(50, Color.MediumSeaGreen)); + private Pen OverlayPen = new Pen(Color.FromArgb(50, Color.Black)); + private CaptureMode captureMode = CaptureMode.None; + private List windows = new List(); + private WindowDetails selectedCaptureWindow; + private bool mouseDown = false; + private Rectangle captureRect = Rectangle.Empty; + private ICapture capture = null; + private AppConfig conf = AppConfig.GetInstance(); + private CopyData copyData = null; + private ILanguage lang = Language.GetInstance(); + + public CaptureForm() { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + // Create a new instance of the class: copyData = new CopyData(); + copyData = new CopyData(); + + // Assign the handle: + copyData.AssignHandle(this.Handle); + // Create the channel to send on: + copyData.Channels.Add("Greenshot"); + // Hook up received event: + copyData.DataReceived += new DataReceivedEventHandler(CopyDataDataReceived); + + // Make sure the form is hidden (might be overdoing it...) + this.Hide(); + } + + /// + /// DataReceivedEventHandler + /// + /// + /// + private void CopyDataDataReceived(object sender, DataReceivedEventArgs dataReceivedEventArgs) { + // Cast the data to the type of object we sent: + DataTransport dataTransport = (DataTransport)dataReceivedEventArgs.Data; + HandleDataTransport(dataTransport); + } + + public void HandleDataTransport(DataTransport dataTransport) { + LOG.Debug("Data received, Command = " + dataTransport.Command + ", Data: " + dataTransport.CommandData); + switch(dataTransport.Command) { + case CommandEnum.Exit: + Application.Exit(); + break; + case CommandEnum.ReloadConfig: + AppConfig.Reload(); + // Even update language when needed + MainForm.instance.UpdateUI(); + break; + case CommandEnum.OpenFile: + string filename = dataTransport.CommandData; + if (File.Exists(filename)) { + MakeCapture(filename); + } else { + LOG.Warn("No such file: " + filename); + } + break; + default: + LOG.Error("Unknown command!"); + break; + } + } + + void DoCaptureFeedback() { + if((bool)conf.Ui_Effects_CameraSound) { + SoundHelper.Play(); + } + if((bool)conf.Ui_Effects_Flashlight) { + FlashlightForm flashlightForm = new FlashlightForm(); + flashlightForm.Bounds = capture.ScreenBounds; + flashlightForm.FadeIn(); + flashlightForm.FadeOut(); + flashlightForm.Dispose(); + } + } + + /// + /// Make Capture with default destinations + /// + /// CaptureMode + /// bool false if the mouse should not be captured, true if the configuration should be checked + public void MakeCapture(CaptureMode mode, bool captureMouseCursor) { + Capture passingCapture = new Capture(); + MakeCapture(mode, captureMouseCursor, passingCapture); + } + + /// + /// Make Capture with default destinations + /// + /// CaptureMode + /// bool false if the mouse should not be captured, true if the configuration should be checked + public void MakeCapture(CaptureMode mode, bool captureMouseCursor, CaptureHandler captureHandler) { + Capture passingCapture = new Capture(); + passingCapture.CaptureDetails.CaptureHandler = captureHandler; + MakeCapture(mode, captureMouseCursor, passingCapture); + } + + + /// + /// Make Capture with specified destinations + /// + /// CaptureMode + /// bool false if the mouse should not be captured, true if the configuration should be checked + /// List with destinations + public void MakeCapture(CaptureMode mode, bool captureMouseCursor, List captureDestinations) { + Capture passingCapture = new Capture(); + passingCapture.CaptureDetails.CaptureDestinations = captureDestinations; + MakeCapture(mode, captureMouseCursor, passingCapture); + } + + /// + /// Make Capture with file name + /// + /// List with destinations + public void MakeCapture(string filename) { + Capture passingCapture = new Capture(); + passingCapture.CaptureDetails.Filename = filename; + MakeCapture(CaptureMode.File, false, passingCapture); + } + + /// + /// Make Capture with specified destinations + /// + /// CaptureMode + /// bool false if the mouse should not be captured, true if the configuration should be checked + /// List with destinations + private void MakeCapture(CaptureMode mode, bool captureMouseCursor, ICapture newCapture) { + if (captureMode != CaptureMode.None) { + LOG.Warn(String.Format("Capture started while capturing, current mode = {0} new capture was {1}.", captureMode, mode)); + return; + } else { + LOG.Debug(String.Format("MakeCapture({0}, {1})", mode, captureMouseCursor)); + } + captureMode = mode; + + // cleanup the previos information if there is still any + if (capture != null) { + LOG.Debug("Capture wasn't disposed yet, this would suggest a leak"); + capture.Dispose(); + capture = null; + } + + // Use the supplied Capture information + capture = newCapture; + capture.CaptureDetails.CaptureMode = mode; + + // Delay for the Context menu + System.Threading.Thread.Sleep(conf.Capture_Wait_Time); + + // Allways capture Mousecursor, only show when needed + capture = WindowCapture.CaptureCursor(capture); + capture.CursorVisible = false; + // Check if needed + if (captureMouseCursor && mode != CaptureMode.Clipboard && mode != CaptureMode.File) { + capture.CursorVisible = (conf.Capture_Mousepointer.HasValue && conf.Capture_Mousepointer.Value); + } + + switch(mode) { + case CaptureMode.Window: + capture = WindowCapture.CaptureScreen(capture); + CaptureWithFeedback(); + break; + case CaptureMode.ActiveWindow: + CaptureActiveWindow(); + finishCapture(); + break; + case CaptureMode.FullScreen: + capture = WindowCapture.CaptureScreen(capture); + HandleCapture(); + break; + case CaptureMode.Clipboard: + Image clipboardImage = null; + string text = "Clipboard"; + if (Clipboard.ContainsImage()) { + clipboardImage = Clipboard.GetImage(); + } else if (ClipboardHelper.GetFormats().Contains("HTML Format")) { + HtmlFragment htmlFragment = HtmlFragment.FromClipboard(); + text = htmlFragment.Fragment; + clipboardImage = WebsiteImageGenerator.GetImageFromHTML(text); + } else { + text = Clipboard.GetText(); + if ((text != null && text.StartsWith("http://"))) { + clipboardImage = WebsiteImageGenerator.GetImageFromURL(text); + } + } + if (clipboardImage != null) { + if (capture != null) { + capture.Image = clipboardImage; + } else { + capture = new Capture(clipboardImage); + } + // Force Editor + capture.CaptureDetails.AddDestination(CaptureDestination.Editor); + HandleCapture(); + } else { + MessageBox.Show("Couldn't create bitmap from : " + text); + } + break; + case CaptureMode.File: + Bitmap fileBitmap = null; + try { + fileBitmap = new Bitmap(capture.CaptureDetails.Filename, true); + } catch (Exception e) { + LOG.Error(e.Message, e); + MessageBox.Show(lang.GetFormattedString(LangKey.error_openfile, capture.CaptureDetails.Filename)); + } + if (fileBitmap != null) { + if (capture != null) { + capture.Image = fileBitmap; + } else { + capture = new Capture(fileBitmap); + } + // Force Editor + capture.CaptureDetails.AddDestination(CaptureDestination.Editor); + HandleCapture(); + } + break; + case CaptureMode.LastRegion: + if (!RuntimeConfig.LastCapturedRegion.Equals(Rectangle.Empty)) { + capture = WindowCapture.CaptureRectangle(capture, RuntimeConfig.LastCapturedRegion); + HandleCapture(); + } + break; + case CaptureMode.Region: + capture = WindowCapture.CaptureScreen(capture); + CaptureWithFeedback(); + break; + default: + LOG.Warn("Unknown capture mode: " + mode); + break; + } + } + + private ICapture AddConfiguredDestination(ICapture capture) { + if ((conf.Output_Destinations & ScreenshotDestinations.FileDefault) == ScreenshotDestinations.FileDefault) { + capture.CaptureDetails.AddDestination(CaptureDestination.File); + } + + if ((conf.Output_Destinations & ScreenshotDestinations.FileWithDialog) == ScreenshotDestinations.FileWithDialog) { + capture.CaptureDetails.AddDestination(CaptureDestination.FileWithDialog); + } + + if ((conf.Output_Destinations & ScreenshotDestinations.Clipboard) == ScreenshotDestinations.Clipboard) { + capture.CaptureDetails.AddDestination(CaptureDestination.Clipboard); + } + + if ((conf.Output_Destinations & ScreenshotDestinations.Printer) == ScreenshotDestinations.Printer) { + capture.CaptureDetails.AddDestination(CaptureDestination.Printer); + } + + if ((conf.Output_Destinations & ScreenshotDestinations.Editor) == ScreenshotDestinations.Editor) { + capture.CaptureDetails.AddDestination(CaptureDestination.Editor); + } + + if ((conf.Output_Destinations & ScreenshotDestinations.EMail) == ScreenshotDestinations.EMail) { + capture.CaptureDetails.AddDestination(CaptureDestination.EMail); + } + return capture; + } + + /// + /// Process a bitmap like it was captured + /// + /// The bitmap to process + public void HandleCapture(Bitmap bitmap) { + Capture capture = new Capture(bitmap); + HandleCapture(capture); + } + + // This is also an ICapture Interface implementation + public void HandleCapture(Capture capture) { + this.capture = capture; + HandleCapture(); + } + + private void HandleCapture() { + string fullPath = null; + // Flag to see if the image was "exported" so the FileEditor doesn't + // ask to save the file as long as nothing is done. + bool outputMade = false; + + // Make sure the user sees that the capture is made + if (capture.CaptureDetails.CaptureMode != CaptureMode.File && capture.CaptureDetails.CaptureMode != CaptureMode.Clipboard) { + DoCaptureFeedback(); + } else { + // If File || Clipboard + // Maybe not "made" but the original is still there... somehow + outputMade = true; + } + + LOG.Debug("A capture of: " + capture.CaptureDetails.Title); + + // Create event OnCaptureTaken for all Plugins + PluginHelper.instance.CreateCaptureTakenEvent(capture); + + // check if someone has passed a handler + if (capture.CaptureDetails.CaptureHandler != null) { + CaptureTakenEventArgs eventArgs = new CaptureTakenEventArgs(capture); + capture.CaptureDetails.CaptureHandler(this, eventArgs); + } else if (capture.CaptureDetails.CaptureDestinations == null || capture.CaptureDetails.CaptureDestinations.Count == 0) { + AddConfiguredDestination(capture); + } + + // Create Surface with capture, this way elements can be added automatically (like the mouse cursor) + Surface surface = new Surface(capture); + + // Call plugins to do something with the screenshot + PluginHelper.instance.CreateSurfaceFromCaptureEvent(capture, surface); + + // Disable capturing + captureMode = CaptureMode.None; + + // Retrieve important information from the Capture object + ICaptureDetails captureDetails = capture.CaptureDetails; + List captureDestinations = capture.CaptureDetails.CaptureDestinations; + + // Dispose the capture, we don't need it anymore (the surface copied all information and we got the title (if any)). + capture.Dispose(); + capture = null; + + // Want to add more stuff to the surface?? DO IT HERE! + + // Create Image for writing/printing etc and use "using" as all code paths either output the image or copy the image + using (Image image = surface.GetImageForExport()) { + // Flag to detect if we need to create a temp file for the email + // or use the file that was written + bool fileWritten = false; + if (captureDestinations.Contains(CaptureDestination.File)) { + string filename = FilenameHelper.GetFilenameFromPattern(conf.Output_File_FilenamePattern, conf.Output_File_Format, captureDetails); + fullPath = Path.Combine(conf.Output_File_Path,filename); + + // Catching any exception to prevent that the user can't write in the directory. + // This is done for e.g. bugs #2974608, #2963943, #2816163, #2795317, #2789218, #3004642 + try { + ImageOutput.Save(image, fullPath, captureDetails); + fileWritten = true; + outputMade = true; + } catch (Exception e) { + LOG.Error("Error saving screenshot!", e); + // Show the problem + MessageBox.Show(lang.GetString(LangKey.error_save), lang.GetString(LangKey.error)); + // when save failed we present a SaveWithDialog + fullPath = ImageOutput.SaveWithDialog(image, captureDetails); + fileWritten = (fullPath != null); + } + } + + if (captureDestinations.Contains(CaptureDestination.FileWithDialog)) { + fullPath = ImageOutput.SaveWithDialog(image, captureDetails); + fileWritten = (fullPath != null); + outputMade = outputMade || fileWritten; + } + + if (captureDestinations.Contains(CaptureDestination.Clipboard)) { + ClipboardHelper.SetClipboardData(image); + outputMade = true; + } + + if (captureDestinations.Contains(CaptureDestination.Printer)) { + PrinterSettings printerSettings = new PrintHelper(image, captureDetails).PrintWithDialog(); + outputMade = outputMade || printerSettings != null; + } + + if (captureDestinations.Contains(CaptureDestination.EMail)) { + if (!fileWritten) { + MapiMailMessage.SendImage(image, captureDetails); + } else { + MapiMailMessage.SendImage(fullPath, captureDetails.Title, false); + } + // Don't know how to handle a cancel in the email + outputMade = true; + } + } + + // If the editor is opened, let it Dispose the surface! + if (captureDestinations.Contains(CaptureDestination.Editor)) { + ImageEditorForm editor = new ImageEditorForm(surface, outputMade); + + if (fullPath != null) { + editor.SetImagePath(fullPath); + } + editor.Show(); + editor.Activate(); + LOG.Debug("Finished opening Editor"); + } else { + // Dispose the surface, we are done with it! + surface.Dispose(); + } + + // Make CaptureForm invisible + this.Visible = false; + // Hiding makes the editor (if any) get focus + this.Hide(); + } + + /** + * Finishing the whole Capture with Feedback flow, passing the result on to the HandleCapture + */ + private void finishCapture() { + bool fromWindow = (conf.Capture_Complete_Window.HasValue && conf.Capture_Complete_Window.Value); + + // Get title + if (selectedCaptureWindow != null) { + if (capture == null) { + capture = new Capture(); + } + capture.CaptureDetails.Title = selectedCaptureWindow.Text; + } + + if ( (captureMode == CaptureMode.Window || captureMode == CaptureMode.ActiveWindow) && selectedCaptureWindow != null) { + Image capturedWindowImage = null; + // What type of capturing? (From Screen or from window) + if (fromWindow) { + // "Capture" the windows content + capturedWindowImage = selectedCaptureWindow.Image; + if (capturedWindowImage != null) { + // Fix Cursor location as we don't crop + capture.MoveMouseLocation(-selectedCaptureWindow.Rectangle.Location.X, -selectedCaptureWindow.Rectangle.Location.Y); + // Set the image + capture.Image = capturedWindowImage; + } + } + // If the PrintWindow implementation isn't used or failed we use the image from the screen. + if (capturedWindowImage == null) { + // From screen, take the location of the selected window to copy the content + captureRect = selectedCaptureWindow.Rectangle; + // Cropping capture to the selected rectangle + capture.CropWithScreenCoordinates(captureRect); + // save for re-capturing later and show recapture context menu option + RuntimeConfig.LastCapturedRegion = captureRect; + } + StopCapturing(false); + HandleCapture(); + } else if (captureRect.Height > 0 && captureRect.Width > 0) { + // Resizing the captured rectangle (no need to make another capture + capture.CropWithScreenCoordinates(captureRect); + // save for re-capturing later and show recapture context menu option + RuntimeConfig.LastCapturedRegion = captureRect; + + StopCapturing(false); + HandleCapture(); + } + } + + /** + * Stopping the whole Capture with Feedback flow + */ + private void StopCapturing(bool cleanupCapture) { + mouseDown = false; + // Disable the capture mode + captureMode = CaptureMode.None; + cursorPos.X = 0; + cursorPos.Y = 0; + selectedCaptureWindow = null; + if (cleanupCapture && capture != null) { + capture.Dispose(); + capture = null; + } + this.Hide(); + } + + #region key handling + void CaptureFormKeyDown(object sender, KeyEventArgs e) { + if (e.KeyCode == Keys.Escape) { + StopCapturing(true); + } else if (e.KeyCode == Keys.M) { + // Toggle mouse cursor + capture.CursorVisible = !capture.CursorVisible; + PictureBoxMouseMove(this, new MouseEventArgs(MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0)); + } else if (e.KeyCode == Keys.PageDown) { + // Extend the selectable rectangles with the "insides" of the current Window + if (captureMode == CaptureMode.Window) { + WindowDetails currentWindow = FindCurrentWindow(); + if (currentWindow != null && !currentWindow.HasChildren) { + currentWindow.GetChildren(); + } else { + LOG.Warn("No window found!!"); + } + } + PictureBoxMouseMove(this, new MouseEventArgs(MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0)); + } else if (e.KeyCode == Keys.Space) { + switch (captureMode) { + case CaptureMode.Region: + captureMode = CaptureMode.Window; + break; + case CaptureMode.Window: + captureMode = CaptureMode.Region; + break; + } + PictureBoxMouseMove(this, new MouseEventArgs(MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0)); + } else if (e.KeyCode == Keys.Return && captureMode == CaptureMode.Window) { + finishCapture(); + } + } + #endregion + + private void CaptureActiveWindow() { + LOG.Debug("CaptureActiveWindow"); + IntPtr hWnd = User32.GetForegroundWindow(); + if (hWnd != null && hWnd != IntPtr.Zero) { + // Make sure the screen is captured in case of errors or if we don't do direct window capturing + capture = WindowCapture.CaptureScreen(capture); + selectedCaptureWindow = new WindowDetails(hWnd); + // Content only + if ((conf.Capture_Window_Content.HasValue && conf.Capture_Window_Content.Value)) { + // Print Tree for debugging + selectedCaptureWindow.PrintTree(""); + WindowDetails contentWindow = selectedCaptureWindow.GetContent(); + if (contentWindow != null) { + selectedCaptureWindow = contentWindow; + } + } + } + } + + #region capture with feedback + private void CaptureWithFeedback() { + windows.Clear(); + // Start Enumeration of "active" windows + WindowsEnumerator windowsEnumerator = new WindowsEnumerator(); + windowsEnumerator.GetWindows(); + foreach(WindowDetails window in windowsEnumerator.Items) { + // Window should be visible and not ourselves + if (window.Visible && !window.Handle.Equals(this.Handle)) { + windows.Add(window); + } + } + + this.SuspendLayout(); + this.Bounds = capture.ScreenBounds; + pictureBox.Image = capture.Image; + this.Visible = true; + this.ResumeLayout(); + this.Focus(); + this.Show(); + } + + /// + /// Helper Method for finding the current Window in the available rectangles + /// + /// WindowDetails + private WindowDetails FindCurrentWindow() { + foreach(WindowDetails window in windows) { + Rectangle windowRectangle = window.Rectangle; + if (windowRectangle.Contains(Cursor.Position)) { + WindowDetails selectedChild = null; + // Content only + if ((conf.Capture_Window_Content.HasValue && conf.Capture_Window_Content.Value)) { + WindowDetails childWindow = window.GetContent(); + if (childWindow != null && childWindow.Rectangle.Contains(Cursor.Position)) { + return childWindow; + } + } + // Check if Children need to be parsed (only if "pgdn" was used) + if (window.HasChildren) { + foreach(WindowDetails childWindow in window.Children) { + windowRectangle = childWindow.Rectangle; + if (windowRectangle.Contains(Cursor.Position)) { + if (selectedChild == null) { + selectedChild = childWindow; + } else { + int sizeCurrent = childWindow.Rectangle.Height * childWindow.Rectangle.Width; + int sizeSelected = selectedChild.Rectangle.Height * selectedChild.Rectangle.Width; + if (sizeCurrent < sizeSelected) { + selectedChild = childWindow; + } + } + } + } + if (selectedChild != null) { + return selectedChild; + } + } + return window; + } + } + return null; + } + #endregion + + #region pictureBox events + void PictureBoxMouseDown(object sender, MouseEventArgs e) { + if (e.Button == MouseButtons.Left) { + mX = e.X; + mY = e.Y; + mouseDown = true; + PictureBoxMouseMove(this, e); + } + } + + void PictureBoxMouseUp(object sender, MouseEventArgs e) { + if (mouseDown) { + // If the mouse goes up we set down to false (nice logic!) + mouseDown = false; + // Check if anything is selected + if (captureMode == CaptureMode.Window && selectedCaptureWindow != null) { + // Go and process the capture + finishCapture(); + } else if (captureRect.Height > 0 && captureRect.Width > 0) { + // correct the GUI width to real width if Region mode + if (captureMode == CaptureMode.Region) { + captureRect.Width += 1; + captureRect.Height += 1; + } + // Go and process the capture + finishCapture(); + } + } + } + + void PictureBoxMouseMove(object sender, MouseEventArgs e) { + cursorPos.X = e.X; + cursorPos.Y = e.Y; + + if (captureMode == CaptureMode.Region && mouseDown) { + captureRect = GuiRectangle.GetGuiRectangle(e.X + this.Left, e.Y + this.Top, mX - e.X, mY - e.Y); + } + + // Iterate over the found windows and check if the current location is inside a window + selectedCaptureWindow = FindCurrentWindow(); + if (selectedCaptureWindow != null) { + if (capture == null) { + capture = new Capture(); + } + capture.CaptureDetails.Title = selectedCaptureWindow.Text; + if (captureMode == CaptureMode.Window) { + captureRect = selectedCaptureWindow.Rectangle; + } + } + + pictureBox.Invalidate(); + } + + void PictureBoxPaint(object sender, PaintEventArgs e) { + Graphics graphics = e.Graphics; + + if (capture.Cursor != null && capture.CursorVisible) { + graphics.DrawIcon(capture.Cursor, capture.CursorLocation.X, capture.CursorLocation.Y); + } + + if (mouseDown || captureMode == CaptureMode.Window) { + Rectangle screenbounds = capture.ScreenBounds; + captureRect.Intersect(screenbounds); // crop what is outside the screen + Rectangle fixedRect = new Rectangle( captureRect.X, captureRect.Y, captureRect.Width, captureRect.Height ); + fixedRect.X += Math.Abs( screenbounds.X ); + fixedRect.Y += Math.Abs( screenbounds.Y ); + + graphics.FillRectangle( OverlayBrush, fixedRect ); + graphics.DrawRectangle( OverlayPen, fixedRect ); + + // rulers + int dist = 8; + + using (Font rulerFont = new Font(FontFamily.GenericSansSerif, 8)) { + int hSpace = TextRenderer.MeasureText(captureRect.Width.ToString(), rulerFont).Width + 3; + int vSpace = TextRenderer.MeasureText(captureRect.Height.ToString(), rulerFont).Height + 3; + Brush bgBrush = new SolidBrush(Color.FromArgb(200, 217, 240, 227)); + Pen rulerPen = new Pen(Color.SeaGreen); + + // horizontal ruler + if (fixedRect.Width > hSpace + 3) { + using (GraphicsPath p = Drawing.RoundedRectangle.Create2( + fixedRect.X + (fixedRect.Width / 2 - hSpace / 2) + 3, + fixedRect.Y - dist - 7, + TextRenderer.MeasureText(captureRect.Width.ToString(), rulerFont).Width - 3, + TextRenderer.MeasureText(captureRect.Width.ToString(), rulerFont).Height, + 3)) { + graphics.FillPath(bgBrush, p); + graphics.DrawPath(rulerPen, p); + graphics.DrawString(captureRect.Width.ToString(), rulerFont, rulerPen.Brush, fixedRect.X + (fixedRect.Width / 2 - hSpace / 2) + 3, fixedRect.Y - dist - 7); + graphics.DrawLine(rulerPen, fixedRect.X, fixedRect.Y - dist, fixedRect.X + (fixedRect.Width / 2 - hSpace / 2), fixedRect.Y - dist); + graphics.DrawLine(rulerPen, fixedRect.X + (fixedRect.Width / 2 + hSpace / 2), fixedRect.Y - dist, fixedRect.X + fixedRect.Width, fixedRect.Y - dist); + graphics.DrawLine(rulerPen, fixedRect.X, fixedRect.Y - dist - 3, fixedRect.X, fixedRect.Y - dist + 3); + graphics.DrawLine(rulerPen, fixedRect.X + fixedRect.Width, fixedRect.Y - dist - 3, fixedRect.X + fixedRect.Width, fixedRect.Y - dist + 3); + } + } + + // vertical ruler + if (fixedRect.Height > vSpace + 3) { + using (GraphicsPath p = Drawing.RoundedRectangle.Create2( + fixedRect.X - (TextRenderer.MeasureText(captureRect.Height.ToString(), rulerFont).Width) + 1, + fixedRect.Y + (fixedRect.Height / 2 - vSpace / 2) + 2, + TextRenderer.MeasureText(captureRect.Height.ToString(), rulerFont).Width - 3, + TextRenderer.MeasureText(captureRect.Height.ToString(), rulerFont).Height - 1, + 3)) { + graphics.FillPath(bgBrush, p); + graphics.DrawPath(rulerPen, p); + graphics.DrawString(captureRect.Height.ToString(), rulerFont, rulerPen.Brush, fixedRect.X - (TextRenderer.MeasureText(captureRect.Height.ToString(), rulerFont).Width) + 1, fixedRect.Y + (fixedRect.Height / 2 - vSpace / 2) + 2); + graphics.DrawLine(rulerPen, fixedRect.X - dist, fixedRect.Y, fixedRect.X - dist, fixedRect.Y + (fixedRect.Height / 2 - vSpace / 2)); + graphics.DrawLine(rulerPen, fixedRect.X - dist, fixedRect.Y + (fixedRect.Height / 2 + vSpace / 2), fixedRect.X - dist, fixedRect.Y + fixedRect.Height); + graphics.DrawLine(rulerPen, fixedRect.X - dist - 3, fixedRect.Y, fixedRect.X - dist + 3, fixedRect.Y); + graphics.DrawLine(rulerPen, fixedRect.X - dist - 3, fixedRect.Y + fixedRect.Height, fixedRect.X - dist + 3, fixedRect.Y + fixedRect.Height); + } + } + + rulerPen.Dispose(); + bgBrush.Dispose(); + } + + // Display size of selected rectangle + // Prepare the font and text. + using (Font sizeFont = new Font( FontFamily.GenericSansSerif, 12 )) { + // When capturing a Region we need to add 1 to the height/width for correction + string sizeText = null; + if (captureMode == CaptureMode.Region) { + // correct the GUI width to real width for the shown size + sizeText = (captureRect.Width + 1) + " x " + (captureRect.Height + 1); + } else { + sizeText = captureRect.Width + " x " + captureRect.Height; + } + + // Calculate the scaled font size. + SizeF extent = graphics.MeasureString( sizeText, sizeFont ); + float hRatio = captureRect.Height / (extent.Height * 2); + float wRatio = captureRect.Width / (extent.Width * 2); + float ratio = ( hRatio < wRatio ? hRatio : wRatio ); + float newSize = sizeFont.Size * ratio; + + if ( newSize >= 4 ) { + // Only show if 4pt or larger. + if (newSize > 20) { + newSize = 20; + } + // Draw the size. + using (Font newSizeFont = new Font(FontFamily.GenericSansSerif, newSize, FontStyle.Bold)) { + PointF sizeLocation = new PointF( fixedRect.X + ( captureRect.Width / 2) - (TextRenderer.MeasureText(sizeText, sizeFont).Width / 2), fixedRect.Y + (captureRect.Height / 2) - (sizeFont.GetHeight() / 2)); + graphics.DrawString(sizeText, sizeFont, Brushes.LightSeaGreen, sizeLocation); + } + } + } + } else { + if (cursorPos.X > 0 || cursorPos.Y > 0) { + using (Pen pen = new Pen(Color.LightSeaGreen)) { + pen.DashStyle = DashStyle.Dot; + Rectangle screenBounds = capture.ScreenBounds; + graphics.DrawLine(pen, cursorPos.X, screenBounds.Y, cursorPos.X, screenBounds.Height); + graphics.DrawLine(pen, screenBounds.X, cursorPos.Y, screenBounds.Width, cursorPos.Y); + } + + string xy = cursorPos.X.ToString() + " x " + cursorPos.Y.ToString(); + using (Font f = new Font(FontFamily.GenericSansSerif, 8)) { + using (GraphicsPath gp = Drawing.RoundedRectangle.Create2( + cursorPos.X + 5, + cursorPos.Y + 5, + TextRenderer.MeasureText(xy, f).Width - 3, + TextRenderer.MeasureText(xy, f).Height, + 3)) { + using (Brush bgBrush = new SolidBrush(Color.FromArgb(200, 217, 240, 227))) { + graphics.FillPath(bgBrush, gp); + } + using (Pen pen = new Pen(Color.SeaGreen)) { + graphics.DrawPath(pen, gp); + Point coordinatePosition = new Point(cursorPos.X + 5, cursorPos.Y + 5); + graphics.DrawString(xy, f, pen.Brush, coordinatePosition); + } + } + } + } + } + } + #endregion + + #region Form Events + private void CaptureFormVisibleChanged( object sender, EventArgs e ) { + if ( !this.Visible && pictureBox.Image != null ) { + Image img = pictureBox.Image; + pictureBox.Image = null; + img.Dispose(); + } + } + #endregion + } +} diff --git a/Greenshot/Forms/ColorDialog.Designer.cs b/Greenshot/Forms/ColorDialog.Designer.cs new file mode 100644 index 000000000..018140920 --- /dev/null +++ b/Greenshot/Forms/ColorDialog.Designer.cs @@ -0,0 +1,259 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace Greenshot { + partial class ColorDialog : System.Windows.Forms.Form { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.btnTransparent = new System.Windows.Forms.Button(); + this.colorPanel = new System.Windows.Forms.Panel(); + this.labelHtmlColor = new System.Windows.Forms.Label(); + this.textBoxHtmlColor = new System.Windows.Forms.TextBox(); + this.labelRed = new System.Windows.Forms.Label(); + this.labelGreen = new System.Windows.Forms.Label(); + this.labelBlue = new System.Windows.Forms.Label(); + this.textBoxRed = new System.Windows.Forms.TextBox(); + this.textBoxGreen = new System.Windows.Forms.TextBox(); + this.textBoxBlue = new System.Windows.Forms.TextBox(); + this.labelRecentColors = new System.Windows.Forms.Label(); + this.textBoxAlpha = new System.Windows.Forms.TextBox(); + this.labelAlpha = new System.Windows.Forms.Label(); + this.btnApply = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // btnTransparent + // + this.btnTransparent.BackColor = System.Drawing.Color.Transparent; + this.btnTransparent.Location = new System.Drawing.Point(210, 4); + this.btnTransparent.Name = "btnTransparent"; + this.btnTransparent.Size = new System.Drawing.Size(78, 23); + this.btnTransparent.TabIndex = 0; + this.btnTransparent.TabStop = false; + this.btnTransparent.Text = "Transparent"; + this.btnTransparent.UseVisualStyleBackColor = false; + this.btnTransparent.Click += new System.EventHandler(this.btnTransparentClick); + // + // colorPanel + // + this.colorPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.colorPanel.Location = new System.Drawing.Point(210, 31); + this.colorPanel.Name = "colorPanel"; + this.colorPanel.Size = new System.Drawing.Size(78, 23); + this.colorPanel.TabIndex = 1; + // + // labelHtmlColor + // + this.labelHtmlColor.Font = new System.Drawing.Font("Tahoma", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.World); + this.labelHtmlColor.Location = new System.Drawing.Point(210, 57); + this.labelHtmlColor.Name = "labelHtmlColor"; + this.labelHtmlColor.Size = new System.Drawing.Size(78, 17); + this.labelHtmlColor.TabIndex = 2; + this.labelHtmlColor.Text = "HTML color"; + // + // textBoxHtmlColor + // + this.textBoxHtmlColor.Location = new System.Drawing.Point(210, 71); + this.textBoxHtmlColor.Name = "textBoxHtmlColor"; + this.textBoxHtmlColor.Size = new System.Drawing.Size(78, 20); + this.textBoxHtmlColor.TabIndex = 1; + this.textBoxHtmlColor.Click += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxHtmlColor.GotFocus += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxHtmlColor.TextChanged += new System.EventHandler(this.TextBoxHexadecimalTextChanged); + this.textBoxHtmlColor.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); + // + // labelRed + // + this.labelRed.Font = new System.Drawing.Font("Tahoma", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.World); + this.labelRed.Location = new System.Drawing.Point(210, 98); + this.labelRed.Name = "labelRed"; + this.labelRed.Size = new System.Drawing.Size(78, 18); + this.labelRed.TabIndex = 4; + this.labelRed.Text = "Red"; + // + // labelGreen + // + this.labelGreen.Font = new System.Drawing.Font("Tahoma", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.World); + this.labelGreen.Location = new System.Drawing.Point(210, 122); + this.labelGreen.Name = "labelGreen"; + this.labelGreen.Size = new System.Drawing.Size(78, 18); + this.labelGreen.TabIndex = 5; + this.labelGreen.Text = "Green"; + // + // labelBlue + // + this.labelBlue.Font = new System.Drawing.Font("Tahoma", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.World); + this.labelBlue.Location = new System.Drawing.Point(210, 146); + this.labelBlue.Name = "labelBlue"; + this.labelBlue.Size = new System.Drawing.Size(78, 18); + this.labelBlue.TabIndex = 6; + this.labelBlue.Text = "Blue"; + // + // textBoxRed + // + this.textBoxRed.Location = new System.Drawing.Point(258, 95); + this.textBoxRed.Name = "textBoxRed"; + this.textBoxRed.Size = new System.Drawing.Size(30, 20); + this.textBoxRed.TabIndex = 2; + this.textBoxRed.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.textBoxRed.Click += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxRed.GotFocus += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxRed.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxRed.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); + // + // textBoxGreen + // + this.textBoxGreen.Location = new System.Drawing.Point(258, 119); + this.textBoxGreen.Name = "textBoxGreen"; + this.textBoxGreen.Size = new System.Drawing.Size(30, 20); + this.textBoxGreen.TabIndex = 3; + this.textBoxGreen.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.textBoxGreen.Click += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxGreen.GotFocus += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxGreen.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxGreen.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); + // + // textBoxBlue + // + this.textBoxBlue.Location = new System.Drawing.Point(258, 143); + this.textBoxBlue.Name = "textBoxBlue"; + this.textBoxBlue.Size = new System.Drawing.Size(30, 20); + this.textBoxBlue.TabIndex = 4; + this.textBoxBlue.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.textBoxBlue.Click += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxBlue.GotFocus += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxBlue.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxBlue.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); + // + // labelRecentColors + // + this.labelRecentColors.Location = new System.Drawing.Point(3, 175); + this.labelRecentColors.Name = "labelRecentColors"; + this.labelRecentColors.Size = new System.Drawing.Size(148, 13); + this.labelRecentColors.TabIndex = 10; + this.labelRecentColors.Text = "Recently used colors"; + // + // textBoxAlpha + // + this.textBoxAlpha.Location = new System.Drawing.Point(258, 167); + this.textBoxAlpha.Name = "textBoxAlpha"; + this.textBoxAlpha.Size = new System.Drawing.Size(30, 20); + this.textBoxAlpha.TabIndex = 5; + this.textBoxAlpha.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.textBoxAlpha.Click += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxAlpha.GotFocus += new System.EventHandler(this.TextBoxGotFocus); + this.textBoxAlpha.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxAlpha.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); + // + // labelAlpha + // + this.labelAlpha.Font = new System.Drawing.Font("Tahoma", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.World); + this.labelAlpha.Location = new System.Drawing.Point(210, 170); + this.labelAlpha.Name = "labelAlpha"; + this.labelAlpha.Size = new System.Drawing.Size(78, 18); + this.labelAlpha.TabIndex = 11; + this.labelAlpha.Text = "Alpha"; + // + // btnApply + // + this.btnApply.BackColor = System.Drawing.Color.Transparent; + this.btnApply.Location = new System.Drawing.Point(210, 191); + this.btnApply.Name = "btnApply"; + this.btnApply.Size = new System.Drawing.Size(78, 23); + this.btnApply.TabIndex = 12; + this.btnApply.TabStop = false; + this.btnApply.Text = "Apply"; + this.btnApply.UseVisualStyleBackColor = false; + this.btnApply.Click += new System.EventHandler(this.BtnApplyClick); + // + // ColorDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 218); + this.Controls.Add(this.btnApply); + this.Controls.Add(this.textBoxAlpha); + this.Controls.Add(this.labelAlpha); + this.Controls.Add(this.labelRecentColors); + this.Controls.Add(this.textBoxBlue); + this.Controls.Add(this.textBoxGreen); + this.Controls.Add(this.textBoxRed); + this.Controls.Add(this.labelBlue); + this.Controls.Add(this.labelGreen); + this.Controls.Add(this.labelRed); + this.Controls.Add(this.textBoxHtmlColor); + this.Controls.Add(this.labelHtmlColor); + this.Controls.Add(this.colorPanel); + this.Controls.Add(this.btnTransparent); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ColorDialog"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "TestProject"; + this.ResumeLayout(false); + this.PerformLayout(); + } + private System.Windows.Forms.Label labelRed; + private System.Windows.Forms.Label labelGreen; + private System.Windows.Forms.Label labelBlue; + private System.Windows.Forms.TextBox textBoxHtmlColor; + private System.Windows.Forms.Label labelRecentColors; + private System.Windows.Forms.Label labelAlpha; + private System.Windows.Forms.Label labelHtmlColor; + private System.Windows.Forms.Button btnApply; + private System.Windows.Forms.TextBox textBoxAlpha; + private System.Windows.Forms.TextBox textBoxRed; + private System.Windows.Forms.TextBox textBoxGreen; + private System.Windows.Forms.TextBox textBoxBlue; + private System.Windows.Forms.Panel colorPanel; + private System.Windows.Forms.Button btnTransparent; + + + + + + } +} diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs new file mode 100644 index 000000000..08f4ff8c7 --- /dev/null +++ b/Greenshot/Forms/ColorDialog.cs @@ -0,0 +1,242 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Threading; +using System.Windows.Forms; + +using Greenshot.Configuration; +using GreenshotPlugin.Core; + +namespace Greenshot { + /// + /// Description of ColorDialog. + /// + public partial class ColorDialog { + private static ColorDialog uniqueInstance; + + private ColorDialog() { + this.SuspendLayout(); + InitializeComponent(); + lang = Language.GetInstance(); + updateUI(); + this.SuspendLayout(); + this.createColorPalette(5,5,15,15); + this.createLastUsedColorButtonRow(5,190,15,15); + this.ResumeLayout(); + } + + public static ColorDialog GetInstance() { + if(uniqueInstance == null) { + uniqueInstance = new ColorDialog(); + } + return uniqueInstance; + } + + private ILanguage lang; + private List