From ded97b17f7c141c70793ac088805ac4d1b360cf7 Mon Sep 17 00:00:00 2001 From: softrev2000 Date: Wed, 20 May 2015 15:39:33 +0200 Subject: [PATCH 001/170] mispelling --- Greenshot/Languages/language-fr-FR.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Greenshot/Languages/language-fr-FR.xml b/Greenshot/Languages/language-fr-FR.xml index c98bf502b..b23f64c6f 100644 --- a/Greenshot/Languages/language-fr-FR.xml +++ b/Greenshot/Languages/language-fr-FR.xml @@ -142,12 +142,12 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si Imprimer Rétablir {0} Réinitialiser la taille - Redimmensionner + Redimensionner Maintenir le rapport L / H Hauteur Pourcentage Pixels - Paramètres du redimmensionnement + Paramètres du redimensionnement Largeur Tourner vers la gauche Tourner vers la droite From 2973ea654e488b89aaac2574d18bb00efc73b3d1 Mon Sep 17 00:00:00 2001 From: "Pete M. Wilson" Date: Thu, 7 Jan 2016 19:16:44 -0500 Subject: [PATCH 002/170] Fix Reduce Color Arithmetic Overflow --- GreenshotPlugin/Core/QuantizerHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index fbdb6a219..d9bfa1713 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -578,7 +578,7 @@ namespace GreenshotPlugin.Core { // the cube cannot be cut at bottom (this would lead to empty cube) if (halfWeight != 0) { - Single halfDistance = halfRed * halfRed + halfGreen * halfGreen + halfBlue * halfBlue; + Single halfDistance = (Single)halfRed * halfRed + (Single)halfGreen * halfGreen + (Single)halfBlue * halfBlue; Single temp = halfDistance / halfWeight; halfRed = wholeRed - halfRed; @@ -587,7 +587,7 @@ namespace GreenshotPlugin.Core { halfWeight = wholeWeight - halfWeight; if (halfWeight != 0) { - halfDistance = halfRed * halfRed + halfGreen * halfGreen + halfBlue * halfBlue; + halfDistance = (Single)halfRed * halfRed + (Single)halfGreen * halfGreen + (Single)halfBlue * halfBlue; temp += halfDistance / halfWeight; if (temp > result) { From 23410c0440dc6d69e3a2b37ebd5c5386dd6e2d75 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 4 Mar 2016 07:39:31 +0100 Subject: [PATCH 003/170] Currently 1.2 is in the master (with a small change not out in the release), so I chanced the appveyor.yml file. --- appveyor.yml => appveyor12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename appveyor.yml => appveyor12.yml (99%) diff --git a/appveyor.yml b/appveyor12.yml similarity index 99% rename from appveyor.yml rename to appveyor12.yml index 2b4283e3e..ac57b85d2 100644 --- a/appveyor.yml +++ b/appveyor12.yml @@ -1,7 +1,7 @@ version: 1.2.7.{build} branches: only: - - 1.2 + - master skip_tags: true configuration: Release platform: Any CPU From 932ffef7532e8f92e15a049076c67e3961c9b3d7 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 4 Mar 2016 07:41:03 +0100 Subject: [PATCH 004/170] 1.3 is in the develop, changed the appveyor.yml file accordingly --- appveyor13.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor13.yml b/appveyor13.yml index 42be232f5..01d1c6d3e 100644 --- a/appveyor13.yml +++ b/appveyor13.yml @@ -1,7 +1,7 @@ version: 1.3.0.{build} branches: only: - - 1.3 + - develop skip_tags: true configuration: Release platform: Any CPU From 3d5b9be61566c970b605711aef1991e5fbb1de3b Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 4 Mar 2016 07:42:58 +0100 Subject: [PATCH 005/170] Updated version to build --- appveyor12.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor12.yml b/appveyor12.yml index 5ef4c125e..19f38fd44 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -1,4 +1,4 @@ -version: 1.2.8.{build} +version: 1.2.9.{build} branches: only: - master @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: RELEASE + build_type: UNSTABLE rsakey: secure: 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 before_build: From 324118e1b51de5c12455ba2088167bd5c23ef52b Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 11 Mar 2016 14:09:06 +0100 Subject: [PATCH 006/170] Starting sprint "Greenshot 1.2.9" --- .../additional_files/readme.txt.template | 16 ++++++++++- README.md | 27 +------------------ appveyor12.yml | 2 +- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 0881700f2..e050d9648 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,6 +9,21 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ +Open issues planned for this version: +BUG-1887: hang on exit - hang time proportional to number of objects +BUG-1872: OneDrive prevents Greenshot hotkeys from working +BUG-1876: Already running message, multi user environment +BUG-1892: Greenshot saves blank JPG file with reduce colors +BUG-1898: Specify it's GPLv3 in the license text +BUG-1912: Translation (Enu) +FEATURE-916: Save file as icon +FEATURE-919: Allow adding of space around screenshot +FEATURE-912: [Storage Location] Define directory pattern +BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on + + +1.2.8.12-cab854b RELEASE + There were some major issues with the authenticated (non anonymous) uploads to Imgur. After contacting Imgur they told us that their old API was deprecated or disabled, unfortunately this was not communicated. Although we are working hard on Greenshot 1.3, where we changed most of the Imgur code already, we can't release it. @@ -31,7 +46,6 @@ Features: FEATURE-896: Use Imgur with HTTPS (with changing the Imgur API from V2 to V3 this was already required for the upload anyway.) - 1.2.7.2-342a506 RELEASE Bugs Resolved: diff --git a/README.md b/README.md index 919b1945c..292628058 100644 --- a/README.md +++ b/README.md @@ -21,29 +21,4 @@ Being easy to understand and configurable, Greenshot is an efficient tool for pr About this repository --------------------- -This repository has all the sources of Greenshot, but we have multiple branches of which two should be important to know about: - -**1.1** -Greenshot 1.1.x can be found in the 1.1 branch, this branch represents the current release. - -**1.2** -Greenshot 1.2.x can be found in the 1.2 branch, this branch will be coming soon. -But it mostly has a few more bug fixes and changes as are in our Greenshot release, as we collect multiple fixes before releasing. -1.2 is a "dying" branch, as we want to change a lot of the underlying application for 2.0 and most of Greenshot will need to be rewritten. -This means pull request with fixes or **small** changes are very welcome! - -We now have a continuous integration system, you can find the latest unstable 1.2 builds [here](https://ci.appveyor.com/project/Greenshot/greenshot/history) - -Current build status 1.2 branch: ![Unknown](https://ci.appveyor.com/api/projects/status/yh4jnjbo03qrl60d/branch/1.2?svg=true) - - -Developing for Greenshot ------------------------- -We develop Greenshot with Visual Studio Express 2013 and tested our solution on Visual Studio Professional 2012. -It should be possible to compile Greenshot directly after a checkout, eventually Visual Studio needs to upgrade the solution. -What doesn't work are the plug-in for cloud storage (like Box, Dropbox, Imgur, Picasa and Photobucket) as these need "API keys". -These keys are not in our Greenshot repository, if you want to develop on one of the plug-ins you will need to create you own keys by registering with theses services as a developer. -I will add a description here later to explain how include your API keys so you can develop. - -P.S. -Statistics on the Greenshot project, supplied by Open HUB, can be found [here](https://www.openhub.net/p/greenshot) +This repository is for Greenshot 1.2.9, which is a bugfix of 1.2.8 diff --git a/appveyor12.yml b/appveyor12.yml index 19f38fd44..f689f31dd 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -1,7 +1,7 @@ version: 1.2.9.{build} branches: only: - - master + - release/1.2.9 skip_tags: true configuration: Release platform: Any CPU From 904e46fc3eb58319678843eba80131363d351956 Mon Sep 17 00:00:00 2001 From: PetrToman Date: Wed, 16 Mar 2016 10:58:35 +0100 Subject: [PATCH 007/170] Several corrections and update for version 1.2. --- Greenshot/Languages/language-cs-CZ.xml | 211 ++++++++++++++----------- 1 file changed, 123 insertions(+), 88 deletions(-) diff --git a/Greenshot/Languages/language-cs-CZ.xml b/Greenshot/Languages/language-cs-CZ.xml index a969daf10..666896aaf 100644 --- a/Greenshot/Languages/language-cs-CZ.xml +++ b/Greenshot/Languages/language-cs-CZ.xml @@ -1,28 +1,30 @@ - + - Chyby hlašte, prosím, na - Pokud se vám Greenshot líbí, uvítáme Vaší podporu: - Greenshot hostuje na sourceforge.net - Ikony z Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) + Chyby prosím hlaste na adrese + Pokud se vám Greenshot líbí, uvítáme Vaší podporu + Greenshot je hostován na sourceforge.net + Ikony pochází ze sady Yusuke Kamiyamane's Fugue (licence Creative Commons Attribution 3.0) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ABSOLUTNĚ BEZ ZÁRUKY. Toto je svobodný software, můžete jej dále šířit za určitých podmínek. Podrobnosti o GNU General Public License: O programu Greenshot - Překlad: Zdeněk Chalupský, chalzd@gmail.com + Překlad: Zdeněk Chalupský <chalzd@gmail.com>. Korektura: Petr Toman Greenshot - revoluční utilita pro snímání obrazovky Zavřít Omlouváme se, ale došlo k neočekávané chybě. Dobrá zpráva: můžete nám pomoci odstranit chybu, když o ní podáte hlášení. -Prosím, navštivte níže uvedenou adresu, vytvořte nové hlášení o chybě a vložte text hlášení o chybě. +Navštivte prosím níže uvedenou adresu, vytvořte nové hlášení o chybě a vložte popis chyby. -Prosím, přidejte pouze smysluplné shrnutí a připojte informace, které považujete za užitečné pro popis hlášeného problému. -Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chybu již neexistuje. (Můžete použít rychlé vyhledávání.) Děkuji vám :) +Zadejte prosím smysluplné shrnutí a připojte informace, které považujete za užitečné pro popis hlášeného problému. +Také bychom velmi ocenili, kdybyste zkontrolovali, zda tato chyba již není evidována. (Můžete použít rychlé vyhledávání.) Děkujeme :-) Chyba Zrušit Neočekávaná chyba při zápisu do schránky. - Greenshot nemohl zapisovat do schránky, je {0} blokován přístup. - Zařízení Independend Bitmap (DIB) + Greenshot nemohl zapsat data do schránky, je {0} blokován přístup. + Obrázek ve schránce nebyl nalezen. + Windows Bitmap + Zařízení Independent Bitmap (DIB) HTML HTML s vloženými obrázky PNG @@ -35,11 +37,11 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb Červená Výběr barvy Průhlednost - Přístup k cíli Greenshot {0} zamítnut, pravděpodobně je otevřené dialogové okno. Zavřete dialogové okno a zkuste to znovu. - Přístup ke Greenshot zamítnut + Přístup k cíli byl Greenshotu {0} odepřen, pravděpodobně je otevřené dialogové okno. Zavřete dialogové okno a zkuste to znovu. + Přístup ke Greenshotu zamítnut Nelze uložit konfigurační soubor Greenshot. Prosím zkontrolujte oprávnění k přístupu k '{0}'. O programu Greenshot - Oblast snímání + Označit oblast snímání Otevřít obrázek ze schránky Zachytit celou obrazovku vše @@ -47,7 +49,7 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb vlevo vpravo horní - Zachytávání aplikace Internet Explorer + Zachytávat aplikaci Internet Explorer Zachytit Internet Explorer ze seznamu Zachycení poslední oblasti Vybrat okno pro zachycení @@ -60,6 +62,14 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb Rychlé nastavení Předvolby... Při exportu {0} došlo k chybě. Opakujte akci. + Dolů + Na střed + Horizontální zarovnání + Vlevo + Doprostřed + Vpravo + Nahoře + Vertikální zarovnání Uspořádat Tvar šipky Oba @@ -73,15 +83,15 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb Hranice Jas Zrušit - Chyba při přístupu do schránky. Prosím zkuste to znovu. + Chyba při přístupu do schránky. Zkuste to prosím znovu. Zavřít Přejete si uložit snímek? - Uložit obrázek? + Uložit snímek? Potvrdit Kopírovat obrázek do schránky Kopírovat cestu do schránky Kopírovat - Ořez (C) + Oříznout (C) Výběr objektů (ESC) Vystřihnout Odstranit @@ -94,11 +104,7 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb Nakreslit linku (L) Nakreslit obdélník (R) Přidat textbox (T) - Nastavení vrženého stínu - Tloušťka stínu - Vyrovnání stínu - Intenzita stínu - Duplikovat vybraný prvek + Duplikovat vybraný prvek Úpravy Efekty E-Mail @@ -115,14 +121,14 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb Obrázek uložen do {0}. Vložit okno Invertovat - Italic + Italika Načíst objekty ze souboru Faktor zvětšení - Rozlišovat velikost záznamu + Přizpůsobit velikosti snímku Zamlžit (O) Rozmazat Ztížení rozeznání obsahu - Pixalizace + Pixelizace Objekt Otevřít složku v prohlížeči Windows Vložit @@ -131,147 +137,176 @@ Také bychom velmi ocenili, kdyby jste zkontrolovali, zda položka pro tuto chyb Tisk Znovu {0} Obnovit velikost + Procent + Pixelů Otočit proti směru hodinových ručiček - Otočit ve směru hodinových ručiček + Otočit po směru hodinových ručiček Uložit Uložit objekty do souboru Uložit jako... - Pixelů - Procent - Vybrat vše + Vybrat vše Tisková úloha byla zaslána na '{0}'. Vržený stín - Obrázek uložený do schránky. + Obrázek byl vložen do schránky. Tloušťka linky Greenshot editor obrázků Potrhané okraje - Nastavení poškozených okrajů - Velikost zubů - Rozsah zubů horizontálně - Rozsah zubů vertkálně Zpět {0} Nahoru o jednu úroveň Posunout úplně nahoru MAPI klient - Aplikace Outlook s HTML - Aplikace Outlook s textem + Aplikace Outlook s HTML textem + Aplikace Outlook s prostým textem Chyba Program Greenshot je již spuštěn Nelze uložit soubor do {0}. - Zkontrolujte prosím dostupnost vybraného umístění. +Zkontrolujte prosím dostupnost vybraného cíle. Soubor "{0}" nelze otevřít. Nelze otevřít odkaz. - Nelze uložit snímek, prosím, zvolte vhodné místo. + Nelze uložit snímek, zvolte prosím vhodný cíl. + Vygenerovaný název souboru nebo složky není platný. Opravte prosím vzor názvu a zkuste to znovu. Expert - Vytvořit 8-bit obrázek pokud je zároveň barev méně než 256 > 8 bits obrázek - Kontrola nestabilní aktualizace - Následující formáty schránky - Číslo pro ${NUM} ve vzoru názvu souboru - Já vím, co dělám! - Tisk zápatí - Minimalizace paměti, za cenu snížení výkonu (není doporučeno). - Optimalizace pro použití Vzdálené plochy - Opakované použití editoru, pokud je to možné - Potlačit dialog Uložit při zavírání editoru. + Vytvořit 8bitový obrázek, pokud má méně než 256 barev + Kontrolovat nestabilní aktualizace + Formáty schránky + Číslo pro ${NUM} ve vzoru pro název souboru + Vím, co dělám! + Vzor pro zápatí + Minimalizovat využití paměti za cenu snížení výkonu (není doporučeno) + Optimalizovat pro použití Vzdálené plochy + Znovu použít editor, je-li to možné + Potlačit dialog Uložit při zavírání editoru Zobrazovat miniatury oken v kontextové nabídce (pro Vista a Windows 7) Exportovat do: {0} Došlo k chybě při exportu do{0}: Nápověda Greenshot Klávesové zkratky - Vyberte nastavení kvality vašeho obrázku v JPEG + Vyberte nastavení kvality obrázku v JPEG formátu Ok Nastala chyba při pokusu o tisk. - Centrovat na stránce + Centrovat obrázek na stránce Zvětšit oblast tisku, aby odpovídala velikosti papíru Otočit obrázek podle orientace stránky - Zmenšit oblast tisku aby odpovídala velikosti papíru - Uložit možnosti jako výchozí, nedotazovat se znovu - Tisknout s obrácenými barvami + Zmenšit oblast tisku, aby odpovídala velikosti papíru + Nastavení barev + Uložit možnosti jako výchozí a znovu se nedotazovat + Tisk v invertovaných barvách + Rozložení stránky + Plnobarevný tisk Tisk ve stupních šedé - Tisk data/času v dolní části stránky + Vynutit černobílý tisk + Tisknout datum/čas v dolní části stránky Možnosti tisku Greenshot - Uložit jako výchozí kvalitu a neptat se znovu + Uložit jako výchozí kvalitu a znovu se nedotazovat Kvalita Greenshot - Uložit přímo (pomocí preferovaného nastavení pro výstupní soubor) - Zobrazit dialog pro nastavení tisku vždy před tiskem - Zobrazit dialogové okno kvality pokaždé, když je obraz je uložen + Uložit přímo (pomocí preferovaného nastavení pro výstup) + Před tiskem vždy zobrazit dialog pro nastavení tisku + Při ukládání obrázku vždy zobrazit dialogové okno kvality Nastavení aplikace - Spustit Greenshot při startu - Zachytit + Spustit Greenshot při startu Windows + Zachycení Zachytit kurzor myši - Použit interaktivní režim snímání oken - Interval kontroly aktualizace ve dnech (0 = bez kontroly) + Použit interaktivní režim snímání okna + Interval kontroly aktualizace Greenshotu ve dnech (0 = bez kontroly) Konfigurovat - Cesta k souboru kopírovat do schránky pokaždé, když je obrázek uložen + Při uložení obrázku vždy kopírovat do schránky cestu k souboru Cíl snímku Kopírovat do schránky Otevřít v editoru obrázků E-Mail Uložit přímo (pomocí nastavení níže) - Uložit jako (zobrazovat dialogo) + Uložit jako (zobrazit dialog) Vybrat cíl dynamicky Odeslat na tiskárnu Editor - Vzorové jméno souboru - Celkový - Snímek plikace Internet Explorer + Vzor pro název souboru + Obecné + Snímek aplikace Internet Explorer Kvalita JPEG Jazyk - Následující symboly budou nahrazeny automaticky v definované struktuře: + Následující symboly budou automaticky nahrazeny: ${YYYY} rok, 4 číslice ${MM} měsíc, 2 číslice ${DD} den, 2 číslice ${hh} hodina, 2 číslice ${mm} minuta, 2 číslice ${ss} sekunda, 2 číslice -${NUM} zvyšování počtu, 6 číslice +${NUM} počítadlo, 6 číslic ${title} titulek okna ${user} uživatel Windows -${domain} Windows doména -${hostname} jméno PC +${domain} doména Windows +${hostname} název počítače -Můžete také vytvářet adresáře Greenshotu dynamicky, stačí použít zpětné lomítko (symbol \) pro určení složky. -Například: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} bude vytvářet složky ve výchozím úložišti pro příslušný den, např. 2008-06-29, ty budou obsahovat snímky s názvem souboru tvořeným aktuálním časem PC, např. 11_58_32 (plus rozšíření definováno v nastavení). +Složky také můžete vytvářet dynamicky pomocí zpětného lomítka (symbol \). +Například: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} vytvoří ve výchozím úložišti složku pro dnešní den, např. 2008-06-29, a název souboru snímku bude odvozen od aktuálního času, např. 11_58_32 (plus rozšíření uvedené v nastavení). Síť a aktualizace Výstup Přehrát zvuk uzávěrky fotoaparátu Pluginy - Vytvořil + Autor Cesta k DLL - Jméno + Název Verze - Nastavení výstupního souboru + Preferované nastavení pro výstup Formát obrázku Tisk Možnosti tisku Nastavení kvality - Snížit množství barev na maximálně 256 + Snížit počet barev na maximálně 256 Registrovat klávesové zkratky - Použít záblesk + Použít blesk Zobrazovat upozornění - Úložné místo + Zobrazit lupu + Cíl Nastavení Vzor pro generování souborů při ukládání snímků Jazyk uživatelského rozhraní Greenshot (vyžaduje restart) Výchozí formát obrázku - Definuje klávesové zkratky Prnt, Ctrl + Print, Alt + Prnt, které jsou vyhrazeny pro globální použití od startu Greenshotu, až po jeho ukončení. + Definuje klávesové zkratky Prnt, Ctrl + Print, Alt + Prnt, které jsou vyhrazeny pro globální použití od startu do ukončení Greenshotu. Výchozí místo pro uložení snímků (ponechte prázdné pro uložení do počítače) - Použít výchozí systémové proxy + Použít výchozí systémovou proxy Efekty - Před zachycením čekat milisekund - Mód sběrného okna. + Před zachycením počkat daný počet milisekund + Režim zachycování okna Snímek okna - Klikněte pravým tlašítkem myši, nebo stiskněte klávesu PrtSc. + Klikněte pravým tlačítkem myši nebo stiskněte klávesu PrtSc. K dispozici je novější verze Greenshot! Přejete si stáhnout Greenshot {0}? - Počkejte prosím, než je zachycena stránka v aplikaci Internet Explorer... + Počkejte prosím než bude zachycena stránka v aplikaci Internet Explorer... Upozornění - Klávesová(é) zktaka(y) "{0}" nelze použít. Tento problém je pravděpodobně způsoben jiným nástrojem tvrzením, používající tytéž klávesové zkratky.! Můžete změnit nastavení klávesových zkratek, deaktivovat nebo změnit software využívající shodné klávesové zkratky. + Klávesovou(é) zkratku(y) "{0}" nelze použít. Tento problém je pravděpodobně způsoben jiným programem používajícím tytéž klávesové zkratky! Můžete změnit nastavení klávesových zkratek, deaktivovat je nebo změnit nastavení softwaru využívajícího shodné klávesové zkratky. -Všechny funkce Greenshot jsou stále dostupné přímo z místní nabídky bez použití klávesové zkratky. +Všechny funkce Greenshotu jsou stále dostupné přímo z místní nabídky bez použití klávesové zkratky. Použít vlastní barvu Zachovat průhlednost Automaticky Použít výchozí barvu Jak je zobrazeno + + + Intenzita stínu + Vyrovnání stínu + Nastavení stínu + Tloušťka stínu + + Rozsah zubů horizontálně + Nastavení potrhaných okrajů + Velikost zubů + Rozsah zubů vertkálně + Potrhat všechny strany + Levá strana + Prava strana + Horní strana + Dolní strana + Vytvořit stín + + Přidat počítadlo (I) + Přidat textovou bublinu (S) + + Změnit velikost + Nastavení změny velikosti + Zachovat poměr stran + Šířka + Výška + Velikost ikon From 6924495471b905f875622781178893fd50d9a9c6 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 18 Mar 2016 14:41:30 +0100 Subject: [PATCH 008/170] Fix for BUG-1884, added a trim call for the scanned text --- GreenshotOCRCommand/Program.cs | 7 ++++++- GreenshotOCRPlugin/OCRPlugin.cs | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/GreenshotOCRCommand/Program.cs b/GreenshotOCRCommand/Program.cs index 1975e451c..eb8033856 100644 --- a/GreenshotOCRCommand/Program.cs +++ b/GreenshotOCRCommand/Program.cs @@ -40,7 +40,12 @@ namespace GreenshotOCRCommand { modiDocument.OCR(language, orientimage, straightenImage); IImage modiImage = modiDocument.Images[0]; ILayout layout = modiImage.Layout; - Console.WriteLine(layout.Text); + if (layout.Text != null) + { + // For for BUG-1884: + // Although this is done in the OCR Plugin, it does make sense in the command too. + Console.WriteLine(layout.Text.Trim()); + } modiDocument.Close(false); return 0; } diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 8b4440136..3c832b5c5 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -202,6 +202,9 @@ namespace GreenshotOCR { return null; } + // For for BUG-1884: + text = text.Trim(); + try { LOG.DebugFormat("Pasting OCR Text to Clipboard: {0}", text); // Paste to Clipboard (the Plugin currently doesn't have access to the ClipboardHelper from Greenshot From 841ab69b69c0ea8cc04f4a97c7aac97d4ac46757 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 23 Mar 2016 14:22:10 +0100 Subject: [PATCH 009/170] Replaced Mutex code with a from Dapplo.Addons class written for Greenshot 1.3 "ResourceMutex", this should fix a few start-up issues. --- Greenshot/Forms/MainForm.cs | 39 +----- Greenshot/Greenshot.csproj | 1 + Greenshot/Helpers/ResourceMutex.cs | 195 +++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 35 deletions(-) create mode 100644 Greenshot/Helpers/ResourceMutex.cs diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index e58af6640..784dd6bbf 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -26,8 +26,6 @@ using System.Diagnostics; using System.Drawing; using System.IO; using System.Reflection; -using System.Security.AccessControl; -using System.Security.Principal; using System.Text; using System.Threading; using System.Windows.Forms; @@ -52,7 +50,7 @@ namespace Greenshot { /// public partial class MainForm : BaseForm { private static ILog LOG; - private static Mutex _applicationMutex; + private static ResourceMutex _applicationMutex; private static CoreConfiguration _conf; public static string LogFileLocation = null; @@ -82,38 +80,9 @@ namespace Greenshot { try { // Fix for Bug 2495900, Multi-user Environment // check whether there's an local instance running already - - try { - // Added Mutex Security, hopefully this prevents the UnauthorizedAccessException more gracefully - // See an example in Bug #3131534 - SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); - MutexSecurity mutexsecurity = new MutexSecurity(); - mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow)); - mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.ChangePermissions, AccessControlType.Deny)); - mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.Delete, AccessControlType.Deny)); + _applicationMutex = ResourceMutex.Create("F48E86D3-E34C-4DB7-8F8F-9A0EA55F0D08", "Greenshot", false); - bool created; - // 1) Create Mutex - _applicationMutex = new Mutex(false, @"Local\F48E86D3-E34C-4DB7-8F8F-9A0EA55F0D08", out created, mutexsecurity); - // 2) Get the right to it, this returns false if it's already locked - if (!_applicationMutex.WaitOne(0, false)) { - LOG.Debug("Greenshot seems already to be running!"); - isAlreadyRunning = true; - // Clean up - _applicationMutex.Close(); - _applicationMutex = null; - } - } catch (AbandonedMutexException e) { - // Another Greenshot instance didn't cleanup correctly! - // we can ignore the exception, it happend on the "waitone" but still the mutex belongs to us - LOG.Warn("Greenshot didn't cleanup correctly!", e); - } catch (UnauthorizedAccessException e) { - LOG.Warn("Greenshot is most likely already running for a different user in the same session, can't create mutex due to error: ", e); - isAlreadyRunning = true; - } catch (Exception e) { - LOG.Warn("Problem obtaining the Mutex, assuming it was already taken!", e); - isAlreadyRunning = true; - } + isAlreadyRunning = !_applicationMutex.IsLocked; if (args.Length > 0 && LOG.IsDebugEnabled) { StringBuilder argumentString = new StringBuilder(); @@ -316,7 +285,7 @@ namespace Greenshot { // Remove the application mutex if (_applicationMutex != null) { try { - _applicationMutex.ReleaseMutex(); + _applicationMutex.Dispose(); _applicationMutex = null; } catch (Exception ex) { LOG.Error("Error releasing Mutex!", ex); diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index ee50aa76a..eb756b36a 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -212,6 +212,7 @@ + diff --git a/Greenshot/Helpers/ResourceMutex.cs b/Greenshot/Helpers/ResourceMutex.cs new file mode 100644 index 000000000..becab8262 --- /dev/null +++ b/Greenshot/Helpers/ResourceMutex.cs @@ -0,0 +1,195 @@ +/* + Dapplo - building blocks for desktop applications + Copyright (C) 2015-2016 Dapplo + + For more information see: http://dapplo.net/ + Dapplo repositories are hosted on GitHub: https://github.com/dapplo + + This file is part of Dapplo.Addons + + Dapplo.Addons 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 3 of the License, or + (at your option) any later version. + + Dapplo.Addons 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 Dapplo.Addons. If not, see . + */ + + +using log4net; +using System; +using System.Security.AccessControl; +using System.Security.Principal; +using System.Threading; + +namespace Greenshot.Helpers +{ + /// + /// This comes from Dapplo.Addons, which was created for Greenshot, this file is copied here as this is the only part we use in 1.2.8 + /// This protects your resources or application from running more than once + /// Simplifies the usage of the Mutex class, as described here: https://msdn.microsoft.com/en-us/library/System.Threading.Mutex.aspx + /// + public class ResourceMutex : IDisposable + { + private static ILog LOG = LogManager.GetLogger(typeof(DestinationHelper)); + private readonly string _mutexId; + private readonly string _resourceName; + private Mutex _applicationMutex; + + /// + /// Test if the Mutex was created and locked. + /// + public bool IsLocked + { + get; + set; + } + + /// + /// Private constructor + /// + /// + /// + private ResourceMutex(string mutexId, string resourceName = null) + { + _mutexId = mutexId; + _resourceName = resourceName ?? "some resource"; + } + + /// + /// Create a ResourceMutex for the specified mutex id and resource-name + /// + /// ID of the mutex, preferably a Guid as string + /// Name of the resource to lock, e.g your application name, usefull for logs + /// true to have a global mutex see: https://msdn.microsoft.com/en-us/library/bwe34f1k.aspx + public static ResourceMutex Create(string mutexId, string resourceName = null, bool global = false) + { + var applicationMutex = new ResourceMutex((global ? @"Global\" : @"Local\") + mutexId, resourceName); + applicationMutex.Lock(); + return applicationMutex; + } + + /// + /// This tries to get the Mutex, which takes care of having multiple instances running + /// + /// true if it worked, false if another instance is already running or something went wrong + public bool Lock() + { + LOG.DebugFormat("{0} is trying to get Mutex {1}", _resourceName, _mutexId); + + IsLocked = true; + // check whether there's an local instance running already, but use local so this works in a multi-user environment + try + { + // Added Mutex Security, hopefully this prevents the UnauthorizedAccessException more gracefully + var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); + var mutexsecurity = new MutexSecurity(); + mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow)); + mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.ChangePermissions, AccessControlType.Deny)); + mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.Delete, AccessControlType.Deny)); + + bool createdNew; + // 1) Create Mutex + _applicationMutex = new Mutex(true, _mutexId, out createdNew, mutexsecurity); + // 2) if the mutex wasn't created new get the right to it, this returns false if it's already locked + if (!createdNew && !_applicationMutex.WaitOne(100, false)) + { + LOG.InfoFormat("{0} is already in use, mutex {1} is NOT locked for the caller", _resourceName, _mutexId); + IsLocked = false; + // Clean up + _applicationMutex.Close(); + _applicationMutex = null; + } + else + { + if (createdNew) + { + LOG.InfoFormat("{0} has created & claimed the mutex {1}", _resourceName, _mutexId); + } + else + { + LOG.InfoFormat("{0} has claimed the mutex {1}", _resourceName, _mutexId); + + } + } + } + catch (AbandonedMutexException e) + { + // Another instance didn't cleanup correctly! + // we can ignore the exception, it happend on the "waitone" but still the mutex belongs to us + LOG.WarnFormat("{0} didn't cleanup correctly, but we got the mutex {1}.", _resourceName, _mutexId); + LOG.Warn(e); + } + catch (UnauthorizedAccessException e) + { + LOG.ErrorFormat("{0} is most likely already running for a different user in the same session, can't create/get mutex {1} due to error.", _resourceName, _mutexId); + LOG.Error(e); + IsLocked = false; + } + catch (Exception ex) + { + LOG.ErrorFormat("Problem obtaining the Mutex {1} for {0}, assuming it was already taken!", _resourceName, _mutexId); + LOG.Error(ex); + IsLocked = false; + } + return IsLocked; + } + + #region IDisposable Support + // To detect redundant Dispose calls + private bool _disposedValue = false; + + /// + /// The real disposing code + /// + /// true if dispose is called, false when the finalizer is called + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (_applicationMutex != null) + { + try + { + _applicationMutex.ReleaseMutex(); + _applicationMutex = null; + LOG.InfoFormat("Released Mutex {0} for {1}", _mutexId, _resourceName); + } + catch (Exception ex) + { + LOG.ErrorFormat("Error releasing Mutex {0} for {1}", _mutexId, _resourceName); + LOG.Error(ex); + } + + } + _disposedValue = true; + } + } + + /// + /// Make sure the ApplicationMutex is disposed when the finalizer is called + /// + ~ResourceMutex() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(false); + } + + /// + /// The dispose interface, which calls Dispose(true) to signal that dispose is called. + /// + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + GC.SuppressFinalize(this); + } + #endregion + } +} From 0d9ae043672cb43bd6cc00030747721f195f004e Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 23 Mar 2016 14:51:37 +0100 Subject: [PATCH 010/170] Changed the GPL text to GPLv3, from here: https://www.gnu.org/licenses/gpl-3.0.txt --- .../releases/additional_files/license.txt | 860 ++++++++++++------ 1 file changed, 599 insertions(+), 261 deletions(-) diff --git a/Greenshot/releases/additional_files/license.txt b/Greenshot/releases/additional_files/license.txt index 099dab19d..edd2492d2 100644 --- a/Greenshot/releases/additional_files/license.txt +++ b/Greenshot/releases/additional_files/license.txt @@ -1,336 +1,674 @@ -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 -Preamble + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to your programs, too. -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. -To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. -For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. -We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. -Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. -Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. -The precise terms and conditions for copying, distribution and + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and modification follow. -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + TERMS AND CONDITIONS -0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. Definitions. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + "This License" refers to version 3 of the GNU General Public License. -1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. -2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + A "covered work" means either the unmodified Program or a work based +on the Program. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. + 1. Source Code. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. -3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + The Corresponding Source for a work in source code form is that +same work. -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 2. Basic Permissions. -4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. -5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. -6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. -7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 13. Use with the GNU Affero General Public License. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. + 14. Revised Versions of this License. -8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. -10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. -NO WARRANTY + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. + 15. Disclaimer of Warranty. -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -END OF TERMS AND CONDITIONS + 16. Limitation of Liability. -How to Apply These Terms to Your New Programs + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. -If you develop a new program, and you want it to be of the greatest + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. -To do so, attach the following notices to the program. It is safest + To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least +state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - One line to give the program's name and a brief idea of what it does. + + Copyright (C) - Copyright (C) - - This program is free software; you can redistribute it and/or modify + 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 2 of the License, or + the Free Software Foundation, either version 3 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 + 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - signature of Ty Coon, 1 April 1989 - - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file From fe176a2da4aad5b14423856389a54f405c5a109f Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 23 Mar 2016 16:54:57 +0100 Subject: [PATCH 011/170] Removed most references to Sourceforge, need to check with a file-searcher if something is left. P.S. The help files still have references... --- Greenshot/AssemblyInfo.cs | 2 +- .../Configuration/EditorConfiguration.cs | 2 +- Greenshot/Configuration/LanguageKeys.cs | 2 +- Greenshot/Controls/BindableToolStripButton.cs | 2 +- .../Controls/BindableToolStripComboBox.cs | 2 +- .../BindableToolStripDropDownButton.cs | 2 +- Greenshot/Controls/ColorButton.cs | 2 +- ...ontextMenuToolStripProfessionalRenderer.cs | 2 +- .../CustomToolStripProfessionalRenderer.cs | 2 +- Greenshot/Controls/FontFamilyComboBox.cs | 2 +- Greenshot/Controls/MenuStripEx.cs | 2 +- Greenshot/Controls/NonJumpingPanel.cs | 2 +- Greenshot/Controls/Pipette.cs | 2 +- Greenshot/Controls/ToolStripColorButton.cs | 2 +- Greenshot/Controls/ToolStripEx.cs | 2 +- Greenshot/Controls/ToolStripNumericUpDown.cs | 2 +- .../Destinations/ClipboardDestination.cs | 2 +- Greenshot/Destinations/EditorDestination.cs | 2 +- Greenshot/Destinations/EmailDestination.cs | 2 +- Greenshot/Destinations/FileDestination.cs | 2 +- .../Destinations/FileWithDialogDestination.cs | 2 +- Greenshot/Destinations/PickerDestination.cs | 2 +- Greenshot/Destinations/PrinterDestination.cs | 2 +- Greenshot/Drawing/ArrowContainer.cs | 2 +- Greenshot/Drawing/CropContainer.cs | 2 +- Greenshot/Drawing/CursorContainer.cs | 2 +- Greenshot/Drawing/DrawableContainer.cs | 2 +- Greenshot/Drawing/DrawableContainerList.cs | 2 +- Greenshot/Drawing/EllipseContainer.cs | 2 +- .../Drawing/Fields/AbstractFieldHolder.cs | 2 +- .../Fields/AbstractFieldHolderWithChildren.cs | 2 +- .../Binding/AbstractBindingConverter.cs | 2 +- .../Fields/Binding/BidirectionalBinding.cs | 2 +- .../DecimalDoublePercentageConverter.cs | 2 +- .../Fields/Binding/DecimalFloatConverter.cs | 2 +- .../Fields/Binding/DecimalIntConverter.cs | 2 +- .../Fields/Binding/IBindingConverter.cs | 2 +- .../Fields/Binding/IBindingValidator.cs | 2 +- .../Fields/Binding/NotNullValidator.cs | 2 +- Greenshot/Drawing/Fields/Field.cs | 2 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 +- Greenshot/Drawing/Fields/FieldType.cs | 2 +- Greenshot/Drawing/Fields/IFieldHolder.cs | 2 +- Greenshot/Drawing/FilterContainer.cs | 2 +- Greenshot/Drawing/Filters/AbstractFilter.cs | 2 +- Greenshot/Drawing/Filters/BlurFilter.cs | 2 +- Greenshot/Drawing/Filters/BrightnessFilter.cs | 2 +- Greenshot/Drawing/Filters/GrayscaleFilter.cs | 2 +- Greenshot/Drawing/Filters/HighlightFilter.cs | 2 +- Greenshot/Drawing/Filters/IFilter.cs | 2 +- Greenshot/Drawing/Filters/MagnifierFilter.cs | 2 +- .../Drawing/Filters/PixelizationFilter.cs | 2 +- Greenshot/Drawing/FreehandContainer.cs | 2 +- Greenshot/Drawing/Gripper.cs | 2 +- Greenshot/Drawing/HighlightContainer.cs | 2 +- Greenshot/Drawing/IconContainer.cs | 2 +- Greenshot/Drawing/ImageContainer.cs | 2 +- Greenshot/Drawing/LineContainer.cs | 2 +- Greenshot/Drawing/ObfuscateContainer.cs | 2 +- Greenshot/Drawing/RectangleContainer.cs | 2 +- Greenshot/Drawing/RoundedRectangle.cs | 2 +- Greenshot/Drawing/SpeechbubbleContainer.cs | 2 +- Greenshot/Drawing/StepLabelContainer.cs | 2 +- Greenshot/Drawing/Surface.cs | 2 +- Greenshot/Drawing/TextContainer.cs | 2 +- Greenshot/Forms/AboutForm.Designer.cs | 4 +- Greenshot/Forms/AboutForm.cs | 2 +- Greenshot/Forms/AnimatingBaseForm.cs | 2 +- Greenshot/Forms/BaseForm.cs | 2 +- Greenshot/Forms/BugReportForm.Designer.cs | 2 +- Greenshot/Forms/BugReportForm.cs | 2 +- Greenshot/Forms/CaptureForm.Designer.cs | 2 +- Greenshot/Forms/CaptureForm.cs | 2 +- Greenshot/Forms/ColorDialog.Designer.cs | 2 +- Greenshot/Forms/ColorDialog.cs | 2 +- .../Forms/DropShadowSettingsForm.Designer.cs | 2 +- Greenshot/Forms/DropShadowSettingsForm.cs | 2 +- Greenshot/Forms/ImageEditorForm.Designer.cs | 2 +- Greenshot/Forms/ImageEditorForm.cs | 2 +- Greenshot/Forms/LanguageDialog.Designer.cs | 2 +- Greenshot/Forms/LanguageDialog.cs | 2 +- Greenshot/Forms/MainForm.Designer.cs | 2 +- Greenshot/Forms/MainForm.cs | 2 +- Greenshot/Forms/MovableShowColorForm.cs | 2 +- .../Forms/PrintOptionsDialog.Designer.cs | 2 +- Greenshot/Forms/PrintOptionsDialog.cs | 2 +- .../Forms/ResizeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/ResizeSettingsForm.cs | 2 +- Greenshot/Forms/SettingsForm.Designer.cs | 2 +- Greenshot/Forms/SettingsForm.cs | 2 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 2 +- .../Forms/TornEdgeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/TornEdgeSettingsForm.cs | 2 +- Greenshot/GreenshotMain.cs | 2 +- Greenshot/Help/HelpFileLoader.cs | 2 +- Greenshot/Helpers/CaptureHelper.cs | 2 +- Greenshot/Helpers/Colors.cs | 2 +- Greenshot/Helpers/CopyData.cs | 2 +- Greenshot/Helpers/DestinationHelper.cs | 2 +- Greenshot/Helpers/EnvironmentInfo.cs | 2 +- Greenshot/Helpers/GeometryHelper.cs | 2 +- Greenshot/Helpers/GuiRectangle.cs | 2 +- Greenshot/Helpers/IECaptureHelper.cs | 2 +- Greenshot/Helpers/IEInterop/IEContainer.cs | 2 +- Greenshot/Helpers/MailHelper.cs | 2 +- Greenshot/Helpers/PluginHelper.cs | 2 +- Greenshot/Helpers/PrintHelper.cs | 2 +- Greenshot/Helpers/ProcessorHelper.cs | 2 +- Greenshot/Helpers/ScaleHelper.cs | 2 +- Greenshot/Helpers/SoundHelper.cs | 2 +- Greenshot/Helpers/StartupHelper.cs | 2 +- Greenshot/Helpers/ToolStripItemEndisabler.cs | 2 +- Greenshot/Helpers/UpdateHelper.cs | 110 +++++++----------- Greenshot/Helpers/WindowWrapper.cs | 2 +- Greenshot/Languages/language-ar-SY.xml | 54 ++++----- Greenshot/Languages/language-cs-CZ.xml | 2 +- Greenshot/Languages/language-de-DE.xml | 2 +- Greenshot/Languages/language-el-GR.xml | 2 +- Greenshot/Languages/language-en-US.xml | 2 +- Greenshot/Languages/language-es-ES.xml | 2 +- Greenshot/Languages/language-fi-FI.xml | 2 +- Greenshot/Languages/language-fr-FR.xml | 56 ++++----- Greenshot/Languages/language-fr-QC.xml | 42 +++---- Greenshot/Languages/language-he-IL.xml | 2 +- Greenshot/Languages/language-hu-HU.xml | 54 ++++----- Greenshot/Languages/language-it-IT.xml | 2 +- Greenshot/Languages/language-ja-JP.xml | 2 +- Greenshot/Languages/language-ko-KR.xml | 2 +- Greenshot/Languages/language-lt-LT.xml | 48 ++++---- Greenshot/Languages/language-nl-NL.xml | 2 +- Greenshot/Languages/language-nn-NO.xml | 54 ++++----- Greenshot/Languages/language-pl-PL.xml | 2 +- Greenshot/Languages/language-pt-BR.xml | 2 +- Greenshot/Languages/language-pt-PT.xml | 2 +- Greenshot/Languages/language-ro-RO.xml | 2 +- Greenshot/Languages/language-ru-RU.xml | 56 ++++----- Greenshot/Languages/language-sk-SK.xml | 2 +- Greenshot/Languages/language-sr-RS.xml | 2 +- Greenshot/Languages/language-sv-SE.xml | 2 +- Greenshot/Languages/language-tr-TR.xml | 2 +- Greenshot/Languages/language-uk-UA.xml | 2 +- Greenshot/Languages/language-vi-VN.xml | 2 +- Greenshot/Languages/language-zh-CN.xml | 2 +- Greenshot/Languages/language-zh-TW.xml | 2 +- Greenshot/Memento/AddElementMemento.cs | 2 +- Greenshot/Memento/ChangeFieldHolderMemento.cs | 2 +- Greenshot/Memento/DeleteElementMemento.cs | 2 +- .../DrawableContainerBoundsChangeMemento.cs | 2 +- Greenshot/Memento/IMemento.cs | 2 +- .../Memento/SurfaceBackgroundChangeMemento.cs | 2 +- Greenshot/Memento/TextChangeMemento.cs | 2 +- Greenshot/Processors/TitleFixProcessor.cs | 2 +- GreenshotBoxPlugin/BoxConfiguration.cs | 2 +- GreenshotBoxPlugin/BoxCredentials.cs | 2 +- GreenshotBoxPlugin/BoxDestination.cs | 2 +- GreenshotBoxPlugin/BoxEntities.cs | 2 +- GreenshotBoxPlugin/BoxPlugin.cs | 2 +- GreenshotBoxPlugin/BoxUtils.cs | 2 +- GreenshotBoxPlugin/Forms/BoxForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotBoxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotBoxPlugin/LanguageKeys.cs | 2 +- GreenshotBoxPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotConfluencePlugin/Confluence.cs | 2 +- .../ConfluenceConfiguration.cs | 2 +- .../ConfluenceDestination.cs | 2 +- GreenshotConfluencePlugin/ConfluencePlugin.cs | 2 +- GreenshotConfluencePlugin/ConfluenceUtils.cs | 2 +- GreenshotConfluencePlugin/EnumDisplayer.cs | 2 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 2 +- .../Forms/ConfluencePagePicker.xaml.cs | 2 +- .../Forms/ConfluenceSearch.xaml.cs | 2 +- .../Forms/ConfluenceTreePicker.xaml.cs | 2 +- .../Forms/ConfluenceUpload.xaml.cs | 2 +- GreenshotConfluencePlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotDropboxPlugin/DropBoxCredentials.cs | 2 +- GreenshotDropboxPlugin/DropboxDestination.cs | 2 +- GreenshotDropboxPlugin/DropboxPlugin.cs | 2 +- .../DropboxPluginConfiguration.cs | 2 +- GreenshotDropboxPlugin/DropboxUtils.cs | 2 +- GreenshotDropboxPlugin/Forms/DropboxForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotDropboxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotDropboxPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../ExternalCommandConfiguration.cs | 2 +- .../ExternalCommandDestination.cs | 2 +- .../ExternalCommandForm.cs | 2 +- .../ExternalCommandPlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../SettingsForm.Designer.cs | 2 +- .../SettingsForm.cs | 2 +- .../SettingsFormDetail.Designer.cs | 2 +- .../SettingsFormDetail.cs | 2 +- GreenshotFlickrPlugin/FlickrConfiguration.cs | 2 +- GreenshotFlickrPlugin/FlickrCredentials.cs | 2 +- GreenshotFlickrPlugin/FlickrDestination.cs | 2 +- GreenshotFlickrPlugin/FlickrPlugin.cs | 2 +- GreenshotFlickrPlugin/FlickrUtils.cs | 2 +- GreenshotFlickrPlugin/Forms/FlickrForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotFlickrPlugin/Forms/SettingsForm.cs | 2 +- GreenshotFlickrPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurForm.cs | 2 +- .../Forms/ImgurHistory.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurHistory.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/SettingsForm.cs | 2 +- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 +- GreenshotImgurPlugin/ImgurCredentials.cs | 2 +- GreenshotImgurPlugin/ImgurDestination.cs | 2 +- GreenshotImgurPlugin/ImgurInfo.cs | 2 +- GreenshotImgurPlugin/ImgurPlugin.cs | 2 +- GreenshotImgurPlugin/ImgurUtils.cs | 2 +- GreenshotImgurPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Forms/JiraForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/JiraForm.cs | 2 +- GreenshotJiraPlugin/Forms/JiraFormBase.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.cs | 2 +- GreenshotJiraPlugin/Jira.cs | 2 +- GreenshotJiraPlugin/JiraConfiguration.cs | 2 +- GreenshotJiraPlugin/JiraDestination.cs | 2 +- GreenshotJiraPlugin/JiraPlugin.cs | 2 +- GreenshotJiraPlugin/JiraUtils.cs | 2 +- GreenshotJiraPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotOCRCommand/COMWrapper.cs | 2 +- GreenshotOCRCommand/ComProgIdAttribute.cs | 2 +- GreenshotOCRCommand/ModiInterop.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/OCRConfiguration.cs | 2 +- GreenshotOCRPlugin/OCRDestination.cs | 2 +- GreenshotOCRPlugin/OCRForm.cs | 2 +- GreenshotOCRPlugin/OCRPlugin.cs | 2 +- GreenshotOCRPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/SettingsForm.Designer.cs | 2 +- GreenshotOCRPlugin/SettingsForm.cs | 2 +- .../Destinations/ExcelDestination.cs | 2 +- .../Destinations/OneNoteDestination.cs | 2 +- .../Destinations/OutlookDestination.cs | 2 +- .../Destinations/PowerpointDestination.cs | 2 +- .../Destinations/WordDestination.cs | 2 +- GreenshotOfficePlugin/OfficeConfiguration.cs | 2 +- .../OfficeExport/ExcelExporter.cs | 2 +- .../OfficeExport/OneNoteExporter.cs | 2 +- .../OfficeExport/OutlookEmailExporter.cs | 2 +- .../OfficeExport/PowerpointExporter.cs | 2 +- .../OfficeExport/WordExporter.cs | 2 +- .../OfficeInterop/ExcelInterop.cs | 2 +- .../OfficeInterop/OfficeInterop.cs | 2 +- .../OfficeInterop/OneNoteInterop.cs | 2 +- .../OfficeInterop/OutlookInterop.cs | 2 +- .../OfficeInterop/OutlookUtils.cs | 2 +- .../OfficeInterop/PowerpointInterop.cs | 2 +- .../OfficeInterop/WordInterop.cs | 2 +- GreenshotOfficePlugin/OfficePlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Forms/PhotobucketForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- .../Forms/SettingsForm.cs | 2 +- GreenshotPhotobucketPlugin/LanguageKeys.cs | 2 +- .../PhotobucketConfiguration.cs | 2 +- .../PhotobucketCredentials.cs | 2 +- .../PhotobucketDestination.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketInfo.cs | 2 +- .../PhotobucketPlugin.cs | 2 +- .../PhotobucketUtils.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotPicasaPlugin/PicasaCredentials.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/Controls/AnimatingForm.cs | 2 +- .../Controls/BackgroundForm.Designer.cs | 2 +- GreenshotPlugin/Controls/BackgroundForm.cs | 2 +- .../Controls/ExtendedWebBrowser.cs | 2 +- .../Controls/FormWithoutActivation.cs | 2 +- GreenshotPlugin/Controls/GreenshotButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotCheckBox.cs | 2 +- .../Controls/GreenshotColumnSorter.cs | 2 +- GreenshotPlugin/Controls/GreenshotComboBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotForm.cs | 2 +- GreenshotPlugin/Controls/GreenshotGroupBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotLabel.cs | 2 +- .../Controls/GreenshotRadioButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotTabPage.cs | 2 +- GreenshotPlugin/Controls/GreenshotTextBox.cs | 2 +- .../Controls/GreenshotToolDropDownButton.cs | 2 +- .../Controls/GreenshotToolStripButton.cs | 2 +- .../Controls/GreenshotToolStripLabel.cs | 2 +- .../Controls/GreenshotToolStripMenuItem.cs | 2 +- GreenshotPlugin/Controls/HotkeyControl.cs | 2 +- .../Controls/IGreenshotConfigBindable.cs | 2 +- .../Controls/IGreenshotLanguageBindable.cs | 2 +- .../Controls/OAuthLoginForm.Designer.cs | 2 +- GreenshotPlugin/Controls/OAuthLoginForm.cs | 2 +- .../Controls/PleaseWaitForm.Designer.cs | 2 +- GreenshotPlugin/Controls/PleaseWaitForm.cs | 2 +- .../Controls/QualityDialog.Designer.cs | 2 +- GreenshotPlugin/Controls/QualityDialog.cs | 2 +- .../Controls/SaveImageFileDialog.cs | 2 +- GreenshotPlugin/Controls/ThumbnailForm.cs | 2 +- GreenshotPlugin/Core/AbstractDestination.cs | 2 +- GreenshotPlugin/Core/AbstractProcessor.cs | 2 +- GreenshotPlugin/Core/AccessibleHelper.cs | 2 +- GreenshotPlugin/Core/AnimationHelpers.cs | 2 +- GreenshotPlugin/Core/BinaryStructHelper.cs | 2 +- GreenshotPlugin/Core/Cache.cs | 2 +- GreenshotPlugin/Core/CaptureHandler.cs | 2 +- GreenshotPlugin/Core/ClipboardHelper.cs | 4 +- GreenshotPlugin/Core/CoreConfiguration.cs | 2 +- GreenshotPlugin/Core/CredentialsHelper.cs | 2 +- GreenshotPlugin/Core/DisplayKeyAttribute.cs | 2 +- GreenshotPlugin/Core/Effects.cs | 2 +- GreenshotPlugin/Core/EmailConfigHelper.cs | 2 +- GreenshotPlugin/Core/EnumExtensions.cs | 2 +- GreenshotPlugin/Core/EventDelay.cs | 2 +- GreenshotPlugin/Core/ExtensionAttribute.cs | 2 +- GreenshotPlugin/Core/FastBitmap.cs | 2 +- GreenshotPlugin/Core/FilenameHelper.cs | 2 +- GreenshotPlugin/Core/GreenshotResources.cs | 2 +- GreenshotPlugin/Core/IEHelper.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 2 +- GreenshotPlugin/Core/ImageOutput.cs | 2 +- GreenshotPlugin/Core/InterfaceUtils.cs | 2 +- GreenshotPlugin/Core/Language.cs | 2 +- GreenshotPlugin/Core/LogHelper.cs | 2 +- GreenshotPlugin/Core/NetworkHelper.cs | 2 +- GreenshotPlugin/Core/OAuthHelper.cs | 2 +- GreenshotPlugin/Core/Objects.cs | 2 +- GreenshotPlugin/Core/PluginUtils.cs | 2 +- GreenshotPlugin/Core/QuantizerHelper.cs | 2 +- .../{SourceForgeHelper.cs => RssHelper.cs} | 65 ++++------- GreenshotPlugin/Core/StringExtensions.cs | 2 +- GreenshotPlugin/Core/WindowCapture.cs | 2 +- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- .../Core/WmInputLangChangeRequestFilter.cs | 2 +- GreenshotPlugin/GreenshotPlugin.csproj | 2 +- GreenshotPlugin/IEInterop/IHTMLBodyElement.cs | 2 +- .../IEInterop/IHTMLCurrentStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument4.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument5.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement2.cs | 2 +- .../IEInterop/IHTMLElementCollection.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLFrameBase.cs | 2 +- .../IEInterop/IHTMLFramesCollection2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLRect.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen2.cs | 2 +- .../IEInterop/IHTMLSelectionObject.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLTxtRange.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow4.cs | 2 +- GreenshotPlugin/IEInterop/IWebBrowser2.cs | 2 +- GreenshotPlugin/IniFile/IniAttributes.cs | 2 +- GreenshotPlugin/IniFile/IniConfig.cs | 2 +- GreenshotPlugin/IniFile/IniReader.cs | 2 +- GreenshotPlugin/IniFile/IniSection.cs | 2 +- GreenshotPlugin/IniFile/IniValue.cs | 2 +- GreenshotPlugin/Interfaces/Capture.cs | 2 +- .../Interfaces/Drawing/Container.cs | 2 +- .../Interfaces/Forms/ImageEditor.cs | 2 +- GreenshotPlugin/Interfaces/Generic.cs | 2 +- GreenshotPlugin/Interfaces/IDestination.cs | 2 +- GreenshotPlugin/Interfaces/IProcessor.cs | 2 +- .../Interfaces/Plugin/PluginInterfaces.cs | 2 +- GreenshotPlugin/Interop/COMWrapper.cs | 2 +- GreenshotPlugin/Interop/ComProgIdAttribute.cs | 2 +- GreenshotPlugin/Interop/IAppVisibility.cs | 2 +- GreenshotPlugin/Interop/IDispatch.cs | 2 +- GreenshotPlugin/Interop/IOleCommandTarget.cs | 2 +- GreenshotPlugin/Interop/IOleWindow.cs | 2 +- GreenshotPlugin/Interop/IServiceProvider.cs | 2 +- GreenshotPlugin/Interop/IUnknown.cs | 2 +- GreenshotPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/DWM.cs | 2 +- .../UnmanagedHelpers/Enumerations.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDIplus.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Kernel32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/PsAPI.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/User32.cs | 2 +- .../UnmanagedHelpers/Win32Errors.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/WinMM.cs | 2 +- 394 files changed, 633 insertions(+), 680 deletions(-) rename GreenshotPlugin/Core/{SourceForgeHelper.cs => RssHelper.cs} (68%) diff --git a/Greenshot/AssemblyInfo.cs b/Greenshot/AssemblyInfo.cs index 71277cb02..8faad06ca 100644 --- a/Greenshot/AssemblyInfo.cs +++ b/Greenshot/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index 4c805e5ce..c74592a8d 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs index 57b21f268..240fcd3e8 100644 --- a/Greenshot/Configuration/LanguageKeys.cs +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index 5641a9c27..3d2fa28b6 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs index 192e25ecb..0b991e4c6 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs index d32b2453d..a50139e00 100644 --- a/Greenshot/Controls/BindableToolStripDropDownButton.cs +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index 8eb49f13e..80e77399c 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index 6c18554da..a159283b4 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs index 89260baf3..8f7e454af 100644 --- a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs index 410c87402..f25355fb3 100644 --- a/Greenshot/Controls/FontFamilyComboBox.cs +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/MenuStripEx.cs b/Greenshot/Controls/MenuStripEx.cs index aa880f06e..a4ead03fe 100644 --- a/Greenshot/Controls/MenuStripEx.cs +++ b/Greenshot/Controls/MenuStripEx.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/NonJumpingPanel.cs b/Greenshot/Controls/NonJumpingPanel.cs index 8392b9219..bab51077b 100644 --- a/Greenshot/Controls/NonJumpingPanel.cs +++ b/Greenshot/Controls/NonJumpingPanel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index 6aeccf9b5..d54e56d78 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index 915721248..cbabe38fb 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ToolStripEx.cs b/Greenshot/Controls/ToolStripEx.cs index 3a32224c3..38e1aa737 100644 --- a/Greenshot/Controls/ToolStripEx.cs +++ b/Greenshot/Controls/ToolStripEx.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ToolStripNumericUpDown.cs b/Greenshot/Controls/ToolStripNumericUpDown.cs index 376c021d0..35916c909 100644 --- a/Greenshot/Controls/ToolStripNumericUpDown.cs +++ b/Greenshot/Controls/ToolStripNumericUpDown.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/ClipboardDestination.cs b/Greenshot/Destinations/ClipboardDestination.cs index 25476f64e..fecebc33e 100644 --- a/Greenshot/Destinations/ClipboardDestination.cs +++ b/Greenshot/Destinations/ClipboardDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/EditorDestination.cs b/Greenshot/Destinations/EditorDestination.cs index 0aaed76a2..41cb39bae 100644 --- a/Greenshot/Destinations/EditorDestination.cs +++ b/Greenshot/Destinations/EditorDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index b82b233b0..00b5dfc90 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 24af9bd1d..149173722 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/FileWithDialogDestination.cs b/Greenshot/Destinations/FileWithDialogDestination.cs index e14b804b6..151ba4d97 100644 --- a/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/Greenshot/Destinations/FileWithDialogDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/PickerDestination.cs b/Greenshot/Destinations/PickerDestination.cs index 7988dea71..cd3c68273 100644 --- a/Greenshot/Destinations/PickerDestination.cs +++ b/Greenshot/Destinations/PickerDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index bc4ce8af0..af44cd910 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/ArrowContainer.cs b/Greenshot/Drawing/ArrowContainer.cs index f1c65ff53..fc39c61d9 100644 --- a/Greenshot/Drawing/ArrowContainer.cs +++ b/Greenshot/Drawing/ArrowContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index 676836f93..e7588d7e8 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs index 3911d5940..fbc37d0b1 100644 --- a/Greenshot/Drawing/CursorContainer.cs +++ b/Greenshot/Drawing/CursorContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index aa4ffce43..4699375ea 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 570949a40..56dc2b281 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs index caf41824b..3a4651494 100644 --- a/Greenshot/Drawing/EllipseContainer.cs +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 0f8df4937..4e0fa10e4 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index b919edd9b..c0754175f 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs index da43dd6f3..684f54716 100644 --- a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs index 21ebeb1ef..e67f0ee21 100644 --- a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs index 7638c98ee..d7e92247f 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs index 0d53793ec..c2f58fd9d 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs index 9610e9759..4507f0495 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs index 82a2129b3..c791fe9b1 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs index 6edc70f6e..acc9808d6 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs index 06254324f..c7e917aa4 100644 --- a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs index 28246a6cc..7e3e9e3bc 100644 --- a/Greenshot/Drawing/Fields/Field.cs +++ b/Greenshot/Drawing/Fields/Field.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 1d9e8b6bf..c40edc993 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index 4469f86cf..f51de36a9 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/IFieldHolder.cs b/Greenshot/Drawing/Fields/IFieldHolder.cs index 1fd2952f3..063ca48d7 100644 --- a/Greenshot/Drawing/Fields/IFieldHolder.cs +++ b/Greenshot/Drawing/Fields/IFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs index 630c5c35d..3793bf5fc 100644 --- a/Greenshot/Drawing/FilterContainer.cs +++ b/Greenshot/Drawing/FilterContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index cd1be85a2..d784c5b93 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/BlurFilter.cs b/Greenshot/Drawing/Filters/BlurFilter.cs index 1b2e6ab68..0402bd521 100644 --- a/Greenshot/Drawing/Filters/BlurFilter.cs +++ b/Greenshot/Drawing/Filters/BlurFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/BrightnessFilter.cs b/Greenshot/Drawing/Filters/BrightnessFilter.cs index f7d689d52..3e8b0541a 100644 --- a/Greenshot/Drawing/Filters/BrightnessFilter.cs +++ b/Greenshot/Drawing/Filters/BrightnessFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/GrayscaleFilter.cs b/Greenshot/Drawing/Filters/GrayscaleFilter.cs index a6d0ac83d..d89cd7ec0 100644 --- a/Greenshot/Drawing/Filters/GrayscaleFilter.cs +++ b/Greenshot/Drawing/Filters/GrayscaleFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/HighlightFilter.cs b/Greenshot/Drawing/Filters/HighlightFilter.cs index 896bbff5c..a9cc5a5a8 100644 --- a/Greenshot/Drawing/Filters/HighlightFilter.cs +++ b/Greenshot/Drawing/Filters/HighlightFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/IFilter.cs b/Greenshot/Drawing/Filters/IFilter.cs index 5840e9650..c5bc7d0ad 100644 --- a/Greenshot/Drawing/Filters/IFilter.cs +++ b/Greenshot/Drawing/Filters/IFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/MagnifierFilter.cs b/Greenshot/Drawing/Filters/MagnifierFilter.cs index 23359546e..f5e96be30 100644 --- a/Greenshot/Drawing/Filters/MagnifierFilter.cs +++ b/Greenshot/Drawing/Filters/MagnifierFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/PixelizationFilter.cs b/Greenshot/Drawing/Filters/PixelizationFilter.cs index a7f13c096..53853d7a5 100644 --- a/Greenshot/Drawing/Filters/PixelizationFilter.cs +++ b/Greenshot/Drawing/Filters/PixelizationFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index b30937c2b..23ea7f408 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Gripper.cs b/Greenshot/Drawing/Gripper.cs index 7a65fc57a..52ee5adbf 100644 --- a/Greenshot/Drawing/Gripper.cs +++ b/Greenshot/Drawing/Gripper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index aec48208f..5dc015495 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index 86b82a46f..e2ab3c27d 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index b9f9c6dc3..3cec536d2 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index 4189134ac..1cf4ef4c1 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index 80f395c31..fcb6afbca 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index c235346c5..5bf16de04 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs index 51ea777ff..b38e48330 100644 --- a/Greenshot/Drawing/RoundedRectangle.cs +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index 64ede51e8..b0cdf3f76 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2012 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 79583c5ab..e4a1bb337 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2012 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index b28e2a86f..1eea446cc 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 110c40775..d4c4ec2a0 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/AboutForm.Designer.cs b/Greenshot/Forms/AboutForm.Designer.cs index 342d6d734..552a28af1 100644 --- a/Greenshot/Forms/AboutForm.Designer.cs +++ b/Greenshot/Forms/AboutForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -104,7 +104,7 @@ namespace Greenshot { 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.Text = "https://github.com/greenshot/greenshot"; this.linkLblHost.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // linkLblBugs diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index 64934dea0..8c11bbf13 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ +* The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/AnimatingBaseForm.cs b/Greenshot/Forms/AnimatingBaseForm.cs index 36d85c2b3..a04532165 100644 --- a/Greenshot/Forms/AnimatingBaseForm.cs +++ b/Greenshot/Forms/AnimatingBaseForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/BaseForm.cs b/Greenshot/Forms/BaseForm.cs index 59293cd1c..a230a6615 100644 --- a/Greenshot/Forms/BaseForm.cs +++ b/Greenshot/Forms/BaseForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/BugReportForm.Designer.cs b/Greenshot/Forms/BugReportForm.Designer.cs index f1c5147e0..6debe66ec 100644 --- a/Greenshot/Forms/BugReportForm.Designer.cs +++ b/Greenshot/Forms/BugReportForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/BugReportForm.cs b/Greenshot/Forms/BugReportForm.cs index 2f6fb0247..9683d3243 100644 --- a/Greenshot/Forms/BugReportForm.cs +++ b/Greenshot/Forms/BugReportForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/CaptureForm.Designer.cs b/Greenshot/Forms/CaptureForm.Designer.cs index 72deb4ffd..02f5780f8 100644 --- a/Greenshot/Forms/CaptureForm.Designer.cs +++ b/Greenshot/Forms/CaptureForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 528cd6515..4fa200cb9 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ColorDialog.Designer.cs b/Greenshot/Forms/ColorDialog.Designer.cs index 622a799cc..bcc813c4b 100644 --- a/Greenshot/Forms/ColorDialog.Designer.cs +++ b/Greenshot/Forms/ColorDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index 2f630d064..a8a5d13de 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs index b2fa2d733..576162caf 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/DropShadowSettingsForm.cs b/Greenshot/Forms/DropShadowSettingsForm.cs index 1952c6058..4e749baf9 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index 01fda903b..26a5f6aa0 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index c5cc2ddba..71a581ada 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/LanguageDialog.Designer.cs b/Greenshot/Forms/LanguageDialog.Designer.cs index 78d4abd7b..0c6bdbb97 100644 --- a/Greenshot/Forms/LanguageDialog.Designer.cs +++ b/Greenshot/Forms/LanguageDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/LanguageDialog.cs b/Greenshot/Forms/LanguageDialog.cs index ee0fb7549..9c6333668 100644 --- a/Greenshot/Forms/LanguageDialog.cs +++ b/Greenshot/Forms/LanguageDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/MainForm.Designer.cs b/Greenshot/Forms/MainForm.Designer.cs index da54e6cb8..f51b3bf87 100644 --- a/Greenshot/Forms/MainForm.Designer.cs +++ b/Greenshot/Forms/MainForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index e58af6640..afc9978e8 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/MovableShowColorForm.cs b/Greenshot/Forms/MovableShowColorForm.cs index 6173a4b4e..f2560ba18 100644 --- a/Greenshot/Forms/MovableShowColorForm.cs +++ b/Greenshot/Forms/MovableShowColorForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/PrintOptionsDialog.Designer.cs b/Greenshot/Forms/PrintOptionsDialog.Designer.cs index 321a80873..0f087f50b 100644 --- a/Greenshot/Forms/PrintOptionsDialog.Designer.cs +++ b/Greenshot/Forms/PrintOptionsDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/PrintOptionsDialog.cs b/Greenshot/Forms/PrintOptionsDialog.cs index 1175bf1dc..fa585a8a9 100644 --- a/Greenshot/Forms/PrintOptionsDialog.cs +++ b/Greenshot/Forms/PrintOptionsDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ResizeSettingsForm.Designer.cs b/Greenshot/Forms/ResizeSettingsForm.Designer.cs index f3cd04f36..d7003d606 100644 --- a/Greenshot/Forms/ResizeSettingsForm.Designer.cs +++ b/Greenshot/Forms/ResizeSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ResizeSettingsForm.cs b/Greenshot/Forms/ResizeSettingsForm.cs index db8cac328..0956b62b6 100644 --- a/Greenshot/Forms/ResizeSettingsForm.cs +++ b/Greenshot/Forms/ResizeSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/SettingsForm.Designer.cs b/Greenshot/Forms/SettingsForm.Designer.cs index 715d8f24d..9a76a3a7a 100644 --- a/Greenshot/Forms/SettingsForm.Designer.cs +++ b/Greenshot/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index b64fdfaf0..663d8d08c 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index ce26dc1d5..9d122bed9 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs index 6263465af..12e1817b1 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index 63bae471a..d0089a6cc 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/GreenshotMain.cs b/Greenshot/GreenshotMain.cs index 1f5fa562b..9d018be16 100644 --- a/Greenshot/GreenshotMain.cs +++ b/Greenshot/GreenshotMain.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Help/HelpFileLoader.cs b/Greenshot/Help/HelpFileLoader.cs index c3acda86d..a8a2365df 100644 --- a/Greenshot/Help/HelpFileLoader.cs +++ b/Greenshot/Help/HelpFileLoader.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 301b97c14..a1c8f3ae8 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/Colors.cs b/Greenshot/Helpers/Colors.cs index 0fe637fca..6f072cd60 100644 --- a/Greenshot/Helpers/Colors.cs +++ b/Greenshot/Helpers/Colors.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/CopyData.cs b/Greenshot/Helpers/CopyData.cs index ab695822d..c32ca596e 100644 --- a/Greenshot/Helpers/CopyData.cs +++ b/Greenshot/Helpers/CopyData.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index 5d69c99d3..4ddd7d27e 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index 443fe3321..2b7e0d4ed 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/GeometryHelper.cs b/Greenshot/Helpers/GeometryHelper.cs index 98534a2df..ea3c626a9 100644 --- a/Greenshot/Helpers/GeometryHelper.cs +++ b/Greenshot/Helpers/GeometryHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/GuiRectangle.cs b/Greenshot/Helpers/GuiRectangle.cs index d317fa6f4..6587ec452 100644 --- a/Greenshot/Helpers/GuiRectangle.cs +++ b/Greenshot/Helpers/GuiRectangle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index 1786106c9..d1cd44b7e 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/IEInterop/IEContainer.cs b/Greenshot/Helpers/IEInterop/IEContainer.cs index 0b5b740bc..35c04a960 100644 --- a/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index 4bb549603..73e8e3bea 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/PluginHelper.cs b/Greenshot/Helpers/PluginHelper.cs index 9062490e3..802d776fd 100644 --- a/Greenshot/Helpers/PluginHelper.cs +++ b/Greenshot/Helpers/PluginHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index ddb42b5b9..29b1e0eed 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/ProcessorHelper.cs b/Greenshot/Helpers/ProcessorHelper.cs index ea5c4bef9..ee53a76bb 100644 --- a/Greenshot/Helpers/ProcessorHelper.cs +++ b/Greenshot/Helpers/ProcessorHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/ScaleHelper.cs b/Greenshot/Helpers/ScaleHelper.cs index 77557fc73..fb43662a5 100644 --- a/Greenshot/Helpers/ScaleHelper.cs +++ b/Greenshot/Helpers/ScaleHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index 1b84b1907..f3f34aff8 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/StartupHelper.cs b/Greenshot/Helpers/StartupHelper.cs index 8c717f56f..b9aa52cce 100644 --- a/Greenshot/Helpers/StartupHelper.cs +++ b/Greenshot/Helpers/StartupHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/ToolStripItemEndisabler.cs b/Greenshot/Helpers/ToolStripItemEndisabler.cs index 3fa5cfcd5..54a2e3418 100644 --- a/Greenshot/Helpers/ToolStripItemEndisabler.cs +++ b/Greenshot/Helpers/ToolStripItemEndisabler.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/UpdateHelper.cs b/Greenshot/Helpers/UpdateHelper.cs index 723331d25..2d2692269 100644 --- a/Greenshot/Helpers/UpdateHelper.cs +++ b/Greenshot/Helpers/UpdateHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -39,7 +39,7 @@ namespace Greenshot.Experimental { private const string STABLE_DOWNLOAD_LINK = "http://getgreenshot.org/downloads/"; private const string VERSION_HISTORY_LINK = "http://getgreenshot.org/version-history/"; private static readonly object LockObject = new object(); - private static SourceforgeFile _latestGreenshot; + private static RssFile _latestGreenshot; private static string _downloadLink = STABLE_DOWNLOAD_LINK; /// @@ -59,7 +59,7 @@ namespace Greenshot.Experimental { return false; } LOG.DebugFormat("Update check is due, last check was {0} check needs to be made after {1} (which is one {2} later)", conf.LastUpdateCheck, checkTime, conf.UpdateCheckInterval); - if (!SourceForgeHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { + if (!RssHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { LOG.DebugFormat("RSS feed has not been updated since after {0}", conf.LastUpdateCheck); return false; } @@ -114,88 +114,62 @@ namespace Greenshot.Experimental { private static void ProcessRSSInfo(Version currentVersion) { // Reset latest Greenshot - Dictionary> rssFiles = SourceForgeHelper.readRSS(); + IList rssFiles = RssHelper.readRSS(); if (rssFiles == null) { return; } // Retrieve the current and latest greenshot - foreach(string fileType in rssFiles.Keys) { - foreach(string file in rssFiles[fileType].Keys) { - SourceforgeFile rssFile = rssFiles[fileType][file]; - if (fileType.StartsWith("Greenshot")) { - // check for exe - if (!rssFile.isExe) { + foreach(RssFile rssFile in rssFiles) { + if (rssFile.File.StartsWith("Greenshot")) { + // check for exe + if (!rssFile.isExe) { + continue; + } + + // do we have a version? + if (rssFile.Version == null) { + LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", rssFile.File, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + continue; + } + + // if the file is unstable, we will skip it when: + // the current version is a release or release candidate AND check unstable is turned off. + if (rssFile.isUnstable) { + // Skip if we shouldn't check unstables + if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { continue; } + } - // do we have a version? - if (rssFile.Version == null) { - LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", file, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + // if the file is a release candidate, we will skip it when: + // the current version is a release AND check unstable is turned off. + if (rssFile.isReleaseCandidate) { + if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { continue; } + } - // if the file is unstable, we will skip it when: - // the current version is a release or release candidate AND check unstable is turned off. - if (rssFile.isUnstable) { - // Skip if we shouldn't check unstables - if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { - continue; + // Compare versions + int versionCompare = rssFile.Version.CompareTo(currentVersion); + if (versionCompare > 0) { + LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { + _latestGreenshot = rssFile; + if (rssFile.isReleaseCandidate || rssFile.isUnstable) { + _downloadLink = VERSION_HISTORY_LINK; + } else { + _downloadLink = STABLE_DOWNLOAD_LINK; } } - - // if the file is a release candidate, we will skip it when: - // the current version is a release AND check unstable is turned off. - if (rssFile.isReleaseCandidate) { - if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { - continue; - } - } - - // Compare versions - int versionCompare = rssFile.Version.CompareTo(currentVersion); - if (versionCompare > 0) { - LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", file, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); - if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { - _latestGreenshot = rssFile; - if (rssFile.isReleaseCandidate || rssFile.isUnstable) { - _downloadLink = VERSION_HISTORY_LINK; - } else { - _downloadLink = STABLE_DOWNLOAD_LINK; - } - } - } else if (versionCompare < 0) { - LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); - } else if (versionCompare == 0) { - LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", file, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); - } + } else if (versionCompare < 0) { + LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); + } else if (versionCompare == 0) { + LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); } } } - -// // check for language file updates -// // Directory to store the language files -// string languageFilePath = Path.GetDirectoryName(Language.GetInstance().GetHelpFilePath()); -// LOG.DebugFormat("Language file path: {0}", languageFilePath); -// foreach(string fileType in rssFiles.Keys) { -// foreach(string file in rssFiles[fileType].Keys) { -// RssFile rssFile = rssFiles[fileType][file]; -// if (fileType.Equals("Translations")) { -// LOG.DebugFormat("Found translation {0} with language {1} published at {2} : {3}", file, rssFile.Language, rssFile.Pubdate.ToLocalTime(), rssFile.Link); -// string languageFile = Path.Combine(languageFilePath, file); -// if (!File.Exists(languageFile)) { -// LOG.DebugFormat("Found not installed language: {0}", rssFile.Language); -// // Example to download language files -// //string languageFileContent = GreenshotPlugin.Core.NetworkHelper.DownloadFileAsString(new Uri(rssFile.Link), Encoding.UTF8); -// //TextWriter writer = new StreamWriter(languageFile, false, Encoding.UTF8); -// //LOG.InfoFormat("Writing {0}", languageFile); -// //writer.Write(languageFileContent); -// //writer.Close(); -// } -// } -// } -// } } } } diff --git a/Greenshot/Helpers/WindowWrapper.cs b/Greenshot/Helpers/WindowWrapper.cs index c23614482..e2ce53ab2 100644 --- a/Greenshot/Helpers/WindowWrapper.cs +++ b/Greenshot/Helpers/WindowWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Languages/language-ar-SY.xml b/Greenshot/Languages/language-ar-SY.xml index 35de183f6..e9d31d52c 100644 --- a/Greenshot/Languages/language-ar-SY.xml +++ b/Greenshot/Languages/language-ar-SY.xml @@ -3,19 +3,19 @@ رجاء بلغ عن الاخطاء الى اذا اعجبك البرنامج انت مدعو لدعمنا: - جرين شوت استضيف بواسطة sourceforge.net في + جرين شوت استضيف بواسطة GitHub في الايقونات بواسطة مجموعة ايقونات يوسوكي كامياماني (تحت رخصة المشاع الإبداعي الاصدار 3.0) - حقوق النشر © 2007 - 2012 توماس براون, جينس كلنجين, روبين كروم -جرين شوت لا يأتي مع أية ضمان. هذا برنامج حر, مرحبا بك لتعيد توزيعه تحت شروط معينة. + حقوق النشر © 2007 - 2012 توماس براون, جينس كلنجين, روبين كروم +جرين شوت لا يأتي مع أية ضمان. هذا برنامج حر, مرحبا بك لتعيد توزيعه تحت شروط معينة. تفاصيل حول رخصة جنو العمومية: حول جرين شوت جرين شوت - الاداة الثورية في تصوير الشاشة إغلاق - عذرا, حدث خطأ غير متوقع. - الخبر الجيد: انت تستطيع التخلص من هذا عن طريق تعبئة تقرير الاخطاء. - رجاء قم بزيارة الرابط اسفل, انشئ تقرير اخطاء جديد والصق النص من المربع الى الوصف. - - رجاء قم باضافة تلخيص ذو معنى وارفق اية معلومات تعتبرها مفيدة في اكتشاف الخطأ + عذرا, حدث خطأ غير متوقع. + الخبر الجيد: انت تستطيع التخلص من هذا عن طريق تعبئة تقرير الاخطاء. + رجاء قم بزيارة الرابط اسفل, انشئ تقرير اخطاء جديد والصق النص من المربع الى الوصف. + + رجاء قم باضافة تلخيص ذو معنى وارفق اية معلومات تعتبرها مفيدة في اكتشاف الخطأ أيضا, سوف نقدر وبشدة اذا قمت بفحص ما إذا ما قد تم البلاغ عن الخطأ من قبل. شكرا :) خطأ خطأ غير متوقع حدث عند المحاولة للكتابة على الذاكرة. @@ -112,7 +112,7 @@ إلى الأعلى خطأ برنامج جرين شوت يعمل حاليا - لايمكن حفظ الصورة في {0}. + لايمكن حفظ الصورة في {0}. رجاء تاكد من القدرة على حفظ الملف في هذا المكان. الملف "{0}" لا يمكن فتحه. لا يمكن فتح الوصلة. @@ -150,22 +150,22 @@ JPEG جودة JPEG اعدادات اللغة - سوف يتم استبدال الرموز التالية تلقائيا في النمط المعرف: - -${YYYY} السنة, 4 منازل -${MM} الشهر, منزلتان -${DD} اليوم, منزلتان -${hh} الساعة, منزلتان -${mm} الدقيقة, منزلتان -${ss} الثواني, منزلتان -${NUM} incrementing number, 6 منازل -${title} عنوان النافذة -${user} مستخدم الوندوز -${domain} نطاق وندوز -${hostname} اسم الحاسوب - -بامكانك ايضا جعل جرين شوت ينشئ مجلدات بصورة ديناميكية, ببساطة استخدم رمز (/) لفصل المجلدات واسماء الملفات. -مثال: النمط ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} + سوف يتم استبدال الرموز التالية تلقائيا في النمط المعرف: + +${YYYY} السنة, 4 منازل +${MM} الشهر, منزلتان +${DD} اليوم, منزلتان +${hh} الساعة, منزلتان +${mm} الدقيقة, منزلتان +${ss} الثواني, منزلتان +${NUM} incrementing number, 6 منازل +${title} عنوان النافذة +${user} مستخدم الوندوز +${domain} نطاق وندوز +${hostname} اسم الحاسوب + +بامكانك ايضا جعل جرين شوت ينشئ مجلدات بصورة ديناميكية, ببساطة استخدم رمز (/) لفصل المجلدات واسماء الملفات. +مثال: النمط ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} سيولد مجلدا لليوم الحالي في مكان الحفظ الافتراضي, مثلا 28-09-2011, اسم ملف لقطة الشاشة سيكون على اساس الوقت الحالي, مثلا 14_13_15 (مع امتداد الحفظ) النتائج تشغيل صوت عند الالتقاط @@ -186,8 +186,8 @@ ${hostname} اسم الحاسوب وقت الانتظار بالجزء من الثانية قبل الإلتقاط انقر الزر الايمن هنا أو اضغط مفتاح الطباعة. تحذير - لا يمكن تسجيل اختصار واحد او اكثر. لذلك, قد لا يكون بالامكان استخدام اختصارات جرين شوت. -هذه المشكلة على الاغلب سببها برنامج اخر يدعي استخدام نفس الاختصارات. + لا يمكن تسجيل اختصار واحد او اكثر. لذلك, قد لا يكون بالامكان استخدام اختصارات جرين شوت. +هذه المشكلة على الاغلب سببها برنامج اخر يدعي استخدام نفس الاختصارات. رجاء قم بالغاء البرنامج الذي يقوم باستخدام مفتاح الطباعة. يمكنك ايضا استخدام كل ميزات جرين شوت من الايقونة على شريط المهام. \ No newline at end of file diff --git a/Greenshot/Languages/language-cs-CZ.xml b/Greenshot/Languages/language-cs-CZ.xml index 666896aaf..e6d4abf9b 100644 --- a/Greenshot/Languages/language-cs-CZ.xml +++ b/Greenshot/Languages/language-cs-CZ.xml @@ -3,7 +3,7 @@ Chyby prosím hlaste na adrese Pokud se vám Greenshot líbí, uvítáme Vaší podporu - Greenshot je hostován na sourceforge.net + Greenshot je hostován na GitHub Ikony pochází ze sady Yusuke Kamiyamane's Fugue (licence Creative Commons Attribution 3.0) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ABSOLUTNĚ BEZ ZÁRUKY. Toto je svobodný software, můžete jej dále šířit za určitých podmínek. diff --git a/Greenshot/Languages/language-de-DE.xml b/Greenshot/Languages/language-de-DE.xml index 72806cf78..aba76288a 100644 --- a/Greenshot/Languages/language-de-DE.xml +++ b/Greenshot/Languages/language-de-DE.xml @@ -3,7 +3,7 @@ Bitte melden Sie Fehler unter Wenn Sie Greenshot mögen, können Sie uns gerne unterstützen: - Greenshot wird von sourceforge.net gehostet unter + Greenshot wird von GitHub gehostet unter Icons aus Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Für Greenshot besteht KEINERLEI GARANTIE. Greenshot ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen. diff --git a/Greenshot/Languages/language-el-GR.xml b/Greenshot/Languages/language-el-GR.xml index bc1684428..ef7c74c5c 100644 --- a/Greenshot/Languages/language-el-GR.xml +++ b/Greenshot/Languages/language-el-GR.xml @@ -3,7 +3,7 @@ Αναφορά προβλημάτων: Αν σας αρέσει το Greenshot, είστε ευπρόσδεκτοι να μας υποστηρίξετε: - Το Greenshot φιλοξενείται από τη sourceforge.net: + Το Greenshot φιλοξενείται από τη GitHub: Εικονίδια από Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Δεν παρέχεται ΚΑΜΙΑ ΕΓΓΥΗΣΗ για το Greenshot. Είναι ελεύθερο λογισμικό. Είστε ελεύθεροι να το αναδιανείμετε κάτω από ορισμένες συνθήκες. diff --git a/Greenshot/Languages/language-en-US.xml b/Greenshot/Languages/language-en-US.xml index bf75eef36..6d5d3dca3 100644 --- a/Greenshot/Languages/language-en-US.xml +++ b/Greenshot/Languages/language-en-US.xml @@ -3,7 +3,7 @@ Please report bugs to If you like Greenshot, you are welcome to support us: - Greenshot is hosted by sourceforge.net at + Greenshot is hosted by GitHub at Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-es-ES.xml b/Greenshot/Languages/language-es-ES.xml index e6f660efc..f7b22990d 100644 --- a/Greenshot/Languages/language-es-ES.xml +++ b/Greenshot/Languages/language-es-ES.xml @@ -3,7 +3,7 @@ Por favor reporta errores a Si te gusta Greenshot, te agradeceremos que nos ayudes: - Greenshot está alojado en sourceforge.net en + Greenshot está alojado en GitHub en Iconos del conjunto de iconos Fugue de Yusuke Kamiyamane(Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene ABSOLUTAMENTE SIN GARANTIA. Este es software gratuito, y eres bienvenido a redistribuirlo bajo ciertas condiciones. diff --git a/Greenshot/Languages/language-fi-FI.xml b/Greenshot/Languages/language-fi-FI.xml index 8dda90a6c..5a4b02808 100644 --- a/Greenshot/Languages/language-fi-FI.xml +++ b/Greenshot/Languages/language-fi-FI.xml @@ -3,7 +3,7 @@ Raportoi virheet tänne Jos pidät Greenshotista niin toivottavasti tuet meitä: - Greenshot is hosted by sourceforge.net at + Greenshot is hosted by GitHub at Ikonit ovat Yusuke Kamiyamane:n Fugue ikonisarjasta (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-fr-FR.xml b/Greenshot/Languages/language-fr-FR.xml index b23f64c6f..ab5849d65 100644 --- a/Greenshot/Languages/language-fr-FR.xml +++ b/Greenshot/Languages/language-fr-FR.xml @@ -3,20 +3,20 @@ Veuillez rapporter les bogues à Si vous aimez Greenshot, vous pouvez nous soutenir : - Greenshot est hébergé par sourceforge.net à + Greenshot est hébergé par GitHub à Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license) - Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom -Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. + Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom +Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License : À propos de Greenshot Greenshot - l'utilitaire révolutionnaire de capture d'écran Fermer - Désolé, une erreur inattendue s'est produite. - -La bonne nouvelle, c'est que vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. -Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. - -Ajoutez un résumé compréhensible et des informations que vous jugez utiles à la reproduction du problème. + Désolé, une erreur inattendue s'est produite. + +La bonne nouvelle, c'est que vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. +Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. + +Ajoutez un résumé compréhensible et des informations que vous jugez utiles à la reproduction du problème. De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si un rapport concernant ce problème existe déjà. (Vous pouvez utiliser l'outil de recherche pour les trouver rapidement.) Merci :) Erreur Annuler @@ -180,7 +180,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si Outlook avec texte Erreur Une instance de Greenshot est déjà en cours d'exécution. - Impossible d'enregistrer le fichier vers {0}. + Impossible d'enregistrer le fichier vers {0}. Veuillez vérifier l'accessibilité du répertoire de stockage. Le fichier "{0}" n'a pu être ouvert. Ne peut ouvrir le lien '{0}'. @@ -246,22 +246,22 @@ Veuillez vérifier l'accessibilité du répertoire de stockage. Capture d'Internet Explorer Qualité JPEG Langue - Les variables suivantes seront automatiquement remplacées dans votre modèle : -${YYYY} année sur 4 chiffres -${MM} mois sur 2 chiffres -${DD} jour sur 2 chiffres -${hh} heure sur 2 chiffres -${mm} minutes sur 2 chiffres -${ss} secondes sur 2 chiffres -${NUM} Incrément sur 6 chiffres -${title} Titre de la fenêtre -${user} Nom d'utilisateur Windows -${domain} Domaine Windows -${hostname} Nom d'hôte du PC - -Vous pouvez aussi laisser Greenshot créer des répertoires dynamiquement, simplement en utilisant la barre oblique inversée (\) pour séparer les répertoires et les fichiers. -Exemple : le modèle ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -créera un répertoire pour le jour en cours dans votre emplacement de stockage par défaut, par exemple 2008-06-29, le nom du fichier contenant la capture d'écran sera basé sur l'heure + Les variables suivantes seront automatiquement remplacées dans votre modèle : +${YYYY} année sur 4 chiffres +${MM} mois sur 2 chiffres +${DD} jour sur 2 chiffres +${hh} heure sur 2 chiffres +${mm} minutes sur 2 chiffres +${ss} secondes sur 2 chiffres +${NUM} Incrément sur 6 chiffres +${title} Titre de la fenêtre +${user} Nom d'utilisateur Windows +${domain} Domaine Windows +${hostname} Nom d'hôte du PC + +Vous pouvez aussi laisser Greenshot créer des répertoires dynamiquement, simplement en utilisant la barre oblique inversée (\) pour séparer les répertoires et les fichiers. +Exemple : le modèle ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +créera un répertoire pour le jour en cours dans votre emplacement de stockage par défaut, par exemple 2008-06-29, le nom du fichier contenant la capture d'écran sera basé sur l'heure en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres) Réseau et mises à jour Sortie @@ -297,8 +297,8 @@ en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres)< Une nouvelle version de Greenshot est disponible ! Voulez-vous télécharger Greenshot {0} ? Veuillez patienter pendant la capture de la page Internet Explorer... Avertissement - Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). - + Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). + Toutes les fonctionnalités de Greenshot se lancent aussi directement depuis le menu contextuel de l'icône de la zone de notifications système. Utiliser une couleur personnalisée Préserver la transparence diff --git a/Greenshot/Languages/language-fr-QC.xml b/Greenshot/Languages/language-fr-QC.xml index a5209bf89..78d0309ce 100644 --- a/Greenshot/Languages/language-fr-QC.xml +++ b/Greenshot/Languages/language-fr-QC.xml @@ -3,18 +3,18 @@ Veuillez rapporter les bogues à Si vous aimez Greenshot, vous pouvez nous soutenir : - Greenshot est hébergé par sourceforge.net à + Greenshot est hébergé par GitHub à Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license) - Copyright © 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. + Copyright © 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License : A propos de Greenshot Greenshot - l'utilitaire révolutionnaire de capture d'écran Fermer - Désolé, une erreur inattendue s'est produite. -La bonne nouvelle est la suivante : vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. -Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. -Veuillez y ajouter un résumé compréhensible des informations que vous jugez utiles à la reproduction du problème. + Désolé, une erreur inattendue s'est produite. +La bonne nouvelle est la suivante : vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. +Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. +Veuillez y ajouter un résumé compréhensible des informations que vous jugez utiles à la reproduction du problème. De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si un rapport concernant ce problème existe déjà. (Vous pouvez utiliser l'outil de recherche pour les trouver rapidement.) Merci :) Erreur Annuler @@ -142,7 +142,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si Outlook avec du text Erreur Une instance de Greenshot est déjà en cours d'exécution. - Impossible de sauvegarder le fichier dans {0}. + Impossible de sauvegarder le fichier dans {0}. Veuillez vérifier que vous avez l'autorisation d'écrire dans le répertoire de stockage. Le fichier "{0}" n'a pu être ouvert. Impossible d'ouvrir le lien '{0}'. @@ -209,17 +209,17 @@ Veuillez vérifier que vous avez l'autorisation d'écrire dans le répertoire de Qualité JPEG Paramètres JPEG Langue - Les variables suivantes seront automatiquement remplacées dans votre motif : -${YYYY} Année sur 4 chiffres -${MM} mois sur 2 chiffres -${DD} jour sur 2 chiffres -${hh} heure sur 2 chiffres -${mm} minutes sur 2 chiffres -${ss} secondes sur 2 chiffres -${NUM} Incrément sur 6 chiffres -${title} Titre de la fenêtre -${user} Nom d'utilisateur Windows -${domain} Domaine Windows + Les variables suivantes seront automatiquement remplacées dans votre motif : +${YYYY} Année sur 4 chiffres +${MM} mois sur 2 chiffres +${DD} jour sur 2 chiffres +${hh} heure sur 2 chiffres +${mm} minutes sur 2 chiffres +${ss} secondes sur 2 chiffres +${NUM} Incrément sur 6 chiffres +${title} Titre de la fenêtre +${user} Nom d'utilisateur Windows +${domain} Domaine Windows ${hostname} Nom d'hôte du PC Mises à jour réseau Sortie @@ -250,8 +250,8 @@ ${hostname} Nom d'hôte du PC Une nouvelle version de Greenshot est disponible! Voulez-vous télécharger Greenshot {0}? Veuillez patienter pendant que la page dans Internet Explorer est capturée... Avertissement - Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. -Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. + Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. +Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. Veuillez désactiver ce(s) logiciel(s) utilisant le bouton Impr.écran. Vous pouvez également utiliser Greenshot au moyen de son menu contextuel. Utiliser les couleurs personnalisées Conserver la transparence diff --git a/Greenshot/Languages/language-he-IL.xml b/Greenshot/Languages/language-he-IL.xml index d4f82d69b..287f83946 100644 --- a/Greenshot/Languages/language-he-IL.xml +++ b/Greenshot/Languages/language-he-IL.xml @@ -3,7 +3,7 @@ :אנא דווח באגים בכתובת :אם את\ה נהנה\ית משימוש בתוכנה, את\ה מוזמן לתרום לנו - Greenshot is hosted by sourceforge.net at + Greenshot is hosted by GitHub at Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-hu-HU.xml b/Greenshot/Languages/language-hu-HU.xml index a4132795d..9e1201fec 100644 --- a/Greenshot/Languages/language-hu-HU.xml +++ b/Greenshot/Languages/language-hu-HU.xml @@ -3,20 +3,20 @@ Kérük a hibákat az alábbi helyen jelezzék Ha szereted Greenshot -ot, akkor támogass minket: - Greenshot kiszolgálója a sourceforge.net + Greenshot kiszolgálója a GitHub Az ikonokat Yusuke Kamiyamane's Fugue készítette (Creative Commons Attribution 3.0 license) - Szerzői jog (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -SEMMIFÉLE GARANCIA sincs a Greenshot -hoz. Ez egy ingyenes program, és hálásak vagyunk, hogy terjeszted bizonyos feltételekkel. + Szerzői jog (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +SEMMIFÉLE GARANCIA sincs a Greenshot -hoz. Ez egy ingyenes program, és hálásak vagyunk, hogy terjeszted bizonyos feltételekkel. Részletek a GNU Fő Nyílvános Engedélyről: Greenshot névjegye Greenshot - Egy forradalmian új képernyőkép készítő program Bezárni - Elnézést, váratlan hiba történt! - -A jó hír: ha jelzi felénk a hibát segítűnk megoldani. -Kérjük látogassa meg az alábbi URL-t, hozzon létre egy új hibabejegyzés és másolja be a hibaüzenetet. - -Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt, ami a segítségünkre lehet. + Elnézést, váratlan hiba történt! + +A jó hír: ha jelzi felénk a hibát segítűnk megoldani. +Kérjük látogassa meg az alábbi URL-t, hozzon létre egy új hibabejegyzés és másolja be a hibaüzenetet. + +Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt, ami a segítségünkre lehet. Örülnénk, ha ellenőrizné, hogy a hibát jelentette e már valaki. (Ha használja a keresőt, gyorsabban megtalálhatja) Köszönjük :) Hiba Váratlan hiba történt a vágólapra másoláskor. @@ -113,7 +113,7 @@ Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt Előre hozás Hiba A Greenshot egy példánya már fut. - Nem lehet menteni a fájlt {0}. + Nem lehet menteni a fájlt {0}. Kérjük ellenőrizze a mentési hely hozzáférhetőségét. A fájlt "{0}" nem sikerült megnyitni. Nem sikerült megnyitni a helyet. @@ -151,21 +151,21 @@ Kérjük ellenőrizze a mentési hely hozzáférhetőségét. JPEG minőség JPEG beállítások Nyelv - A következő minták válthatják fel az automatikus meghatározást: -${YYYY} év, 4 karakter -${MM} hónap, 2 karakter -${DD} nap, 2 karakter -${hh} óra, 2 karakter -${mm} perc, 2 karakter -${ss} másodperc, 2 karakter -${NUM} növekvő szám, 6 karakter -${title} Az ablak neve -${user} Windows felhasználó -${domain} Windows tartomány -${hostname} Számítógép név - -Könyvtárak lehet létrehozni a Greenshot -tal, a visszaper jeletet (\) használja a mappák és fájlnevek elválasztásánál. -Például: a minta ${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss} + A következő minták válthatják fel az automatikus meghatározást: +${YYYY} év, 4 karakter +${MM} hónap, 2 karakter +${DD} nap, 2 karakter +${hh} óra, 2 karakter +${mm} perc, 2 karakter +${ss} másodperc, 2 karakter +${NUM} növekvő szám, 6 karakter +${title} Az ablak neve +${user} Windows felhasználó +${domain} Windows tartomány +${hostname} Számítógép név + +Könyvtárak lehet létrehozni a Greenshot -tal, a visszaper jeletet (\) használja a mappák és fájlnevek elválasztásánál. +Például: a minta ${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss} fájl mentése az aktuális dátummal és időponttal, a megadott tárolási helyre, pl.: 2008-06-29_14-34-21, ezzel a mentési meghatározással a képernyőkép mindig az aktuális dátummal, idővel lesz elmentve. Mentés Fényképező zárhang @@ -186,8 +186,8 @@ fájl mentése az aktuális dátummal és időponttal, a megadott tárolási hel Ezredmásodpercet várjon kijelölés előtt Jobb klikk ide vagy nyomja meg a PrinScrn gombot. Figyelem - Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. -Ez a hiba akkor fordulhat elő, ha egy másik program használja. + Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. +Ez a hiba akkor fordulhat elő, ha egy másik program használja. Kapcsolja ki a szotvert és használja PrintScrn billentyűt. Egyszerűen használhatja a Greenshot -ot a tálca ikon helyi menüjéből. \ No newline at end of file diff --git a/Greenshot/Languages/language-it-IT.xml b/Greenshot/Languages/language-it-IT.xml index 70284f5ef..41a8b6a66 100644 --- a/Greenshot/Languages/language-it-IT.xml +++ b/Greenshot/Languages/language-it-IT.xml @@ -3,7 +3,7 @@ Per favore, riporta le anomalie a Se gradisci Greenshot, puoi darci il tuo aiuto su: - Greenshot è disponibile su sourceforge.net a + Greenshot è disponibile su GitHub a Icone prese da Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene fornito SENZA ALCUNA GARANZIA. Questo è "free software", e potete ri-distribuirlo secondo certe condizioni. diff --git a/Greenshot/Languages/language-ja-JP.xml b/Greenshot/Languages/language-ja-JP.xml index 4b4cf79aa..88eb4b242 100644 --- a/Greenshot/Languages/language-ja-JP.xml +++ b/Greenshot/Languages/language-ja-JP.xml @@ -3,7 +3,7 @@ バグ等の報告先 : Greenshot がお気に召したなら、是非支援をお願いします : - Greenshot は sourceforge.net によって運営されています : + Greenshot は GitHub によって運営されています : 上山根 祐輔氏の Fugue Icons を使用しています (Creative Commons Attribution 3.0 license) : Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot には一切の保障がありません。GNU General Public License に定められた条件下で再配布をおこなうことができます。: diff --git a/Greenshot/Languages/language-ko-KR.xml b/Greenshot/Languages/language-ko-KR.xml index c1896f8c7..50930abb9 100644 --- a/Greenshot/Languages/language-ko-KR.xml +++ b/Greenshot/Languages/language-ko-KR.xml @@ -3,7 +3,7 @@ 버그는 아래 URL로 전달바랍니다. Greenshot이 좋다면 아래 URL로 방문하셔서 지원할 수 있습니다. - Greenshot은 sourceforge.net 관리하에 아래 링크에서 호스팅되고 있습니다 + Greenshot은 GitHub 관리하에 아래 링크에서 호스팅되고 있습니다 아이콘은 Yusuke Kamiyamane's Fugue icon set으로부터 제공받은 것입니다. (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-lt-LT.xml b/Greenshot/Languages/language-lt-LT.xml index c67f49f92..2a84f330a 100644 --- a/Greenshot/Languages/language-lt-LT.xml +++ b/Greenshot/Languages/language-lt-LT.xml @@ -3,18 +3,18 @@ Apie klaidas praneškite Jei jums patiko Greenshot, galite mus paremti: - Greenshot talpinamas sourceforge.net + Greenshot talpinamas GitHub IIkonų rinkinys Fugue, аutorius Yusuke Kamiyamane, licencija Creative Commons Attribution 3.0 - Visos teisės saugomos (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + Visos teisės saugomos (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot pateikiama BE JOKIŲ GARANTIJŲ. Greenshot — laisvai platinama PĮ su GPL licencija ir jūs galite laisvai ją platinti, laikydamasi licencinės sutarties: Apie Greenshot Greenshot — revoliucinis įrankis ekrano nuotraukoms daryti Uždaryti - Nenumatyta klaida. - -Gera žinia: jūs galite padėti ištaisyti programą, jei atsiųsite ataskaitą apie klaidą. -Nurodytu adresu sukurkite klaidos ataskaitą ir nukopijuokite klaidos tekstą į aprašymą. Galite pridėti bet kokią informaciją, kuri galėtų padėti atkatoti klaidos įvykio aplinkybes. Be to, būtume labai dėkingi, jei patikrintumėte ar panašios klaidos jau neužregistravo kas nors kitas (galite pasinaudoti paieška tinklapyje). - + Nenumatyta klaida. + +Gera žinia: jūs galite padėti ištaisyti programą, jei atsiųsite ataskaitą apie klaidą. +Nurodytu adresu sukurkite klaidos ataskaitą ir nukopijuokite klaidos tekstą į aprašymą. Galite pridėti bet kokią informaciją, kuri galėtų padėti atkatoti klaidos įvykio aplinkybes. Be to, būtume labai dėkingi, jei patikrintumėte ar panašios klaidos jau neužregistravo kas nors kitas (galite pasinaudoti paieška tinklapyje). + Dėkojame už pagalbą :) Klaida Netikėta klaida įrašant į apsikeitimo podelį. @@ -111,7 +111,7 @@ Dėkojame už pagalbą :) Į priekį Klaida Greenshot jau paleistas. - Neįmanoma išsaugoti failo į {0}. + Neįmanoma išsaugoti failo į {0}. Patikrinkite ar turite tam teises. Nepavyko atidaryti failo "{0}". Nepavyko atidaryti nuorodos. @@ -149,19 +149,19 @@ Patikrinkite ar turite tam teises. Кokybė JPEG parametrai Kalba (Language) - Numatyti simboliai: - -${YYYY} metai, 4 skaičiai -${MM} menuo, 2 skaičiai -${DD} diena, 2 skaičiai -${hh} valanda, 2 skaičiai -${mm} minutės, 2 skaičiai -${ss} sekundės, 2 skaičiai -${NUM} eilės numeris, 6 skaičiai -${title} lango pavadinimas - -Greenshot gali pavadinti pagal šabloną ne tik failus, bet ir katalogus, jei pavadinime naudojamas atvirkščias pasviręs brūkšnys "\" - + Numatyti simboliai: + +${YYYY} metai, 4 skaičiai +${MM} menuo, 2 skaičiai +${DD} diena, 2 skaičiai +${hh} valanda, 2 skaičiai +${mm} minutės, 2 skaičiai +${ss} sekundės, 2 skaičiai +${NUM} eilės numeris, 6 skaičiai +${title} lango pavadinimas + +Greenshot gali pavadinti pagal šabloną ne tik failus, bet ir katalogus, jei pavadinime naudojamas atvirkščias pasviręs brūkšnys "\" + Pvz, šablonas ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} rodo, kad šios dienos datos kataloge "2011-04-27", nuotrauka bus pavadinta "16-40-23" (plius nuotraukos plėtinys, nurodytas nustatymuose) Nuotraukos Fotoaparato garsas @@ -176,15 +176,15 @@ Pvz, šablonas ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} rodo, kad šios dienos dato Nuotraukų vardų generavimo šablonas išsaugant nuotraukas Programos kalba (programą reikės startuoti iš naujo) Numatytas formatas - Mygtukas Print (PrintScreen), derinys Ctrl-Print, Alt-Print + Mygtukas Print (PrintScreen), derinys Ctrl-Print, Alt-Print bus perimti Greenshot programos, kai ji yra paleista. Numatytas nuotraukų saugojimo katalogas (jei nenurodyta - į darbastalį) Fotoefektai Išlaikymas prieš fotografuojant (ms) Spauskite dešiniu pelės klavišu arba spauskite "PrintScreen". Dėmesio - Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. -Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, + Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. +Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, kurios naudoja šiuos mygtukus. Arba galima naudoti komandas iš Greenshot programos kontekstinio meniu. \ No newline at end of file diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index cb18e6672..709c30615 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -3,7 +3,7 @@ Meld problemen bij Als U Greenshot goed vindt kunt U ons ondersteunen: - Greenshot word gehost door sourceforge.net op + Greenshot word gehost door GitHub op Iconen van de icon set van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot komt zonder enige garantie! Dit is gratis software, en U kunt het distribueren onder bepaalde voorwaarden. diff --git a/Greenshot/Languages/language-nn-NO.xml b/Greenshot/Languages/language-nn-NO.xml index 67d8cb214..9ae31d78f 100644 --- a/Greenshot/Languages/language-nn-NO.xml +++ b/Greenshot/Languages/language-nn-NO.xml @@ -3,20 +3,20 @@ Ver venleg å melde frå om feil til Om du likar Greenshot er du velkomen til å støtte oss: - Greenshot held virtuelt hus hjå sourceforge.net: + Greenshot held virtuelt hus hjå GitHub: Ikon frå Yusuke Kamiyamane sit "Fugue" ikonsett (Creative Commons Attribution 3.0-lisens) - Med kopirett (C) 2007-2012 Thomas Braun, Jens Klingen og Robin Krom. Norsk omsetjing av Ivar Barstad. -Greenshot har ABSOLUTT INGEN GARANTI. Dette er gratis programvare, og du står fritt til å distribuere det under visse vilkår. + Med kopirett (C) 2007-2012 Thomas Braun, Jens Klingen og Robin Krom. Norsk omsetjing av Ivar Barstad. +Greenshot har ABSOLUTT INGEN GARANTI. Dette er gratis programvare, og du står fritt til å distribuere det under visse vilkår. Detaljar om GNU General Public-lisens: Om Greenshot Greenshot - det revolusjonerande skjermknipsverktøyet Lukk - Orsak, ein ukjend feil oppstod! - -På den ljose sida kan du hjelpe oss med å finne ut av dette ved å fylle ut ein feilrapport! -Ver venleg og kopier innhaldet frå tekstområdet inn i "description"-feltet på nettsida bak lenkja under. - -Om du legg til ei forståeleg oppsummering (helst på engelsk) av kva som skjedde og kva som kan ha forårsaka feilen er det lettare for oss å finne ut av det. + Orsak, ein ukjend feil oppstod! + +På den ljose sida kan du hjelpe oss med å finne ut av dette ved å fylle ut ein feilrapport! +Ver venleg og kopier innhaldet frå tekstområdet inn i "description"-feltet på nettsida bak lenkja under. + +Om du legg til ei forståeleg oppsummering (helst på engelsk) av kva som skjedde og kva som kan ha forårsaka feilen er det lettare for oss å finne ut av det. Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om det alt er registrert ei sak på denne feilen. Tusen takk! Trøbbel! Avbryt @@ -145,7 +145,7 @@ Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om d Outlook med tekst Feil! Greenshot køyrer alt! - Kan ikkje lagre fila som {0}. + Kan ikkje lagre fila som {0}. Har du skrivetilgang til det valde området? Fila "{0}" kunne ikkje opnast! Kunne ikkje opne lenkja "{0}". @@ -203,21 +203,21 @@ Har du skrivetilgang til det valde området? Internet Explorer-knipsing JPEG-kvalitet Språk - Dei fylgjande felta vil bli fylt ut automatisk etter definert regel: -${YYYY} - Årstal, 4 siffer -${MM} - Månad, 2 siffer -${DD} - Dag, 2 siffer -${hh} - Time, 2 siffer -${mm} - Minutt, 2 siffer -${ss} - Sekund, 2 siffer -${NUM} - Automatisk teljar, 6 sifer -${title} - Vindaugstittel -${user} - Brukarnamn i Windows -${domain} - Windows-domene -${hostname} - Maskinnamn på nettverket - -Du kan òg setje Greenshot til å lage mapper dynamisk ved å bruke bakvendt skråstrek ( \ ) til å skilje mappe- og filnamn. -Eksempelregel: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} + Dei fylgjande felta vil bli fylt ut automatisk etter definert regel: +${YYYY} - Årstal, 4 siffer +${MM} - Månad, 2 siffer +${DD} - Dag, 2 siffer +${hh} - Time, 2 siffer +${mm} - Minutt, 2 siffer +${ss} - Sekund, 2 siffer +${NUM} - Automatisk teljar, 6 sifer +${title} - Vindaugstittel +${user} - Brukarnamn i Windows +${domain} - Windows-domene +${hostname} - Maskinnamn på nettverket + +Du kan òg setje Greenshot til å lage mapper dynamisk ved å bruke bakvendt skråstrek ( \ ) til å skilje mappe- og filnamn. +Eksempelregel: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med tidspunktet som namn, fylgt av filtype definert i innstillingane (f.eks. 10_14_31.JPG). Nettverk og oppdateringar Utformat @@ -248,8 +248,8 @@ vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med ti Ein nyare versjon av skjermknipsaren er tilgjengeleg! Vil du laste ned Greenshot {0}? Ver venleg og vent medan Internet Explorer-sida blir knipsa... Åtvaring! - Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. - + Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. + Alle Greenshot-funksjonar er likevel tilgjengeleg via høgreklikkmenyen i varslingsfeltet nedst til høgre på skjermen. Bruk eigendefinert farge Hald på gjennomsynlegheit diff --git a/Greenshot/Languages/language-pl-PL.xml b/Greenshot/Languages/language-pl-PL.xml index 6962ad536..b9dc55886 100644 --- a/Greenshot/Languages/language-pl-PL.xml +++ b/Greenshot/Languages/language-pl-PL.xml @@ -3,7 +3,7 @@ Tutaj proszę zgłaszać błędy: Jeśli podoba Ci się Greenshot, chętnie przyjmiemy Twoje wsparcie: - Greenshot jest utrzymywany przez sourceforge.net pod adresem: + Greenshot jest utrzymywany przez GitHub pod adresem: Ikony z zestawu Fugue od Yusuke Kamiyamane (licencja Creative Commons Attribution 3.0): Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot nie jest objęty JAKĄKOLWIEK GWARANCJĄ. Jako wolne oprogramowanie może być rozpowszechniany na określonych warunkach. diff --git a/Greenshot/Languages/language-pt-BR.xml b/Greenshot/Languages/language-pt-BR.xml index 280068294..e53dc2ca8 100644 --- a/Greenshot/Languages/language-pt-BR.xml +++ b/Greenshot/Languages/language-pt-BR.xml @@ -3,7 +3,7 @@ Por favor envie erros para Se você gostou do Greenshot, por favor contribua: - O Greenshot está armazenado no sourceforge.net em + O Greenshot está armazenado no GitHub em Ícones de Yusuke Kamiyamane (Biblioteca Fugue, licença "Creative Commons Attribution 3.0") Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuido sob algumas condições. diff --git a/Greenshot/Languages/language-pt-PT.xml b/Greenshot/Languages/language-pt-PT.xml index cd7fb8869..a39bdc7b4 100644 --- a/Greenshot/Languages/language-pt-PT.xml +++ b/Greenshot/Languages/language-pt-PT.xml @@ -3,7 +3,7 @@ Por favor envie erros para Se gostou do Greenshot, por favor contribua: - O Greenshot está armazenado no sourceforge.net em + O Greenshot está armazenado no GitHub em Ícones da colecção Fugue de Yusuke Kamiyamane (Licença "Creative Commons Attribution 3.0") Direitos de Autor (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuído sob algumas condições. diff --git a/Greenshot/Languages/language-ro-RO.xml b/Greenshot/Languages/language-ro-RO.xml index de435b088..11f17a736 100644 --- a/Greenshot/Languages/language-ro-RO.xml +++ b/Greenshot/Languages/language-ro-RO.xml @@ -102,7 +102,7 @@ Detalii despre licența GNU General Public License: Pictograme din setul de icoane Fugue al lui Yusuke Kamiyamane (Creative Commons Attribution 3.0 license) - Greenshot e hostat de sourceforge.net la + Greenshot e hostat de GitHub la Raportați bug-uri la diff --git a/Greenshot/Languages/language-ru-RU.xml b/Greenshot/Languages/language-ru-RU.xml index 7506dae8b..b7df2b940 100644 --- a/Greenshot/Languages/language-ru-RU.xml +++ b/Greenshot/Languages/language-ru-RU.xml @@ -3,21 +3,21 @@ Просьба сообщать об ошибках на Если вам нравится Greenshot, вы можете поддержать нас: - Greenshot размещается на sourceforge.net + Greenshot размещается на GitHub Набор иконок Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.Это бесплатная программа и вы можете распространять её на определённых условиях. + Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.Это бесплатная программа и вы можете распространять её на определённых условиях. Подробно о GNU General Public License: О программе Greenshot Русский перевод Андрея Кравцова, http://sapfir.ucoz.ru Greenshot — передовая утилита для получения скриншотов Закрыть - Извините, произошла непредвиденная ошибка. - -Это хорошая новость: Вы можете помочь нам избавиться от неё, отправив сообщение об ошибке. -Посетите URL ниже, создайте новый отчёт об ошибке и вставьте содержимое в текстовое поле. - -Пожалуйста, добавьте значимое резюме и приложите любую информацию, которую вы считаете полезной для воспроизведения проблемы. + Извините, произошла непредвиденная ошибка. + +Это хорошая новость: Вы можете помочь нам избавиться от неё, отправив сообщение об ошибке. +Посетите URL ниже, создайте новый отчёт об ошибке и вставьте содержимое в текстовое поле. + +Пожалуйста, добавьте значимое резюме и приложите любую информацию, которую вы считаете полезной для воспроизведения проблемы. Кроме того, мы были бы весьма признательны, если вы попробуете найти решение этой ошибки, вользовавшись поисковиком. Спасибо:) Ошибка Отмена @@ -168,7 +168,7 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Outlook с текстом Ошибка Экземпляр Greenshot уже запущен. - Не удалось сохранить файл на {0}. + Не удалось сохранить файл на {0}. Проверьте доступность записи в выбраном месте расположения. Файл "{0}" не может быть открыт. Не удалось открыть ссылку '{0}'. @@ -232,22 +232,22 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Захват Internet Explorer Качество JPEG Язык - В определённом шаблоне автоматически будут заменены следующие заполнители: -${YYYY} Год, 4 цифры -${MM} Месяц, 2 цифры -${DD} День, 2 цифры -${hh} Часы, 2 цифры -${mm} Минуты, 2 цифры -${ss} Секунды, 2 цифры -${NUM} Увеличивающееся число, 6 цифр -${title} Заголовок окна -${user} Пользователь Windows -${domain} Домен Windows -${hostname} Имя ПК - -Вы также можете создавать динамичные каталоги Greenshot, используя символ обратную косую черту (\) для отдельных папок и названий файлов. -Пример шаблона: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -Будет создана папка на текущий день, в вашем хранилище по умолчанию, например 2008-06-29.Содержащее имя файла скриншота будет основываться на текущем + В определённом шаблоне автоматически будут заменены следующие заполнители: +${YYYY} Год, 4 цифры +${MM} Месяц, 2 цифры +${DD} День, 2 цифры +${hh} Часы, 2 цифры +${mm} Минуты, 2 цифры +${ss} Секунды, 2 цифры +${NUM} Увеличивающееся число, 6 цифр +${title} Заголовок окна +${user} Пользователь Windows +${domain} Домен Windows +${hostname} Имя ПК + +Вы также можете создавать динамичные каталоги Greenshot, используя символ обратную косую черту (\) для отдельных папок и названий файлов. +Пример шаблона: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +Будет создана папка на текущий день, в вашем хранилище по умолчанию, например 2008-06-29.Содержащее имя файла скриншота будет основываться на текущем времени, например 11_58_32 (плюс расширения, определённые в настройках) Сеть и обновления Выходные данные @@ -283,8 +283,8 @@ ${hostname} Имя ПК Доступна новая версия Greenshot! Вы хотите скачать Greenshot {0}? Пожалуйста, подождите, пока страница в Internet Explorer захватывается... Внимание - Горячие клавиши "{0}" не могут быть зарегистрированы. Эта проблема может быть связана с ещё одним инструментом, использующим те же клавиши! Нужно либо изменить настройки клавиш или деактивировать/изменить программное обеспечение, использующее горячие клавиши. - + Горячие клавиши "{0}" не могут быть зарегистрированы. Эта проблема может быть связана с ещё одним инструментом, использующим те же клавиши! Нужно либо изменить настройки клавиш или деактивировать/изменить программное обеспечение, использующее горячие клавиши. + Все функции Greenshot по-прежнему работают прямо из контекстного меню через значок в трее. Использовать другой цвет Сохранить прозрачность diff --git a/Greenshot/Languages/language-sk-SK.xml b/Greenshot/Languages/language-sk-SK.xml index d8d526216..9691b3d67 100644 --- a/Greenshot/Languages/language-sk-SK.xml +++ b/Greenshot/Languages/language-sk-SK.xml @@ -3,7 +3,7 @@ Prosím oznámte chyby na Ak se vám Greenshot páči, uvítame vašu podporu: - Greenshot je na sourceforge.net + Greenshot je na GitHub Ikony z Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ÚPLNE BEZ ZÁRUKY. Toto je FREE software, a môžete ho distribuovať za určitých podmienok. diff --git a/Greenshot/Languages/language-sr-RS.xml b/Greenshot/Languages/language-sr-RS.xml index ded34237a..24e1af87e 100644 --- a/Greenshot/Languages/language-sr-RS.xml +++ b/Greenshot/Languages/language-sr-RS.xml @@ -3,7 +3,7 @@ Пријавите грешке на: Ако вам се свиђа Гриншот, помозите нам: - Гриншот покреће Сорсфорџ (sourceforge.net): + Гриншот покреће Сорсфорџ (GitHub): Иконе су преузете из пакета „Fugue“ Јусуке Камијамане (лиценца Кријејтив комонс Ауторство 3.0) Ауторска права © 2007–2012 Томас Браун, Џенс Клинџен, Робин Кром Гриншот се издаје БЕЗ ИКАКВЕ ГАРАНЦИЈЕ. Он је бесплатан програм, који можете да делите под одређеним условима. diff --git a/Greenshot/Languages/language-sv-SE.xml b/Greenshot/Languages/language-sv-SE.xml index 27977474b..be5687fc3 100644 --- a/Greenshot/Languages/language-sv-SE.xml +++ b/Greenshot/Languages/language-sv-SE.xml @@ -3,7 +3,7 @@ Var vänlig att rapportera in fel till Om du gillar Greenshot, så är du välkommen att stödja oss: - Greenshots hemsida tillhandahålls av sourceforge.net på + Greenshots hemsida tillhandahålls av GitHub på Ikoner från "Yusuke Kamiyamane's Fugue icon set" (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot lämnar ABSOLUT INGA GARANTIER. Detta är ett gratisprogram, och du får vidaredistribuera programmet under vissa villkor. diff --git a/Greenshot/Languages/language-tr-TR.xml b/Greenshot/Languages/language-tr-TR.xml index 7a4bafa85..a0c8783c3 100644 --- a/Greenshot/Languages/language-tr-TR.xml +++ b/Greenshot/Languages/language-tr-TR.xml @@ -3,7 +3,7 @@ Hataları şu adrese bildirebilirsiniz: Greenshot'ı sevdiyseniz, bizi destekleyin: - Greenshot sourceforge.net üzerinde şu adreste barındırılmaktadır: + Greenshot GitHub üzerinde şu adreste barındırılmaktadır: Simgeler Yusuke Kamiyamane'nin Fugue simge setidir (Creative Commons Attribution 3.0 lisansı) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot HİÇ BİR GARANTİ vermez. Serbest bir yazılımdır ve belirli koşullar altında dağıtmakta serbestsiniz. GNU diff --git a/Greenshot/Languages/language-uk-UA.xml b/Greenshot/Languages/language-uk-UA.xml index 855cf3afa..30ca49fe5 100644 --- a/Greenshot/Languages/language-uk-UA.xml +++ b/Greenshot/Languages/language-uk-UA.xml @@ -3,7 +3,7 @@ Про помилки повідомляйте на Якщо Вам подобається Greenshot, то можете підтримати нас: - Greenshot is розташовується на sourceforge.net + Greenshot is розташовується на GitHub Набір іконок Fugue від Yusuke Kamiyamane (ліцензія Creative Commons Attribution 3.0) Авторство © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot постачається АБСОЛЮТНО БЕЗ ҐАРАНТІЇ. Це вільне програмне забезпечення, Ви можете розповсюджувати його за певних умов. diff --git a/Greenshot/Languages/language-vi-VN.xml b/Greenshot/Languages/language-vi-VN.xml index 6611abd16..f31104799 100644 --- a/Greenshot/Languages/language-vi-VN.xml +++ b/Greenshot/Languages/language-vi-VN.xml @@ -3,7 +3,7 @@ Địa chỉ gửi báo cáo lỗi: Hãy ủng hộ nếu bạn thấy Greenshot hữu dụng: - Greenshot được tài trợ bởi sourceforge.net + Greenshot được tài trợ bởi GitHub Dùng biểu tượng Fugue (Giấy phép Commons Attribution 3.0 license) : Bản quyền (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot không đi kèm theo đảm bảo nào và được phân phối dưới giấy phép GNU General Public License. diff --git a/Greenshot/Languages/language-zh-CN.xml b/Greenshot/Languages/language-zh-CN.xml index 8d1f2fff6..9b6bd73f6 100644 --- a/Greenshot/Languages/language-zh-CN.xml +++ b/Greenshot/Languages/language-zh-CN.xml @@ -3,7 +3,7 @@ 如果发现任何错误,请到以下网址报告 如果您喜欢这个软件,希望您可以捐助我们: - Greenshot 托管在 sourceforge.net + Greenshot 托管在 GitHub 图标来源:Yusuke Kamiyamane的Fugue图标基于(Creative Commons Attribution 3.0 协议) 版权所有 (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom 作者不会对程序进行任何担保。 diff --git a/Greenshot/Languages/language-zh-TW.xml b/Greenshot/Languages/language-zh-TW.xml index 9b2a4f62d..ded5485cb 100644 --- a/Greenshot/Languages/language-zh-TW.xml +++ b/Greenshot/Languages/language-zh-TW.xml @@ -3,7 +3,7 @@ 請回報錯誤到以下網址 如果您喜歡 Greenshot,歡迎您支持我們: - Greenshot 的主機在 sourceforge.net 網址是 + Greenshot 的主機在 GitHub 網址是 圖片來源: Yusuke Kamiyamane's Fugue 圖示集 (Creative Commons Attribution 3.0 授權) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot 不對這個程式做任何擔保。 這個程式是自由軟體,您可以在 GNU General Public License 下任意散佈本軟體。 diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 91f3fcd3b..30b79e745 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index 0c4911ae1..f64b7762d 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index ba532b11c..b44ddd784 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index e4aded8c6..2e4241068 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/IMemento.cs b/Greenshot/Memento/IMemento.cs index 96e8d97d4..c0a28417c 100644 --- a/Greenshot/Memento/IMemento.cs +++ b/Greenshot/Memento/IMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs index 9c8935abc..0fcacbdb6 100644 --- a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs +++ b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index 541b4c06e..0f954e58c 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Processors/TitleFixProcessor.cs b/Greenshot/Processors/TitleFixProcessor.cs index d20798db2..bbd3c61be 100644 --- a/Greenshot/Processors/TitleFixProcessor.cs +++ b/Greenshot/Processors/TitleFixProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxConfiguration.cs b/GreenshotBoxPlugin/BoxConfiguration.cs index b75a3c2ae..5c42cb1a5 100644 --- a/GreenshotBoxPlugin/BoxConfiguration.cs +++ b/GreenshotBoxPlugin/BoxConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxCredentials.cs b/GreenshotBoxPlugin/BoxCredentials.cs index 5d70729ed..bff044e9f 100644 --- a/GreenshotBoxPlugin/BoxCredentials.cs +++ b/GreenshotBoxPlugin/BoxCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxDestination.cs b/GreenshotBoxPlugin/BoxDestination.cs index 6e2606fbd..653f92ffa 100644 --- a/GreenshotBoxPlugin/BoxDestination.cs +++ b/GreenshotBoxPlugin/BoxDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxEntities.cs b/GreenshotBoxPlugin/BoxEntities.cs index afc567121..99b51fe7a 100644 --- a/GreenshotBoxPlugin/BoxEntities.cs +++ b/GreenshotBoxPlugin/BoxEntities.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxPlugin.cs b/GreenshotBoxPlugin/BoxPlugin.cs index 717db960e..6131a4654 100644 --- a/GreenshotBoxPlugin/BoxPlugin.cs +++ b/GreenshotBoxPlugin/BoxPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxUtils.cs b/GreenshotBoxPlugin/BoxUtils.cs index e0e1566d5..6737d1c28 100644 --- a/GreenshotBoxPlugin/BoxUtils.cs +++ b/GreenshotBoxPlugin/BoxUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Forms/BoxForm.cs b/GreenshotBoxPlugin/Forms/BoxForm.cs index dc1b5f22f..42de01744 100644 --- a/GreenshotBoxPlugin/Forms/BoxForm.cs +++ b/GreenshotBoxPlugin/Forms/BoxForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs index b91b206a1..88c97a400 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.cs b/GreenshotBoxPlugin/Forms/SettingsForm.cs index 07b32373d..fc2524f60 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/LanguageKeys.cs b/GreenshotBoxPlugin/LanguageKeys.cs index ac3765582..cade07532 100644 --- a/GreenshotBoxPlugin/LanguageKeys.cs +++ b/GreenshotBoxPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs index 4dbee7804..413f7d5fe 100644 --- a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 05651949d..b6852fcdb 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs index b8745054e..a57c52591 100644 --- a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs +++ b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 10e212d5e..0f52ceb9b 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluencePlugin.cs b/GreenshotConfluencePlugin/ConfluencePlugin.cs index 9a3e459c7..c8a86ec20 100644 --- a/GreenshotConfluencePlugin/ConfluencePlugin.cs +++ b/GreenshotConfluencePlugin/ConfluencePlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index 3ffafbfd6..d216f6028 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index 102bf6732..e98f85aac 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index 63b72292d..889b5f665 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index a8ddec0dd..1b161d7d9 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index 3c816a2f9..400d20d42 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index b639a5f98..71ffe073e 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index 3c3d9442e..ea3732328 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/LanguageKeys.cs b/GreenshotConfluencePlugin/LanguageKeys.cs index 3936ac398..dd199103d 100644 --- a/GreenshotConfluencePlugin/LanguageKeys.cs +++ b/GreenshotConfluencePlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs index b9720505b..e3889aea4 100644 --- a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropBoxCredentials.cs b/GreenshotDropboxPlugin/DropBoxCredentials.cs index bd6f17366..51f497b7d 100644 --- a/GreenshotDropboxPlugin/DropBoxCredentials.cs +++ b/GreenshotDropboxPlugin/DropBoxCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index c4f79732f..16be2bd05 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index 772545395..0deace234 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs index 090fdccbf..2d75754ad 100644 --- a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs +++ b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxUtils.cs b/GreenshotDropboxPlugin/DropboxUtils.cs index 126a41cd3..66e0f15b8 100644 --- a/GreenshotDropboxPlugin/DropboxUtils.cs +++ b/GreenshotDropboxPlugin/DropboxUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Forms/DropboxForm.cs b/GreenshotDropboxPlugin/Forms/DropboxForm.cs index b2c87ec61..62d219a01 100644 --- a/GreenshotDropboxPlugin/Forms/DropboxForm.cs +++ b/GreenshotDropboxPlugin/Forms/DropboxForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs index 2549c2018..3e8226dc9 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2011 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.cs index 280ded7f1..e0157343a 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/LanguageKeys.cs b/GreenshotDropboxPlugin/LanguageKeys.cs index daa6fb14c..de9325019 100644 --- a/GreenshotDropboxPlugin/LanguageKeys.cs +++ b/GreenshotDropboxPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs index 67d20ede5..a7905990f 100644 --- a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index f83bc9370..4e64daf5d 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index ee13f6eee..1c4ec1469 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs index 29441232a..c8d5f0a89 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index 9531b0066..462722e8b 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs index 812fd723c..39543feca 100644 --- a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs index c0a9d3043..28ad2552a 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 247e38b59..0c95b7a44 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs index 96efa4063..d655815e0 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index ae9d4b030..bd9c7f8db 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrConfiguration.cs b/GreenshotFlickrPlugin/FlickrConfiguration.cs index 94e767698..6c784dc9d 100644 --- a/GreenshotFlickrPlugin/FlickrConfiguration.cs +++ b/GreenshotFlickrPlugin/FlickrConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrCredentials.cs b/GreenshotFlickrPlugin/FlickrCredentials.cs index 75d888219..74f57c320 100644 --- a/GreenshotFlickrPlugin/FlickrCredentials.cs +++ b/GreenshotFlickrPlugin/FlickrCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrDestination.cs b/GreenshotFlickrPlugin/FlickrDestination.cs index 7155937aa..4d0c19c07 100644 --- a/GreenshotFlickrPlugin/FlickrDestination.cs +++ b/GreenshotFlickrPlugin/FlickrDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrPlugin.cs b/GreenshotFlickrPlugin/FlickrPlugin.cs index ba6210b6e..f6d06f15d 100644 --- a/GreenshotFlickrPlugin/FlickrPlugin.cs +++ b/GreenshotFlickrPlugin/FlickrPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrUtils.cs b/GreenshotFlickrPlugin/FlickrUtils.cs index 8737f85e0..3a4502353 100644 --- a/GreenshotFlickrPlugin/FlickrUtils.cs +++ b/GreenshotFlickrPlugin/FlickrUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Forms/FlickrForm.cs b/GreenshotFlickrPlugin/Forms/FlickrForm.cs index 59358436e..63951c68b 100644 --- a/GreenshotFlickrPlugin/Forms/FlickrForm.cs +++ b/GreenshotFlickrPlugin/Forms/FlickrForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs index 3f47f6b31..7da57baf1 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.cs index 0835e2ea5..45dcebbae 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/LanguageKeys.cs b/GreenshotFlickrPlugin/LanguageKeys.cs index 63849aa3c..52c96b7f1 100644 --- a/GreenshotFlickrPlugin/LanguageKeys.cs +++ b/GreenshotFlickrPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs index 810171a92..47e084756 100644 --- a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/ImgurForm.cs b/GreenshotImgurPlugin/Forms/ImgurForm.cs index d476f9313..5a6c59a0b 100644 --- a/GreenshotImgurPlugin/Forms/ImgurForm.cs +++ b/GreenshotImgurPlugin/Forms/ImgurForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs index f3d3d221f..78350ec53 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index 064fcc21f..b18a44f8f 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs index c24d1f67d..59c12786a 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index 8a35fc06e..79c3faaca 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 104839352..48bba7c4b 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurCredentials.cs b/GreenshotImgurPlugin/ImgurCredentials.cs index 4eee20fba..8d268154d 100644 --- a/GreenshotImgurPlugin/ImgurCredentials.cs +++ b/GreenshotImgurPlugin/ImgurCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index 9002463f3..cd1349fa2 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index 37e5a3ce8..a39c2326a 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index c5c354eec..65d2c41e7 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index 3bb80e0f8..cb4beaa3b 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/LanguageKeys.cs b/GreenshotImgurPlugin/LanguageKeys.cs index b5d81646e..bfc73e7ec 100644 --- a/GreenshotImgurPlugin/LanguageKeys.cs +++ b/GreenshotImgurPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs index 06afabdf8..9e66e2995 100644 --- a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs index 8b60e5c4c..a749454d0 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 535a039bf..3a35a95de 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/JiraFormBase.cs b/GreenshotJiraPlugin/Forms/JiraFormBase.cs index 6cba807a3..0f9ecdcf0 100644 --- a/GreenshotJiraPlugin/Forms/JiraFormBase.cs +++ b/GreenshotJiraPlugin/Forms/JiraFormBase.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs index ab6257839..0b2132df6 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.cs b/GreenshotJiraPlugin/Forms/SettingsForm.cs index 1ecaecfbf..a08b8fc17 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Jira.cs b/GreenshotJiraPlugin/Jira.cs index cdaaae97a..4f03cb9ad 100644 --- a/GreenshotJiraPlugin/Jira.cs +++ b/GreenshotJiraPlugin/Jira.cs @@ -4,7 +4,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 1ebb03186..8dbdfb471 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index bd443b37e..fcf69899b 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 18e6576b9..045027cf0 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index cd78c4bde..4d43d9ace 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/LanguageKeys.cs b/GreenshotJiraPlugin/LanguageKeys.cs index 0d7a8fefc..a3204ae3e 100644 --- a/GreenshotJiraPlugin/LanguageKeys.cs +++ b/GreenshotJiraPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs index 080ba5f3d..4bf25d8b6 100644 --- a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index af7ef4bb0..73aa72444 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 231786e12..5b0405723 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/ModiInterop.cs b/GreenshotOCRCommand/ModiInterop.cs index a73586172..3f52c2127 100644 --- a/GreenshotOCRCommand/ModiInterop.cs +++ b/GreenshotOCRCommand/ModiInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/Properties/AssemblyInfo.cs b/GreenshotOCRCommand/Properties/AssemblyInfo.cs index 419eb53b6..e2f7a415d 100644 --- a/GreenshotOCRCommand/Properties/AssemblyInfo.cs +++ b/GreenshotOCRCommand/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRConfiguration.cs b/GreenshotOCRPlugin/OCRConfiguration.cs index 87b42f6be..2d67d0d33 100644 --- a/GreenshotOCRPlugin/OCRConfiguration.cs +++ b/GreenshotOCRPlugin/OCRConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRDestination.cs b/GreenshotOCRPlugin/OCRDestination.cs index ac50ad74a..5080678f5 100644 --- a/GreenshotOCRPlugin/OCRDestination.cs +++ b/GreenshotOCRPlugin/OCRDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRForm.cs b/GreenshotOCRPlugin/OCRForm.cs index f6fe326a2..26cb9b274 100644 --- a/GreenshotOCRPlugin/OCRForm.cs +++ b/GreenshotOCRPlugin/OCRForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 8b4440136..60313cbd6 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs index c524510e1..c98d2649d 100644 --- a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/SettingsForm.Designer.cs b/GreenshotOCRPlugin/SettingsForm.Designer.cs index 84a8c1e91..533315915 100644 --- a/GreenshotOCRPlugin/SettingsForm.Designer.cs +++ b/GreenshotOCRPlugin/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index 88b1d029a..dc9cb7052 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs index 1b9e6febb..f634c1072 100644 --- a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs +++ b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs index 9a72feee5..8d57f7f32 100644 --- a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs index 66db19b40..ffbe0be2d 100644 --- a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs index 30a5d3df5..8b911ab86 100644 --- a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs +++ b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/WordDestination.cs b/GreenshotOfficePlugin/Destinations/WordDestination.cs index 202b2ee72..a2da6e2fd 100644 --- a/GreenshotOfficePlugin/Destinations/WordDestination.cs +++ b/GreenshotOfficePlugin/Destinations/WordDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeConfiguration.cs b/GreenshotOfficePlugin/OfficeConfiguration.cs index f89b7f73a..982411901 100644 --- a/GreenshotOfficePlugin/OfficeConfiguration.cs +++ b/GreenshotOfficePlugin/OfficeConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 0a5bfd161..ac4ed4675 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs index f2e419411..3569c2da2 100644 --- a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index 39e0ea13c..03919db89 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs index a8318b6a0..8474e1c4a 100644 --- a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index bd45749e2..c8e72f2b2 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs index 43d122c19..4c5b3b201 100644 --- a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs index b41211cb5..3090c9591 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs index 411ceaf4c..2d1ecd0e7 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs index 904693ddb..1b3e90f2e 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs index 3f1532cef..42a31fa24 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs index 3e5fa215f..681053801 100644 --- a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs index 60ab99216..99433ebb3 100644 --- a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficePlugin.cs b/GreenshotOfficePlugin/OfficePlugin.cs index 234171a74..142b9dee0 100644 --- a/GreenshotOfficePlugin/OfficePlugin.cs +++ b/GreenshotOfficePlugin/OfficePlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs index 79ad89124..203d02cd8 100644 --- a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs index 63f6636c4..c58aa8d20 100644 --- a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs index cb2b9d569..3f8530ed5 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs index 560a29b39..f45492e53 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/LanguageKeys.cs b/GreenshotPhotobucketPlugin/LanguageKeys.cs index 5e6f33437..d240fb14b 100644 --- a/GreenshotPhotobucketPlugin/LanguageKeys.cs +++ b/GreenshotPhotobucketPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs index bd7e20043..1b7d8c829 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs index d03ee597a..1f95aeda1 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs index 68f467c53..5a1976ec1 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs index 9a8fd8843..c23d4a351 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index 63fd3f035..7e9d53a9c 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs index 3030f5059..58d64ed93 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs index d732925da..ca598ebf8 100644 --- a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPicasaPlugin/PicasaCredentials.cs b/GreenshotPicasaPlugin/PicasaCredentials.cs index 83c6059b6..670ef7182 100644 --- a/GreenshotPicasaPlugin/PicasaCredentials.cs +++ b/GreenshotPicasaPlugin/PicasaCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs index 4e50cceda..b7003ce97 100644 --- a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index 17f8baa38..ebbf5fda4 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs index e372f6316..690420195 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index e3d73ac4d..765ae7e22 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index 785fb37ee..66c7273e2 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/FormWithoutActivation.cs b/GreenshotPlugin/Controls/FormWithoutActivation.cs index 2b92989a5..699dcd93f 100644 --- a/GreenshotPlugin/Controls/FormWithoutActivation.cs +++ b/GreenshotPlugin/Controls/FormWithoutActivation.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotButton.cs b/GreenshotPlugin/Controls/GreenshotButton.cs index 530c34a89..64dc6f127 100644 --- a/GreenshotPlugin/Controls/GreenshotButton.cs +++ b/GreenshotPlugin/Controls/GreenshotButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotCheckBox.cs b/GreenshotPlugin/Controls/GreenshotCheckBox.cs index 30aa74712..67d74172f 100644 --- a/GreenshotPlugin/Controls/GreenshotCheckBox.cs +++ b/GreenshotPlugin/Controls/GreenshotCheckBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs index a64a4aabb..fe47b59eb 100644 --- a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs +++ b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotComboBox.cs b/GreenshotPlugin/Controls/GreenshotComboBox.cs index 0fe165061..e304e0f25 100644 --- a/GreenshotPlugin/Controls/GreenshotComboBox.cs +++ b/GreenshotPlugin/Controls/GreenshotComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotForm.cs b/GreenshotPlugin/Controls/GreenshotForm.cs index ab151675a..36a909462 100644 --- a/GreenshotPlugin/Controls/GreenshotForm.cs +++ b/GreenshotPlugin/Controls/GreenshotForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotGroupBox.cs b/GreenshotPlugin/Controls/GreenshotGroupBox.cs index b83ce53c9..6f1ef9f10 100644 --- a/GreenshotPlugin/Controls/GreenshotGroupBox.cs +++ b/GreenshotPlugin/Controls/GreenshotGroupBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotLabel.cs b/GreenshotPlugin/Controls/GreenshotLabel.cs index 813eb7aa5..396977c3b 100644 --- a/GreenshotPlugin/Controls/GreenshotLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotLabel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotRadioButton.cs b/GreenshotPlugin/Controls/GreenshotRadioButton.cs index 9de1d2147..403f939d0 100644 --- a/GreenshotPlugin/Controls/GreenshotRadioButton.cs +++ b/GreenshotPlugin/Controls/GreenshotRadioButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotTabPage.cs b/GreenshotPlugin/Controls/GreenshotTabPage.cs index 9e95517b1..03922b1e2 100644 --- a/GreenshotPlugin/Controls/GreenshotTabPage.cs +++ b/GreenshotPlugin/Controls/GreenshotTabPage.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotTextBox.cs b/GreenshotPlugin/Controls/GreenshotTextBox.cs index 772520bcd..cc599587c 100644 --- a/GreenshotPlugin/Controls/GreenshotTextBox.cs +++ b/GreenshotPlugin/Controls/GreenshotTextBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs index 48301b72d..addc626d2 100644 --- a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs index 3678081f0..e23d981db 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs index 615b9206e..f543ffe83 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs index 2ef417fd9..8629bc6e1 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 706e5316f..f61217c72 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs index e17e9f112..a83c90fa9 100644 --- a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs index 899f78134..0b7ebaf6e 100644 --- a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs index f7d47f4c5..a46972a0d 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index e562b1185..b5cdd8cd1 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs index e5b631849..a66a66e30 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index 63a0c783b..d02d05a8d 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/QualityDialog.Designer.cs b/GreenshotPlugin/Controls/QualityDialog.Designer.cs index 9b7e03fa4..23734de5f 100644 --- a/GreenshotPlugin/Controls/QualityDialog.Designer.cs +++ b/GreenshotPlugin/Controls/QualityDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/QualityDialog.cs b/GreenshotPlugin/Controls/QualityDialog.cs index c601c8e88..81cef1be8 100644 --- a/GreenshotPlugin/Controls/QualityDialog.cs +++ b/GreenshotPlugin/Controls/QualityDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/SaveImageFileDialog.cs b/GreenshotPlugin/Controls/SaveImageFileDialog.cs index bf14f2be0..ac99facbb 100644 --- a/GreenshotPlugin/Controls/SaveImageFileDialog.cs +++ b/GreenshotPlugin/Controls/SaveImageFileDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index 7f5053399..a3cf5de35 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index af74efb41..64acf4f75 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AbstractProcessor.cs b/GreenshotPlugin/Core/AbstractProcessor.cs index c0d22ea18..667bce3f7 100644 --- a/GreenshotPlugin/Core/AbstractProcessor.cs +++ b/GreenshotPlugin/Core/AbstractProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index 914b27733..8613f82f8 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AnimationHelpers.cs b/GreenshotPlugin/Core/AnimationHelpers.cs index fe70fff73..1cdf9547c 100644 --- a/GreenshotPlugin/Core/AnimationHelpers.cs +++ b/GreenshotPlugin/Core/AnimationHelpers.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/BinaryStructHelper.cs b/GreenshotPlugin/Core/BinaryStructHelper.cs index 0a1c64016..0d43679b4 100644 --- a/GreenshotPlugin/Core/BinaryStructHelper.cs +++ b/GreenshotPlugin/Core/BinaryStructHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index 894e389cc..c13f7c9dd 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/CaptureHandler.cs b/GreenshotPlugin/Core/CaptureHandler.cs index 660da5527..da4dfa7ed 100644 --- a/GreenshotPlugin/Core/CaptureHandler.cs +++ b/GreenshotPlugin/Core/CaptureHandler.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7bb88cd61..7b3819836 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -349,7 +349,7 @@ EndSelection:<<<<<<<4 /// /// Helper method to try to get an image in the specified format from the dataObject - /// the DIB readed should solve the issue reported here: https://sourceforge.net/projects/greenshot/forums/forum/676083/topic/6354353/index/page/1 + /// the DIB reader should solve some issues /// It also supports Format17/DibV5, by using the following information: http://stackoverflow.com/a/14335591 /// /// string with the format diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index b5bff9abb..d4a367090 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 539ab244a..31038e3ae 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/DisplayKeyAttribute.cs b/GreenshotPlugin/Core/DisplayKeyAttribute.cs index b7c2d71f5..e66d7acff 100644 --- a/GreenshotPlugin/Core/DisplayKeyAttribute.cs +++ b/GreenshotPlugin/Core/DisplayKeyAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs index 70c45bfb9..567dc4f29 100644 --- a/GreenshotPlugin/Core/Effects.cs +++ b/GreenshotPlugin/Core/Effects.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/EmailConfigHelper.cs b/GreenshotPlugin/Core/EmailConfigHelper.cs index 9f1903897..673b1a9b6 100644 --- a/GreenshotPlugin/Core/EmailConfigHelper.cs +++ b/GreenshotPlugin/Core/EmailConfigHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/EnumExtensions.cs b/GreenshotPlugin/Core/EnumExtensions.cs index 780b59a2c..3f4e605c0 100644 --- a/GreenshotPlugin/Core/EnumExtensions.cs +++ b/GreenshotPlugin/Core/EnumExtensions.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/EventDelay.cs b/GreenshotPlugin/Core/EventDelay.cs index 848d19dd9..db36fba1e 100644 --- a/GreenshotPlugin/Core/EventDelay.cs +++ b/GreenshotPlugin/Core/EventDelay.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ExtensionAttribute.cs b/GreenshotPlugin/Core/ExtensionAttribute.cs index eed21f8ae..69916ac74 100644 --- a/GreenshotPlugin/Core/ExtensionAttribute.cs +++ b/GreenshotPlugin/Core/ExtensionAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index 228e1e4bf..26da6df48 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 30c7b3f59..6fb51b764 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/GreenshotResources.cs b/GreenshotPlugin/Core/GreenshotResources.cs index 701786e80..8244775de 100644 --- a/GreenshotPlugin/Core/GreenshotResources.cs +++ b/GreenshotPlugin/Core/GreenshotResources.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/IEHelper.cs b/GreenshotPlugin/Core/IEHelper.cs index 0aa8db457..43bffff57 100644 --- a/GreenshotPlugin/Core/IEHelper.cs +++ b/GreenshotPlugin/Core/IEHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 86abd0dab..f5998b0c3 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 9b961b0f3..0f98ae73e 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/InterfaceUtils.cs b/GreenshotPlugin/Core/InterfaceUtils.cs index 0b02a9103..0e3e7044a 100644 --- a/GreenshotPlugin/Core/InterfaceUtils.cs +++ b/GreenshotPlugin/Core/InterfaceUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index e897c6a66..44790752a 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 253493f58..11172bd92 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index dc816eab7..30e3ec020 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index 110736f5e..f7adc99fd 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Objects.cs b/GreenshotPlugin/Core/Objects.cs index 4589b9b01..3727d4ef9 100644 --- a/GreenshotPlugin/Core/Objects.cs +++ b/GreenshotPlugin/Core/Objects.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 122fbc150..645904e5f 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index d9bfa1713..e7c03c7c1 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/SourceForgeHelper.cs b/GreenshotPlugin/Core/RssHelper.cs similarity index 68% rename from GreenshotPlugin/Core/SourceForgeHelper.cs rename to GreenshotPlugin/Core/RssHelper.cs index 3a027cbbb..f2293b6dd 100644 --- a/GreenshotPlugin/Core/SourceForgeHelper.cs +++ b/GreenshotPlugin/Core/RssHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -28,7 +28,7 @@ using System.Xml; using log4net; namespace GreenshotPlugin.Core { - public class SourceforgeFile { + public class RssFile { private readonly string _file; public string File { get {return _file;} @@ -41,10 +41,6 @@ namespace GreenshotPlugin.Core { public string Link { get {return _link;} } - private readonly string _directLink; - public string DirectLink { - get {return _directLink;} - } private Version _version; public Version Version { get {return _version;} @@ -85,18 +81,21 @@ namespace GreenshotPlugin.Core { } } - public SourceforgeFile(string file, string pubdate, string link, string directLink) { - this._file = file; - DateTime.TryParse(pubdate, out _pubdate); - this._link = link; - this._directLink = directLink; + public RssFile(string file, string pubdate, string link) { + _file = file; + if (!DateTime.TryParse(pubdate, out _pubdate)) + { + DateTime.TryParseExact(pubdate.Replace(" UT", ""), "ddd, dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out _pubdate); + } + _link = link; } } + /// - /// Description of SourceForgeHelper. + /// Description of RssHelper. /// - public class SourceForgeHelper { - private static ILog LOG = LogManager.GetLogger(typeof(SourceForgeHelper)); + public class RssHelper { + private static ILog LOG = LogManager.GetLogger(typeof(RssHelper)); private const string RSSFEED = "http://getgreenshot.org/project-feed/"; /// @@ -118,8 +117,8 @@ namespace GreenshotPlugin.Core { /// /// Read the Greenshot RSS feed, so we can use this information to check for updates /// - /// Dictionary> with files and their RssFile "description" - public static Dictionary> readRSS() { + /// List with RssFile(s) + public static IList readRSS() { XmlDocument rssDoc = new XmlDocument(); try { HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(RSSFEED); @@ -163,7 +162,7 @@ namespace GreenshotPlugin.Core { return null; } - Dictionary> rssFiles = new Dictionary>(); + IList rssFiles = new List(); // Loop for the , <link>, <description> and all the other tags for (int i = 0; i < nodeChannel.ChildNodes.Count; i++) { @@ -171,26 +170,14 @@ namespace GreenshotPlugin.Core { if (nodeChannel.ChildNodes[i].Name == "item") { XmlNode nodeItem = nodeChannel.ChildNodes[i]; - string sfLink = nodeItem["link"].InnerText; + string link = nodeItem["link"].InnerText; string pubdate = nodeItem["pubDate"].InnerText; try { - Match match= Regex.Match(Uri.UnescapeDataString(sfLink), @"^http.*sourceforge.*\/projects\/([^\/]+)\/files\/([^\/]+)\/([^\/]+)\/(.+)\/download$"); + Match match= Regex.Match(Uri.UnescapeDataString(link), @"^.*\/(Greenshot.+)\/download$"); if (match.Success) { - string project = match.Groups[1].Value; - string subdir = match.Groups[2].Value; - string type = match.Groups[3].Value; - string file = match.Groups[4].Value; - // !!! Change this to the mirror !!! - string mirror = "kent"; - string directLink = Uri.EscapeUriString("http://"+mirror+".dl.sourceforge.net/project/"+project+"/"+subdir+"/"+type+"/"+file); - Dictionary<string, SourceforgeFile> filesForType; - if (rssFiles.ContainsKey(type)) { - filesForType = rssFiles[type]; - } else { - filesForType = new Dictionary<string, SourceforgeFile>(); - rssFiles.Add(type, filesForType); - } - SourceforgeFile rssFile = new SourceforgeFile(file, pubdate, sfLink, directLink); + string file = match.Groups[1].Value; + + RssFile rssFile = new RssFile(file, pubdate, link); if (file.EndsWith(".exe") ||file.EndsWith(".zip")) { string version = Regex.Replace(file, @".*[a-zA-Z_]\-", ""); version = version.Replace(@"\-[a-zA-Z]+.*",""); @@ -209,16 +196,8 @@ namespace GreenshotPlugin.Core { LOG.DebugFormat("Found invalid version {0} in file {1}", version, file); } } - } else if (type.Equals("Translations")) { - string culture = Regex.Replace(file, @"[a-zA-Z]+-(..-..)\.(xml|html)", "$1"); - try { - //CultureInfo cultureInfo = new CultureInfo(culture); - rssFile.Language = culture;//cultureInfo.NativeName; - } catch (Exception) { - LOG.WarnFormat("Can't read the native name of the culture {0}", culture); - } + rssFiles.Add(rssFile); } - filesForType.Add(file, rssFile); } } catch (Exception ex) { LOG.WarnFormat("Couldn't read RSS entry for: {0}", nodeChannel["title"].InnerText); diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index 9cbec97b4..4414e05c0 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index 733aa12f0..df217342e 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 4b69f88ad..71f930686 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs index f1caf717c..e5954ddda 100644 --- a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs +++ b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 917a12654..d4da13521 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -180,7 +180,7 @@ <Compile Include="Core\Objects.cs" /> <Compile Include="Core\PluginUtils.cs" /> <Compile Include="Core\QuantizerHelper.cs" /> - <Compile Include="Core\SourceForgeHelper.cs" /> + <Compile Include="Core\RssHelper.cs" /> <Compile Include="Core\WindowCapture.cs" /> <Compile Include="Core\WindowsHelper.cs" /> <Compile Include="IniFile\IniAttributes.cs" /> diff --git a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs index eb5b399e2..107027365 100644 --- a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs index 0bab7edf0..089b9bb58 100644 --- a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument.cs b/GreenshotPlugin/IEInterop/IHTMLDocument.cs index 176b66fea..ddbcdfe8a 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs index a7a2e26e4..ae7a7c8eb 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs index 8d4825044..f164237e3 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs index 2ee041264..b84d0d871 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs index 10c603d7d..99c4c26a3 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElement.cs b/GreenshotPlugin/IEInterop/IHTMLElement.cs index 5bdf3bf6f..003f4b034 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElement2.cs b/GreenshotPlugin/IEInterop/IHTMLElement2.cs index 44a278179..e5b5231bc 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs index 3a393c69c..fdd216e5d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs index a41922c14..f520a59df 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs index 07c2fab8a..75c5c44d6 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLRect.cs b/GreenshotPlugin/IEInterop/IHTMLRect.cs index 943081b03..f894fe67b 100644 --- a/GreenshotPlugin/IEInterop/IHTMLRect.cs +++ b/GreenshotPlugin/IEInterop/IHTMLRect.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen.cs b/GreenshotPlugin/IEInterop/IHTMLScreen.cs index f51807b0d..4ebff42f0 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs index 459aeb741..4412f5e55 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs index 43fb5434c..d7fe06570 100644 --- a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs +++ b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLStyle.cs b/GreenshotPlugin/IEInterop/IHTMLStyle.cs index 31433a84c..a604203e9 100644 --- a/GreenshotPlugin/IEInterop/IHTMLStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLStyle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs index 21e2997b8..c198ef772 100644 --- a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs +++ b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs index 16e1fd9cc..42f03dc63 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs index 0fb76e227..ab8732654 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs index 276f2bc73..6e06bd75f 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IWebBrowser2.cs b/GreenshotPlugin/IEInterop/IWebBrowser2.cs index 00abda678..40eff770b 100644 --- a/GreenshotPlugin/IEInterop/IWebBrowser2.cs +++ b/GreenshotPlugin/IEInterop/IWebBrowser2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniAttributes.cs b/GreenshotPlugin/IniFile/IniAttributes.cs index a885bb7e1..01b119404 100644 --- a/GreenshotPlugin/IniFile/IniAttributes.cs +++ b/GreenshotPlugin/IniFile/IniAttributes.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index a6bbfca12..c00b5bae0 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniReader.cs b/GreenshotPlugin/IniFile/IniReader.cs index 3447bf9db..fbaea2680 100644 --- a/GreenshotPlugin/IniFile/IniReader.cs +++ b/GreenshotPlugin/IniFile/IniReader.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniSection.cs b/GreenshotPlugin/IniFile/IniSection.cs index 40aba49f9..cf29ab2d7 100644 --- a/GreenshotPlugin/IniFile/IniSection.cs +++ b/GreenshotPlugin/IniFile/IniSection.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index c7fe99d01..70d9b1bb6 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Capture.cs b/GreenshotPlugin/Interfaces/Capture.cs index 3ac0d0a15..c8170ceb9 100644 --- a/GreenshotPlugin/Interfaces/Capture.cs +++ b/GreenshotPlugin/Interfaces/Capture.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index 7be49e852..e2a253a49 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs index 8c49e4e2d..1f589e41c 100644 --- a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs +++ b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 73e6c2cf6..e21141206 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index e7da7eb9a..4da036457 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/IProcessor.cs b/GreenshotPlugin/Interfaces/IProcessor.cs index 40737888f..131e4ab6b 100644 --- a/GreenshotPlugin/Interfaces/IProcessor.cs +++ b/GreenshotPlugin/Interfaces/IProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index b21963bf2..5416aa294 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 49c3e1d8d..98bda9f1c 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/ComProgIdAttribute.cs b/GreenshotPlugin/Interop/ComProgIdAttribute.cs index c2d9e1434..31fd60f2e 100644 --- a/GreenshotPlugin/Interop/ComProgIdAttribute.cs +++ b/GreenshotPlugin/Interop/ComProgIdAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IAppVisibility.cs b/GreenshotPlugin/Interop/IAppVisibility.cs index edcfcf915..97e052037 100644 --- a/GreenshotPlugin/Interop/IAppVisibility.cs +++ b/GreenshotPlugin/Interop/IAppVisibility.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IDispatch.cs b/GreenshotPlugin/Interop/IDispatch.cs index e83bc4488..bd3b5aabf 100644 --- a/GreenshotPlugin/Interop/IDispatch.cs +++ b/GreenshotPlugin/Interop/IDispatch.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IOleCommandTarget.cs b/GreenshotPlugin/Interop/IOleCommandTarget.cs index 6dc6deb28..8a2f7d45f 100644 --- a/GreenshotPlugin/Interop/IOleCommandTarget.cs +++ b/GreenshotPlugin/Interop/IOleCommandTarget.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IOleWindow.cs b/GreenshotPlugin/Interop/IOleWindow.cs index b34945312..ba2105f17 100644 --- a/GreenshotPlugin/Interop/IOleWindow.cs +++ b/GreenshotPlugin/Interop/IOleWindow.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IServiceProvider.cs b/GreenshotPlugin/Interop/IServiceProvider.cs index 1152fa7b8..207d02d55 100644 --- a/GreenshotPlugin/Interop/IServiceProvider.cs +++ b/GreenshotPlugin/Interop/IServiceProvider.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IUnknown.cs b/GreenshotPlugin/Interop/IUnknown.cs index 8f19c9beb..a13d15287 100644 --- a/GreenshotPlugin/Interop/IUnknown.cs +++ b/GreenshotPlugin/Interop/IUnknown.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Properties/AssemblyInfo.cs b/GreenshotPlugin/Properties/AssemblyInfo.cs index f4e66e2f6..3fa090e3b 100644 --- a/GreenshotPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/DWM.cs b/GreenshotPlugin/UnmanagedHelpers/DWM.cs index 7a5c77b72..8488ea45d 100644 --- a/GreenshotPlugin/UnmanagedHelpers/DWM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/DWM.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index 9a3fbbaf4..6a3bd273f 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index 2d12a4a81..dd225e914 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs index dd446b425..b4feab39b 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs index 677e1a0f4..e72bf53ba 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs index 1d20744d2..9e0bdba0b 100644 --- a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs +++ b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index 945c3b292..8d807a4c1 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index e0e3cadcb..82037faba 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index 416a38823..a526daf65 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index 23c9085f8..f6614d1b5 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs index 2ad24e99c..be2451c21 100644 --- a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 From 2599ff5b7c72af98cc87796a3708133e27b91c8a Mon Sep 17 00:00:00 2001 From: jklingen <jklingen@users.noreply.github.com> Date: Thu, 24 Mar 2016 22:54:16 +0100 Subject: [PATCH 012/170] Revert "Removed most references to SF" --- Greenshot/AssemblyInfo.cs | 2 +- .../Configuration/EditorConfiguration.cs | 2 +- Greenshot/Configuration/LanguageKeys.cs | 2 +- Greenshot/Controls/BindableToolStripButton.cs | 2 +- .../Controls/BindableToolStripComboBox.cs | 2 +- .../BindableToolStripDropDownButton.cs | 2 +- Greenshot/Controls/ColorButton.cs | 2 +- ...ontextMenuToolStripProfessionalRenderer.cs | 2 +- .../CustomToolStripProfessionalRenderer.cs | 2 +- Greenshot/Controls/FontFamilyComboBox.cs | 2 +- Greenshot/Controls/MenuStripEx.cs | 2 +- Greenshot/Controls/NonJumpingPanel.cs | 2 +- Greenshot/Controls/Pipette.cs | 2 +- Greenshot/Controls/ToolStripColorButton.cs | 2 +- Greenshot/Controls/ToolStripEx.cs | 2 +- Greenshot/Controls/ToolStripNumericUpDown.cs | 2 +- .../Destinations/ClipboardDestination.cs | 2 +- Greenshot/Destinations/EditorDestination.cs | 2 +- Greenshot/Destinations/EmailDestination.cs | 2 +- Greenshot/Destinations/FileDestination.cs | 2 +- .../Destinations/FileWithDialogDestination.cs | 2 +- Greenshot/Destinations/PickerDestination.cs | 2 +- Greenshot/Destinations/PrinterDestination.cs | 2 +- Greenshot/Drawing/ArrowContainer.cs | 2 +- Greenshot/Drawing/CropContainer.cs | 2 +- Greenshot/Drawing/CursorContainer.cs | 2 +- Greenshot/Drawing/DrawableContainer.cs | 2 +- Greenshot/Drawing/DrawableContainerList.cs | 2 +- Greenshot/Drawing/EllipseContainer.cs | 2 +- .../Drawing/Fields/AbstractFieldHolder.cs | 2 +- .../Fields/AbstractFieldHolderWithChildren.cs | 2 +- .../Binding/AbstractBindingConverter.cs | 2 +- .../Fields/Binding/BidirectionalBinding.cs | 2 +- .../DecimalDoublePercentageConverter.cs | 2 +- .../Fields/Binding/DecimalFloatConverter.cs | 2 +- .../Fields/Binding/DecimalIntConverter.cs | 2 +- .../Fields/Binding/IBindingConverter.cs | 2 +- .../Fields/Binding/IBindingValidator.cs | 2 +- .../Fields/Binding/NotNullValidator.cs | 2 +- Greenshot/Drawing/Fields/Field.cs | 2 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 +- Greenshot/Drawing/Fields/FieldType.cs | 2 +- Greenshot/Drawing/Fields/IFieldHolder.cs | 2 +- Greenshot/Drawing/FilterContainer.cs | 2 +- Greenshot/Drawing/Filters/AbstractFilter.cs | 2 +- Greenshot/Drawing/Filters/BlurFilter.cs | 2 +- Greenshot/Drawing/Filters/BrightnessFilter.cs | 2 +- Greenshot/Drawing/Filters/GrayscaleFilter.cs | 2 +- Greenshot/Drawing/Filters/HighlightFilter.cs | 2 +- Greenshot/Drawing/Filters/IFilter.cs | 2 +- Greenshot/Drawing/Filters/MagnifierFilter.cs | 2 +- .../Drawing/Filters/PixelizationFilter.cs | 2 +- Greenshot/Drawing/FreehandContainer.cs | 2 +- Greenshot/Drawing/Gripper.cs | 2 +- Greenshot/Drawing/HighlightContainer.cs | 2 +- Greenshot/Drawing/IconContainer.cs | 2 +- Greenshot/Drawing/ImageContainer.cs | 2 +- Greenshot/Drawing/LineContainer.cs | 2 +- Greenshot/Drawing/ObfuscateContainer.cs | 2 +- Greenshot/Drawing/RectangleContainer.cs | 2 +- Greenshot/Drawing/RoundedRectangle.cs | 2 +- Greenshot/Drawing/SpeechbubbleContainer.cs | 2 +- Greenshot/Drawing/StepLabelContainer.cs | 2 +- Greenshot/Drawing/Surface.cs | 2 +- Greenshot/Drawing/TextContainer.cs | 2 +- Greenshot/Forms/AboutForm.Designer.cs | 4 +- Greenshot/Forms/AboutForm.cs | 2 +- Greenshot/Forms/AnimatingBaseForm.cs | 2 +- Greenshot/Forms/BaseForm.cs | 2 +- Greenshot/Forms/BugReportForm.Designer.cs | 2 +- Greenshot/Forms/BugReportForm.cs | 2 +- Greenshot/Forms/CaptureForm.Designer.cs | 2 +- Greenshot/Forms/CaptureForm.cs | 2 +- Greenshot/Forms/ColorDialog.Designer.cs | 2 +- Greenshot/Forms/ColorDialog.cs | 2 +- .../Forms/DropShadowSettingsForm.Designer.cs | 2 +- Greenshot/Forms/DropShadowSettingsForm.cs | 2 +- Greenshot/Forms/ImageEditorForm.Designer.cs | 2 +- Greenshot/Forms/ImageEditorForm.cs | 2 +- Greenshot/Forms/LanguageDialog.Designer.cs | 2 +- Greenshot/Forms/LanguageDialog.cs | 2 +- Greenshot/Forms/MainForm.Designer.cs | 2 +- Greenshot/Forms/MainForm.cs | 2 +- Greenshot/Forms/MovableShowColorForm.cs | 2 +- .../Forms/PrintOptionsDialog.Designer.cs | 2 +- Greenshot/Forms/PrintOptionsDialog.cs | 2 +- .../Forms/ResizeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/ResizeSettingsForm.cs | 2 +- Greenshot/Forms/SettingsForm.Designer.cs | 2 +- Greenshot/Forms/SettingsForm.cs | 2 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 2 +- .../Forms/TornEdgeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/TornEdgeSettingsForm.cs | 2 +- Greenshot/GreenshotMain.cs | 2 +- Greenshot/Help/HelpFileLoader.cs | 2 +- Greenshot/Helpers/CaptureHelper.cs | 2 +- Greenshot/Helpers/Colors.cs | 2 +- Greenshot/Helpers/CopyData.cs | 2 +- Greenshot/Helpers/DestinationHelper.cs | 2 +- Greenshot/Helpers/EnvironmentInfo.cs | 2 +- Greenshot/Helpers/GeometryHelper.cs | 2 +- Greenshot/Helpers/GuiRectangle.cs | 2 +- Greenshot/Helpers/IECaptureHelper.cs | 2 +- Greenshot/Helpers/IEInterop/IEContainer.cs | 2 +- Greenshot/Helpers/MailHelper.cs | 2 +- Greenshot/Helpers/PluginHelper.cs | 2 +- Greenshot/Helpers/PrintHelper.cs | 2 +- Greenshot/Helpers/ProcessorHelper.cs | 2 +- Greenshot/Helpers/ScaleHelper.cs | 2 +- Greenshot/Helpers/SoundHelper.cs | 2 +- Greenshot/Helpers/StartupHelper.cs | 2 +- Greenshot/Helpers/ToolStripItemEndisabler.cs | 2 +- Greenshot/Helpers/UpdateHelper.cs | 110 +++++++++++------- Greenshot/Helpers/WindowWrapper.cs | 2 +- Greenshot/Languages/language-ar-SY.xml | 54 ++++----- Greenshot/Languages/language-cs-CZ.xml | 2 +- Greenshot/Languages/language-de-DE.xml | 2 +- Greenshot/Languages/language-el-GR.xml | 2 +- Greenshot/Languages/language-en-US.xml | 2 +- Greenshot/Languages/language-es-ES.xml | 2 +- Greenshot/Languages/language-fi-FI.xml | 2 +- Greenshot/Languages/language-fr-FR.xml | 56 ++++----- Greenshot/Languages/language-fr-QC.xml | 42 +++---- Greenshot/Languages/language-he-IL.xml | 2 +- Greenshot/Languages/language-hu-HU.xml | 54 ++++----- Greenshot/Languages/language-it-IT.xml | 2 +- Greenshot/Languages/language-ja-JP.xml | 2 +- Greenshot/Languages/language-ko-KR.xml | 2 +- Greenshot/Languages/language-lt-LT.xml | 48 ++++---- Greenshot/Languages/language-nl-NL.xml | 2 +- Greenshot/Languages/language-nn-NO.xml | 54 ++++----- Greenshot/Languages/language-pl-PL.xml | 2 +- Greenshot/Languages/language-pt-BR.xml | 2 +- Greenshot/Languages/language-pt-PT.xml | 2 +- Greenshot/Languages/language-ro-RO.xml | 2 +- Greenshot/Languages/language-ru-RU.xml | 56 ++++----- Greenshot/Languages/language-sk-SK.xml | 2 +- Greenshot/Languages/language-sr-RS.xml | 2 +- Greenshot/Languages/language-sv-SE.xml | 2 +- Greenshot/Languages/language-tr-TR.xml | 2 +- Greenshot/Languages/language-uk-UA.xml | 2 +- Greenshot/Languages/language-vi-VN.xml | 2 +- Greenshot/Languages/language-zh-CN.xml | 2 +- Greenshot/Languages/language-zh-TW.xml | 2 +- Greenshot/Memento/AddElementMemento.cs | 2 +- Greenshot/Memento/ChangeFieldHolderMemento.cs | 2 +- Greenshot/Memento/DeleteElementMemento.cs | 2 +- .../DrawableContainerBoundsChangeMemento.cs | 2 +- Greenshot/Memento/IMemento.cs | 2 +- .../Memento/SurfaceBackgroundChangeMemento.cs | 2 +- Greenshot/Memento/TextChangeMemento.cs | 2 +- Greenshot/Processors/TitleFixProcessor.cs | 2 +- GreenshotBoxPlugin/BoxConfiguration.cs | 2 +- GreenshotBoxPlugin/BoxCredentials.cs | 2 +- GreenshotBoxPlugin/BoxDestination.cs | 2 +- GreenshotBoxPlugin/BoxEntities.cs | 2 +- GreenshotBoxPlugin/BoxPlugin.cs | 2 +- GreenshotBoxPlugin/BoxUtils.cs | 2 +- GreenshotBoxPlugin/Forms/BoxForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotBoxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotBoxPlugin/LanguageKeys.cs | 2 +- GreenshotBoxPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotConfluencePlugin/Confluence.cs | 2 +- .../ConfluenceConfiguration.cs | 2 +- .../ConfluenceDestination.cs | 2 +- GreenshotConfluencePlugin/ConfluencePlugin.cs | 2 +- GreenshotConfluencePlugin/ConfluenceUtils.cs | 2 +- GreenshotConfluencePlugin/EnumDisplayer.cs | 2 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 2 +- .../Forms/ConfluencePagePicker.xaml.cs | 2 +- .../Forms/ConfluenceSearch.xaml.cs | 2 +- .../Forms/ConfluenceTreePicker.xaml.cs | 2 +- .../Forms/ConfluenceUpload.xaml.cs | 2 +- GreenshotConfluencePlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotDropboxPlugin/DropBoxCredentials.cs | 2 +- GreenshotDropboxPlugin/DropboxDestination.cs | 2 +- GreenshotDropboxPlugin/DropboxPlugin.cs | 2 +- .../DropboxPluginConfiguration.cs | 2 +- GreenshotDropboxPlugin/DropboxUtils.cs | 2 +- GreenshotDropboxPlugin/Forms/DropboxForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotDropboxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotDropboxPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../ExternalCommandConfiguration.cs | 2 +- .../ExternalCommandDestination.cs | 2 +- .../ExternalCommandForm.cs | 2 +- .../ExternalCommandPlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../SettingsForm.Designer.cs | 2 +- .../SettingsForm.cs | 2 +- .../SettingsFormDetail.Designer.cs | 2 +- .../SettingsFormDetail.cs | 2 +- GreenshotFlickrPlugin/FlickrConfiguration.cs | 2 +- GreenshotFlickrPlugin/FlickrCredentials.cs | 2 +- GreenshotFlickrPlugin/FlickrDestination.cs | 2 +- GreenshotFlickrPlugin/FlickrPlugin.cs | 2 +- GreenshotFlickrPlugin/FlickrUtils.cs | 2 +- GreenshotFlickrPlugin/Forms/FlickrForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotFlickrPlugin/Forms/SettingsForm.cs | 2 +- GreenshotFlickrPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurForm.cs | 2 +- .../Forms/ImgurHistory.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurHistory.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/SettingsForm.cs | 2 +- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 +- GreenshotImgurPlugin/ImgurCredentials.cs | 2 +- GreenshotImgurPlugin/ImgurDestination.cs | 2 +- GreenshotImgurPlugin/ImgurInfo.cs | 2 +- GreenshotImgurPlugin/ImgurPlugin.cs | 2 +- GreenshotImgurPlugin/ImgurUtils.cs | 2 +- GreenshotImgurPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Forms/JiraForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/JiraForm.cs | 2 +- GreenshotJiraPlugin/Forms/JiraFormBase.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.cs | 2 +- GreenshotJiraPlugin/Jira.cs | 2 +- GreenshotJiraPlugin/JiraConfiguration.cs | 2 +- GreenshotJiraPlugin/JiraDestination.cs | 2 +- GreenshotJiraPlugin/JiraPlugin.cs | 2 +- GreenshotJiraPlugin/JiraUtils.cs | 2 +- GreenshotJiraPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotOCRCommand/COMWrapper.cs | 2 +- GreenshotOCRCommand/ComProgIdAttribute.cs | 2 +- GreenshotOCRCommand/ModiInterop.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/OCRConfiguration.cs | 2 +- GreenshotOCRPlugin/OCRDestination.cs | 2 +- GreenshotOCRPlugin/OCRForm.cs | 2 +- GreenshotOCRPlugin/OCRPlugin.cs | 2 +- GreenshotOCRPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/SettingsForm.Designer.cs | 2 +- GreenshotOCRPlugin/SettingsForm.cs | 2 +- .../Destinations/ExcelDestination.cs | 2 +- .../Destinations/OneNoteDestination.cs | 2 +- .../Destinations/OutlookDestination.cs | 2 +- .../Destinations/PowerpointDestination.cs | 2 +- .../Destinations/WordDestination.cs | 2 +- GreenshotOfficePlugin/OfficeConfiguration.cs | 2 +- .../OfficeExport/ExcelExporter.cs | 2 +- .../OfficeExport/OneNoteExporter.cs | 2 +- .../OfficeExport/OutlookEmailExporter.cs | 2 +- .../OfficeExport/PowerpointExporter.cs | 2 +- .../OfficeExport/WordExporter.cs | 2 +- .../OfficeInterop/ExcelInterop.cs | 2 +- .../OfficeInterop/OfficeInterop.cs | 2 +- .../OfficeInterop/OneNoteInterop.cs | 2 +- .../OfficeInterop/OutlookInterop.cs | 2 +- .../OfficeInterop/OutlookUtils.cs | 2 +- .../OfficeInterop/PowerpointInterop.cs | 2 +- .../OfficeInterop/WordInterop.cs | 2 +- GreenshotOfficePlugin/OfficePlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Forms/PhotobucketForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- .../Forms/SettingsForm.cs | 2 +- GreenshotPhotobucketPlugin/LanguageKeys.cs | 2 +- .../PhotobucketConfiguration.cs | 2 +- .../PhotobucketCredentials.cs | 2 +- .../PhotobucketDestination.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketInfo.cs | 2 +- .../PhotobucketPlugin.cs | 2 +- .../PhotobucketUtils.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotPicasaPlugin/PicasaCredentials.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/Controls/AnimatingForm.cs | 2 +- .../Controls/BackgroundForm.Designer.cs | 2 +- GreenshotPlugin/Controls/BackgroundForm.cs | 2 +- .../Controls/ExtendedWebBrowser.cs | 2 +- .../Controls/FormWithoutActivation.cs | 2 +- GreenshotPlugin/Controls/GreenshotButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotCheckBox.cs | 2 +- .../Controls/GreenshotColumnSorter.cs | 2 +- GreenshotPlugin/Controls/GreenshotComboBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotForm.cs | 2 +- GreenshotPlugin/Controls/GreenshotGroupBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotLabel.cs | 2 +- .../Controls/GreenshotRadioButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotTabPage.cs | 2 +- GreenshotPlugin/Controls/GreenshotTextBox.cs | 2 +- .../Controls/GreenshotToolDropDownButton.cs | 2 +- .../Controls/GreenshotToolStripButton.cs | 2 +- .../Controls/GreenshotToolStripLabel.cs | 2 +- .../Controls/GreenshotToolStripMenuItem.cs | 2 +- GreenshotPlugin/Controls/HotkeyControl.cs | 2 +- .../Controls/IGreenshotConfigBindable.cs | 2 +- .../Controls/IGreenshotLanguageBindable.cs | 2 +- .../Controls/OAuthLoginForm.Designer.cs | 2 +- GreenshotPlugin/Controls/OAuthLoginForm.cs | 2 +- .../Controls/PleaseWaitForm.Designer.cs | 2 +- GreenshotPlugin/Controls/PleaseWaitForm.cs | 2 +- .../Controls/QualityDialog.Designer.cs | 2 +- GreenshotPlugin/Controls/QualityDialog.cs | 2 +- .../Controls/SaveImageFileDialog.cs | 2 +- GreenshotPlugin/Controls/ThumbnailForm.cs | 2 +- GreenshotPlugin/Core/AbstractDestination.cs | 2 +- GreenshotPlugin/Core/AbstractProcessor.cs | 2 +- GreenshotPlugin/Core/AccessibleHelper.cs | 2 +- GreenshotPlugin/Core/AnimationHelpers.cs | 2 +- GreenshotPlugin/Core/BinaryStructHelper.cs | 2 +- GreenshotPlugin/Core/Cache.cs | 2 +- GreenshotPlugin/Core/CaptureHandler.cs | 2 +- GreenshotPlugin/Core/ClipboardHelper.cs | 4 +- GreenshotPlugin/Core/CoreConfiguration.cs | 2 +- GreenshotPlugin/Core/CredentialsHelper.cs | 2 +- GreenshotPlugin/Core/DisplayKeyAttribute.cs | 2 +- GreenshotPlugin/Core/Effects.cs | 2 +- GreenshotPlugin/Core/EmailConfigHelper.cs | 2 +- GreenshotPlugin/Core/EnumExtensions.cs | 2 +- GreenshotPlugin/Core/EventDelay.cs | 2 +- GreenshotPlugin/Core/ExtensionAttribute.cs | 2 +- GreenshotPlugin/Core/FastBitmap.cs | 2 +- GreenshotPlugin/Core/FilenameHelper.cs | 2 +- GreenshotPlugin/Core/GreenshotResources.cs | 2 +- GreenshotPlugin/Core/IEHelper.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 2 +- GreenshotPlugin/Core/ImageOutput.cs | 2 +- GreenshotPlugin/Core/InterfaceUtils.cs | 2 +- GreenshotPlugin/Core/Language.cs | 2 +- GreenshotPlugin/Core/LogHelper.cs | 2 +- GreenshotPlugin/Core/NetworkHelper.cs | 2 +- GreenshotPlugin/Core/OAuthHelper.cs | 2 +- GreenshotPlugin/Core/Objects.cs | 2 +- GreenshotPlugin/Core/PluginUtils.cs | 2 +- GreenshotPlugin/Core/QuantizerHelper.cs | 2 +- .../{RssHelper.cs => SourceForgeHelper.cs} | 65 +++++++---- GreenshotPlugin/Core/StringExtensions.cs | 2 +- GreenshotPlugin/Core/WindowCapture.cs | 2 +- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- .../Core/WmInputLangChangeRequestFilter.cs | 2 +- GreenshotPlugin/GreenshotPlugin.csproj | 2 +- GreenshotPlugin/IEInterop/IHTMLBodyElement.cs | 2 +- .../IEInterop/IHTMLCurrentStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument4.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument5.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement2.cs | 2 +- .../IEInterop/IHTMLElementCollection.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLFrameBase.cs | 2 +- .../IEInterop/IHTMLFramesCollection2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLRect.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen2.cs | 2 +- .../IEInterop/IHTMLSelectionObject.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLTxtRange.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow4.cs | 2 +- GreenshotPlugin/IEInterop/IWebBrowser2.cs | 2 +- GreenshotPlugin/IniFile/IniAttributes.cs | 2 +- GreenshotPlugin/IniFile/IniConfig.cs | 2 +- GreenshotPlugin/IniFile/IniReader.cs | 2 +- GreenshotPlugin/IniFile/IniSection.cs | 2 +- GreenshotPlugin/IniFile/IniValue.cs | 2 +- GreenshotPlugin/Interfaces/Capture.cs | 2 +- .../Interfaces/Drawing/Container.cs | 2 +- .../Interfaces/Forms/ImageEditor.cs | 2 +- GreenshotPlugin/Interfaces/Generic.cs | 2 +- GreenshotPlugin/Interfaces/IDestination.cs | 2 +- GreenshotPlugin/Interfaces/IProcessor.cs | 2 +- .../Interfaces/Plugin/PluginInterfaces.cs | 2 +- GreenshotPlugin/Interop/COMWrapper.cs | 2 +- GreenshotPlugin/Interop/ComProgIdAttribute.cs | 2 +- GreenshotPlugin/Interop/IAppVisibility.cs | 2 +- GreenshotPlugin/Interop/IDispatch.cs | 2 +- GreenshotPlugin/Interop/IOleCommandTarget.cs | 2 +- GreenshotPlugin/Interop/IOleWindow.cs | 2 +- GreenshotPlugin/Interop/IServiceProvider.cs | 2 +- GreenshotPlugin/Interop/IUnknown.cs | 2 +- GreenshotPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/DWM.cs | 2 +- .../UnmanagedHelpers/Enumerations.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDIplus.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Kernel32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/PsAPI.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/User32.cs | 2 +- .../UnmanagedHelpers/Win32Errors.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/WinMM.cs | 2 +- 394 files changed, 680 insertions(+), 633 deletions(-) rename GreenshotPlugin/Core/{RssHelper.cs => SourceForgeHelper.cs} (68%) diff --git a/Greenshot/AssemblyInfo.cs b/Greenshot/AssemblyInfo.cs index 8faad06ca..71277cb02 100644 --- a/Greenshot/AssemblyInfo.cs +++ b/Greenshot/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index c74592a8d..4c805e5ce 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs index 240fcd3e8..57b21f268 100644 --- a/Greenshot/Configuration/LanguageKeys.cs +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index 3d2fa28b6..5641a9c27 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs index 0b991e4c6..192e25ecb 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs index a50139e00..d32b2453d 100644 --- a/Greenshot/Controls/BindableToolStripDropDownButton.cs +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index 80e77399c..8eb49f13e 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index a159283b4..6c18554da 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs index 8f7e454af..89260baf3 100644 --- a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs index f25355fb3..410c87402 100644 --- a/Greenshot/Controls/FontFamilyComboBox.cs +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/MenuStripEx.cs b/Greenshot/Controls/MenuStripEx.cs index a4ead03fe..aa880f06e 100644 --- a/Greenshot/Controls/MenuStripEx.cs +++ b/Greenshot/Controls/MenuStripEx.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/NonJumpingPanel.cs b/Greenshot/Controls/NonJumpingPanel.cs index bab51077b..8392b9219 100644 --- a/Greenshot/Controls/NonJumpingPanel.cs +++ b/Greenshot/Controls/NonJumpingPanel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index d54e56d78..6aeccf9b5 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index cbabe38fb..915721248 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/ToolStripEx.cs b/Greenshot/Controls/ToolStripEx.cs index 38e1aa737..3a32224c3 100644 --- a/Greenshot/Controls/ToolStripEx.cs +++ b/Greenshot/Controls/ToolStripEx.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Controls/ToolStripNumericUpDown.cs b/Greenshot/Controls/ToolStripNumericUpDown.cs index 35916c909..376c021d0 100644 --- a/Greenshot/Controls/ToolStripNumericUpDown.cs +++ b/Greenshot/Controls/ToolStripNumericUpDown.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/ClipboardDestination.cs b/Greenshot/Destinations/ClipboardDestination.cs index fecebc33e..25476f64e 100644 --- a/Greenshot/Destinations/ClipboardDestination.cs +++ b/Greenshot/Destinations/ClipboardDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/EditorDestination.cs b/Greenshot/Destinations/EditorDestination.cs index 41cb39bae..0aaed76a2 100644 --- a/Greenshot/Destinations/EditorDestination.cs +++ b/Greenshot/Destinations/EditorDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index 00b5dfc90..b82b233b0 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 149173722..24af9bd1d 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/FileWithDialogDestination.cs b/Greenshot/Destinations/FileWithDialogDestination.cs index 151ba4d97..e14b804b6 100644 --- a/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/Greenshot/Destinations/FileWithDialogDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/PickerDestination.cs b/Greenshot/Destinations/PickerDestination.cs index cd3c68273..7988dea71 100644 --- a/Greenshot/Destinations/PickerDestination.cs +++ b/Greenshot/Destinations/PickerDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index af44cd910..bc4ce8af0 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/ArrowContainer.cs b/Greenshot/Drawing/ArrowContainer.cs index fc39c61d9..f1c65ff53 100644 --- a/Greenshot/Drawing/ArrowContainer.cs +++ b/Greenshot/Drawing/ArrowContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index e7588d7e8..676836f93 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs index fbc37d0b1..3911d5940 100644 --- a/Greenshot/Drawing/CursorContainer.cs +++ b/Greenshot/Drawing/CursorContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 4699375ea..aa4ffce43 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 56dc2b281..570949a40 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs index 3a4651494..caf41824b 100644 --- a/Greenshot/Drawing/EllipseContainer.cs +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 4e0fa10e4..0f8df4937 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index c0754175f..b919edd9b 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs index 684f54716..da43dd6f3 100644 --- a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs index e67f0ee21..21ebeb1ef 100644 --- a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs index d7e92247f..7638c98ee 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs index c2f58fd9d..0d53793ec 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs index 4507f0495..9610e9759 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs index c791fe9b1..82a2129b3 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs index acc9808d6..6edc70f6e 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs index c7e917aa4..06254324f 100644 --- a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs index 7e3e9e3bc..28246a6cc 100644 --- a/Greenshot/Drawing/Fields/Field.cs +++ b/Greenshot/Drawing/Fields/Field.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index c40edc993..1d9e8b6bf 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index f51de36a9..4469f86cf 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Fields/IFieldHolder.cs b/Greenshot/Drawing/Fields/IFieldHolder.cs index 063ca48d7..1fd2952f3 100644 --- a/Greenshot/Drawing/Fields/IFieldHolder.cs +++ b/Greenshot/Drawing/Fields/IFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs index 3793bf5fc..630c5c35d 100644 --- a/Greenshot/Drawing/FilterContainer.cs +++ b/Greenshot/Drawing/FilterContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index d784c5b93..cd1be85a2 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/BlurFilter.cs b/Greenshot/Drawing/Filters/BlurFilter.cs index 0402bd521..1b2e6ab68 100644 --- a/Greenshot/Drawing/Filters/BlurFilter.cs +++ b/Greenshot/Drawing/Filters/BlurFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/BrightnessFilter.cs b/Greenshot/Drawing/Filters/BrightnessFilter.cs index 3e8b0541a..f7d689d52 100644 --- a/Greenshot/Drawing/Filters/BrightnessFilter.cs +++ b/Greenshot/Drawing/Filters/BrightnessFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/GrayscaleFilter.cs b/Greenshot/Drawing/Filters/GrayscaleFilter.cs index d89cd7ec0..a6d0ac83d 100644 --- a/Greenshot/Drawing/Filters/GrayscaleFilter.cs +++ b/Greenshot/Drawing/Filters/GrayscaleFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/HighlightFilter.cs b/Greenshot/Drawing/Filters/HighlightFilter.cs index a9cc5a5a8..896bbff5c 100644 --- a/Greenshot/Drawing/Filters/HighlightFilter.cs +++ b/Greenshot/Drawing/Filters/HighlightFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/IFilter.cs b/Greenshot/Drawing/Filters/IFilter.cs index c5bc7d0ad..5840e9650 100644 --- a/Greenshot/Drawing/Filters/IFilter.cs +++ b/Greenshot/Drawing/Filters/IFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/MagnifierFilter.cs b/Greenshot/Drawing/Filters/MagnifierFilter.cs index f5e96be30..23359546e 100644 --- a/Greenshot/Drawing/Filters/MagnifierFilter.cs +++ b/Greenshot/Drawing/Filters/MagnifierFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Filters/PixelizationFilter.cs b/Greenshot/Drawing/Filters/PixelizationFilter.cs index 53853d7a5..a7f13c096 100644 --- a/Greenshot/Drawing/Filters/PixelizationFilter.cs +++ b/Greenshot/Drawing/Filters/PixelizationFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index 23ea7f408..b30937c2b 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Gripper.cs b/Greenshot/Drawing/Gripper.cs index 52ee5adbf..7a65fc57a 100644 --- a/Greenshot/Drawing/Gripper.cs +++ b/Greenshot/Drawing/Gripper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index 5dc015495..aec48208f 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index e2ab3c27d..86b82a46f 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index 3cec536d2..b9f9c6dc3 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index 1cf4ef4c1..4189134ac 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index fcb6afbca..80f395c31 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index 5bf16de04..c235346c5 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs index b38e48330..51ea777ff 100644 --- a/Greenshot/Drawing/RoundedRectangle.cs +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index b0cdf3f76..64ede51e8 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index e4a1bb337..79583c5ab 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 1eea446cc..b28e2a86f 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index d4c4ec2a0..110c40775 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/AboutForm.Designer.cs b/Greenshot/Forms/AboutForm.Designer.cs index 552a28af1..342d6d734 100644 --- a/Greenshot/Forms/AboutForm.Designer.cs +++ b/Greenshot/Forms/AboutForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 @@ -104,7 +104,7 @@ namespace Greenshot { this.linkLblHost.Size = new System.Drawing.Size(465, 23); this.linkLblHost.TabIndex = 6; this.linkLblHost.TabStop = true; - this.linkLblHost.Text = "https://github.com/greenshot/greenshot"; + this.linkLblHost.Text = "http://sourceforge.net/projects/greenshot/"; this.linkLblHost.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // linkLblBugs diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index 8c11bbf13..64934dea0 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ -* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot +* 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 diff --git a/Greenshot/Forms/AnimatingBaseForm.cs b/Greenshot/Forms/AnimatingBaseForm.cs index a04532165..36d85c2b3 100644 --- a/Greenshot/Forms/AnimatingBaseForm.cs +++ b/Greenshot/Forms/AnimatingBaseForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/BaseForm.cs b/Greenshot/Forms/BaseForm.cs index a230a6615..59293cd1c 100644 --- a/Greenshot/Forms/BaseForm.cs +++ b/Greenshot/Forms/BaseForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/BugReportForm.Designer.cs b/Greenshot/Forms/BugReportForm.Designer.cs index 6debe66ec..f1c5147e0 100644 --- a/Greenshot/Forms/BugReportForm.Designer.cs +++ b/Greenshot/Forms/BugReportForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/BugReportForm.cs b/Greenshot/Forms/BugReportForm.cs index 9683d3243..2f6fb0247 100644 --- a/Greenshot/Forms/BugReportForm.cs +++ b/Greenshot/Forms/BugReportForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/CaptureForm.Designer.cs b/Greenshot/Forms/CaptureForm.Designer.cs index 02f5780f8..72deb4ffd 100644 --- a/Greenshot/Forms/CaptureForm.Designer.cs +++ b/Greenshot/Forms/CaptureForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 4fa200cb9..528cd6515 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ColorDialog.Designer.cs b/Greenshot/Forms/ColorDialog.Designer.cs index bcc813c4b..622a799cc 100644 --- a/Greenshot/Forms/ColorDialog.Designer.cs +++ b/Greenshot/Forms/ColorDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index a8a5d13de..2f630d064 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs index 576162caf..b2fa2d733 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/DropShadowSettingsForm.cs b/Greenshot/Forms/DropShadowSettingsForm.cs index 4e749baf9..1952c6058 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index 26a5f6aa0..01fda903b 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index 71a581ada..c5cc2ddba 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/LanguageDialog.Designer.cs b/Greenshot/Forms/LanguageDialog.Designer.cs index 0c6bdbb97..78d4abd7b 100644 --- a/Greenshot/Forms/LanguageDialog.Designer.cs +++ b/Greenshot/Forms/LanguageDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/LanguageDialog.cs b/Greenshot/Forms/LanguageDialog.cs index 9c6333668..ee0fb7549 100644 --- a/Greenshot/Forms/LanguageDialog.cs +++ b/Greenshot/Forms/LanguageDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/MainForm.Designer.cs b/Greenshot/Forms/MainForm.Designer.cs index f51b3bf87..da54e6cb8 100644 --- a/Greenshot/Forms/MainForm.Designer.cs +++ b/Greenshot/Forms/MainForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 17c2f09ea..784dd6bbf 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/MovableShowColorForm.cs b/Greenshot/Forms/MovableShowColorForm.cs index f2560ba18..6173a4b4e 100644 --- a/Greenshot/Forms/MovableShowColorForm.cs +++ b/Greenshot/Forms/MovableShowColorForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/PrintOptionsDialog.Designer.cs b/Greenshot/Forms/PrintOptionsDialog.Designer.cs index 0f087f50b..321a80873 100644 --- a/Greenshot/Forms/PrintOptionsDialog.Designer.cs +++ b/Greenshot/Forms/PrintOptionsDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/PrintOptionsDialog.cs b/Greenshot/Forms/PrintOptionsDialog.cs index fa585a8a9..1175bf1dc 100644 --- a/Greenshot/Forms/PrintOptionsDialog.cs +++ b/Greenshot/Forms/PrintOptionsDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ResizeSettingsForm.Designer.cs b/Greenshot/Forms/ResizeSettingsForm.Designer.cs index d7003d606..f3cd04f36 100644 --- a/Greenshot/Forms/ResizeSettingsForm.Designer.cs +++ b/Greenshot/Forms/ResizeSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ResizeSettingsForm.cs b/Greenshot/Forms/ResizeSettingsForm.cs index 0956b62b6..db8cac328 100644 --- a/Greenshot/Forms/ResizeSettingsForm.cs +++ b/Greenshot/Forms/ResizeSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/SettingsForm.Designer.cs b/Greenshot/Forms/SettingsForm.Designer.cs index 9a76a3a7a..715d8f24d 100644 --- a/Greenshot/Forms/SettingsForm.Designer.cs +++ b/Greenshot/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 663d8d08c..b64fdfaf0 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index 9d122bed9..ce26dc1d5 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs index 12e1817b1..6263465af 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index d0089a6cc..63bae471a 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/GreenshotMain.cs b/Greenshot/GreenshotMain.cs index 9d018be16..1f5fa562b 100644 --- a/Greenshot/GreenshotMain.cs +++ b/Greenshot/GreenshotMain.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Help/HelpFileLoader.cs b/Greenshot/Help/HelpFileLoader.cs index a8a2365df..c3acda86d 100644 --- a/Greenshot/Help/HelpFileLoader.cs +++ b/Greenshot/Help/HelpFileLoader.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index a1c8f3ae8..301b97c14 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/Colors.cs b/Greenshot/Helpers/Colors.cs index 6f072cd60..0fe637fca 100644 --- a/Greenshot/Helpers/Colors.cs +++ b/Greenshot/Helpers/Colors.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/CopyData.cs b/Greenshot/Helpers/CopyData.cs index c32ca596e..ab695822d 100644 --- a/Greenshot/Helpers/CopyData.cs +++ b/Greenshot/Helpers/CopyData.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index 4ddd7d27e..5d69c99d3 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index 2b7e0d4ed..443fe3321 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/GeometryHelper.cs b/Greenshot/Helpers/GeometryHelper.cs index ea3c626a9..98534a2df 100644 --- a/Greenshot/Helpers/GeometryHelper.cs +++ b/Greenshot/Helpers/GeometryHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/GuiRectangle.cs b/Greenshot/Helpers/GuiRectangle.cs index 6587ec452..d317fa6f4 100644 --- a/Greenshot/Helpers/GuiRectangle.cs +++ b/Greenshot/Helpers/GuiRectangle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index d1cd44b7e..1786106c9 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/IEInterop/IEContainer.cs b/Greenshot/Helpers/IEInterop/IEContainer.cs index 35c04a960..0b5b740bc 100644 --- a/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index 73e8e3bea..4bb549603 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/PluginHelper.cs b/Greenshot/Helpers/PluginHelper.cs index 802d776fd..9062490e3 100644 --- a/Greenshot/Helpers/PluginHelper.cs +++ b/Greenshot/Helpers/PluginHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index 29b1e0eed..ddb42b5b9 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/ProcessorHelper.cs b/Greenshot/Helpers/ProcessorHelper.cs index ee53a76bb..ea5c4bef9 100644 --- a/Greenshot/Helpers/ProcessorHelper.cs +++ b/Greenshot/Helpers/ProcessorHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/ScaleHelper.cs b/Greenshot/Helpers/ScaleHelper.cs index fb43662a5..77557fc73 100644 --- a/Greenshot/Helpers/ScaleHelper.cs +++ b/Greenshot/Helpers/ScaleHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index f3f34aff8..1b84b1907 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/StartupHelper.cs b/Greenshot/Helpers/StartupHelper.cs index b9aa52cce..8c717f56f 100644 --- a/Greenshot/Helpers/StartupHelper.cs +++ b/Greenshot/Helpers/StartupHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/ToolStripItemEndisabler.cs b/Greenshot/Helpers/ToolStripItemEndisabler.cs index 54a2e3418..3fa5cfcd5 100644 --- a/Greenshot/Helpers/ToolStripItemEndisabler.cs +++ b/Greenshot/Helpers/ToolStripItemEndisabler.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Helpers/UpdateHelper.cs b/Greenshot/Helpers/UpdateHelper.cs index 2d2692269..723331d25 100644 --- a/Greenshot/Helpers/UpdateHelper.cs +++ b/Greenshot/Helpers/UpdateHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 @@ -39,7 +39,7 @@ namespace Greenshot.Experimental { private const string STABLE_DOWNLOAD_LINK = "http://getgreenshot.org/downloads/"; private const string VERSION_HISTORY_LINK = "http://getgreenshot.org/version-history/"; private static readonly object LockObject = new object(); - private static RssFile _latestGreenshot; + private static SourceforgeFile _latestGreenshot; private static string _downloadLink = STABLE_DOWNLOAD_LINK; /// <summary> @@ -59,7 +59,7 @@ namespace Greenshot.Experimental { return false; } LOG.DebugFormat("Update check is due, last check was {0} check needs to be made after {1} (which is one {2} later)", conf.LastUpdateCheck, checkTime, conf.UpdateCheckInterval); - if (!RssHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { + if (!SourceForgeHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { LOG.DebugFormat("RSS feed has not been updated since after {0}", conf.LastUpdateCheck); return false; } @@ -114,62 +114,88 @@ namespace Greenshot.Experimental { private static void ProcessRSSInfo(Version currentVersion) { // Reset latest Greenshot - IList<RssFile> rssFiles = RssHelper.readRSS(); + Dictionary<string, Dictionary<string, SourceforgeFile>> rssFiles = SourceForgeHelper.readRSS(); if (rssFiles == null) { return; } // Retrieve the current and latest greenshot - foreach(RssFile rssFile in rssFiles) { - if (rssFile.File.StartsWith("Greenshot")) { - // check for exe - if (!rssFile.isExe) { - continue; - } - - // do we have a version? - if (rssFile.Version == null) { - LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", rssFile.File, rssFile.Pubdate.ToLocalTime(), rssFile.Link); - continue; - } - - // if the file is unstable, we will skip it when: - // the current version is a release or release candidate AND check unstable is turned off. - if (rssFile.isUnstable) { - // Skip if we shouldn't check unstables - if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { + foreach(string fileType in rssFiles.Keys) { + foreach(string file in rssFiles[fileType].Keys) { + SourceforgeFile rssFile = rssFiles[fileType][file]; + if (fileType.StartsWith("Greenshot")) { + // check for exe + if (!rssFile.isExe) { continue; } - } - // if the file is a release candidate, we will skip it when: - // the current version is a release AND check unstable is turned off. - if (rssFile.isReleaseCandidate) { - if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { + // do we have a version? + if (rssFile.Version == null) { + LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", file, rssFile.Pubdate.ToLocalTime(), rssFile.Link); continue; } - } - // Compare versions - int versionCompare = rssFile.Version.CompareTo(currentVersion); - if (versionCompare > 0) { - LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); - if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { - _latestGreenshot = rssFile; - if (rssFile.isReleaseCandidate || rssFile.isUnstable) { - _downloadLink = VERSION_HISTORY_LINK; - } else { - _downloadLink = STABLE_DOWNLOAD_LINK; + // if the file is unstable, we will skip it when: + // the current version is a release or release candidate AND check unstable is turned off. + if (rssFile.isUnstable) { + // Skip if we shouldn't check unstables + if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { + continue; } } - } else if (versionCompare < 0) { - LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); - } else if (versionCompare == 0) { - LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + + // if the file is a release candidate, we will skip it when: + // the current version is a release AND check unstable is turned off. + if (rssFile.isReleaseCandidate) { + if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { + continue; + } + } + + // Compare versions + int versionCompare = rssFile.Version.CompareTo(currentVersion); + if (versionCompare > 0) { + LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", file, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { + _latestGreenshot = rssFile; + if (rssFile.isReleaseCandidate || rssFile.isUnstable) { + _downloadLink = VERSION_HISTORY_LINK; + } else { + _downloadLink = STABLE_DOWNLOAD_LINK; + } + } + } else if (versionCompare < 0) { + LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); + } else if (versionCompare == 0) { + LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", file, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + } } } } + +// // check for language file updates +// // Directory to store the language files +// string languageFilePath = Path.GetDirectoryName(Language.GetInstance().GetHelpFilePath()); +// LOG.DebugFormat("Language file path: {0}", languageFilePath); +// foreach(string fileType in rssFiles.Keys) { +// foreach(string file in rssFiles[fileType].Keys) { +// RssFile rssFile = rssFiles[fileType][file]; +// if (fileType.Equals("Translations")) { +// LOG.DebugFormat("Found translation {0} with language {1} published at {2} : {3}", file, rssFile.Language, rssFile.Pubdate.ToLocalTime(), rssFile.Link); +// string languageFile = Path.Combine(languageFilePath, file); +// if (!File.Exists(languageFile)) { +// LOG.DebugFormat("Found not installed language: {0}", rssFile.Language); +// // Example to download language files +// //string languageFileContent = GreenshotPlugin.Core.NetworkHelper.DownloadFileAsString(new Uri(rssFile.Link), Encoding.UTF8); +// //TextWriter writer = new StreamWriter(languageFile, false, Encoding.UTF8); +// //LOG.InfoFormat("Writing {0}", languageFile); +// //writer.Write(languageFileContent); +// //writer.Close(); +// } +// } +// } +// } } } } diff --git a/Greenshot/Helpers/WindowWrapper.cs b/Greenshot/Helpers/WindowWrapper.cs index e2ce53ab2..c23614482 100644 --- a/Greenshot/Helpers/WindowWrapper.cs +++ b/Greenshot/Helpers/WindowWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Languages/language-ar-SY.xml b/Greenshot/Languages/language-ar-SY.xml index e9d31d52c..35de183f6 100644 --- a/Greenshot/Languages/language-ar-SY.xml +++ b/Greenshot/Languages/language-ar-SY.xml @@ -3,19 +3,19 @@ <resources> <resource name="about_bugs">رجاء بلغ عن الاخطاء الى</resource> <resource name="about_donations">اذا اعجبك البرنامج انت مدعو لدعمنا:</resource> - <resource name="about_host">جرين شوت استضيف بواسطة GitHub في</resource> + <resource name="about_host">جرين شوت استضيف بواسطة sourceforge.net في</resource> <resource name="about_icons">الايقونات بواسطة مجموعة ايقونات يوسوكي كامياماني (تحت رخصة المشاع الإبداعي الاصدار 3.0)</resource> - <resource name="about_license">حقوق النشر © 2007 - 2012 توماس براون, جينس كلنجين, روبين كروم -جرين شوت لا يأتي مع أية ضمان. هذا برنامج حر, مرحبا بك لتعيد توزيعه تحت شروط معينة. + <resource name="about_license">حقوق النشر © 2007 - 2012 توماس براون, جينس كلنجين, روبين كروم +جرين شوت لا يأتي مع أية ضمان. هذا برنامج حر, مرحبا بك لتعيد توزيعه تحت شروط معينة. تفاصيل حول رخصة جنو العمومية:</resource> <resource name="about_title">حول جرين شوت</resource> <resource name="application_title">جرين شوت - الاداة الثورية في تصوير الشاشة</resource> <resource name="bugreport_cancel">إغلاق</resource> - <resource name="bugreport_info">عذرا, حدث خطأ غير متوقع. - الخبر الجيد: انت تستطيع التخلص من هذا عن طريق تعبئة تقرير الاخطاء. - رجاء قم بزيارة الرابط اسفل, انشئ تقرير اخطاء جديد والصق النص من المربع الى الوصف. - - رجاء قم باضافة تلخيص ذو معنى وارفق اية معلومات تعتبرها مفيدة في اكتشاف الخطأ + <resource name="bugreport_info">عذرا, حدث خطأ غير متوقع. + الخبر الجيد: انت تستطيع التخلص من هذا عن طريق تعبئة تقرير الاخطاء. + رجاء قم بزيارة الرابط اسفل, انشئ تقرير اخطاء جديد والصق النص من المربع الى الوصف. + + رجاء قم باضافة تلخيص ذو معنى وارفق اية معلومات تعتبرها مفيدة في اكتشاف الخطأ أيضا, سوف نقدر وبشدة اذا قمت بفحص ما إذا ما قد تم البلاغ عن الخطأ من قبل. شكرا :)</resource> <resource name="bugreport_title">خطأ</resource> <resource name="clipboard_error">خطأ غير متوقع حدث عند المحاولة للكتابة على الذاكرة.</resource> @@ -112,7 +112,7 @@ <resource name="editor_uptotop">إلى الأعلى</resource> <resource name="error">خطأ</resource> <resource name="error_multipleinstances">برنامج جرين شوت يعمل حاليا</resource> - <resource name="error_nowriteaccess">لايمكن حفظ الصورة في {0}. + <resource name="error_nowriteaccess">لايمكن حفظ الصورة في {0}. رجاء تاكد من القدرة على حفظ الملف في هذا المكان.</resource> <resource name="error_openfile">الملف "{0}" لا يمكن فتحه.</resource> <resource name="error_openlink">لا يمكن فتح الوصلة.</resource> @@ -150,22 +150,22 @@ <resource name="settings_jpegquality">JPEG جودة</resource> <resource name="settings_jpegsettings">JPEG اعدادات</resource> <resource name="settings_language">اللغة</resource> - <resource name="settings_message_filenamepattern">سوف يتم استبدال الرموز التالية تلقائيا في النمط المعرف: - -${YYYY} السنة, 4 منازل -${MM} الشهر, منزلتان -${DD} اليوم, منزلتان -${hh} الساعة, منزلتان -${mm} الدقيقة, منزلتان -${ss} الثواني, منزلتان -${NUM} incrementing number, 6 منازل -${title} عنوان النافذة -${user} مستخدم الوندوز -${domain} نطاق وندوز -${hostname} اسم الحاسوب - -بامكانك ايضا جعل جرين شوت ينشئ مجلدات بصورة ديناميكية, ببساطة استخدم رمز (/) لفصل المجلدات واسماء الملفات. -مثال: النمط ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} + <resource name="settings_message_filenamepattern">سوف يتم استبدال الرموز التالية تلقائيا في النمط المعرف: + +${YYYY} السنة, 4 منازل +${MM} الشهر, منزلتان +${DD} اليوم, منزلتان +${hh} الساعة, منزلتان +${mm} الدقيقة, منزلتان +${ss} الثواني, منزلتان +${NUM} incrementing number, 6 منازل +${title} عنوان النافذة +${user} مستخدم الوندوز +${domain} نطاق وندوز +${hostname} اسم الحاسوب + +بامكانك ايضا جعل جرين شوت ينشئ مجلدات بصورة ديناميكية, ببساطة استخدم رمز (/) لفصل المجلدات واسماء الملفات. +مثال: النمط ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} سيولد مجلدا لليوم الحالي في مكان الحفظ الافتراضي, مثلا 28-09-2011, اسم ملف لقطة الشاشة سيكون على اساس الوقت الحالي, مثلا 14_13_15 (مع امتداد الحفظ)</resource> <resource name="settings_output">النتائج</resource> <resource name="settings_playsound">تشغيل صوت عند الالتقاط</resource> @@ -186,8 +186,8 @@ ${hostname} اسم الحاسوب <resource name="settings_waittime">وقت الانتظار بالجزء من الثانية قبل الإلتقاط</resource> <resource name="tooltip_firststart">انقر الزر الايمن هنا أو اضغط مفتاح الطباعة.</resource> <resource name="warning">تحذير</resource> - <resource name="warning_hotkeys">لا يمكن تسجيل اختصار واحد او اكثر. لذلك, قد لا يكون بالامكان استخدام اختصارات جرين شوت. -هذه المشكلة على الاغلب سببها برنامج اخر يدعي استخدام نفس الاختصارات. + <resource name="warning_hotkeys">لا يمكن تسجيل اختصار واحد او اكثر. لذلك, قد لا يكون بالامكان استخدام اختصارات جرين شوت. +هذه المشكلة على الاغلب سببها برنامج اخر يدعي استخدام نفس الاختصارات. رجاء قم بالغاء البرنامج الذي يقوم باستخدام مفتاح الطباعة. يمكنك ايضا استخدام كل ميزات جرين شوت من الايقونة على شريط المهام.</resource> </resources> </language> \ No newline at end of file diff --git a/Greenshot/Languages/language-cs-CZ.xml b/Greenshot/Languages/language-cs-CZ.xml index e6d4abf9b..666896aaf 100644 --- a/Greenshot/Languages/language-cs-CZ.xml +++ b/Greenshot/Languages/language-cs-CZ.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Chyby prosím hlaste na adrese</resource> <resource name="about_donations">Pokud se vám Greenshot líbí, uvítáme Vaší podporu</resource> - <resource name="about_host">Greenshot je hostován na GitHub</resource> + <resource name="about_host">Greenshot je hostován na sourceforge.net</resource> <resource name="about_icons">Ikony pochází ze sady Yusuke Kamiyamane's Fugue (licence Creative Commons Attribution 3.0)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ABSOLUTNĚ BEZ ZÁRUKY. Toto je svobodný software, můžete jej dále šířit za určitých podmínek. diff --git a/Greenshot/Languages/language-de-DE.xml b/Greenshot/Languages/language-de-DE.xml index aba76288a..72806cf78 100644 --- a/Greenshot/Languages/language-de-DE.xml +++ b/Greenshot/Languages/language-de-DE.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Bitte melden Sie Fehler unter</resource> <resource name="about_donations">Wenn Sie Greenshot mögen, können Sie uns gerne unterstützen:</resource> - <resource name="about_host">Greenshot wird von GitHub gehostet unter</resource> + <resource name="about_host">Greenshot wird von sourceforge.net gehostet unter</resource> <resource name="about_icons">Icons aus Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Für Greenshot besteht KEINERLEI GARANTIE. Greenshot ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen. diff --git a/Greenshot/Languages/language-el-GR.xml b/Greenshot/Languages/language-el-GR.xml index ef7c74c5c..bc1684428 100644 --- a/Greenshot/Languages/language-el-GR.xml +++ b/Greenshot/Languages/language-el-GR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Αναφορά προβλημάτων:</resource> <resource name="about_donations">Αν σας αρέσει το Greenshot, είστε ευπρόσδεκτοι να μας υποστηρίξετε:</resource> - <resource name="about_host">Το Greenshot φιλοξενείται από τη GitHub:</resource> + <resource name="about_host">Το Greenshot φιλοξενείται από τη sourceforge.net:</resource> <resource name="about_icons">Εικονίδια από Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Δεν παρέχεται ΚΑΜΙΑ ΕΓΓΥΗΣΗ για το Greenshot. Είναι ελεύθερο λογισμικό. Είστε ελεύθεροι να το αναδιανείμετε κάτω από ορισμένες συνθήκες. diff --git a/Greenshot/Languages/language-en-US.xml b/Greenshot/Languages/language-en-US.xml index 6d5d3dca3..bf75eef36 100644 --- a/Greenshot/Languages/language-en-US.xml +++ b/Greenshot/Languages/language-en-US.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Please report bugs to</resource> <resource name="about_donations">If you like Greenshot, you are welcome to support us:</resource> - <resource name="about_host">Greenshot is hosted by GitHub at</resource> + <resource name="about_host">Greenshot is hosted by sourceforge.net at</resource> <resource name="about_icons">Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-es-ES.xml b/Greenshot/Languages/language-es-ES.xml index f7b22990d..e6f660efc 100644 --- a/Greenshot/Languages/language-es-ES.xml +++ b/Greenshot/Languages/language-es-ES.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Por favor reporta errores a</resource> <resource name="about_donations">Si te gusta Greenshot, te agradeceremos que nos ayudes:</resource> - <resource name="about_host">Greenshot está alojado en GitHub en</resource> + <resource name="about_host">Greenshot está alojado en sourceforge.net en</resource> <resource name="about_icons">Iconos del conjunto de iconos Fugue de Yusuke Kamiyamane(Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene ABSOLUTAMENTE SIN GARANTIA. Este es software gratuito, y eres bienvenido a redistribuirlo bajo ciertas condiciones. diff --git a/Greenshot/Languages/language-fi-FI.xml b/Greenshot/Languages/language-fi-FI.xml index 5a4b02808..8dda90a6c 100644 --- a/Greenshot/Languages/language-fi-FI.xml +++ b/Greenshot/Languages/language-fi-FI.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Raportoi virheet tänne</resource> <resource name="about_donations">Jos pidät Greenshotista niin toivottavasti tuet meitä:</resource> - <resource name="about_host">Greenshot is hosted by GitHub at</resource> + <resource name="about_host">Greenshot is hosted by sourceforge.net at</resource> <resource name="about_icons">Ikonit ovat Yusuke Kamiyamane:n Fugue ikonisarjasta (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-fr-FR.xml b/Greenshot/Languages/language-fr-FR.xml index ab5849d65..b23f64c6f 100644 --- a/Greenshot/Languages/language-fr-FR.xml +++ b/Greenshot/Languages/language-fr-FR.xml @@ -3,20 +3,20 @@ <resources> <resource name="about_bugs">Veuillez rapporter les bogues à</resource> <resource name="about_donations">Si vous aimez Greenshot, vous pouvez nous soutenir :</resource> - <resource name="about_host">Greenshot est hébergé par GitHub à</resource> + <resource name="about_host">Greenshot est hébergé par sourceforge.net à</resource> <resource name="about_icons">Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom -Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. + <resource name="about_license">Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom +Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License :</resource> <resource name="about_title">À propos de Greenshot</resource> <resource name="application_title">Greenshot - l'utilitaire révolutionnaire de capture d'écran</resource> <resource name="bugreport_cancel">Fermer</resource> - <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. - -La bonne nouvelle, c'est que vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. -Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. - -Ajoutez un résumé compréhensible et des informations que vous jugez utiles à la reproduction du problème. + <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. + +La bonne nouvelle, c'est que vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. +Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. + +Ajoutez un résumé compréhensible et des informations que vous jugez utiles à la reproduction du problème. De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si un rapport concernant ce problème existe déjà. (Vous pouvez utiliser l'outil de recherche pour les trouver rapidement.) Merci :)</resource> <resource name="bugreport_title">Erreur</resource> <resource name="CANCEL">Annuler</resource> @@ -180,7 +180,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si <resource name="EmailFormat.OUTLOOK_TXT">Outlook avec texte</resource> <resource name="error">Erreur</resource> <resource name="error_multipleinstances">Une instance de Greenshot est déjà en cours d'exécution.</resource> - <resource name="error_nowriteaccess">Impossible d'enregistrer le fichier vers {0}. + <resource name="error_nowriteaccess">Impossible d'enregistrer le fichier vers {0}. Veuillez vérifier l'accessibilité du répertoire de stockage.</resource> <resource name="error_openfile">Le fichier "{0}" n'a pu être ouvert.</resource> <resource name="error_openlink">Ne peut ouvrir le lien '{0}'.</resource> @@ -246,22 +246,22 @@ Veuillez vérifier l'accessibilité du répertoire de stockage.</resource> <resource name="settings_iecapture">Capture d'Internet Explorer</resource> <resource name="settings_jpegquality">Qualité JPEG</resource> <resource name="settings_language">Langue</resource> - <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre modèle : -${YYYY} année sur 4 chiffres -${MM} mois sur 2 chiffres -${DD} jour sur 2 chiffres -${hh} heure sur 2 chiffres -${mm} minutes sur 2 chiffres -${ss} secondes sur 2 chiffres -${NUM} Incrément sur 6 chiffres -${title} Titre de la fenêtre -${user} Nom d'utilisateur Windows -${domain} Domaine Windows -${hostname} Nom d'hôte du PC - -Vous pouvez aussi laisser Greenshot créer des répertoires dynamiquement, simplement en utilisant la barre oblique inversée (\) pour séparer les répertoires et les fichiers. -Exemple : le modèle ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -créera un répertoire pour le jour en cours dans votre emplacement de stockage par défaut, par exemple 2008-06-29, le nom du fichier contenant la capture d'écran sera basé sur l'heure + <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre modèle : +${YYYY} année sur 4 chiffres +${MM} mois sur 2 chiffres +${DD} jour sur 2 chiffres +${hh} heure sur 2 chiffres +${mm} minutes sur 2 chiffres +${ss} secondes sur 2 chiffres +${NUM} Incrément sur 6 chiffres +${title} Titre de la fenêtre +${user} Nom d'utilisateur Windows +${domain} Domaine Windows +${hostname} Nom d'hôte du PC + +Vous pouvez aussi laisser Greenshot créer des répertoires dynamiquement, simplement en utilisant la barre oblique inversée (\) pour séparer les répertoires et les fichiers. +Exemple : le modèle ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +créera un répertoire pour le jour en cours dans votre emplacement de stockage par défaut, par exemple 2008-06-29, le nom du fichier contenant la capture d'écran sera basé sur l'heure en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres)</resource> <resource name="settings_network">Réseau et mises à jour</resource> <resource name="settings_output">Sortie</resource> @@ -297,8 +297,8 @@ en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres)< <resource name="update_found">Une nouvelle version de Greenshot est disponible ! Voulez-vous télécharger Greenshot {0} ?</resource> <resource name="wait_ie_capture">Veuillez patienter pendant la capture de la page Internet Explorer...</resource> <resource name="warning">Avertissement</resource> - <resource name="warning_hotkeys">Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). - + <resource name="warning_hotkeys">Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). + Toutes les fonctionnalités de Greenshot se lancent aussi directement depuis le menu contextuel de l'icône de la zone de notifications système.</resource> <resource name="WindowCaptureMode.Aero">Utiliser une couleur personnalisée</resource> <resource name="WindowCaptureMode.AeroTransparent">Préserver la transparence</resource> diff --git a/Greenshot/Languages/language-fr-QC.xml b/Greenshot/Languages/language-fr-QC.xml index 78d0309ce..a5209bf89 100644 --- a/Greenshot/Languages/language-fr-QC.xml +++ b/Greenshot/Languages/language-fr-QC.xml @@ -3,18 +3,18 @@ <resources> <resource name="about_bugs">Veuillez rapporter les bogues à</resource> <resource name="about_donations">Si vous aimez Greenshot, vous pouvez nous soutenir :</resource> - <resource name="about_host">Greenshot est hébergé par GitHub à</resource> + <resource name="about_host">Greenshot est hébergé par sourceforge.net à</resource> <resource name="about_icons">Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Copyright © 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. + <resource name="about_license">Copyright © 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License :</resource> <resource name="about_title">A propos de Greenshot</resource> <resource name="application_title">Greenshot - l'utilitaire révolutionnaire de capture d'écran</resource> <resource name="bugreport_cancel">Fermer</resource> - <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. -La bonne nouvelle est la suivante : vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. -Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. -Veuillez y ajouter un résumé compréhensible des informations que vous jugez utiles à la reproduction du problème. + <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. +La bonne nouvelle est la suivante : vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. +Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. +Veuillez y ajouter un résumé compréhensible des informations que vous jugez utiles à la reproduction du problème. De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si un rapport concernant ce problème existe déjà. (Vous pouvez utiliser l'outil de recherche pour les trouver rapidement.) Merci :)</resource> <resource name="bugreport_title">Erreur</resource> <resource name="CANCEL">Annuler</resource> @@ -142,7 +142,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si <resource name="EmailFormat.OUTLOOK_TXT">Outlook avec du text</resource> <resource name="error">Erreur</resource> <resource name="error_multipleinstances">Une instance de Greenshot est déjà en cours d'exécution.</resource> - <resource name="error_nowriteaccess">Impossible de sauvegarder le fichier dans {0}. + <resource name="error_nowriteaccess">Impossible de sauvegarder le fichier dans {0}. Veuillez vérifier que vous avez l'autorisation d'écrire dans le répertoire de stockage.</resource> <resource name="error_openfile">Le fichier "{0}" n'a pu être ouvert.</resource> <resource name="error_openlink">Impossible d'ouvrir le lien '{0}'.</resource> @@ -209,17 +209,17 @@ Veuillez vérifier que vous avez l'autorisation d'écrire dans le répertoire de <resource name="settings_jpegquality">Qualité JPEG</resource> <resource name="settings_jpegsettings">Paramètres JPEG</resource> <resource name="settings_language">Langue</resource> - <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre motif : -${YYYY} Année sur 4 chiffres -${MM} mois sur 2 chiffres -${DD} jour sur 2 chiffres -${hh} heure sur 2 chiffres -${mm} minutes sur 2 chiffres -${ss} secondes sur 2 chiffres -${NUM} Incrément sur 6 chiffres -${title} Titre de la fenêtre -${user} Nom d'utilisateur Windows -${domain} Domaine Windows + <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre motif : +${YYYY} Année sur 4 chiffres +${MM} mois sur 2 chiffres +${DD} jour sur 2 chiffres +${hh} heure sur 2 chiffres +${mm} minutes sur 2 chiffres +${ss} secondes sur 2 chiffres +${NUM} Incrément sur 6 chiffres +${title} Titre de la fenêtre +${user} Nom d'utilisateur Windows +${domain} Domaine Windows ${hostname} Nom d'hôte du PC</resource> <resource name="settings_network">Mises à jour réseau</resource> <resource name="settings_output">Sortie</resource> @@ -250,8 +250,8 @@ ${hostname} Nom d'hôte du PC</resource> <resource name="update_found">Une nouvelle version de Greenshot est disponible! Voulez-vous télécharger Greenshot {0}?</resource> <resource name="wait_ie_capture">Veuillez patienter pendant que la page dans Internet Explorer est capturée...</resource> <resource name="warning">Avertissement</resource> - <resource name="warning_hotkeys">Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. -Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. + <resource name="warning_hotkeys">Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. +Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. Veuillez désactiver ce(s) logiciel(s) utilisant le bouton Impr.écran. Vous pouvez également utiliser Greenshot au moyen de son menu contextuel.</resource> <resource name="WindowCaptureMode.Aero">Utiliser les couleurs personnalisées</resource> <resource name="WindowCaptureMode.AeroTransparent">Conserver la transparence</resource> diff --git a/Greenshot/Languages/language-he-IL.xml b/Greenshot/Languages/language-he-IL.xml index 287f83946..d4f82d69b 100644 --- a/Greenshot/Languages/language-he-IL.xml +++ b/Greenshot/Languages/language-he-IL.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">:אנא דווח באגים בכתובת</resource> <resource name="about_donations">:אם את\ה נהנה\ית משימוש בתוכנה, את\ה מוזמן לתרום לנו</resource> - <resource name="about_host">Greenshot is hosted by GitHub at</resource> + <resource name="about_host">Greenshot is hosted by sourceforge.net at</resource> <resource name="about_icons">Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-hu-HU.xml b/Greenshot/Languages/language-hu-HU.xml index 9e1201fec..a4132795d 100644 --- a/Greenshot/Languages/language-hu-HU.xml +++ b/Greenshot/Languages/language-hu-HU.xml @@ -3,20 +3,20 @@ <resources> <resource name="about_bugs">Kérük a hibákat az alábbi helyen jelezzék</resource> <resource name="about_donations">Ha szereted Greenshot -ot, akkor támogass minket:</resource> - <resource name="about_host">Greenshot kiszolgálója a GitHub</resource> + <resource name="about_host">Greenshot kiszolgálója a sourceforge.net</resource> <resource name="about_icons">Az ikonokat Yusuke Kamiyamane's Fugue készítette (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Szerzői jog (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -SEMMIFÉLE GARANCIA sincs a Greenshot -hoz. Ez egy ingyenes program, és hálásak vagyunk, hogy terjeszted bizonyos feltételekkel. + <resource name="about_license">Szerzői jog (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +SEMMIFÉLE GARANCIA sincs a Greenshot -hoz. Ez egy ingyenes program, és hálásak vagyunk, hogy terjeszted bizonyos feltételekkel. Részletek a GNU Fő Nyílvános Engedélyről:</resource> <resource name="about_title">Greenshot névjegye</resource> <resource name="application_title">Greenshot - Egy forradalmian új képernyőkép készítő program</resource> <resource name="bugreport_cancel">Bezárni</resource> - <resource name="bugreport_info">Elnézést, váratlan hiba történt! - -A jó hír: ha jelzi felénk a hibát segítűnk megoldani. -Kérjük látogassa meg az alábbi URL-t, hozzon létre egy új hibabejegyzés és másolja be a hibaüzenetet. - -Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt, ami a segítségünkre lehet. + <resource name="bugreport_info">Elnézést, váratlan hiba történt! + +A jó hír: ha jelzi felénk a hibát segítűnk megoldani. +Kérjük látogassa meg az alábbi URL-t, hozzon létre egy új hibabejegyzés és másolja be a hibaüzenetet. + +Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt, ami a segítségünkre lehet. Örülnénk, ha ellenőrizné, hogy a hibát jelentette e már valaki. (Ha használja a keresőt, gyorsabban megtalálhatja) Köszönjük :)</resource> <resource name="bugreport_title">Hiba</resource> <resource name="clipboard_error">Váratlan hiba történt a vágólapra másoláskor.</resource> @@ -113,7 +113,7 @@ Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt <resource name="editor_uptotop">Előre hozás</resource> <resource name="error">Hiba</resource> <resource name="error_multipleinstances">A Greenshot egy példánya már fut.</resource> - <resource name="error_nowriteaccess">Nem lehet menteni a fájlt {0}. + <resource name="error_nowriteaccess">Nem lehet menteni a fájlt {0}. Kérjük ellenőrizze a mentési hely hozzáférhetőségét.</resource> <resource name="error_openfile">A fájlt "{0}" nem sikerült megnyitni.</resource> <resource name="error_openlink">Nem sikerült megnyitni a helyet.</resource> @@ -151,21 +151,21 @@ Kérjük ellenőrizze a mentési hely hozzáférhetőségét.</resource> <resource name="settings_jpegquality">JPEG minőség</resource> <resource name="settings_jpegsettings">JPEG beállítások</resource> <resource name="settings_language">Nyelv</resource> - <resource name="settings_message_filenamepattern">A következő minták válthatják fel az automatikus meghatározást: -${YYYY} év, 4 karakter -${MM} hónap, 2 karakter -${DD} nap, 2 karakter -${hh} óra, 2 karakter -${mm} perc, 2 karakter -${ss} másodperc, 2 karakter -${NUM} növekvő szám, 6 karakter -${title} Az ablak neve -${user} Windows felhasználó -${domain} Windows tartomány -${hostname} Számítógép név - -Könyvtárak lehet létrehozni a Greenshot -tal, a visszaper jeletet (\) használja a mappák és fájlnevek elválasztásánál. -Például: a minta ${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss} + <resource name="settings_message_filenamepattern">A következő minták válthatják fel az automatikus meghatározást: +${YYYY} év, 4 karakter +${MM} hónap, 2 karakter +${DD} nap, 2 karakter +${hh} óra, 2 karakter +${mm} perc, 2 karakter +${ss} másodperc, 2 karakter +${NUM} növekvő szám, 6 karakter +${title} Az ablak neve +${user} Windows felhasználó +${domain} Windows tartomány +${hostname} Számítógép név + +Könyvtárak lehet létrehozni a Greenshot -tal, a visszaper jeletet (\) használja a mappák és fájlnevek elválasztásánál. +Például: a minta ${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss} fájl mentése az aktuális dátummal és időponttal, a megadott tárolási helyre, pl.: 2008-06-29_14-34-21, ezzel a mentési meghatározással a képernyőkép mindig az aktuális dátummal, idővel lesz elmentve.</resource> <resource name="settings_output">Mentés</resource> <resource name="settings_playsound">Fényképező zárhang</resource> @@ -186,8 +186,8 @@ fájl mentése az aktuális dátummal és időponttal, a megadott tárolási hel <resource name="settings_waittime">Ezredmásodpercet várjon kijelölés előtt</resource> <resource name="tooltip_firststart">Jobb klikk ide vagy nyomja meg a PrinScrn gombot.</resource> <resource name="warning">Figyelem</resource> - <resource name="warning_hotkeys">Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. -Ez a hiba akkor fordulhat elő, ha egy másik program használja. + <resource name="warning_hotkeys">Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. +Ez a hiba akkor fordulhat elő, ha egy másik program használja. Kapcsolja ki a szotvert és használja PrintScrn billentyűt. Egyszerűen használhatja a Greenshot -ot a tálca ikon helyi menüjéből.</resource> </resources> </language> \ No newline at end of file diff --git a/Greenshot/Languages/language-it-IT.xml b/Greenshot/Languages/language-it-IT.xml index 41a8b6a66..70284f5ef 100644 --- a/Greenshot/Languages/language-it-IT.xml +++ b/Greenshot/Languages/language-it-IT.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Per favore, riporta le anomalie a</resource> <resource name="about_donations">Se gradisci Greenshot, puoi darci il tuo aiuto su:</resource> - <resource name="about_host">Greenshot è disponibile su GitHub a</resource> + <resource name="about_host">Greenshot è disponibile su sourceforge.net a</resource> <resource name="about_icons">Icone prese da Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene fornito SENZA ALCUNA GARANZIA. Questo è "free software", e potete ri-distribuirlo secondo certe condizioni. diff --git a/Greenshot/Languages/language-ja-JP.xml b/Greenshot/Languages/language-ja-JP.xml index 88eb4b242..4b4cf79aa 100644 --- a/Greenshot/Languages/language-ja-JP.xml +++ b/Greenshot/Languages/language-ja-JP.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">バグ等の報告先 :</resource> <resource name="about_donations">Greenshot がお気に召したなら、是非支援をお願いします :</resource> - <resource name="about_host">Greenshot は GitHub によって運営されています :</resource> + <resource name="about_host">Greenshot は sourceforge.net によって運営されています :</resource> <resource name="about_icons">上山根 祐輔氏の Fugue Icons を使用しています (Creative Commons Attribution 3.0 license) :</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot には一切の保障がありません。GNU General Public License に定められた条件下で再配布をおこなうことができます。:</resource> diff --git a/Greenshot/Languages/language-ko-KR.xml b/Greenshot/Languages/language-ko-KR.xml index 50930abb9..c1896f8c7 100644 --- a/Greenshot/Languages/language-ko-KR.xml +++ b/Greenshot/Languages/language-ko-KR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">버그는 아래 URL로 전달바랍니다.</resource> <resource name="about_donations">Greenshot이 좋다면 아래 URL로 방문하셔서 지원할 수 있습니다.</resource> - <resource name="about_host">Greenshot은 GitHub 관리하에 아래 링크에서 호스팅되고 있습니다</resource> + <resource name="about_host">Greenshot은 sourceforge.net 관리하에 아래 링크에서 호스팅되고 있습니다</resource> <resource name="about_icons">아이콘은 Yusuke Kamiyamane's Fugue icon set으로부터 제공받은 것입니다. (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-lt-LT.xml b/Greenshot/Languages/language-lt-LT.xml index 2a84f330a..c67f49f92 100644 --- a/Greenshot/Languages/language-lt-LT.xml +++ b/Greenshot/Languages/language-lt-LT.xml @@ -3,18 +3,18 @@ <resources> <resource name="about_bugs">Apie klaidas praneškite</resource> <resource name="about_donations">Jei jums patiko Greenshot, galite mus paremti:</resource> - <resource name="about_host">Greenshot talpinamas GitHub</resource> + <resource name="about_host">Greenshot talpinamas sourceforge.net</resource> <resource name="about_icons">IIkonų rinkinys Fugue, аutorius Yusuke Kamiyamane, licencija Creative Commons Attribution 3.0</resource> - <resource name="about_license">Visos teisės saugomos (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + <resource name="about_license">Visos teisės saugomos (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot pateikiama BE JOKIŲ GARANTIJŲ. Greenshot — laisvai platinama PĮ su GPL licencija ir jūs galite laisvai ją platinti, laikydamasi licencinės sutarties:</resource> <resource name="about_title">Apie Greenshot</resource> <resource name="application_title">Greenshot — revoliucinis įrankis ekrano nuotraukoms daryti</resource> <resource name="bugreport_cancel">Uždaryti</resource> - <resource name="bugreport_info">Nenumatyta klaida. - -Gera žinia: jūs galite padėti ištaisyti programą, jei atsiųsite ataskaitą apie klaidą. -Nurodytu adresu sukurkite klaidos ataskaitą ir nukopijuokite klaidos tekstą į aprašymą. Galite pridėti bet kokią informaciją, kuri galėtų padėti atkatoti klaidos įvykio aplinkybes. Be to, būtume labai dėkingi, jei patikrintumėte ar panašios klaidos jau neužregistravo kas nors kitas (galite pasinaudoti paieška tinklapyje). - + <resource name="bugreport_info">Nenumatyta klaida. + +Gera žinia: jūs galite padėti ištaisyti programą, jei atsiųsite ataskaitą apie klaidą. +Nurodytu adresu sukurkite klaidos ataskaitą ir nukopijuokite klaidos tekstą į aprašymą. Galite pridėti bet kokią informaciją, kuri galėtų padėti atkatoti klaidos įvykio aplinkybes. Be to, būtume labai dėkingi, jei patikrintumėte ar panašios klaidos jau neužregistravo kas nors kitas (galite pasinaudoti paieška tinklapyje). + Dėkojame už pagalbą :)</resource> <resource name="bugreport_title">Klaida</resource> <resource name="clipboard_error">Netikėta klaida įrašant į apsikeitimo podelį.</resource> @@ -111,7 +111,7 @@ Dėkojame už pagalbą :)</resource> <resource name="editor_uptotop">Į priekį</resource> <resource name="error">Klaida</resource> <resource name="error_multipleinstances">Greenshot jau paleistas.</resource> - <resource name="error_nowriteaccess">Neįmanoma išsaugoti failo į {0}. + <resource name="error_nowriteaccess">Neįmanoma išsaugoti failo į {0}. Patikrinkite ar turite tam teises.</resource> <resource name="error_openfile">Nepavyko atidaryti failo "{0}".</resource> <resource name="error_openlink">Nepavyko atidaryti nuorodos.</resource> @@ -149,19 +149,19 @@ Patikrinkite ar turite tam teises.</resource> <resource name="settings_jpegquality">Кokybė</resource> <resource name="settings_jpegsettings">JPEG parametrai</resource> <resource name="settings_language">Kalba (Language)</resource> - <resource name="settings_message_filenamepattern">Numatyti simboliai: - -${YYYY} metai, 4 skaičiai -${MM} menuo, 2 skaičiai -${DD} diena, 2 skaičiai -${hh} valanda, 2 skaičiai -${mm} minutės, 2 skaičiai -${ss} sekundės, 2 skaičiai -${NUM} eilės numeris, 6 skaičiai -${title} lango pavadinimas - -Greenshot gali pavadinti pagal šabloną ne tik failus, bet ir katalogus, jei pavadinime naudojamas atvirkščias pasviręs brūkšnys "\" - + <resource name="settings_message_filenamepattern">Numatyti simboliai: + +${YYYY} metai, 4 skaičiai +${MM} menuo, 2 skaičiai +${DD} diena, 2 skaičiai +${hh} valanda, 2 skaičiai +${mm} minutės, 2 skaičiai +${ss} sekundės, 2 skaičiai +${NUM} eilės numeris, 6 skaičiai +${title} lango pavadinimas + +Greenshot gali pavadinti pagal šabloną ne tik failus, bet ir katalogus, jei pavadinime naudojamas atvirkščias pasviręs brūkšnys "\" + Pvz, šablonas ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} rodo, kad šios dienos datos kataloge "2011-04-27", nuotrauka bus pavadinta "16-40-23" (plius nuotraukos plėtinys, nurodytas nustatymuose)</resource> <resource name="settings_output">Nuotraukos</resource> <resource name="settings_playsound">Fotoaparato garsas</resource> @@ -176,15 +176,15 @@ Pvz, šablonas ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} rodo, kad šios dienos dato <resource name="settings_tooltip_filenamepattern">Nuotraukų vardų generavimo šablonas išsaugant nuotraukas</resource> <resource name="settings_tooltip_language">Programos kalba (programą reikės startuoti iš naujo)</resource> <resource name="settings_tooltip_primaryimageformat">Numatytas formatas</resource> - <resource name="settings_tooltip_registerhotkeys">Mygtukas Print (PrintScreen), derinys Ctrl-Print, Alt-Print + <resource name="settings_tooltip_registerhotkeys">Mygtukas Print (PrintScreen), derinys Ctrl-Print, Alt-Print bus perimti Greenshot programos, kai ji yra paleista.</resource> <resource name="settings_tooltip_storagelocation">Numatytas nuotraukų saugojimo katalogas (jei nenurodyta - į darbastalį)</resource> <resource name="settings_visualization">Fotoefektai</resource> <resource name="settings_waittime">Išlaikymas prieš fotografuojant (ms)</resource> <resource name="tooltip_firststart">Spauskite dešiniu pelės klavišu arba spauskite "PrintScreen".</resource> <resource name="warning">Dėmesio</resource> - <resource name="warning_hotkeys">Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. -Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, + <resource name="warning_hotkeys">Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. +Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, kurios naudoja šiuos mygtukus. Arba galima naudoti komandas iš Greenshot programos kontekstinio meniu.</resource> </resources> </language> \ No newline at end of file diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index 709c30615..cb18e6672 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Meld problemen bij</resource> <resource name="about_donations">Als U Greenshot goed vindt kunt U ons ondersteunen:</resource> - <resource name="about_host">Greenshot word gehost door GitHub op</resource> + <resource name="about_host">Greenshot word gehost door sourceforge.net op</resource> <resource name="about_icons">Iconen van de icon set van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot komt zonder enige garantie! Dit is gratis software, en U kunt het distribueren onder bepaalde voorwaarden. diff --git a/Greenshot/Languages/language-nn-NO.xml b/Greenshot/Languages/language-nn-NO.xml index 9ae31d78f..67d8cb214 100644 --- a/Greenshot/Languages/language-nn-NO.xml +++ b/Greenshot/Languages/language-nn-NO.xml @@ -3,20 +3,20 @@ <resources> <resource name="about_bugs">Ver venleg å melde frå om feil til</resource> <resource name="about_donations">Om du likar Greenshot er du velkomen til å støtte oss:</resource> - <resource name="about_host">Greenshot held virtuelt hus hjå GitHub:</resource> + <resource name="about_host">Greenshot held virtuelt hus hjå sourceforge.net:</resource> <resource name="about_icons">Ikon frå Yusuke Kamiyamane sit "Fugue" ikonsett (Creative Commons Attribution 3.0-lisens)</resource> - <resource name="about_license">Med kopirett (C) 2007-2012 Thomas Braun, Jens Klingen og Robin Krom. Norsk omsetjing av Ivar Barstad. -Greenshot har ABSOLUTT INGEN GARANTI. Dette er gratis programvare, og du står fritt til å distribuere det under visse vilkår. + <resource name="about_license">Med kopirett (C) 2007-2012 Thomas Braun, Jens Klingen og Robin Krom. Norsk omsetjing av Ivar Barstad. +Greenshot har ABSOLUTT INGEN GARANTI. Dette er gratis programvare, og du står fritt til å distribuere det under visse vilkår. Detaljar om GNU General Public-lisens:</resource> <resource name="about_title">Om Greenshot</resource> <resource name="application_title">Greenshot - det revolusjonerande skjermknipsverktøyet</resource> <resource name="bugreport_cancel">Lukk</resource> - <resource name="bugreport_info">Orsak, ein ukjend feil oppstod! - -På den ljose sida kan du hjelpe oss med å finne ut av dette ved å fylle ut ein feilrapport! -Ver venleg og kopier innhaldet frå tekstområdet inn i "description"-feltet på nettsida bak lenkja under. - -Om du legg til ei forståeleg oppsummering (helst på engelsk) av kva som skjedde og kva som kan ha forårsaka feilen er det lettare for oss å finne ut av det. + <resource name="bugreport_info">Orsak, ein ukjend feil oppstod! + +På den ljose sida kan du hjelpe oss med å finne ut av dette ved å fylle ut ein feilrapport! +Ver venleg og kopier innhaldet frå tekstområdet inn i "description"-feltet på nettsida bak lenkja under. + +Om du legg til ei forståeleg oppsummering (helst på engelsk) av kva som skjedde og kva som kan ha forårsaka feilen er det lettare for oss å finne ut av det. Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om det alt er registrert ei sak på denne feilen. Tusen takk!</resource> <resource name="bugreport_title">Trøbbel!</resource> <resource name="CANCEL">Avbryt</resource> @@ -145,7 +145,7 @@ Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om d <resource name="EmailFormat.OUTLOOK_TXT">Outlook med tekst</resource> <resource name="error">Feil!</resource> <resource name="error_multipleinstances">Greenshot køyrer alt!</resource> - <resource name="error_nowriteaccess">Kan ikkje lagre fila som {0}. + <resource name="error_nowriteaccess">Kan ikkje lagre fila som {0}. Har du skrivetilgang til det valde området?</resource> <resource name="error_openfile">Fila "{0}" kunne ikkje opnast!</resource> <resource name="error_openlink">Kunne ikkje opne lenkja "{0}".</resource> @@ -203,21 +203,21 @@ Har du skrivetilgang til det valde området?</resource> <resource name="settings_iecapture">Internet Explorer-knipsing</resource> <resource name="settings_jpegquality">JPEG-kvalitet</resource> <resource name="settings_language">Språk</resource> - <resource name="settings_message_filenamepattern">Dei fylgjande felta vil bli fylt ut automatisk etter definert regel: -${YYYY} - Årstal, 4 siffer -${MM} - Månad, 2 siffer -${DD} - Dag, 2 siffer -${hh} - Time, 2 siffer -${mm} - Minutt, 2 siffer -${ss} - Sekund, 2 siffer -${NUM} - Automatisk teljar, 6 sifer -${title} - Vindaugstittel -${user} - Brukarnamn i Windows -${domain} - Windows-domene -${hostname} - Maskinnamn på nettverket - -Du kan òg setje Greenshot til å lage mapper dynamisk ved å bruke bakvendt skråstrek ( \ ) til å skilje mappe- og filnamn. -Eksempelregel: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} + <resource name="settings_message_filenamepattern">Dei fylgjande felta vil bli fylt ut automatisk etter definert regel: +${YYYY} - Årstal, 4 siffer +${MM} - Månad, 2 siffer +${DD} - Dag, 2 siffer +${hh} - Time, 2 siffer +${mm} - Minutt, 2 siffer +${ss} - Sekund, 2 siffer +${NUM} - Automatisk teljar, 6 sifer +${title} - Vindaugstittel +${user} - Brukarnamn i Windows +${domain} - Windows-domene +${hostname} - Maskinnamn på nettverket + +Du kan òg setje Greenshot til å lage mapper dynamisk ved å bruke bakvendt skråstrek ( \ ) til å skilje mappe- og filnamn. +Eksempelregel: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med tidspunktet som namn, fylgt av filtype definert i innstillingane (f.eks. 10_14_31.JPG).</resource> <resource name="settings_network">Nettverk og oppdateringar</resource> <resource name="settings_output">Utformat</resource> @@ -248,8 +248,8 @@ vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med ti <resource name="update_found">Ein nyare versjon av skjermknipsaren er tilgjengeleg! Vil du laste ned Greenshot {0}?</resource> <resource name="wait_ie_capture">Ver venleg og vent medan Internet Explorer-sida blir knipsa...</resource> <resource name="warning">Åtvaring!</resource> - <resource name="warning_hotkeys">Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. - + <resource name="warning_hotkeys">Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. + Alle Greenshot-funksjonar er likevel tilgjengeleg via høgreklikkmenyen i varslingsfeltet nedst til høgre på skjermen.</resource> <resource name="WindowCaptureMode.Aero">Bruk eigendefinert farge</resource> <resource name="WindowCaptureMode.AeroTransparent">Hald på gjennomsynlegheit</resource> diff --git a/Greenshot/Languages/language-pl-PL.xml b/Greenshot/Languages/language-pl-PL.xml index b9dc55886..6962ad536 100644 --- a/Greenshot/Languages/language-pl-PL.xml +++ b/Greenshot/Languages/language-pl-PL.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Tutaj proszę zgłaszać błędy:</resource> <resource name="about_donations">Jeśli podoba Ci się Greenshot, chętnie przyjmiemy Twoje wsparcie:</resource> - <resource name="about_host">Greenshot jest utrzymywany przez GitHub pod adresem:</resource> + <resource name="about_host">Greenshot jest utrzymywany przez sourceforge.net pod adresem:</resource> <resource name="about_icons">Ikony z zestawu Fugue od Yusuke Kamiyamane (licencja Creative Commons Attribution 3.0):</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot nie jest objęty JAKĄKOLWIEK GWARANCJĄ. Jako wolne oprogramowanie może być rozpowszechniany na określonych warunkach. diff --git a/Greenshot/Languages/language-pt-BR.xml b/Greenshot/Languages/language-pt-BR.xml index e53dc2ca8..280068294 100644 --- a/Greenshot/Languages/language-pt-BR.xml +++ b/Greenshot/Languages/language-pt-BR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Por favor envie erros para</resource> <resource name="about_donations">Se você gostou do Greenshot, por favor contribua:</resource> - <resource name="about_host">O Greenshot está armazenado no GitHub em</resource> + <resource name="about_host">O Greenshot está armazenado no sourceforge.net em</resource> <resource name="about_icons">Ícones de Yusuke Kamiyamane (Biblioteca Fugue, licença "Creative Commons Attribution 3.0")</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuido sob algumas condições. diff --git a/Greenshot/Languages/language-pt-PT.xml b/Greenshot/Languages/language-pt-PT.xml index a39bdc7b4..cd7fb8869 100644 --- a/Greenshot/Languages/language-pt-PT.xml +++ b/Greenshot/Languages/language-pt-PT.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Por favor envie erros para</resource> <resource name="about_donations">Se gostou do Greenshot, por favor contribua:</resource> - <resource name="about_host">O Greenshot está armazenado no GitHub em</resource> + <resource name="about_host">O Greenshot está armazenado no sourceforge.net em</resource> <resource name="about_icons">Ícones da colecção Fugue de Yusuke Kamiyamane (Licença "Creative Commons Attribution 3.0")</resource> <resource name="about_license">Direitos de Autor (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuído sob algumas condições. diff --git a/Greenshot/Languages/language-ro-RO.xml b/Greenshot/Languages/language-ro-RO.xml index 11f17a736..de435b088 100644 --- a/Greenshot/Languages/language-ro-RO.xml +++ b/Greenshot/Languages/language-ro-RO.xml @@ -102,7 +102,7 @@ Detalii despre licența GNU General Public License: Pictograme din setul de icoane Fugue al lui Yusuke Kamiyamane (Creative Commons Attribution 3.0 license) </resource> <resource name="about_host"> - Greenshot e hostat de GitHub la + Greenshot e hostat de sourceforge.net la </resource> <resource name="about_bugs"> Raportați bug-uri la diff --git a/Greenshot/Languages/language-ru-RU.xml b/Greenshot/Languages/language-ru-RU.xml index b7df2b940..7506dae8b 100644 --- a/Greenshot/Languages/language-ru-RU.xml +++ b/Greenshot/Languages/language-ru-RU.xml @@ -3,21 +3,21 @@ <resources> <resource name="about_bugs">Просьба сообщать об ошибках на</resource> <resource name="about_donations">Если вам нравится Greenshot, вы можете поддержать нас:</resource> - <resource name="about_host">Greenshot размещается на GitHub</resource> + <resource name="about_host">Greenshot размещается на sourceforge.net</resource> <resource name="about_icons">Набор иконок Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.Это бесплатная программа и вы можете распространять её на определённых условиях. + <resource name="about_license">Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.Это бесплатная программа и вы можете распространять её на определённых условиях. Подробно о GNU General Public License:</resource> <resource name="about_title">О программе Greenshot</resource> <resource name="about_translation">Русский перевод Андрея Кравцова, http://sapfir.ucoz.ru</resource> <resource name="application_title">Greenshot — передовая утилита для получения скриншотов</resource> <resource name="bugreport_cancel">Закрыть</resource> - <resource name="bugreport_info">Извините, произошла непредвиденная ошибка. - -Это хорошая новость: Вы можете помочь нам избавиться от неё, отправив сообщение об ошибке. -Посетите URL ниже, создайте новый отчёт об ошибке и вставьте содержимое в текстовое поле. - -Пожалуйста, добавьте значимое резюме и приложите любую информацию, которую вы считаете полезной для воспроизведения проблемы. + <resource name="bugreport_info">Извините, произошла непредвиденная ошибка. + +Это хорошая новость: Вы можете помочь нам избавиться от неё, отправив сообщение об ошибке. +Посетите URL ниже, создайте новый отчёт об ошибке и вставьте содержимое в текстовое поле. + +Пожалуйста, добавьте значимое резюме и приложите любую информацию, которую вы считаете полезной для воспроизведения проблемы. Кроме того, мы были бы весьма признательны, если вы попробуете найти решение этой ошибки, вользовавшись поисковиком. Спасибо:)</resource> <resource name="bugreport_title">Ошибка</resource> <resource name="CANCEL">Отмена</resource> @@ -168,7 +168,7 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. <resource name="EmailFormat.OUTLOOK_TXT">Outlook с текстом</resource> <resource name="error">Ошибка</resource> <resource name="error_multipleinstances">Экземпляр Greenshot уже запущен.</resource> - <resource name="error_nowriteaccess">Не удалось сохранить файл на {0}. + <resource name="error_nowriteaccess">Не удалось сохранить файл на {0}. Проверьте доступность записи в выбраном месте расположения.</resource> <resource name="error_openfile">Файл "{0}" не может быть открыт.</resource> <resource name="error_openlink">Не удалось открыть ссылку '{0}'.</resource> @@ -232,22 +232,22 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. <resource name="settings_iecapture">Захват Internet Explorer</resource> <resource name="settings_jpegquality">Качество JPEG</resource> <resource name="settings_language">Язык</resource> - <resource name="settings_message_filenamepattern">В определённом шаблоне автоматически будут заменены следующие заполнители: -${YYYY} Год, 4 цифры -${MM} Месяц, 2 цифры -${DD} День, 2 цифры -${hh} Часы, 2 цифры -${mm} Минуты, 2 цифры -${ss} Секунды, 2 цифры -${NUM} Увеличивающееся число, 6 цифр -${title} Заголовок окна -${user} Пользователь Windows -${domain} Домен Windows -${hostname} Имя ПК - -Вы также можете создавать динамичные каталоги Greenshot, используя символ обратную косую черту (\) для отдельных папок и названий файлов. -Пример шаблона: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -Будет создана папка на текущий день, в вашем хранилище по умолчанию, например 2008-06-29.Содержащее имя файла скриншота будет основываться на текущем + <resource name="settings_message_filenamepattern">В определённом шаблоне автоматически будут заменены следующие заполнители: +${YYYY} Год, 4 цифры +${MM} Месяц, 2 цифры +${DD} День, 2 цифры +${hh} Часы, 2 цифры +${mm} Минуты, 2 цифры +${ss} Секунды, 2 цифры +${NUM} Увеличивающееся число, 6 цифр +${title} Заголовок окна +${user} Пользователь Windows +${domain} Домен Windows +${hostname} Имя ПК + +Вы также можете создавать динамичные каталоги Greenshot, используя символ обратную косую черту (\) для отдельных папок и названий файлов. +Пример шаблона: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +Будет создана папка на текущий день, в вашем хранилище по умолчанию, например 2008-06-29.Содержащее имя файла скриншота будет основываться на текущем времени, например 11_58_32 (плюс расширения, определённые в настройках)</resource> <resource name="settings_network">Сеть и обновления</resource> <resource name="settings_output">Выходные данные</resource> @@ -283,8 +283,8 @@ ${hostname} Имя ПК <resource name="update_found">Доступна новая версия Greenshot! Вы хотите скачать Greenshot {0}?</resource> <resource name="wait_ie_capture">Пожалуйста, подождите, пока страница в Internet Explorer захватывается...</resource> <resource name="warning">Внимание</resource> - <resource name="warning_hotkeys">Горячие клавиши "{0}" не могут быть зарегистрированы. Эта проблема может быть связана с ещё одним инструментом, использующим те же клавиши! Нужно либо изменить настройки клавиш или деактивировать/изменить программное обеспечение, использующее горячие клавиши. - + <resource name="warning_hotkeys">Горячие клавиши "{0}" не могут быть зарегистрированы. Эта проблема может быть связана с ещё одним инструментом, использующим те же клавиши! Нужно либо изменить настройки клавиш или деактивировать/изменить программное обеспечение, использующее горячие клавиши. + Все функции Greenshot по-прежнему работают прямо из контекстного меню через значок в трее.</resource> <resource name="WindowCaptureMode.Aero">Использовать другой цвет</resource> <resource name="WindowCaptureMode.AeroTransparent">Сохранить прозрачность</resource> diff --git a/Greenshot/Languages/language-sk-SK.xml b/Greenshot/Languages/language-sk-SK.xml index 9691b3d67..d8d526216 100644 --- a/Greenshot/Languages/language-sk-SK.xml +++ b/Greenshot/Languages/language-sk-SK.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Prosím oznámte chyby na</resource> <resource name="about_donations">Ak se vám Greenshot páči, uvítame vašu podporu:</resource> - <resource name="about_host">Greenshot je na GitHub</resource> + <resource name="about_host">Greenshot je na sourceforge.net</resource> <resource name="about_icons">Ikony z Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ÚPLNE BEZ ZÁRUKY. Toto je FREE software, a môžete ho distribuovať za určitých podmienok. diff --git a/Greenshot/Languages/language-sr-RS.xml b/Greenshot/Languages/language-sr-RS.xml index 24e1af87e..ded34237a 100644 --- a/Greenshot/Languages/language-sr-RS.xml +++ b/Greenshot/Languages/language-sr-RS.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Пријавите грешке на:</resource> <resource name="about_donations">Ако вам се свиђа Гриншот, помозите нам:</resource> - <resource name="about_host">Гриншот покреће Сорсфорџ (GitHub):</resource> + <resource name="about_host">Гриншот покреће Сорсфорџ (sourceforge.net):</resource> <resource name="about_icons">Иконе су преузете из пакета „Fugue“ Јусуке Камијамане (лиценца Кријејтив комонс Ауторство 3.0)</resource> <resource name="about_license">Ауторска права © 2007–2012 Томас Браун, Џенс Клинџен, Робин Кром Гриншот се издаје БЕЗ ИКАКВЕ ГАРАНЦИЈЕ. Он је бесплатан програм, који можете да делите под одређеним условима. diff --git a/Greenshot/Languages/language-sv-SE.xml b/Greenshot/Languages/language-sv-SE.xml index be5687fc3..27977474b 100644 --- a/Greenshot/Languages/language-sv-SE.xml +++ b/Greenshot/Languages/language-sv-SE.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Var vänlig att rapportera in fel till</resource> <resource name="about_donations">Om du gillar Greenshot, så är du välkommen att stödja oss:</resource> - <resource name="about_host">Greenshots hemsida tillhandahålls av GitHub på</resource> + <resource name="about_host">Greenshots hemsida tillhandahålls av sourceforge.net på</resource> <resource name="about_icons">Ikoner från "Yusuke Kamiyamane's Fugue icon set" (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot lämnar ABSOLUT INGA GARANTIER. Detta är ett gratisprogram, och du får vidaredistribuera programmet under vissa villkor. diff --git a/Greenshot/Languages/language-tr-TR.xml b/Greenshot/Languages/language-tr-TR.xml index a0c8783c3..7a4bafa85 100644 --- a/Greenshot/Languages/language-tr-TR.xml +++ b/Greenshot/Languages/language-tr-TR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Hataları şu adrese bildirebilirsiniz:</resource> <resource name="about_donations">Greenshot'ı sevdiyseniz, bizi destekleyin:</resource> - <resource name="about_host">Greenshot GitHub üzerinde şu adreste barındırılmaktadır:</resource> + <resource name="about_host">Greenshot sourceforge.net üzerinde şu adreste barındırılmaktadır:</resource> <resource name="about_icons">Simgeler Yusuke Kamiyamane'nin Fugue simge setidir (Creative Commons Attribution 3.0 lisansı)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot HİÇ BİR GARANTİ vermez. Serbest bir yazılımdır ve belirli koşullar altında dağıtmakta serbestsiniz. GNU diff --git a/Greenshot/Languages/language-uk-UA.xml b/Greenshot/Languages/language-uk-UA.xml index 30ca49fe5..855cf3afa 100644 --- a/Greenshot/Languages/language-uk-UA.xml +++ b/Greenshot/Languages/language-uk-UA.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Про помилки повідомляйте на</resource> <resource name="about_donations">Якщо Вам подобається Greenshot, то можете підтримати нас:</resource> - <resource name="about_host">Greenshot is розташовується на GitHub</resource> + <resource name="about_host">Greenshot is розташовується на sourceforge.net</resource> <resource name="about_icons">Набір іконок Fugue від Yusuke Kamiyamane (ліцензія Creative Commons Attribution 3.0)</resource> <resource name="about_license">Авторство © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot постачається АБСОЛЮТНО БЕЗ ҐАРАНТІЇ. Це вільне програмне забезпечення, Ви можете розповсюджувати його за певних умов. diff --git a/Greenshot/Languages/language-vi-VN.xml b/Greenshot/Languages/language-vi-VN.xml index f31104799..6611abd16 100644 --- a/Greenshot/Languages/language-vi-VN.xml +++ b/Greenshot/Languages/language-vi-VN.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Địa chỉ gửi báo cáo lỗi:</resource> <resource name="about_donations">Hãy ủng hộ nếu bạn thấy Greenshot hữu dụng:</resource> - <resource name="about_host">Greenshot được tài trợ bởi GitHub</resource> + <resource name="about_host">Greenshot được tài trợ bởi sourceforge.net</resource> <resource name="about_icons">Dùng biểu tượng Fugue (Giấy phép Commons Attribution 3.0 license) :</resource> <resource name="about_license">Bản quyền (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot không đi kèm theo đảm bảo nào và được phân phối dưới giấy phép GNU General Public License.</resource> diff --git a/Greenshot/Languages/language-zh-CN.xml b/Greenshot/Languages/language-zh-CN.xml index 9b6bd73f6..8d1f2fff6 100644 --- a/Greenshot/Languages/language-zh-CN.xml +++ b/Greenshot/Languages/language-zh-CN.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">如果发现任何错误,请到以下网址报告</resource> <resource name="about_donations">如果您喜欢这个软件,希望您可以捐助我们:</resource> - <resource name="about_host">Greenshot 托管在 GitHub</resource> + <resource name="about_host">Greenshot 托管在 sourceforge.net</resource> <resource name="about_icons">图标来源:Yusuke Kamiyamane的Fugue图标基于(Creative Commons Attribution 3.0 协议)</resource> <resource name="about_license">版权所有 (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom 作者不会对程序进行任何担保。 diff --git a/Greenshot/Languages/language-zh-TW.xml b/Greenshot/Languages/language-zh-TW.xml index ded5485cb..9b2a4f62d 100644 --- a/Greenshot/Languages/language-zh-TW.xml +++ b/Greenshot/Languages/language-zh-TW.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">請回報錯誤到以下網址</resource> <resource name="about_donations">如果您喜歡 Greenshot,歡迎您支持我們:</resource> - <resource name="about_host">Greenshot 的主機在 GitHub 網址是</resource> + <resource name="about_host">Greenshot 的主機在 sourceforge.net 網址是</resource> <resource name="about_icons">圖片來源: Yusuke Kamiyamane's Fugue 圖示集 (Creative Commons Attribution 3.0 授權)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot 不對這個程式做任何擔保。 這個程式是自由軟體,您可以在 GNU General Public License 下任意散佈本軟體。 diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 30b79e745..91f3fcd3b 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index f64b7762d..0c4911ae1 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index b44ddd784..ba532b11c 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index 2e4241068..e4aded8c6 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Memento/IMemento.cs b/Greenshot/Memento/IMemento.cs index c0a28417c..96e8d97d4 100644 --- a/Greenshot/Memento/IMemento.cs +++ b/Greenshot/Memento/IMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs index 0fcacbdb6..9c8935abc 100644 --- a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs +++ b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index 0f954e58c..541b4c06e 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/Greenshot/Processors/TitleFixProcessor.cs b/Greenshot/Processors/TitleFixProcessor.cs index bbd3c61be..d20798db2 100644 --- a/Greenshot/Processors/TitleFixProcessor.cs +++ b/Greenshot/Processors/TitleFixProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/BoxConfiguration.cs b/GreenshotBoxPlugin/BoxConfiguration.cs index 5c42cb1a5..b75a3c2ae 100644 --- a/GreenshotBoxPlugin/BoxConfiguration.cs +++ b/GreenshotBoxPlugin/BoxConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/BoxCredentials.cs b/GreenshotBoxPlugin/BoxCredentials.cs index bff044e9f..5d70729ed 100644 --- a/GreenshotBoxPlugin/BoxCredentials.cs +++ b/GreenshotBoxPlugin/BoxCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/BoxDestination.cs b/GreenshotBoxPlugin/BoxDestination.cs index 653f92ffa..6e2606fbd 100644 --- a/GreenshotBoxPlugin/BoxDestination.cs +++ b/GreenshotBoxPlugin/BoxDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/BoxEntities.cs b/GreenshotBoxPlugin/BoxEntities.cs index 99b51fe7a..afc567121 100644 --- a/GreenshotBoxPlugin/BoxEntities.cs +++ b/GreenshotBoxPlugin/BoxEntities.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/BoxPlugin.cs b/GreenshotBoxPlugin/BoxPlugin.cs index 6131a4654..717db960e 100644 --- a/GreenshotBoxPlugin/BoxPlugin.cs +++ b/GreenshotBoxPlugin/BoxPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/BoxUtils.cs b/GreenshotBoxPlugin/BoxUtils.cs index 6737d1c28..e0e1566d5 100644 --- a/GreenshotBoxPlugin/BoxUtils.cs +++ b/GreenshotBoxPlugin/BoxUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/Forms/BoxForm.cs b/GreenshotBoxPlugin/Forms/BoxForm.cs index 42de01744..dc1b5f22f 100644 --- a/GreenshotBoxPlugin/Forms/BoxForm.cs +++ b/GreenshotBoxPlugin/Forms/BoxForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs index 88c97a400..b91b206a1 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.cs b/GreenshotBoxPlugin/Forms/SettingsForm.cs index fc2524f60..07b32373d 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/LanguageKeys.cs b/GreenshotBoxPlugin/LanguageKeys.cs index cade07532..ac3765582 100644 --- a/GreenshotBoxPlugin/LanguageKeys.cs +++ b/GreenshotBoxPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs index 413f7d5fe..4dbee7804 100644 --- a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index b6852fcdb..05651949d 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs index a57c52591..b8745054e 100644 --- a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs +++ b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 0f52ceb9b..10e212d5e 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/ConfluencePlugin.cs b/GreenshotConfluencePlugin/ConfluencePlugin.cs index c8a86ec20..9a3e459c7 100644 --- a/GreenshotConfluencePlugin/ConfluencePlugin.cs +++ b/GreenshotConfluencePlugin/ConfluencePlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index d216f6028..3ffafbfd6 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index e98f85aac..102bf6732 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index 889b5f665..63b72292d 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index 1b161d7d9..a8ddec0dd 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index 400d20d42..3c816a2f9 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index 71ffe073e..b639a5f98 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index ea3732328..3c3d9442e 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/LanguageKeys.cs b/GreenshotConfluencePlugin/LanguageKeys.cs index dd199103d..3936ac398 100644 --- a/GreenshotConfluencePlugin/LanguageKeys.cs +++ b/GreenshotConfluencePlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs index e3889aea4..b9720505b 100644 --- a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/DropBoxCredentials.cs b/GreenshotDropboxPlugin/DropBoxCredentials.cs index 51f497b7d..bd6f17366 100644 --- a/GreenshotDropboxPlugin/DropBoxCredentials.cs +++ b/GreenshotDropboxPlugin/DropBoxCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index 16be2bd05..c4f79732f 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index 0deace234..772545395 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs index 2d75754ad..090fdccbf 100644 --- a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs +++ b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/DropboxUtils.cs b/GreenshotDropboxPlugin/DropboxUtils.cs index 66e0f15b8..126a41cd3 100644 --- a/GreenshotDropboxPlugin/DropboxUtils.cs +++ b/GreenshotDropboxPlugin/DropboxUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/Forms/DropboxForm.cs b/GreenshotDropboxPlugin/Forms/DropboxForm.cs index 62d219a01..b2c87ec61 100644 --- a/GreenshotDropboxPlugin/Forms/DropboxForm.cs +++ b/GreenshotDropboxPlugin/Forms/DropboxForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs index 3e8226dc9..2549c2018 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2011 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.cs index e0157343a..280ded7f1 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/LanguageKeys.cs b/GreenshotDropboxPlugin/LanguageKeys.cs index de9325019..daa6fb14c 100644 --- a/GreenshotDropboxPlugin/LanguageKeys.cs +++ b/GreenshotDropboxPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs index a7905990f..67d20ede5 100644 --- a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index 4e64daf5d..f83bc9370 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index 1c4ec1469..ee13f6eee 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs index c8d5f0a89..29441232a 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index 462722e8b..9531b0066 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs index 39543feca..812fd723c 100644 --- a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs index 28ad2552a..c0a9d3043 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 0c95b7a44..247e38b59 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs index d655815e0..96efa4063 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index bd9c7f8db..ae9d4b030 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/FlickrConfiguration.cs b/GreenshotFlickrPlugin/FlickrConfiguration.cs index 6c784dc9d..94e767698 100644 --- a/GreenshotFlickrPlugin/FlickrConfiguration.cs +++ b/GreenshotFlickrPlugin/FlickrConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/FlickrCredentials.cs b/GreenshotFlickrPlugin/FlickrCredentials.cs index 74f57c320..75d888219 100644 --- a/GreenshotFlickrPlugin/FlickrCredentials.cs +++ b/GreenshotFlickrPlugin/FlickrCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/FlickrDestination.cs b/GreenshotFlickrPlugin/FlickrDestination.cs index 4d0c19c07..7155937aa 100644 --- a/GreenshotFlickrPlugin/FlickrDestination.cs +++ b/GreenshotFlickrPlugin/FlickrDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/FlickrPlugin.cs b/GreenshotFlickrPlugin/FlickrPlugin.cs index f6d06f15d..ba6210b6e 100644 --- a/GreenshotFlickrPlugin/FlickrPlugin.cs +++ b/GreenshotFlickrPlugin/FlickrPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/FlickrUtils.cs b/GreenshotFlickrPlugin/FlickrUtils.cs index 3a4502353..8737f85e0 100644 --- a/GreenshotFlickrPlugin/FlickrUtils.cs +++ b/GreenshotFlickrPlugin/FlickrUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/Forms/FlickrForm.cs b/GreenshotFlickrPlugin/Forms/FlickrForm.cs index 63951c68b..59358436e 100644 --- a/GreenshotFlickrPlugin/Forms/FlickrForm.cs +++ b/GreenshotFlickrPlugin/Forms/FlickrForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs index 7da57baf1..3f47f6b31 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.cs index 45dcebbae..0835e2ea5 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/LanguageKeys.cs b/GreenshotFlickrPlugin/LanguageKeys.cs index 52c96b7f1..63849aa3c 100644 --- a/GreenshotFlickrPlugin/LanguageKeys.cs +++ b/GreenshotFlickrPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs index 47e084756..810171a92 100644 --- a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/Forms/ImgurForm.cs b/GreenshotImgurPlugin/Forms/ImgurForm.cs index 5a6c59a0b..d476f9313 100644 --- a/GreenshotImgurPlugin/Forms/ImgurForm.cs +++ b/GreenshotImgurPlugin/Forms/ImgurForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs index 78350ec53..f3d3d221f 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index b18a44f8f..064fcc21f 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs index 59c12786a..c24d1f67d 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index 79c3faaca..8a35fc06e 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 48bba7c4b..104839352 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/ImgurCredentials.cs b/GreenshotImgurPlugin/ImgurCredentials.cs index 8d268154d..4eee20fba 100644 --- a/GreenshotImgurPlugin/ImgurCredentials.cs +++ b/GreenshotImgurPlugin/ImgurCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index cd1349fa2..9002463f3 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index a39c2326a..37e5a3ce8 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index 65d2c41e7..c5c354eec 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index cb4beaa3b..3bb80e0f8 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/LanguageKeys.cs b/GreenshotImgurPlugin/LanguageKeys.cs index bfc73e7ec..b5d81646e 100644 --- a/GreenshotImgurPlugin/LanguageKeys.cs +++ b/GreenshotImgurPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs index 9e66e2995..06afabdf8 100644 --- a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs index a749454d0..8b60e5c4c 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 3a35a95de..535a039bf 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Forms/JiraFormBase.cs b/GreenshotJiraPlugin/Forms/JiraFormBase.cs index 0f9ecdcf0..6cba807a3 100644 --- a/GreenshotJiraPlugin/Forms/JiraFormBase.cs +++ b/GreenshotJiraPlugin/Forms/JiraFormBase.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs index 0b2132df6..ab6257839 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.cs b/GreenshotJiraPlugin/Forms/SettingsForm.cs index a08b8fc17..1ecaecfbf 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Jira.cs b/GreenshotJiraPlugin/Jira.cs index 4f03cb9ad..cdaaae97a 100644 --- a/GreenshotJiraPlugin/Jira.cs +++ b/GreenshotJiraPlugin/Jira.cs @@ -4,7 +4,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 8dbdfb471..1ebb03186 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index fcf69899b..bd443b37e 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 045027cf0..18e6576b9 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index 4d43d9ace..cd78c4bde 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/LanguageKeys.cs b/GreenshotJiraPlugin/LanguageKeys.cs index a3204ae3e..0d7a8fefc 100644 --- a/GreenshotJiraPlugin/LanguageKeys.cs +++ b/GreenshotJiraPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs index 4bf25d8b6..080ba5f3d 100644 --- a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index 73aa72444..af7ef4bb0 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 5b0405723..231786e12 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRCommand/ModiInterop.cs b/GreenshotOCRCommand/ModiInterop.cs index 3f52c2127..a73586172 100644 --- a/GreenshotOCRCommand/ModiInterop.cs +++ b/GreenshotOCRCommand/ModiInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRCommand/Properties/AssemblyInfo.cs b/GreenshotOCRCommand/Properties/AssemblyInfo.cs index e2f7a415d..419eb53b6 100644 --- a/GreenshotOCRCommand/Properties/AssemblyInfo.cs +++ b/GreenshotOCRCommand/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/OCRConfiguration.cs b/GreenshotOCRPlugin/OCRConfiguration.cs index 2d67d0d33..87b42f6be 100644 --- a/GreenshotOCRPlugin/OCRConfiguration.cs +++ b/GreenshotOCRPlugin/OCRConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/OCRDestination.cs b/GreenshotOCRPlugin/OCRDestination.cs index 5080678f5..ac50ad74a 100644 --- a/GreenshotOCRPlugin/OCRDestination.cs +++ b/GreenshotOCRPlugin/OCRDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/OCRForm.cs b/GreenshotOCRPlugin/OCRForm.cs index 26cb9b274..f6fe326a2 100644 --- a/GreenshotOCRPlugin/OCRForm.cs +++ b/GreenshotOCRPlugin/OCRForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 29663f698..3c832b5c5 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs index c98d2649d..c524510e1 100644 --- a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/SettingsForm.Designer.cs b/GreenshotOCRPlugin/SettingsForm.Designer.cs index 533315915..84a8c1e91 100644 --- a/GreenshotOCRPlugin/SettingsForm.Designer.cs +++ b/GreenshotOCRPlugin/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index dc9cb7052..88b1d029a 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs index f634c1072..1b9e6febb 100644 --- a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs +++ b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs index 8d57f7f32..9a72feee5 100644 --- a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs index ffbe0be2d..66db19b40 100644 --- a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs index 8b911ab86..30a5d3df5 100644 --- a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs +++ b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/Destinations/WordDestination.cs b/GreenshotOfficePlugin/Destinations/WordDestination.cs index a2da6e2fd..202b2ee72 100644 --- a/GreenshotOfficePlugin/Destinations/WordDestination.cs +++ b/GreenshotOfficePlugin/Destinations/WordDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeConfiguration.cs b/GreenshotOfficePlugin/OfficeConfiguration.cs index 982411901..f89b7f73a 100644 --- a/GreenshotOfficePlugin/OfficeConfiguration.cs +++ b/GreenshotOfficePlugin/OfficeConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index ac4ed4675..0a5bfd161 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs index 3569c2da2..f2e419411 100644 --- a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index 03919db89..39e0ea13c 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs index 8474e1c4a..a8318b6a0 100644 --- a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index c8e72f2b2..bd45749e2 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs index 4c5b3b201..43d122c19 100644 --- a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs index 3090c9591..b41211cb5 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs index 2d1ecd0e7..411ceaf4c 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs index 1b3e90f2e..904693ddb 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs index 42a31fa24..3f1532cef 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs index 681053801..3e5fa215f 100644 --- a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs index 99433ebb3..60ab99216 100644 --- a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/OfficePlugin.cs b/GreenshotOfficePlugin/OfficePlugin.cs index 142b9dee0..234171a74 100644 --- a/GreenshotOfficePlugin/OfficePlugin.cs +++ b/GreenshotOfficePlugin/OfficePlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs index 203d02cd8..79ad89124 100644 --- a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs index c58aa8d20..63f6636c4 100644 --- a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs index 3f8530ed5..cb2b9d569 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs index f45492e53..560a29b39 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/LanguageKeys.cs b/GreenshotPhotobucketPlugin/LanguageKeys.cs index d240fb14b..5e6f33437 100644 --- a/GreenshotPhotobucketPlugin/LanguageKeys.cs +++ b/GreenshotPhotobucketPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs index 1b7d8c829..bd7e20043 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs index 1f95aeda1..d03ee597a 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs index 5a1976ec1..68f467c53 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs index c23d4a351..9a8fd8843 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index 7e9d53a9c..63fd3f035 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs index 58d64ed93..3030f5059 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs index ca598ebf8..d732925da 100644 --- a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPicasaPlugin/PicasaCredentials.cs b/GreenshotPicasaPlugin/PicasaCredentials.cs index 670ef7182..83c6059b6 100644 --- a/GreenshotPicasaPlugin/PicasaCredentials.cs +++ b/GreenshotPicasaPlugin/PicasaCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs index b7003ce97..4e50cceda 100644 --- a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index ebbf5fda4..17f8baa38 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs index 690420195..e372f6316 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index 765ae7e22..e3d73ac4d 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index 66c7273e2..785fb37ee 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/FormWithoutActivation.cs b/GreenshotPlugin/Controls/FormWithoutActivation.cs index 699dcd93f..2b92989a5 100644 --- a/GreenshotPlugin/Controls/FormWithoutActivation.cs +++ b/GreenshotPlugin/Controls/FormWithoutActivation.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotButton.cs b/GreenshotPlugin/Controls/GreenshotButton.cs index 64dc6f127..530c34a89 100644 --- a/GreenshotPlugin/Controls/GreenshotButton.cs +++ b/GreenshotPlugin/Controls/GreenshotButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotCheckBox.cs b/GreenshotPlugin/Controls/GreenshotCheckBox.cs index 67d74172f..30aa74712 100644 --- a/GreenshotPlugin/Controls/GreenshotCheckBox.cs +++ b/GreenshotPlugin/Controls/GreenshotCheckBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs index fe47b59eb..a64a4aabb 100644 --- a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs +++ b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotComboBox.cs b/GreenshotPlugin/Controls/GreenshotComboBox.cs index e304e0f25..0fe165061 100644 --- a/GreenshotPlugin/Controls/GreenshotComboBox.cs +++ b/GreenshotPlugin/Controls/GreenshotComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotForm.cs b/GreenshotPlugin/Controls/GreenshotForm.cs index 36a909462..ab151675a 100644 --- a/GreenshotPlugin/Controls/GreenshotForm.cs +++ b/GreenshotPlugin/Controls/GreenshotForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotGroupBox.cs b/GreenshotPlugin/Controls/GreenshotGroupBox.cs index 6f1ef9f10..b83ce53c9 100644 --- a/GreenshotPlugin/Controls/GreenshotGroupBox.cs +++ b/GreenshotPlugin/Controls/GreenshotGroupBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotLabel.cs b/GreenshotPlugin/Controls/GreenshotLabel.cs index 396977c3b..813eb7aa5 100644 --- a/GreenshotPlugin/Controls/GreenshotLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotLabel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotRadioButton.cs b/GreenshotPlugin/Controls/GreenshotRadioButton.cs index 403f939d0..9de1d2147 100644 --- a/GreenshotPlugin/Controls/GreenshotRadioButton.cs +++ b/GreenshotPlugin/Controls/GreenshotRadioButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotTabPage.cs b/GreenshotPlugin/Controls/GreenshotTabPage.cs index 03922b1e2..9e95517b1 100644 --- a/GreenshotPlugin/Controls/GreenshotTabPage.cs +++ b/GreenshotPlugin/Controls/GreenshotTabPage.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotTextBox.cs b/GreenshotPlugin/Controls/GreenshotTextBox.cs index cc599587c..772520bcd 100644 --- a/GreenshotPlugin/Controls/GreenshotTextBox.cs +++ b/GreenshotPlugin/Controls/GreenshotTextBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs index addc626d2..48301b72d 100644 --- a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs index e23d981db..3678081f0 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs index f543ffe83..615b9206e 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs index 8629bc6e1..2ef417fd9 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index f61217c72..706e5316f 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs index a83c90fa9..e17e9f112 100644 --- a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs index 0b7ebaf6e..899f78134 100644 --- a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs index a46972a0d..f7d47f4c5 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index b5cdd8cd1..e562b1185 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs index a66a66e30..e5b631849 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index d02d05a8d..63a0c783b 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/QualityDialog.Designer.cs b/GreenshotPlugin/Controls/QualityDialog.Designer.cs index 23734de5f..9b7e03fa4 100644 --- a/GreenshotPlugin/Controls/QualityDialog.Designer.cs +++ b/GreenshotPlugin/Controls/QualityDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/QualityDialog.cs b/GreenshotPlugin/Controls/QualityDialog.cs index 81cef1be8..c601c8e88 100644 --- a/GreenshotPlugin/Controls/QualityDialog.cs +++ b/GreenshotPlugin/Controls/QualityDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/SaveImageFileDialog.cs b/GreenshotPlugin/Controls/SaveImageFileDialog.cs index ac99facbb..bf14f2be0 100644 --- a/GreenshotPlugin/Controls/SaveImageFileDialog.cs +++ b/GreenshotPlugin/Controls/SaveImageFileDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index a3cf5de35..7f5053399 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index 64acf4f75..af74efb41 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/AbstractProcessor.cs b/GreenshotPlugin/Core/AbstractProcessor.cs index 667bce3f7..c0d22ea18 100644 --- a/GreenshotPlugin/Core/AbstractProcessor.cs +++ b/GreenshotPlugin/Core/AbstractProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index 8613f82f8..914b27733 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/AnimationHelpers.cs b/GreenshotPlugin/Core/AnimationHelpers.cs index 1cdf9547c..fe70fff73 100644 --- a/GreenshotPlugin/Core/AnimationHelpers.cs +++ b/GreenshotPlugin/Core/AnimationHelpers.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/BinaryStructHelper.cs b/GreenshotPlugin/Core/BinaryStructHelper.cs index 0d43679b4..0a1c64016 100644 --- a/GreenshotPlugin/Core/BinaryStructHelper.cs +++ b/GreenshotPlugin/Core/BinaryStructHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index c13f7c9dd..894e389cc 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/CaptureHandler.cs b/GreenshotPlugin/Core/CaptureHandler.cs index da4dfa7ed..660da5527 100644 --- a/GreenshotPlugin/Core/CaptureHandler.cs +++ b/GreenshotPlugin/Core/CaptureHandler.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7b3819836..7bb88cd61 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 @@ -349,7 +349,7 @@ EndSelection:<<<<<<<4 /// <summary> /// Helper method to try to get an image in the specified format from the dataObject - /// the DIB reader should solve some issues + /// the DIB readed should solve the issue reported here: https://sourceforge.net/projects/greenshot/forums/forum/676083/topic/6354353/index/page/1 /// It also supports Format17/DibV5, by using the following information: http://stackoverflow.com/a/14335591 /// </summary> /// <param name="format">string with the format</param> diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index d4a367090..b5bff9abb 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 31038e3ae..539ab244a 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/DisplayKeyAttribute.cs b/GreenshotPlugin/Core/DisplayKeyAttribute.cs index e66d7acff..b7c2d71f5 100644 --- a/GreenshotPlugin/Core/DisplayKeyAttribute.cs +++ b/GreenshotPlugin/Core/DisplayKeyAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs index 567dc4f29..70c45bfb9 100644 --- a/GreenshotPlugin/Core/Effects.cs +++ b/GreenshotPlugin/Core/Effects.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/EmailConfigHelper.cs b/GreenshotPlugin/Core/EmailConfigHelper.cs index 673b1a9b6..9f1903897 100644 --- a/GreenshotPlugin/Core/EmailConfigHelper.cs +++ b/GreenshotPlugin/Core/EmailConfigHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/EnumExtensions.cs b/GreenshotPlugin/Core/EnumExtensions.cs index 3f4e605c0..780b59a2c 100644 --- a/GreenshotPlugin/Core/EnumExtensions.cs +++ b/GreenshotPlugin/Core/EnumExtensions.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/EventDelay.cs b/GreenshotPlugin/Core/EventDelay.cs index db36fba1e..848d19dd9 100644 --- a/GreenshotPlugin/Core/EventDelay.cs +++ b/GreenshotPlugin/Core/EventDelay.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/ExtensionAttribute.cs b/GreenshotPlugin/Core/ExtensionAttribute.cs index 69916ac74..eed21f8ae 100644 --- a/GreenshotPlugin/Core/ExtensionAttribute.cs +++ b/GreenshotPlugin/Core/ExtensionAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index 26da6df48..228e1e4bf 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 6fb51b764..30c7b3f59 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/GreenshotResources.cs b/GreenshotPlugin/Core/GreenshotResources.cs index 8244775de..701786e80 100644 --- a/GreenshotPlugin/Core/GreenshotResources.cs +++ b/GreenshotPlugin/Core/GreenshotResources.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/IEHelper.cs b/GreenshotPlugin/Core/IEHelper.cs index 43bffff57..0aa8db457 100644 --- a/GreenshotPlugin/Core/IEHelper.cs +++ b/GreenshotPlugin/Core/IEHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index f5998b0c3..86abd0dab 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 0f98ae73e..9b961b0f3 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/InterfaceUtils.cs b/GreenshotPlugin/Core/InterfaceUtils.cs index 0e3e7044a..0b02a9103 100644 --- a/GreenshotPlugin/Core/InterfaceUtils.cs +++ b/GreenshotPlugin/Core/InterfaceUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 44790752a..e897c6a66 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 11172bd92..253493f58 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 30e3ec020..dc816eab7 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index f7adc99fd..110736f5e 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/Objects.cs b/GreenshotPlugin/Core/Objects.cs index 3727d4ef9..4589b9b01 100644 --- a/GreenshotPlugin/Core/Objects.cs +++ b/GreenshotPlugin/Core/Objects.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 645904e5f..122fbc150 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index e7c03c7c1..d9bfa1713 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/RssHelper.cs b/GreenshotPlugin/Core/SourceForgeHelper.cs similarity index 68% rename from GreenshotPlugin/Core/RssHelper.cs rename to GreenshotPlugin/Core/SourceForgeHelper.cs index f2293b6dd..3a027cbbb 100644 --- a/GreenshotPlugin/Core/RssHelper.cs +++ b/GreenshotPlugin/Core/SourceForgeHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 @@ -28,7 +28,7 @@ using System.Xml; using log4net; namespace GreenshotPlugin.Core { - public class RssFile { + public class SourceforgeFile { private readonly string _file; public string File { get {return _file;} @@ -41,6 +41,10 @@ namespace GreenshotPlugin.Core { public string Link { get {return _link;} } + private readonly string _directLink; + public string DirectLink { + get {return _directLink;} + } private Version _version; public Version Version { get {return _version;} @@ -81,21 +85,18 @@ namespace GreenshotPlugin.Core { } } - public RssFile(string file, string pubdate, string link) { - _file = file; - if (!DateTime.TryParse(pubdate, out _pubdate)) - { - DateTime.TryParseExact(pubdate.Replace(" UT", ""), "ddd, dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out _pubdate); - } - _link = link; + public SourceforgeFile(string file, string pubdate, string link, string directLink) { + this._file = file; + DateTime.TryParse(pubdate, out _pubdate); + this._link = link; + this._directLink = directLink; } } - /// <summary> - /// Description of RssHelper. + /// Description of SourceForgeHelper. /// </summary> - public class RssHelper { - private static ILog LOG = LogManager.GetLogger(typeof(RssHelper)); + public class SourceForgeHelper { + private static ILog LOG = LogManager.GetLogger(typeof(SourceForgeHelper)); private const string RSSFEED = "http://getgreenshot.org/project-feed/"; /// <summary> @@ -117,8 +118,8 @@ namespace GreenshotPlugin.Core { /// <summary> /// Read the Greenshot RSS feed, so we can use this information to check for updates /// </summary> - /// <returns>List with RssFile(s)</returns> - public static IList<RssFile> readRSS() { + /// <returns>Dictionary<string, Dictionary<string, RssFile>> with files and their RssFile "description"</returns> + public static Dictionary<string, Dictionary<string, SourceforgeFile>> readRSS() { XmlDocument rssDoc = new XmlDocument(); try { HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(RSSFEED); @@ -162,7 +163,7 @@ namespace GreenshotPlugin.Core { return null; } - IList<RssFile> rssFiles = new List<RssFile>(); + Dictionary<string, Dictionary<string, SourceforgeFile>> rssFiles = new Dictionary<string, Dictionary<string, SourceforgeFile>>(); // Loop for the <title>, <link>, <description> and all the other tags for (int i = 0; i < nodeChannel.ChildNodes.Count; i++) { @@ -170,14 +171,26 @@ namespace GreenshotPlugin.Core { if (nodeChannel.ChildNodes[i].Name == "item") { XmlNode nodeItem = nodeChannel.ChildNodes[i]; - string link = nodeItem["link"].InnerText; + string sfLink = nodeItem["link"].InnerText; string pubdate = nodeItem["pubDate"].InnerText; try { - Match match= Regex.Match(Uri.UnescapeDataString(link), @"^.*\/(Greenshot.+)\/download$"); + Match match= Regex.Match(Uri.UnescapeDataString(sfLink), @"^http.*sourceforge.*\/projects\/([^\/]+)\/files\/([^\/]+)\/([^\/]+)\/(.+)\/download$"); if (match.Success) { - string file = match.Groups[1].Value; - - RssFile rssFile = new RssFile(file, pubdate, link); + string project = match.Groups[1].Value; + string subdir = match.Groups[2].Value; + string type = match.Groups[3].Value; + string file = match.Groups[4].Value; + // !!! Change this to the mirror !!! + string mirror = "kent"; + string directLink = Uri.EscapeUriString("http://"+mirror+".dl.sourceforge.net/project/"+project+"/"+subdir+"/"+type+"/"+file); + Dictionary<string, SourceforgeFile> filesForType; + if (rssFiles.ContainsKey(type)) { + filesForType = rssFiles[type]; + } else { + filesForType = new Dictionary<string, SourceforgeFile>(); + rssFiles.Add(type, filesForType); + } + SourceforgeFile rssFile = new SourceforgeFile(file, pubdate, sfLink, directLink); if (file.EndsWith(".exe") ||file.EndsWith(".zip")) { string version = Regex.Replace(file, @".*[a-zA-Z_]\-", ""); version = version.Replace(@"\-[a-zA-Z]+.*",""); @@ -196,8 +209,16 @@ namespace GreenshotPlugin.Core { LOG.DebugFormat("Found invalid version {0} in file {1}", version, file); } } - rssFiles.Add(rssFile); + } else if (type.Equals("Translations")) { + string culture = Regex.Replace(file, @"[a-zA-Z]+-(..-..)\.(xml|html)", "$1"); + try { + //CultureInfo cultureInfo = new CultureInfo(culture); + rssFile.Language = culture;//cultureInfo.NativeName; + } catch (Exception) { + LOG.WarnFormat("Can't read the native name of the culture {0}", culture); + } } + filesForType.Add(file, rssFile); } } catch (Exception ex) { LOG.WarnFormat("Couldn't read RSS entry for: {0}", nodeChannel["title"].InnerText); diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index 4414e05c0..9cbec97b4 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index df217342e..733aa12f0 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 71f930686..4b69f88ad 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs index e5954ddda..f1caf717c 100644 --- a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs +++ b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index d4da13521..917a12654 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -180,7 +180,7 @@ <Compile Include="Core\Objects.cs" /> <Compile Include="Core\PluginUtils.cs" /> <Compile Include="Core\QuantizerHelper.cs" /> - <Compile Include="Core\RssHelper.cs" /> + <Compile Include="Core\SourceForgeHelper.cs" /> <Compile Include="Core\WindowCapture.cs" /> <Compile Include="Core\WindowsHelper.cs" /> <Compile Include="IniFile\IniAttributes.cs" /> diff --git a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs index 107027365..eb5b399e2 100644 --- a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs index 089b9bb58..0bab7edf0 100644 --- a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument.cs b/GreenshotPlugin/IEInterop/IHTMLDocument.cs index ddbcdfe8a..176b66fea 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs index ae7a7c8eb..a7a2e26e4 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs index f164237e3..8d4825044 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs index b84d0d871..2ee041264 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs index 99c4c26a3..10c603d7d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElement.cs b/GreenshotPlugin/IEInterop/IHTMLElement.cs index 003f4b034..5bdf3bf6f 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElement2.cs b/GreenshotPlugin/IEInterop/IHTMLElement2.cs index e5b5231bc..44a278179 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs index fdd216e5d..3a393c69c 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs index f520a59df..a41922c14 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs index 75c5c44d6..07c2fab8a 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLRect.cs b/GreenshotPlugin/IEInterop/IHTMLRect.cs index f894fe67b..943081b03 100644 --- a/GreenshotPlugin/IEInterop/IHTMLRect.cs +++ b/GreenshotPlugin/IEInterop/IHTMLRect.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen.cs b/GreenshotPlugin/IEInterop/IHTMLScreen.cs index 4ebff42f0..f51807b0d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs index 4412f5e55..459aeb741 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs index d7fe06570..43fb5434c 100644 --- a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs +++ b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLStyle.cs b/GreenshotPlugin/IEInterop/IHTMLStyle.cs index a604203e9..31433a84c 100644 --- a/GreenshotPlugin/IEInterop/IHTMLStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLStyle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs index c198ef772..21e2997b8 100644 --- a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs +++ b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs index 42f03dc63..16e1fd9cc 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs index ab8732654..0fb76e227 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs index 6e06bd75f..276f2bc73 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IEInterop/IWebBrowser2.cs b/GreenshotPlugin/IEInterop/IWebBrowser2.cs index 40eff770b..00abda678 100644 --- a/GreenshotPlugin/IEInterop/IWebBrowser2.cs +++ b/GreenshotPlugin/IEInterop/IWebBrowser2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IniFile/IniAttributes.cs b/GreenshotPlugin/IniFile/IniAttributes.cs index 01b119404..a885bb7e1 100644 --- a/GreenshotPlugin/IniFile/IniAttributes.cs +++ b/GreenshotPlugin/IniFile/IniAttributes.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index c00b5bae0..a6bbfca12 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IniFile/IniReader.cs b/GreenshotPlugin/IniFile/IniReader.cs index fbaea2680..3447bf9db 100644 --- a/GreenshotPlugin/IniFile/IniReader.cs +++ b/GreenshotPlugin/IniFile/IniReader.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IniFile/IniSection.cs b/GreenshotPlugin/IniFile/IniSection.cs index cf29ab2d7..40aba49f9 100644 --- a/GreenshotPlugin/IniFile/IniSection.cs +++ b/GreenshotPlugin/IniFile/IniSection.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index 70d9b1bb6..c7fe99d01 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/Capture.cs b/GreenshotPlugin/Interfaces/Capture.cs index c8170ceb9..3ac0d0a15 100644 --- a/GreenshotPlugin/Interfaces/Capture.cs +++ b/GreenshotPlugin/Interfaces/Capture.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index e2a253a49..7be49e852 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs index 1f589e41c..8c49e4e2d 100644 --- a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs +++ b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index e21141206..73e6c2cf6 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index 4da036457..e7da7eb9a 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/IProcessor.cs b/GreenshotPlugin/Interfaces/IProcessor.cs index 131e4ab6b..40737888f 100644 --- a/GreenshotPlugin/Interfaces/IProcessor.cs +++ b/GreenshotPlugin/Interfaces/IProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index 5416aa294..b21963bf2 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 98bda9f1c..49c3e1d8d 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/ComProgIdAttribute.cs b/GreenshotPlugin/Interop/ComProgIdAttribute.cs index 31fd60f2e..c2d9e1434 100644 --- a/GreenshotPlugin/Interop/ComProgIdAttribute.cs +++ b/GreenshotPlugin/Interop/ComProgIdAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/IAppVisibility.cs b/GreenshotPlugin/Interop/IAppVisibility.cs index 97e052037..edcfcf915 100644 --- a/GreenshotPlugin/Interop/IAppVisibility.cs +++ b/GreenshotPlugin/Interop/IAppVisibility.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/IDispatch.cs b/GreenshotPlugin/Interop/IDispatch.cs index bd3b5aabf..e83bc4488 100644 --- a/GreenshotPlugin/Interop/IDispatch.cs +++ b/GreenshotPlugin/Interop/IDispatch.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/IOleCommandTarget.cs b/GreenshotPlugin/Interop/IOleCommandTarget.cs index 8a2f7d45f..6dc6deb28 100644 --- a/GreenshotPlugin/Interop/IOleCommandTarget.cs +++ b/GreenshotPlugin/Interop/IOleCommandTarget.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/IOleWindow.cs b/GreenshotPlugin/Interop/IOleWindow.cs index ba2105f17..b34945312 100644 --- a/GreenshotPlugin/Interop/IOleWindow.cs +++ b/GreenshotPlugin/Interop/IOleWindow.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/IServiceProvider.cs b/GreenshotPlugin/Interop/IServiceProvider.cs index 207d02d55..1152fa7b8 100644 --- a/GreenshotPlugin/Interop/IServiceProvider.cs +++ b/GreenshotPlugin/Interop/IServiceProvider.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Interop/IUnknown.cs b/GreenshotPlugin/Interop/IUnknown.cs index a13d15287..8f19c9beb 100644 --- a/GreenshotPlugin/Interop/IUnknown.cs +++ b/GreenshotPlugin/Interop/IUnknown.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/Properties/AssemblyInfo.cs b/GreenshotPlugin/Properties/AssemblyInfo.cs index 3fa090e3b..f4e66e2f6 100644 --- a/GreenshotPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/DWM.cs b/GreenshotPlugin/UnmanagedHelpers/DWM.cs index 8488ea45d..7a5c77b72 100644 --- a/GreenshotPlugin/UnmanagedHelpers/DWM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/DWM.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index 6a3bd273f..9a3fbbaf4 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index dd225e914..2d12a4a81 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs index b4feab39b..dd446b425 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs index e72bf53ba..677e1a0f4 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs index 9e0bdba0b..1d20744d2 100644 --- a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs +++ b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index 8d807a4c1..945c3b292 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index 82037faba..e0e3cadcb 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index a526daf65..416a38823 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index f6614d1b5..23c9085f8 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 diff --git a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs index be2451c21..2ad24e99c 100644 --- a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * 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 From b10dfe43ad0c0a993cc4a68f60adde981a29d3fc Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Thu, 24 Mar 2016 23:02:39 +0100 Subject: [PATCH 013/170] Removing bitbucket references, the scripts are local so no need to download. --- appveyor12.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor12.yml b/appveyor12.yml index f689f31dd..a9e0d6b08 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -42,12 +42,12 @@ environment: rsakey: secure: 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 before_build: -- ps: iex (new-object Net.WebClient).DownloadString("https://bitbucket.org/greenshot/greenshot/raw/1.2/prebuild.ps1") +- ps: prebuild.ps1 build: project: greenshot\greenshot.sln verbosity: normal after_build: -- ps: iex (new-object Net.WebClient).DownloadString("https://bitbucket.org/greenshot/greenshot/raw/1.2/build.ps1") +- ps: build.ps1 test: off artifacts: - path: Greenshot\releases\Greenshot*INSTALLER*.exe From e409392f32e1c666fb78c7a92c7b795926628a03 Mon Sep 17 00:00:00 2001 From: jklingen <jklingen@users.noreply.github.com> Date: Thu, 24 Mar 2016 23:04:47 +0100 Subject: [PATCH 014/170] Revert "Revert "Removed most references to SF"" --- Greenshot/AssemblyInfo.cs | 2 +- .../Configuration/EditorConfiguration.cs | 2 +- Greenshot/Configuration/LanguageKeys.cs | 2 +- Greenshot/Controls/BindableToolStripButton.cs | 2 +- .../Controls/BindableToolStripComboBox.cs | 2 +- .../BindableToolStripDropDownButton.cs | 2 +- Greenshot/Controls/ColorButton.cs | 2 +- ...ontextMenuToolStripProfessionalRenderer.cs | 2 +- .../CustomToolStripProfessionalRenderer.cs | 2 +- Greenshot/Controls/FontFamilyComboBox.cs | 2 +- Greenshot/Controls/MenuStripEx.cs | 2 +- Greenshot/Controls/NonJumpingPanel.cs | 2 +- Greenshot/Controls/Pipette.cs | 2 +- Greenshot/Controls/ToolStripColorButton.cs | 2 +- Greenshot/Controls/ToolStripEx.cs | 2 +- Greenshot/Controls/ToolStripNumericUpDown.cs | 2 +- .../Destinations/ClipboardDestination.cs | 2 +- Greenshot/Destinations/EditorDestination.cs | 2 +- Greenshot/Destinations/EmailDestination.cs | 2 +- Greenshot/Destinations/FileDestination.cs | 2 +- .../Destinations/FileWithDialogDestination.cs | 2 +- Greenshot/Destinations/PickerDestination.cs | 2 +- Greenshot/Destinations/PrinterDestination.cs | 2 +- Greenshot/Drawing/ArrowContainer.cs | 2 +- Greenshot/Drawing/CropContainer.cs | 2 +- Greenshot/Drawing/CursorContainer.cs | 2 +- Greenshot/Drawing/DrawableContainer.cs | 2 +- Greenshot/Drawing/DrawableContainerList.cs | 2 +- Greenshot/Drawing/EllipseContainer.cs | 2 +- .../Drawing/Fields/AbstractFieldHolder.cs | 2 +- .../Fields/AbstractFieldHolderWithChildren.cs | 2 +- .../Binding/AbstractBindingConverter.cs | 2 +- .../Fields/Binding/BidirectionalBinding.cs | 2 +- .../DecimalDoublePercentageConverter.cs | 2 +- .../Fields/Binding/DecimalFloatConverter.cs | 2 +- .../Fields/Binding/DecimalIntConverter.cs | 2 +- .../Fields/Binding/IBindingConverter.cs | 2 +- .../Fields/Binding/IBindingValidator.cs | 2 +- .../Fields/Binding/NotNullValidator.cs | 2 +- Greenshot/Drawing/Fields/Field.cs | 2 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 +- Greenshot/Drawing/Fields/FieldType.cs | 2 +- Greenshot/Drawing/Fields/IFieldHolder.cs | 2 +- Greenshot/Drawing/FilterContainer.cs | 2 +- Greenshot/Drawing/Filters/AbstractFilter.cs | 2 +- Greenshot/Drawing/Filters/BlurFilter.cs | 2 +- Greenshot/Drawing/Filters/BrightnessFilter.cs | 2 +- Greenshot/Drawing/Filters/GrayscaleFilter.cs | 2 +- Greenshot/Drawing/Filters/HighlightFilter.cs | 2 +- Greenshot/Drawing/Filters/IFilter.cs | 2 +- Greenshot/Drawing/Filters/MagnifierFilter.cs | 2 +- .../Drawing/Filters/PixelizationFilter.cs | 2 +- Greenshot/Drawing/FreehandContainer.cs | 2 +- Greenshot/Drawing/Gripper.cs | 2 +- Greenshot/Drawing/HighlightContainer.cs | 2 +- Greenshot/Drawing/IconContainer.cs | 2 +- Greenshot/Drawing/ImageContainer.cs | 2 +- Greenshot/Drawing/LineContainer.cs | 2 +- Greenshot/Drawing/ObfuscateContainer.cs | 2 +- Greenshot/Drawing/RectangleContainer.cs | 2 +- Greenshot/Drawing/RoundedRectangle.cs | 2 +- Greenshot/Drawing/SpeechbubbleContainer.cs | 2 +- Greenshot/Drawing/StepLabelContainer.cs | 2 +- Greenshot/Drawing/Surface.cs | 2 +- Greenshot/Drawing/TextContainer.cs | 2 +- Greenshot/Forms/AboutForm.Designer.cs | 4 +- Greenshot/Forms/AboutForm.cs | 2 +- Greenshot/Forms/AnimatingBaseForm.cs | 2 +- Greenshot/Forms/BaseForm.cs | 2 +- Greenshot/Forms/BugReportForm.Designer.cs | 2 +- Greenshot/Forms/BugReportForm.cs | 2 +- Greenshot/Forms/CaptureForm.Designer.cs | 2 +- Greenshot/Forms/CaptureForm.cs | 2 +- Greenshot/Forms/ColorDialog.Designer.cs | 2 +- Greenshot/Forms/ColorDialog.cs | 2 +- .../Forms/DropShadowSettingsForm.Designer.cs | 2 +- Greenshot/Forms/DropShadowSettingsForm.cs | 2 +- Greenshot/Forms/ImageEditorForm.Designer.cs | 2 +- Greenshot/Forms/ImageEditorForm.cs | 2 +- Greenshot/Forms/LanguageDialog.Designer.cs | 2 +- Greenshot/Forms/LanguageDialog.cs | 2 +- Greenshot/Forms/MainForm.Designer.cs | 2 +- Greenshot/Forms/MainForm.cs | 2 +- Greenshot/Forms/MovableShowColorForm.cs | 2 +- .../Forms/PrintOptionsDialog.Designer.cs | 2 +- Greenshot/Forms/PrintOptionsDialog.cs | 2 +- .../Forms/ResizeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/ResizeSettingsForm.cs | 2 +- Greenshot/Forms/SettingsForm.Designer.cs | 2 +- Greenshot/Forms/SettingsForm.cs | 2 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 2 +- .../Forms/TornEdgeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/TornEdgeSettingsForm.cs | 2 +- Greenshot/GreenshotMain.cs | 2 +- Greenshot/Help/HelpFileLoader.cs | 2 +- Greenshot/Helpers/CaptureHelper.cs | 2 +- Greenshot/Helpers/Colors.cs | 2 +- Greenshot/Helpers/CopyData.cs | 2 +- Greenshot/Helpers/DestinationHelper.cs | 2 +- Greenshot/Helpers/EnvironmentInfo.cs | 2 +- Greenshot/Helpers/GeometryHelper.cs | 2 +- Greenshot/Helpers/GuiRectangle.cs | 2 +- Greenshot/Helpers/IECaptureHelper.cs | 2 +- Greenshot/Helpers/IEInterop/IEContainer.cs | 2 +- Greenshot/Helpers/MailHelper.cs | 2 +- Greenshot/Helpers/PluginHelper.cs | 2 +- Greenshot/Helpers/PrintHelper.cs | 2 +- Greenshot/Helpers/ProcessorHelper.cs | 2 +- Greenshot/Helpers/ScaleHelper.cs | 2 +- Greenshot/Helpers/SoundHelper.cs | 2 +- Greenshot/Helpers/StartupHelper.cs | 2 +- Greenshot/Helpers/ToolStripItemEndisabler.cs | 2 +- Greenshot/Helpers/UpdateHelper.cs | 110 +++++++----------- Greenshot/Helpers/WindowWrapper.cs | 2 +- Greenshot/Languages/language-ar-SY.xml | 54 ++++----- Greenshot/Languages/language-cs-CZ.xml | 2 +- Greenshot/Languages/language-de-DE.xml | 2 +- Greenshot/Languages/language-el-GR.xml | 2 +- Greenshot/Languages/language-en-US.xml | 2 +- Greenshot/Languages/language-es-ES.xml | 2 +- Greenshot/Languages/language-fi-FI.xml | 2 +- Greenshot/Languages/language-fr-FR.xml | 56 ++++----- Greenshot/Languages/language-fr-QC.xml | 42 +++---- Greenshot/Languages/language-he-IL.xml | 2 +- Greenshot/Languages/language-hu-HU.xml | 54 ++++----- Greenshot/Languages/language-it-IT.xml | 2 +- Greenshot/Languages/language-ja-JP.xml | 2 +- Greenshot/Languages/language-ko-KR.xml | 2 +- Greenshot/Languages/language-lt-LT.xml | 48 ++++---- Greenshot/Languages/language-nl-NL.xml | 2 +- Greenshot/Languages/language-nn-NO.xml | 54 ++++----- Greenshot/Languages/language-pl-PL.xml | 2 +- Greenshot/Languages/language-pt-BR.xml | 2 +- Greenshot/Languages/language-pt-PT.xml | 2 +- Greenshot/Languages/language-ro-RO.xml | 2 +- Greenshot/Languages/language-ru-RU.xml | 56 ++++----- Greenshot/Languages/language-sk-SK.xml | 2 +- Greenshot/Languages/language-sr-RS.xml | 2 +- Greenshot/Languages/language-sv-SE.xml | 2 +- Greenshot/Languages/language-tr-TR.xml | 2 +- Greenshot/Languages/language-uk-UA.xml | 2 +- Greenshot/Languages/language-vi-VN.xml | 2 +- Greenshot/Languages/language-zh-CN.xml | 2 +- Greenshot/Languages/language-zh-TW.xml | 2 +- Greenshot/Memento/AddElementMemento.cs | 2 +- Greenshot/Memento/ChangeFieldHolderMemento.cs | 2 +- Greenshot/Memento/DeleteElementMemento.cs | 2 +- .../DrawableContainerBoundsChangeMemento.cs | 2 +- Greenshot/Memento/IMemento.cs | 2 +- .../Memento/SurfaceBackgroundChangeMemento.cs | 2 +- Greenshot/Memento/TextChangeMemento.cs | 2 +- Greenshot/Processors/TitleFixProcessor.cs | 2 +- GreenshotBoxPlugin/BoxConfiguration.cs | 2 +- GreenshotBoxPlugin/BoxCredentials.cs | 2 +- GreenshotBoxPlugin/BoxDestination.cs | 2 +- GreenshotBoxPlugin/BoxEntities.cs | 2 +- GreenshotBoxPlugin/BoxPlugin.cs | 2 +- GreenshotBoxPlugin/BoxUtils.cs | 2 +- GreenshotBoxPlugin/Forms/BoxForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotBoxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotBoxPlugin/LanguageKeys.cs | 2 +- GreenshotBoxPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotConfluencePlugin/Confluence.cs | 2 +- .../ConfluenceConfiguration.cs | 2 +- .../ConfluenceDestination.cs | 2 +- GreenshotConfluencePlugin/ConfluencePlugin.cs | 2 +- GreenshotConfluencePlugin/ConfluenceUtils.cs | 2 +- GreenshotConfluencePlugin/EnumDisplayer.cs | 2 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 2 +- .../Forms/ConfluencePagePicker.xaml.cs | 2 +- .../Forms/ConfluenceSearch.xaml.cs | 2 +- .../Forms/ConfluenceTreePicker.xaml.cs | 2 +- .../Forms/ConfluenceUpload.xaml.cs | 2 +- GreenshotConfluencePlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotDropboxPlugin/DropBoxCredentials.cs | 2 +- GreenshotDropboxPlugin/DropboxDestination.cs | 2 +- GreenshotDropboxPlugin/DropboxPlugin.cs | 2 +- .../DropboxPluginConfiguration.cs | 2 +- GreenshotDropboxPlugin/DropboxUtils.cs | 2 +- GreenshotDropboxPlugin/Forms/DropboxForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotDropboxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotDropboxPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../ExternalCommandConfiguration.cs | 2 +- .../ExternalCommandDestination.cs | 2 +- .../ExternalCommandForm.cs | 2 +- .../ExternalCommandPlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../SettingsForm.Designer.cs | 2 +- .../SettingsForm.cs | 2 +- .../SettingsFormDetail.Designer.cs | 2 +- .../SettingsFormDetail.cs | 2 +- GreenshotFlickrPlugin/FlickrConfiguration.cs | 2 +- GreenshotFlickrPlugin/FlickrCredentials.cs | 2 +- GreenshotFlickrPlugin/FlickrDestination.cs | 2 +- GreenshotFlickrPlugin/FlickrPlugin.cs | 2 +- GreenshotFlickrPlugin/FlickrUtils.cs | 2 +- GreenshotFlickrPlugin/Forms/FlickrForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotFlickrPlugin/Forms/SettingsForm.cs | 2 +- GreenshotFlickrPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurForm.cs | 2 +- .../Forms/ImgurHistory.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurHistory.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/SettingsForm.cs | 2 +- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 +- GreenshotImgurPlugin/ImgurCredentials.cs | 2 +- GreenshotImgurPlugin/ImgurDestination.cs | 2 +- GreenshotImgurPlugin/ImgurInfo.cs | 2 +- GreenshotImgurPlugin/ImgurPlugin.cs | 2 +- GreenshotImgurPlugin/ImgurUtils.cs | 2 +- GreenshotImgurPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Forms/JiraForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/JiraForm.cs | 2 +- GreenshotJiraPlugin/Forms/JiraFormBase.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.cs | 2 +- GreenshotJiraPlugin/Jira.cs | 2 +- GreenshotJiraPlugin/JiraConfiguration.cs | 2 +- GreenshotJiraPlugin/JiraDestination.cs | 2 +- GreenshotJiraPlugin/JiraPlugin.cs | 2 +- GreenshotJiraPlugin/JiraUtils.cs | 2 +- GreenshotJiraPlugin/LanguageKeys.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotOCRCommand/COMWrapper.cs | 2 +- GreenshotOCRCommand/ComProgIdAttribute.cs | 2 +- GreenshotOCRCommand/ModiInterop.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/OCRConfiguration.cs | 2 +- GreenshotOCRPlugin/OCRDestination.cs | 2 +- GreenshotOCRPlugin/OCRForm.cs | 2 +- GreenshotOCRPlugin/OCRPlugin.cs | 2 +- GreenshotOCRPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/SettingsForm.Designer.cs | 2 +- GreenshotOCRPlugin/SettingsForm.cs | 2 +- .../Destinations/ExcelDestination.cs | 2 +- .../Destinations/OneNoteDestination.cs | 2 +- .../Destinations/OutlookDestination.cs | 2 +- .../Destinations/PowerpointDestination.cs | 2 +- .../Destinations/WordDestination.cs | 2 +- GreenshotOfficePlugin/OfficeConfiguration.cs | 2 +- .../OfficeExport/ExcelExporter.cs | 2 +- .../OfficeExport/OneNoteExporter.cs | 2 +- .../OfficeExport/OutlookEmailExporter.cs | 2 +- .../OfficeExport/PowerpointExporter.cs | 2 +- .../OfficeExport/WordExporter.cs | 2 +- .../OfficeInterop/ExcelInterop.cs | 2 +- .../OfficeInterop/OfficeInterop.cs | 2 +- .../OfficeInterop/OneNoteInterop.cs | 2 +- .../OfficeInterop/OutlookInterop.cs | 2 +- .../OfficeInterop/OutlookUtils.cs | 2 +- .../OfficeInterop/PowerpointInterop.cs | 2 +- .../OfficeInterop/WordInterop.cs | 2 +- GreenshotOfficePlugin/OfficePlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../Forms/PhotobucketForm.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- .../Forms/SettingsForm.cs | 2 +- GreenshotPhotobucketPlugin/LanguageKeys.cs | 2 +- .../PhotobucketConfiguration.cs | 2 +- .../PhotobucketCredentials.cs | 2 +- .../PhotobucketDestination.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketInfo.cs | 2 +- .../PhotobucketPlugin.cs | 2 +- .../PhotobucketUtils.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotPicasaPlugin/PicasaCredentials.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/Controls/AnimatingForm.cs | 2 +- .../Controls/BackgroundForm.Designer.cs | 2 +- GreenshotPlugin/Controls/BackgroundForm.cs | 2 +- .../Controls/ExtendedWebBrowser.cs | 2 +- .../Controls/FormWithoutActivation.cs | 2 +- GreenshotPlugin/Controls/GreenshotButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotCheckBox.cs | 2 +- .../Controls/GreenshotColumnSorter.cs | 2 +- GreenshotPlugin/Controls/GreenshotComboBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotForm.cs | 2 +- GreenshotPlugin/Controls/GreenshotGroupBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotLabel.cs | 2 +- .../Controls/GreenshotRadioButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotTabPage.cs | 2 +- GreenshotPlugin/Controls/GreenshotTextBox.cs | 2 +- .../Controls/GreenshotToolDropDownButton.cs | 2 +- .../Controls/GreenshotToolStripButton.cs | 2 +- .../Controls/GreenshotToolStripLabel.cs | 2 +- .../Controls/GreenshotToolStripMenuItem.cs | 2 +- GreenshotPlugin/Controls/HotkeyControl.cs | 2 +- .../Controls/IGreenshotConfigBindable.cs | 2 +- .../Controls/IGreenshotLanguageBindable.cs | 2 +- .../Controls/OAuthLoginForm.Designer.cs | 2 +- GreenshotPlugin/Controls/OAuthLoginForm.cs | 2 +- .../Controls/PleaseWaitForm.Designer.cs | 2 +- GreenshotPlugin/Controls/PleaseWaitForm.cs | 2 +- .../Controls/QualityDialog.Designer.cs | 2 +- GreenshotPlugin/Controls/QualityDialog.cs | 2 +- .../Controls/SaveImageFileDialog.cs | 2 +- GreenshotPlugin/Controls/ThumbnailForm.cs | 2 +- GreenshotPlugin/Core/AbstractDestination.cs | 2 +- GreenshotPlugin/Core/AbstractProcessor.cs | 2 +- GreenshotPlugin/Core/AccessibleHelper.cs | 2 +- GreenshotPlugin/Core/AnimationHelpers.cs | 2 +- GreenshotPlugin/Core/BinaryStructHelper.cs | 2 +- GreenshotPlugin/Core/Cache.cs | 2 +- GreenshotPlugin/Core/CaptureHandler.cs | 2 +- GreenshotPlugin/Core/ClipboardHelper.cs | 4 +- GreenshotPlugin/Core/CoreConfiguration.cs | 2 +- GreenshotPlugin/Core/CredentialsHelper.cs | 2 +- GreenshotPlugin/Core/DisplayKeyAttribute.cs | 2 +- GreenshotPlugin/Core/Effects.cs | 2 +- GreenshotPlugin/Core/EmailConfigHelper.cs | 2 +- GreenshotPlugin/Core/EnumExtensions.cs | 2 +- GreenshotPlugin/Core/EventDelay.cs | 2 +- GreenshotPlugin/Core/ExtensionAttribute.cs | 2 +- GreenshotPlugin/Core/FastBitmap.cs | 2 +- GreenshotPlugin/Core/FilenameHelper.cs | 2 +- GreenshotPlugin/Core/GreenshotResources.cs | 2 +- GreenshotPlugin/Core/IEHelper.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 2 +- GreenshotPlugin/Core/ImageOutput.cs | 2 +- GreenshotPlugin/Core/InterfaceUtils.cs | 2 +- GreenshotPlugin/Core/Language.cs | 2 +- GreenshotPlugin/Core/LogHelper.cs | 2 +- GreenshotPlugin/Core/NetworkHelper.cs | 2 +- GreenshotPlugin/Core/OAuthHelper.cs | 2 +- GreenshotPlugin/Core/Objects.cs | 2 +- GreenshotPlugin/Core/PluginUtils.cs | 2 +- GreenshotPlugin/Core/QuantizerHelper.cs | 2 +- .../{SourceForgeHelper.cs => RssHelper.cs} | 65 ++++------- GreenshotPlugin/Core/StringExtensions.cs | 2 +- GreenshotPlugin/Core/WindowCapture.cs | 2 +- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- .../Core/WmInputLangChangeRequestFilter.cs | 2 +- GreenshotPlugin/GreenshotPlugin.csproj | 2 +- GreenshotPlugin/IEInterop/IHTMLBodyElement.cs | 2 +- .../IEInterop/IHTMLCurrentStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument4.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument5.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement2.cs | 2 +- .../IEInterop/IHTMLElementCollection.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLFrameBase.cs | 2 +- .../IEInterop/IHTMLFramesCollection2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLRect.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen2.cs | 2 +- .../IEInterop/IHTMLSelectionObject.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLTxtRange.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow4.cs | 2 +- GreenshotPlugin/IEInterop/IWebBrowser2.cs | 2 +- GreenshotPlugin/IniFile/IniAttributes.cs | 2 +- GreenshotPlugin/IniFile/IniConfig.cs | 2 +- GreenshotPlugin/IniFile/IniReader.cs | 2 +- GreenshotPlugin/IniFile/IniSection.cs | 2 +- GreenshotPlugin/IniFile/IniValue.cs | 2 +- GreenshotPlugin/Interfaces/Capture.cs | 2 +- .../Interfaces/Drawing/Container.cs | 2 +- .../Interfaces/Forms/ImageEditor.cs | 2 +- GreenshotPlugin/Interfaces/Generic.cs | 2 +- GreenshotPlugin/Interfaces/IDestination.cs | 2 +- GreenshotPlugin/Interfaces/IProcessor.cs | 2 +- .../Interfaces/Plugin/PluginInterfaces.cs | 2 +- GreenshotPlugin/Interop/COMWrapper.cs | 2 +- GreenshotPlugin/Interop/ComProgIdAttribute.cs | 2 +- GreenshotPlugin/Interop/IAppVisibility.cs | 2 +- GreenshotPlugin/Interop/IDispatch.cs | 2 +- GreenshotPlugin/Interop/IOleCommandTarget.cs | 2 +- GreenshotPlugin/Interop/IOleWindow.cs | 2 +- GreenshotPlugin/Interop/IServiceProvider.cs | 2 +- GreenshotPlugin/Interop/IUnknown.cs | 2 +- GreenshotPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/DWM.cs | 2 +- .../UnmanagedHelpers/Enumerations.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDIplus.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Kernel32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/PsAPI.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/User32.cs | 2 +- .../UnmanagedHelpers/Win32Errors.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/WinMM.cs | 2 +- 394 files changed, 633 insertions(+), 680 deletions(-) rename GreenshotPlugin/Core/{SourceForgeHelper.cs => RssHelper.cs} (68%) diff --git a/Greenshot/AssemblyInfo.cs b/Greenshot/AssemblyInfo.cs index 71277cb02..8faad06ca 100644 --- a/Greenshot/AssemblyInfo.cs +++ b/Greenshot/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index 4c805e5ce..c74592a8d 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs index 57b21f268..240fcd3e8 100644 --- a/Greenshot/Configuration/LanguageKeys.cs +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index 5641a9c27..3d2fa28b6 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs index 192e25ecb..0b991e4c6 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs index d32b2453d..a50139e00 100644 --- a/Greenshot/Controls/BindableToolStripDropDownButton.cs +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index 8eb49f13e..80e77399c 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index 6c18554da..a159283b4 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs index 89260baf3..8f7e454af 100644 --- a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs index 410c87402..f25355fb3 100644 --- a/Greenshot/Controls/FontFamilyComboBox.cs +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/MenuStripEx.cs b/Greenshot/Controls/MenuStripEx.cs index aa880f06e..a4ead03fe 100644 --- a/Greenshot/Controls/MenuStripEx.cs +++ b/Greenshot/Controls/MenuStripEx.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/NonJumpingPanel.cs b/Greenshot/Controls/NonJumpingPanel.cs index 8392b9219..bab51077b 100644 --- a/Greenshot/Controls/NonJumpingPanel.cs +++ b/Greenshot/Controls/NonJumpingPanel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index 6aeccf9b5..d54e56d78 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index 915721248..cbabe38fb 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ToolStripEx.cs b/Greenshot/Controls/ToolStripEx.cs index 3a32224c3..38e1aa737 100644 --- a/Greenshot/Controls/ToolStripEx.cs +++ b/Greenshot/Controls/ToolStripEx.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Controls/ToolStripNumericUpDown.cs b/Greenshot/Controls/ToolStripNumericUpDown.cs index 376c021d0..35916c909 100644 --- a/Greenshot/Controls/ToolStripNumericUpDown.cs +++ b/Greenshot/Controls/ToolStripNumericUpDown.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/ClipboardDestination.cs b/Greenshot/Destinations/ClipboardDestination.cs index 25476f64e..fecebc33e 100644 --- a/Greenshot/Destinations/ClipboardDestination.cs +++ b/Greenshot/Destinations/ClipboardDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/EditorDestination.cs b/Greenshot/Destinations/EditorDestination.cs index 0aaed76a2..41cb39bae 100644 --- a/Greenshot/Destinations/EditorDestination.cs +++ b/Greenshot/Destinations/EditorDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index b82b233b0..00b5dfc90 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 24af9bd1d..149173722 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/FileWithDialogDestination.cs b/Greenshot/Destinations/FileWithDialogDestination.cs index e14b804b6..151ba4d97 100644 --- a/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/Greenshot/Destinations/FileWithDialogDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/PickerDestination.cs b/Greenshot/Destinations/PickerDestination.cs index 7988dea71..cd3c68273 100644 --- a/Greenshot/Destinations/PickerDestination.cs +++ b/Greenshot/Destinations/PickerDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index bc4ce8af0..af44cd910 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/ArrowContainer.cs b/Greenshot/Drawing/ArrowContainer.cs index f1c65ff53..fc39c61d9 100644 --- a/Greenshot/Drawing/ArrowContainer.cs +++ b/Greenshot/Drawing/ArrowContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index 676836f93..e7588d7e8 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs index 3911d5940..fbc37d0b1 100644 --- a/Greenshot/Drawing/CursorContainer.cs +++ b/Greenshot/Drawing/CursorContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index aa4ffce43..4699375ea 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 570949a40..56dc2b281 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs index caf41824b..3a4651494 100644 --- a/Greenshot/Drawing/EllipseContainer.cs +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 0f8df4937..4e0fa10e4 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index b919edd9b..c0754175f 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs index da43dd6f3..684f54716 100644 --- a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs index 21ebeb1ef..e67f0ee21 100644 --- a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs index 7638c98ee..d7e92247f 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs index 0d53793ec..c2f58fd9d 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs index 9610e9759..4507f0495 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs index 82a2129b3..c791fe9b1 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs index 6edc70f6e..acc9808d6 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs index 06254324f..c7e917aa4 100644 --- a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs index 28246a6cc..7e3e9e3bc 100644 --- a/Greenshot/Drawing/Fields/Field.cs +++ b/Greenshot/Drawing/Fields/Field.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 1d9e8b6bf..c40edc993 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index 4469f86cf..f51de36a9 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Fields/IFieldHolder.cs b/Greenshot/Drawing/Fields/IFieldHolder.cs index 1fd2952f3..063ca48d7 100644 --- a/Greenshot/Drawing/Fields/IFieldHolder.cs +++ b/Greenshot/Drawing/Fields/IFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs index 630c5c35d..3793bf5fc 100644 --- a/Greenshot/Drawing/FilterContainer.cs +++ b/Greenshot/Drawing/FilterContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index cd1be85a2..d784c5b93 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/BlurFilter.cs b/Greenshot/Drawing/Filters/BlurFilter.cs index 1b2e6ab68..0402bd521 100644 --- a/Greenshot/Drawing/Filters/BlurFilter.cs +++ b/Greenshot/Drawing/Filters/BlurFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/BrightnessFilter.cs b/Greenshot/Drawing/Filters/BrightnessFilter.cs index f7d689d52..3e8b0541a 100644 --- a/Greenshot/Drawing/Filters/BrightnessFilter.cs +++ b/Greenshot/Drawing/Filters/BrightnessFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/GrayscaleFilter.cs b/Greenshot/Drawing/Filters/GrayscaleFilter.cs index a6d0ac83d..d89cd7ec0 100644 --- a/Greenshot/Drawing/Filters/GrayscaleFilter.cs +++ b/Greenshot/Drawing/Filters/GrayscaleFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/HighlightFilter.cs b/Greenshot/Drawing/Filters/HighlightFilter.cs index 896bbff5c..a9cc5a5a8 100644 --- a/Greenshot/Drawing/Filters/HighlightFilter.cs +++ b/Greenshot/Drawing/Filters/HighlightFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/IFilter.cs b/Greenshot/Drawing/Filters/IFilter.cs index 5840e9650..c5bc7d0ad 100644 --- a/Greenshot/Drawing/Filters/IFilter.cs +++ b/Greenshot/Drawing/Filters/IFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/MagnifierFilter.cs b/Greenshot/Drawing/Filters/MagnifierFilter.cs index 23359546e..f5e96be30 100644 --- a/Greenshot/Drawing/Filters/MagnifierFilter.cs +++ b/Greenshot/Drawing/Filters/MagnifierFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Filters/PixelizationFilter.cs b/Greenshot/Drawing/Filters/PixelizationFilter.cs index a7f13c096..53853d7a5 100644 --- a/Greenshot/Drawing/Filters/PixelizationFilter.cs +++ b/Greenshot/Drawing/Filters/PixelizationFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index b30937c2b..23ea7f408 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Gripper.cs b/Greenshot/Drawing/Gripper.cs index 7a65fc57a..52ee5adbf 100644 --- a/Greenshot/Drawing/Gripper.cs +++ b/Greenshot/Drawing/Gripper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index aec48208f..5dc015495 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index 86b82a46f..e2ab3c27d 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index b9f9c6dc3..3cec536d2 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index 4189134ac..1cf4ef4c1 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index 80f395c31..fcb6afbca 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index c235346c5..5bf16de04 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs index 51ea777ff..b38e48330 100644 --- a/Greenshot/Drawing/RoundedRectangle.cs +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index 64ede51e8..b0cdf3f76 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2012 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 79583c5ab..e4a1bb337 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2012 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index b28e2a86f..1eea446cc 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 110c40775..d4c4ec2a0 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/AboutForm.Designer.cs b/Greenshot/Forms/AboutForm.Designer.cs index 342d6d734..552a28af1 100644 --- a/Greenshot/Forms/AboutForm.Designer.cs +++ b/Greenshot/Forms/AboutForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -104,7 +104,7 @@ namespace Greenshot { 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.Text = "https://github.com/greenshot/greenshot"; this.linkLblHost.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // linkLblBugs diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index 64934dea0..8c11bbf13 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ +* The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/AnimatingBaseForm.cs b/Greenshot/Forms/AnimatingBaseForm.cs index 36d85c2b3..a04532165 100644 --- a/Greenshot/Forms/AnimatingBaseForm.cs +++ b/Greenshot/Forms/AnimatingBaseForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/BaseForm.cs b/Greenshot/Forms/BaseForm.cs index 59293cd1c..a230a6615 100644 --- a/Greenshot/Forms/BaseForm.cs +++ b/Greenshot/Forms/BaseForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/BugReportForm.Designer.cs b/Greenshot/Forms/BugReportForm.Designer.cs index f1c5147e0..6debe66ec 100644 --- a/Greenshot/Forms/BugReportForm.Designer.cs +++ b/Greenshot/Forms/BugReportForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/BugReportForm.cs b/Greenshot/Forms/BugReportForm.cs index 2f6fb0247..9683d3243 100644 --- a/Greenshot/Forms/BugReportForm.cs +++ b/Greenshot/Forms/BugReportForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/CaptureForm.Designer.cs b/Greenshot/Forms/CaptureForm.Designer.cs index 72deb4ffd..02f5780f8 100644 --- a/Greenshot/Forms/CaptureForm.Designer.cs +++ b/Greenshot/Forms/CaptureForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 528cd6515..4fa200cb9 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ColorDialog.Designer.cs b/Greenshot/Forms/ColorDialog.Designer.cs index 622a799cc..bcc813c4b 100644 --- a/Greenshot/Forms/ColorDialog.Designer.cs +++ b/Greenshot/Forms/ColorDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index 2f630d064..a8a5d13de 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs index b2fa2d733..576162caf 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/DropShadowSettingsForm.cs b/Greenshot/Forms/DropShadowSettingsForm.cs index 1952c6058..4e749baf9 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index 01fda903b..26a5f6aa0 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index c5cc2ddba..71a581ada 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/LanguageDialog.Designer.cs b/Greenshot/Forms/LanguageDialog.Designer.cs index 78d4abd7b..0c6bdbb97 100644 --- a/Greenshot/Forms/LanguageDialog.Designer.cs +++ b/Greenshot/Forms/LanguageDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/LanguageDialog.cs b/Greenshot/Forms/LanguageDialog.cs index ee0fb7549..9c6333668 100644 --- a/Greenshot/Forms/LanguageDialog.cs +++ b/Greenshot/Forms/LanguageDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/MainForm.Designer.cs b/Greenshot/Forms/MainForm.Designer.cs index da54e6cb8..f51b3bf87 100644 --- a/Greenshot/Forms/MainForm.Designer.cs +++ b/Greenshot/Forms/MainForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 784dd6bbf..17c2f09ea 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/MovableShowColorForm.cs b/Greenshot/Forms/MovableShowColorForm.cs index 6173a4b4e..f2560ba18 100644 --- a/Greenshot/Forms/MovableShowColorForm.cs +++ b/Greenshot/Forms/MovableShowColorForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/PrintOptionsDialog.Designer.cs b/Greenshot/Forms/PrintOptionsDialog.Designer.cs index 321a80873..0f087f50b 100644 --- a/Greenshot/Forms/PrintOptionsDialog.Designer.cs +++ b/Greenshot/Forms/PrintOptionsDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/PrintOptionsDialog.cs b/Greenshot/Forms/PrintOptionsDialog.cs index 1175bf1dc..fa585a8a9 100644 --- a/Greenshot/Forms/PrintOptionsDialog.cs +++ b/Greenshot/Forms/PrintOptionsDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ResizeSettingsForm.Designer.cs b/Greenshot/Forms/ResizeSettingsForm.Designer.cs index f3cd04f36..d7003d606 100644 --- a/Greenshot/Forms/ResizeSettingsForm.Designer.cs +++ b/Greenshot/Forms/ResizeSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ResizeSettingsForm.cs b/Greenshot/Forms/ResizeSettingsForm.cs index db8cac328..0956b62b6 100644 --- a/Greenshot/Forms/ResizeSettingsForm.cs +++ b/Greenshot/Forms/ResizeSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/SettingsForm.Designer.cs b/Greenshot/Forms/SettingsForm.Designer.cs index 715d8f24d..9a76a3a7a 100644 --- a/Greenshot/Forms/SettingsForm.Designer.cs +++ b/Greenshot/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index b64fdfaf0..663d8d08c 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index ce26dc1d5..9d122bed9 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs index 6263465af..12e1817b1 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index 63bae471a..d0089a6cc 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/GreenshotMain.cs b/Greenshot/GreenshotMain.cs index 1f5fa562b..9d018be16 100644 --- a/Greenshot/GreenshotMain.cs +++ b/Greenshot/GreenshotMain.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Help/HelpFileLoader.cs b/Greenshot/Help/HelpFileLoader.cs index c3acda86d..a8a2365df 100644 --- a/Greenshot/Help/HelpFileLoader.cs +++ b/Greenshot/Help/HelpFileLoader.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 301b97c14..a1c8f3ae8 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/Colors.cs b/Greenshot/Helpers/Colors.cs index 0fe637fca..6f072cd60 100644 --- a/Greenshot/Helpers/Colors.cs +++ b/Greenshot/Helpers/Colors.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/CopyData.cs b/Greenshot/Helpers/CopyData.cs index ab695822d..c32ca596e 100644 --- a/Greenshot/Helpers/CopyData.cs +++ b/Greenshot/Helpers/CopyData.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index 5d69c99d3..4ddd7d27e 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index 443fe3321..2b7e0d4ed 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/GeometryHelper.cs b/Greenshot/Helpers/GeometryHelper.cs index 98534a2df..ea3c626a9 100644 --- a/Greenshot/Helpers/GeometryHelper.cs +++ b/Greenshot/Helpers/GeometryHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/GuiRectangle.cs b/Greenshot/Helpers/GuiRectangle.cs index d317fa6f4..6587ec452 100644 --- a/Greenshot/Helpers/GuiRectangle.cs +++ b/Greenshot/Helpers/GuiRectangle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index 1786106c9..d1cd44b7e 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/IEInterop/IEContainer.cs b/Greenshot/Helpers/IEInterop/IEContainer.cs index 0b5b740bc..35c04a960 100644 --- a/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index 4bb549603..73e8e3bea 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/PluginHelper.cs b/Greenshot/Helpers/PluginHelper.cs index 9062490e3..802d776fd 100644 --- a/Greenshot/Helpers/PluginHelper.cs +++ b/Greenshot/Helpers/PluginHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index ddb42b5b9..29b1e0eed 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/ProcessorHelper.cs b/Greenshot/Helpers/ProcessorHelper.cs index ea5c4bef9..ee53a76bb 100644 --- a/Greenshot/Helpers/ProcessorHelper.cs +++ b/Greenshot/Helpers/ProcessorHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/ScaleHelper.cs b/Greenshot/Helpers/ScaleHelper.cs index 77557fc73..fb43662a5 100644 --- a/Greenshot/Helpers/ScaleHelper.cs +++ b/Greenshot/Helpers/ScaleHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index 1b84b1907..f3f34aff8 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/StartupHelper.cs b/Greenshot/Helpers/StartupHelper.cs index 8c717f56f..b9aa52cce 100644 --- a/Greenshot/Helpers/StartupHelper.cs +++ b/Greenshot/Helpers/StartupHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/ToolStripItemEndisabler.cs b/Greenshot/Helpers/ToolStripItemEndisabler.cs index 3fa5cfcd5..54a2e3418 100644 --- a/Greenshot/Helpers/ToolStripItemEndisabler.cs +++ b/Greenshot/Helpers/ToolStripItemEndisabler.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Helpers/UpdateHelper.cs b/Greenshot/Helpers/UpdateHelper.cs index 723331d25..2d2692269 100644 --- a/Greenshot/Helpers/UpdateHelper.cs +++ b/Greenshot/Helpers/UpdateHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -39,7 +39,7 @@ namespace Greenshot.Experimental { private const string STABLE_DOWNLOAD_LINK = "http://getgreenshot.org/downloads/"; private const string VERSION_HISTORY_LINK = "http://getgreenshot.org/version-history/"; private static readonly object LockObject = new object(); - private static SourceforgeFile _latestGreenshot; + private static RssFile _latestGreenshot; private static string _downloadLink = STABLE_DOWNLOAD_LINK; /// <summary> @@ -59,7 +59,7 @@ namespace Greenshot.Experimental { return false; } LOG.DebugFormat("Update check is due, last check was {0} check needs to be made after {1} (which is one {2} later)", conf.LastUpdateCheck, checkTime, conf.UpdateCheckInterval); - if (!SourceForgeHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { + if (!RssHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { LOG.DebugFormat("RSS feed has not been updated since after {0}", conf.LastUpdateCheck); return false; } @@ -114,88 +114,62 @@ namespace Greenshot.Experimental { private static void ProcessRSSInfo(Version currentVersion) { // Reset latest Greenshot - Dictionary<string, Dictionary<string, SourceforgeFile>> rssFiles = SourceForgeHelper.readRSS(); + IList<RssFile> rssFiles = RssHelper.readRSS(); if (rssFiles == null) { return; } // Retrieve the current and latest greenshot - foreach(string fileType in rssFiles.Keys) { - foreach(string file in rssFiles[fileType].Keys) { - SourceforgeFile rssFile = rssFiles[fileType][file]; - if (fileType.StartsWith("Greenshot")) { - // check for exe - if (!rssFile.isExe) { + foreach(RssFile rssFile in rssFiles) { + if (rssFile.File.StartsWith("Greenshot")) { + // check for exe + if (!rssFile.isExe) { + continue; + } + + // do we have a version? + if (rssFile.Version == null) { + LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", rssFile.File, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + continue; + } + + // if the file is unstable, we will skip it when: + // the current version is a release or release candidate AND check unstable is turned off. + if (rssFile.isUnstable) { + // Skip if we shouldn't check unstables + if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { continue; } + } - // do we have a version? - if (rssFile.Version == null) { - LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", file, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + // if the file is a release candidate, we will skip it when: + // the current version is a release AND check unstable is turned off. + if (rssFile.isReleaseCandidate) { + if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { continue; } + } - // if the file is unstable, we will skip it when: - // the current version is a release or release candidate AND check unstable is turned off. - if (rssFile.isUnstable) { - // Skip if we shouldn't check unstables - if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { - continue; + // Compare versions + int versionCompare = rssFile.Version.CompareTo(currentVersion); + if (versionCompare > 0) { + LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { + _latestGreenshot = rssFile; + if (rssFile.isReleaseCandidate || rssFile.isUnstable) { + _downloadLink = VERSION_HISTORY_LINK; + } else { + _downloadLink = STABLE_DOWNLOAD_LINK; } } - - // if the file is a release candidate, we will skip it when: - // the current version is a release AND check unstable is turned off. - if (rssFile.isReleaseCandidate) { - if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { - continue; - } - } - - // Compare versions - int versionCompare = rssFile.Version.CompareTo(currentVersion); - if (versionCompare > 0) { - LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", file, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); - if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { - _latestGreenshot = rssFile; - if (rssFile.isReleaseCandidate || rssFile.isUnstable) { - _downloadLink = VERSION_HISTORY_LINK; - } else { - _downloadLink = STABLE_DOWNLOAD_LINK; - } - } - } else if (versionCompare < 0) { - LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); - } else if (versionCompare == 0) { - LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", file, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); - } + } else if (versionCompare < 0) { + LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); + } else if (versionCompare == 0) { + LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); } } } - -// // check for language file updates -// // Directory to store the language files -// string languageFilePath = Path.GetDirectoryName(Language.GetInstance().GetHelpFilePath()); -// LOG.DebugFormat("Language file path: {0}", languageFilePath); -// foreach(string fileType in rssFiles.Keys) { -// foreach(string file in rssFiles[fileType].Keys) { -// RssFile rssFile = rssFiles[fileType][file]; -// if (fileType.Equals("Translations")) { -// LOG.DebugFormat("Found translation {0} with language {1} published at {2} : {3}", file, rssFile.Language, rssFile.Pubdate.ToLocalTime(), rssFile.Link); -// string languageFile = Path.Combine(languageFilePath, file); -// if (!File.Exists(languageFile)) { -// LOG.DebugFormat("Found not installed language: {0}", rssFile.Language); -// // Example to download language files -// //string languageFileContent = GreenshotPlugin.Core.NetworkHelper.DownloadFileAsString(new Uri(rssFile.Link), Encoding.UTF8); -// //TextWriter writer = new StreamWriter(languageFile, false, Encoding.UTF8); -// //LOG.InfoFormat("Writing {0}", languageFile); -// //writer.Write(languageFileContent); -// //writer.Close(); -// } -// } -// } -// } } } } diff --git a/Greenshot/Helpers/WindowWrapper.cs b/Greenshot/Helpers/WindowWrapper.cs index c23614482..e2ce53ab2 100644 --- a/Greenshot/Helpers/WindowWrapper.cs +++ b/Greenshot/Helpers/WindowWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Languages/language-ar-SY.xml b/Greenshot/Languages/language-ar-SY.xml index 35de183f6..e9d31d52c 100644 --- a/Greenshot/Languages/language-ar-SY.xml +++ b/Greenshot/Languages/language-ar-SY.xml @@ -3,19 +3,19 @@ <resources> <resource name="about_bugs">رجاء بلغ عن الاخطاء الى</resource> <resource name="about_donations">اذا اعجبك البرنامج انت مدعو لدعمنا:</resource> - <resource name="about_host">جرين شوت استضيف بواسطة sourceforge.net في</resource> + <resource name="about_host">جرين شوت استضيف بواسطة GitHub في</resource> <resource name="about_icons">الايقونات بواسطة مجموعة ايقونات يوسوكي كامياماني (تحت رخصة المشاع الإبداعي الاصدار 3.0)</resource> - <resource name="about_license">حقوق النشر © 2007 - 2012 توماس براون, جينس كلنجين, روبين كروم -جرين شوت لا يأتي مع أية ضمان. هذا برنامج حر, مرحبا بك لتعيد توزيعه تحت شروط معينة. + <resource name="about_license">حقوق النشر © 2007 - 2012 توماس براون, جينس كلنجين, روبين كروم +جرين شوت لا يأتي مع أية ضمان. هذا برنامج حر, مرحبا بك لتعيد توزيعه تحت شروط معينة. تفاصيل حول رخصة جنو العمومية:</resource> <resource name="about_title">حول جرين شوت</resource> <resource name="application_title">جرين شوت - الاداة الثورية في تصوير الشاشة</resource> <resource name="bugreport_cancel">إغلاق</resource> - <resource name="bugreport_info">عذرا, حدث خطأ غير متوقع. - الخبر الجيد: انت تستطيع التخلص من هذا عن طريق تعبئة تقرير الاخطاء. - رجاء قم بزيارة الرابط اسفل, انشئ تقرير اخطاء جديد والصق النص من المربع الى الوصف. - - رجاء قم باضافة تلخيص ذو معنى وارفق اية معلومات تعتبرها مفيدة في اكتشاف الخطأ + <resource name="bugreport_info">عذرا, حدث خطأ غير متوقع. + الخبر الجيد: انت تستطيع التخلص من هذا عن طريق تعبئة تقرير الاخطاء. + رجاء قم بزيارة الرابط اسفل, انشئ تقرير اخطاء جديد والصق النص من المربع الى الوصف. + + رجاء قم باضافة تلخيص ذو معنى وارفق اية معلومات تعتبرها مفيدة في اكتشاف الخطأ أيضا, سوف نقدر وبشدة اذا قمت بفحص ما إذا ما قد تم البلاغ عن الخطأ من قبل. شكرا :)</resource> <resource name="bugreport_title">خطأ</resource> <resource name="clipboard_error">خطأ غير متوقع حدث عند المحاولة للكتابة على الذاكرة.</resource> @@ -112,7 +112,7 @@ <resource name="editor_uptotop">إلى الأعلى</resource> <resource name="error">خطأ</resource> <resource name="error_multipleinstances">برنامج جرين شوت يعمل حاليا</resource> - <resource name="error_nowriteaccess">لايمكن حفظ الصورة في {0}. + <resource name="error_nowriteaccess">لايمكن حفظ الصورة في {0}. رجاء تاكد من القدرة على حفظ الملف في هذا المكان.</resource> <resource name="error_openfile">الملف "{0}" لا يمكن فتحه.</resource> <resource name="error_openlink">لا يمكن فتح الوصلة.</resource> @@ -150,22 +150,22 @@ <resource name="settings_jpegquality">JPEG جودة</resource> <resource name="settings_jpegsettings">JPEG اعدادات</resource> <resource name="settings_language">اللغة</resource> - <resource name="settings_message_filenamepattern">سوف يتم استبدال الرموز التالية تلقائيا في النمط المعرف: - -${YYYY} السنة, 4 منازل -${MM} الشهر, منزلتان -${DD} اليوم, منزلتان -${hh} الساعة, منزلتان -${mm} الدقيقة, منزلتان -${ss} الثواني, منزلتان -${NUM} incrementing number, 6 منازل -${title} عنوان النافذة -${user} مستخدم الوندوز -${domain} نطاق وندوز -${hostname} اسم الحاسوب - -بامكانك ايضا جعل جرين شوت ينشئ مجلدات بصورة ديناميكية, ببساطة استخدم رمز (/) لفصل المجلدات واسماء الملفات. -مثال: النمط ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} + <resource name="settings_message_filenamepattern">سوف يتم استبدال الرموز التالية تلقائيا في النمط المعرف: + +${YYYY} السنة, 4 منازل +${MM} الشهر, منزلتان +${DD} اليوم, منزلتان +${hh} الساعة, منزلتان +${mm} الدقيقة, منزلتان +${ss} الثواني, منزلتان +${NUM} incrementing number, 6 منازل +${title} عنوان النافذة +${user} مستخدم الوندوز +${domain} نطاق وندوز +${hostname} اسم الحاسوب + +بامكانك ايضا جعل جرين شوت ينشئ مجلدات بصورة ديناميكية, ببساطة استخدم رمز (/) لفصل المجلدات واسماء الملفات. +مثال: النمط ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} سيولد مجلدا لليوم الحالي في مكان الحفظ الافتراضي, مثلا 28-09-2011, اسم ملف لقطة الشاشة سيكون على اساس الوقت الحالي, مثلا 14_13_15 (مع امتداد الحفظ)</resource> <resource name="settings_output">النتائج</resource> <resource name="settings_playsound">تشغيل صوت عند الالتقاط</resource> @@ -186,8 +186,8 @@ ${hostname} اسم الحاسوب <resource name="settings_waittime">وقت الانتظار بالجزء من الثانية قبل الإلتقاط</resource> <resource name="tooltip_firststart">انقر الزر الايمن هنا أو اضغط مفتاح الطباعة.</resource> <resource name="warning">تحذير</resource> - <resource name="warning_hotkeys">لا يمكن تسجيل اختصار واحد او اكثر. لذلك, قد لا يكون بالامكان استخدام اختصارات جرين شوت. -هذه المشكلة على الاغلب سببها برنامج اخر يدعي استخدام نفس الاختصارات. + <resource name="warning_hotkeys">لا يمكن تسجيل اختصار واحد او اكثر. لذلك, قد لا يكون بالامكان استخدام اختصارات جرين شوت. +هذه المشكلة على الاغلب سببها برنامج اخر يدعي استخدام نفس الاختصارات. رجاء قم بالغاء البرنامج الذي يقوم باستخدام مفتاح الطباعة. يمكنك ايضا استخدام كل ميزات جرين شوت من الايقونة على شريط المهام.</resource> </resources> </language> \ No newline at end of file diff --git a/Greenshot/Languages/language-cs-CZ.xml b/Greenshot/Languages/language-cs-CZ.xml index 666896aaf..e6d4abf9b 100644 --- a/Greenshot/Languages/language-cs-CZ.xml +++ b/Greenshot/Languages/language-cs-CZ.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Chyby prosím hlaste na adrese</resource> <resource name="about_donations">Pokud se vám Greenshot líbí, uvítáme Vaší podporu</resource> - <resource name="about_host">Greenshot je hostován na sourceforge.net</resource> + <resource name="about_host">Greenshot je hostován na GitHub</resource> <resource name="about_icons">Ikony pochází ze sady Yusuke Kamiyamane's Fugue (licence Creative Commons Attribution 3.0)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ABSOLUTNĚ BEZ ZÁRUKY. Toto je svobodný software, můžete jej dále šířit za určitých podmínek. diff --git a/Greenshot/Languages/language-de-DE.xml b/Greenshot/Languages/language-de-DE.xml index 72806cf78..aba76288a 100644 --- a/Greenshot/Languages/language-de-DE.xml +++ b/Greenshot/Languages/language-de-DE.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Bitte melden Sie Fehler unter</resource> <resource name="about_donations">Wenn Sie Greenshot mögen, können Sie uns gerne unterstützen:</resource> - <resource name="about_host">Greenshot wird von sourceforge.net gehostet unter</resource> + <resource name="about_host">Greenshot wird von GitHub gehostet unter</resource> <resource name="about_icons">Icons aus Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Für Greenshot besteht KEINERLEI GARANTIE. Greenshot ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen. diff --git a/Greenshot/Languages/language-el-GR.xml b/Greenshot/Languages/language-el-GR.xml index bc1684428..ef7c74c5c 100644 --- a/Greenshot/Languages/language-el-GR.xml +++ b/Greenshot/Languages/language-el-GR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Αναφορά προβλημάτων:</resource> <resource name="about_donations">Αν σας αρέσει το Greenshot, είστε ευπρόσδεκτοι να μας υποστηρίξετε:</resource> - <resource name="about_host">Το Greenshot φιλοξενείται από τη sourceforge.net:</resource> + <resource name="about_host">Το Greenshot φιλοξενείται από τη GitHub:</resource> <resource name="about_icons">Εικονίδια από Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Δεν παρέχεται ΚΑΜΙΑ ΕΓΓΥΗΣΗ για το Greenshot. Είναι ελεύθερο λογισμικό. Είστε ελεύθεροι να το αναδιανείμετε κάτω από ορισμένες συνθήκες. diff --git a/Greenshot/Languages/language-en-US.xml b/Greenshot/Languages/language-en-US.xml index bf75eef36..6d5d3dca3 100644 --- a/Greenshot/Languages/language-en-US.xml +++ b/Greenshot/Languages/language-en-US.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Please report bugs to</resource> <resource name="about_donations">If you like Greenshot, you are welcome to support us:</resource> - <resource name="about_host">Greenshot is hosted by sourceforge.net at</resource> + <resource name="about_host">Greenshot is hosted by GitHub at</resource> <resource name="about_icons">Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-es-ES.xml b/Greenshot/Languages/language-es-ES.xml index e6f660efc..f7b22990d 100644 --- a/Greenshot/Languages/language-es-ES.xml +++ b/Greenshot/Languages/language-es-ES.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Por favor reporta errores a</resource> <resource name="about_donations">Si te gusta Greenshot, te agradeceremos que nos ayudes:</resource> - <resource name="about_host">Greenshot está alojado en sourceforge.net en</resource> + <resource name="about_host">Greenshot está alojado en GitHub en</resource> <resource name="about_icons">Iconos del conjunto de iconos Fugue de Yusuke Kamiyamane(Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene ABSOLUTAMENTE SIN GARANTIA. Este es software gratuito, y eres bienvenido a redistribuirlo bajo ciertas condiciones. diff --git a/Greenshot/Languages/language-fi-FI.xml b/Greenshot/Languages/language-fi-FI.xml index 8dda90a6c..5a4b02808 100644 --- a/Greenshot/Languages/language-fi-FI.xml +++ b/Greenshot/Languages/language-fi-FI.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Raportoi virheet tänne</resource> <resource name="about_donations">Jos pidät Greenshotista niin toivottavasti tuet meitä:</resource> - <resource name="about_host">Greenshot is hosted by sourceforge.net at</resource> + <resource name="about_host">Greenshot is hosted by GitHub at</resource> <resource name="about_icons">Ikonit ovat Yusuke Kamiyamane:n Fugue ikonisarjasta (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-fr-FR.xml b/Greenshot/Languages/language-fr-FR.xml index b23f64c6f..ab5849d65 100644 --- a/Greenshot/Languages/language-fr-FR.xml +++ b/Greenshot/Languages/language-fr-FR.xml @@ -3,20 +3,20 @@ <resources> <resource name="about_bugs">Veuillez rapporter les bogues à</resource> <resource name="about_donations">Si vous aimez Greenshot, vous pouvez nous soutenir :</resource> - <resource name="about_host">Greenshot est hébergé par sourceforge.net à</resource> + <resource name="about_host">Greenshot est hébergé par GitHub à</resource> <resource name="about_icons">Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom -Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. + <resource name="about_license">Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom +Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License :</resource> <resource name="about_title">À propos de Greenshot</resource> <resource name="application_title">Greenshot - l'utilitaire révolutionnaire de capture d'écran</resource> <resource name="bugreport_cancel">Fermer</resource> - <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. - -La bonne nouvelle, c'est que vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. -Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. - -Ajoutez un résumé compréhensible et des informations que vous jugez utiles à la reproduction du problème. + <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. + +La bonne nouvelle, c'est que vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. +Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. + +Ajoutez un résumé compréhensible et des informations que vous jugez utiles à la reproduction du problème. De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si un rapport concernant ce problème existe déjà. (Vous pouvez utiliser l'outil de recherche pour les trouver rapidement.) Merci :)</resource> <resource name="bugreport_title">Erreur</resource> <resource name="CANCEL">Annuler</resource> @@ -180,7 +180,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si <resource name="EmailFormat.OUTLOOK_TXT">Outlook avec texte</resource> <resource name="error">Erreur</resource> <resource name="error_multipleinstances">Une instance de Greenshot est déjà en cours d'exécution.</resource> - <resource name="error_nowriteaccess">Impossible d'enregistrer le fichier vers {0}. + <resource name="error_nowriteaccess">Impossible d'enregistrer le fichier vers {0}. Veuillez vérifier l'accessibilité du répertoire de stockage.</resource> <resource name="error_openfile">Le fichier "{0}" n'a pu être ouvert.</resource> <resource name="error_openlink">Ne peut ouvrir le lien '{0}'.</resource> @@ -246,22 +246,22 @@ Veuillez vérifier l'accessibilité du répertoire de stockage.</resource> <resource name="settings_iecapture">Capture d'Internet Explorer</resource> <resource name="settings_jpegquality">Qualité JPEG</resource> <resource name="settings_language">Langue</resource> - <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre modèle : -${YYYY} année sur 4 chiffres -${MM} mois sur 2 chiffres -${DD} jour sur 2 chiffres -${hh} heure sur 2 chiffres -${mm} minutes sur 2 chiffres -${ss} secondes sur 2 chiffres -${NUM} Incrément sur 6 chiffres -${title} Titre de la fenêtre -${user} Nom d'utilisateur Windows -${domain} Domaine Windows -${hostname} Nom d'hôte du PC - -Vous pouvez aussi laisser Greenshot créer des répertoires dynamiquement, simplement en utilisant la barre oblique inversée (\) pour séparer les répertoires et les fichiers. -Exemple : le modèle ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -créera un répertoire pour le jour en cours dans votre emplacement de stockage par défaut, par exemple 2008-06-29, le nom du fichier contenant la capture d'écran sera basé sur l'heure + <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre modèle : +${YYYY} année sur 4 chiffres +${MM} mois sur 2 chiffres +${DD} jour sur 2 chiffres +${hh} heure sur 2 chiffres +${mm} minutes sur 2 chiffres +${ss} secondes sur 2 chiffres +${NUM} Incrément sur 6 chiffres +${title} Titre de la fenêtre +${user} Nom d'utilisateur Windows +${domain} Domaine Windows +${hostname} Nom d'hôte du PC + +Vous pouvez aussi laisser Greenshot créer des répertoires dynamiquement, simplement en utilisant la barre oblique inversée (\) pour séparer les répertoires et les fichiers. +Exemple : le modèle ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +créera un répertoire pour le jour en cours dans votre emplacement de stockage par défaut, par exemple 2008-06-29, le nom du fichier contenant la capture d'écran sera basé sur l'heure en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres)</resource> <resource name="settings_network">Réseau et mises à jour</resource> <resource name="settings_output">Sortie</resource> @@ -297,8 +297,8 @@ en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres)< <resource name="update_found">Une nouvelle version de Greenshot est disponible ! Voulez-vous télécharger Greenshot {0} ?</resource> <resource name="wait_ie_capture">Veuillez patienter pendant la capture de la page Internet Explorer...</resource> <resource name="warning">Avertissement</resource> - <resource name="warning_hotkeys">Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). - + <resource name="warning_hotkeys">Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). + Toutes les fonctionnalités de Greenshot se lancent aussi directement depuis le menu contextuel de l'icône de la zone de notifications système.</resource> <resource name="WindowCaptureMode.Aero">Utiliser une couleur personnalisée</resource> <resource name="WindowCaptureMode.AeroTransparent">Préserver la transparence</resource> diff --git a/Greenshot/Languages/language-fr-QC.xml b/Greenshot/Languages/language-fr-QC.xml index a5209bf89..78d0309ce 100644 --- a/Greenshot/Languages/language-fr-QC.xml +++ b/Greenshot/Languages/language-fr-QC.xml @@ -3,18 +3,18 @@ <resources> <resource name="about_bugs">Veuillez rapporter les bogues à</resource> <resource name="about_donations">Si vous aimez Greenshot, vous pouvez nous soutenir :</resource> - <resource name="about_host">Greenshot est hébergé par sourceforge.net à</resource> + <resource name="about_host">Greenshot est hébergé par GitHub à</resource> <resource name="about_icons">Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Copyright © 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. + <resource name="about_license">Copyright © 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License :</resource> <resource name="about_title">A propos de Greenshot</resource> <resource name="application_title">Greenshot - l'utilitaire révolutionnaire de capture d'écran</resource> <resource name="bugreport_cancel">Fermer</resource> - <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. -La bonne nouvelle est la suivante : vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. -Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. -Veuillez y ajouter un résumé compréhensible des informations que vous jugez utiles à la reproduction du problème. + <resource name="bugreport_info">Désolé, une erreur inattendue s'est produite. +La bonne nouvelle est la suivante : vous pouvez nous aider à nous en débarrasser en remplissant un rapport de bogue. +Veuillez visiter l'URL ci-dessous, créer un nouveau rapport de bogue et coller le contenu de cette zone de texte. +Veuillez y ajouter un résumé compréhensible des informations que vous jugez utiles à la reproduction du problème. De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si un rapport concernant ce problème existe déjà. (Vous pouvez utiliser l'outil de recherche pour les trouver rapidement.) Merci :)</resource> <resource name="bugreport_title">Erreur</resource> <resource name="CANCEL">Annuler</resource> @@ -142,7 +142,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si <resource name="EmailFormat.OUTLOOK_TXT">Outlook avec du text</resource> <resource name="error">Erreur</resource> <resource name="error_multipleinstances">Une instance de Greenshot est déjà en cours d'exécution.</resource> - <resource name="error_nowriteaccess">Impossible de sauvegarder le fichier dans {0}. + <resource name="error_nowriteaccess">Impossible de sauvegarder le fichier dans {0}. Veuillez vérifier que vous avez l'autorisation d'écrire dans le répertoire de stockage.</resource> <resource name="error_openfile">Le fichier "{0}" n'a pu être ouvert.</resource> <resource name="error_openlink">Impossible d'ouvrir le lien '{0}'.</resource> @@ -209,17 +209,17 @@ Veuillez vérifier que vous avez l'autorisation d'écrire dans le répertoire de <resource name="settings_jpegquality">Qualité JPEG</resource> <resource name="settings_jpegsettings">Paramètres JPEG</resource> <resource name="settings_language">Langue</resource> - <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre motif : -${YYYY} Année sur 4 chiffres -${MM} mois sur 2 chiffres -${DD} jour sur 2 chiffres -${hh} heure sur 2 chiffres -${mm} minutes sur 2 chiffres -${ss} secondes sur 2 chiffres -${NUM} Incrément sur 6 chiffres -${title} Titre de la fenêtre -${user} Nom d'utilisateur Windows -${domain} Domaine Windows + <resource name="settings_message_filenamepattern">Les variables suivantes seront automatiquement remplacées dans votre motif : +${YYYY} Année sur 4 chiffres +${MM} mois sur 2 chiffres +${DD} jour sur 2 chiffres +${hh} heure sur 2 chiffres +${mm} minutes sur 2 chiffres +${ss} secondes sur 2 chiffres +${NUM} Incrément sur 6 chiffres +${title} Titre de la fenêtre +${user} Nom d'utilisateur Windows +${domain} Domaine Windows ${hostname} Nom d'hôte du PC</resource> <resource name="settings_network">Mises à jour réseau</resource> <resource name="settings_output">Sortie</resource> @@ -250,8 +250,8 @@ ${hostname} Nom d'hôte du PC</resource> <resource name="update_found">Une nouvelle version de Greenshot est disponible! Voulez-vous télécharger Greenshot {0}?</resource> <resource name="wait_ie_capture">Veuillez patienter pendant que la page dans Internet Explorer est capturée...</resource> <resource name="warning">Avertissement</resource> - <resource name="warning_hotkeys">Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. -Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. + <resource name="warning_hotkeys">Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. +Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. Veuillez désactiver ce(s) logiciel(s) utilisant le bouton Impr.écran. Vous pouvez également utiliser Greenshot au moyen de son menu contextuel.</resource> <resource name="WindowCaptureMode.Aero">Utiliser les couleurs personnalisées</resource> <resource name="WindowCaptureMode.AeroTransparent">Conserver la transparence</resource> diff --git a/Greenshot/Languages/language-he-IL.xml b/Greenshot/Languages/language-he-IL.xml index d4f82d69b..287f83946 100644 --- a/Greenshot/Languages/language-he-IL.xml +++ b/Greenshot/Languages/language-he-IL.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">:אנא דווח באגים בכתובת</resource> <resource name="about_donations">:אם את\ה נהנה\ית משימוש בתוכנה, את\ה מוזמן לתרום לנו</resource> - <resource name="about_host">Greenshot is hosted by sourceforge.net at</resource> + <resource name="about_host">Greenshot is hosted by GitHub at</resource> <resource name="about_icons">Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-hu-HU.xml b/Greenshot/Languages/language-hu-HU.xml index a4132795d..9e1201fec 100644 --- a/Greenshot/Languages/language-hu-HU.xml +++ b/Greenshot/Languages/language-hu-HU.xml @@ -3,20 +3,20 @@ <resources> <resource name="about_bugs">Kérük a hibákat az alábbi helyen jelezzék</resource> <resource name="about_donations">Ha szereted Greenshot -ot, akkor támogass minket:</resource> - <resource name="about_host">Greenshot kiszolgálója a sourceforge.net</resource> + <resource name="about_host">Greenshot kiszolgálója a GitHub</resource> <resource name="about_icons">Az ikonokat Yusuke Kamiyamane's Fugue készítette (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Szerzői jog (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -SEMMIFÉLE GARANCIA sincs a Greenshot -hoz. Ez egy ingyenes program, és hálásak vagyunk, hogy terjeszted bizonyos feltételekkel. + <resource name="about_license">Szerzői jog (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +SEMMIFÉLE GARANCIA sincs a Greenshot -hoz. Ez egy ingyenes program, és hálásak vagyunk, hogy terjeszted bizonyos feltételekkel. Részletek a GNU Fő Nyílvános Engedélyről:</resource> <resource name="about_title">Greenshot névjegye</resource> <resource name="application_title">Greenshot - Egy forradalmian új képernyőkép készítő program</resource> <resource name="bugreport_cancel">Bezárni</resource> - <resource name="bugreport_info">Elnézést, váratlan hiba történt! - -A jó hír: ha jelzi felénk a hibát segítűnk megoldani. -Kérjük látogassa meg az alábbi URL-t, hozzon létre egy új hibabejegyzés és másolja be a hibaüzenetet. - -Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt, ami a segítségünkre lehet. + <resource name="bugreport_info">Elnézést, váratlan hiba történt! + +A jó hír: ha jelzi felénk a hibát segítűnk megoldani. +Kérjük látogassa meg az alábbi URL-t, hozzon létre egy új hibabejegyzés és másolja be a hibaüzenetet. + +Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt, ami a segítségünkre lehet. Örülnénk, ha ellenőrizné, hogy a hibát jelentette e már valaki. (Ha használja a keresőt, gyorsabban megtalálhatja) Köszönjük :)</resource> <resource name="bugreport_title">Hiba</resource> <resource name="clipboard_error">Váratlan hiba történt a vágólapra másoláskor.</resource> @@ -113,7 +113,7 @@ Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt <resource name="editor_uptotop">Előre hozás</resource> <resource name="error">Hiba</resource> <resource name="error_multipleinstances">A Greenshot egy példánya már fut.</resource> - <resource name="error_nowriteaccess">Nem lehet menteni a fájlt {0}. + <resource name="error_nowriteaccess">Nem lehet menteni a fájlt {0}. Kérjük ellenőrizze a mentési hely hozzáférhetőségét.</resource> <resource name="error_openfile">A fájlt "{0}" nem sikerült megnyitni.</resource> <resource name="error_openlink">Nem sikerült megnyitni a helyet.</resource> @@ -151,21 +151,21 @@ Kérjük ellenőrizze a mentési hely hozzáférhetőségét.</resource> <resource name="settings_jpegquality">JPEG minőség</resource> <resource name="settings_jpegsettings">JPEG beállítások</resource> <resource name="settings_language">Nyelv</resource> - <resource name="settings_message_filenamepattern">A következő minták válthatják fel az automatikus meghatározást: -${YYYY} év, 4 karakter -${MM} hónap, 2 karakter -${DD} nap, 2 karakter -${hh} óra, 2 karakter -${mm} perc, 2 karakter -${ss} másodperc, 2 karakter -${NUM} növekvő szám, 6 karakter -${title} Az ablak neve -${user} Windows felhasználó -${domain} Windows tartomány -${hostname} Számítógép név - -Könyvtárak lehet létrehozni a Greenshot -tal, a visszaper jeletet (\) használja a mappák és fájlnevek elválasztásánál. -Például: a minta ${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss} + <resource name="settings_message_filenamepattern">A következő minták válthatják fel az automatikus meghatározást: +${YYYY} év, 4 karakter +${MM} hónap, 2 karakter +${DD} nap, 2 karakter +${hh} óra, 2 karakter +${mm} perc, 2 karakter +${ss} másodperc, 2 karakter +${NUM} növekvő szám, 6 karakter +${title} Az ablak neve +${user} Windows felhasználó +${domain} Windows tartomány +${hostname} Számítógép név + +Könyvtárak lehet létrehozni a Greenshot -tal, a visszaper jeletet (\) használja a mappák és fájlnevek elválasztásánál. +Például: a minta ${YYYY}-${MM}-${DD}_${hh}-${mm}-${ss} fájl mentése az aktuális dátummal és időponttal, a megadott tárolási helyre, pl.: 2008-06-29_14-34-21, ezzel a mentési meghatározással a képernyőkép mindig az aktuális dátummal, idővel lesz elmentve.</resource> <resource name="settings_output">Mentés</resource> <resource name="settings_playsound">Fényképező zárhang</resource> @@ -186,8 +186,8 @@ fájl mentése az aktuális dátummal és időponttal, a megadott tárolási hel <resource name="settings_waittime">Ezredmásodpercet várjon kijelölés előtt</resource> <resource name="tooltip_firststart">Jobb klikk ide vagy nyomja meg a PrinScrn gombot.</resource> <resource name="warning">Figyelem</resource> - <resource name="warning_hotkeys">Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. -Ez a hiba akkor fordulhat elő, ha egy másik program használja. + <resource name="warning_hotkeys">Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. +Ez a hiba akkor fordulhat elő, ha egy másik program használja. Kapcsolja ki a szotvert és használja PrintScrn billentyűt. Egyszerűen használhatja a Greenshot -ot a tálca ikon helyi menüjéből.</resource> </resources> </language> \ No newline at end of file diff --git a/Greenshot/Languages/language-it-IT.xml b/Greenshot/Languages/language-it-IT.xml index 70284f5ef..41a8b6a66 100644 --- a/Greenshot/Languages/language-it-IT.xml +++ b/Greenshot/Languages/language-it-IT.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Per favore, riporta le anomalie a</resource> <resource name="about_donations">Se gradisci Greenshot, puoi darci il tuo aiuto su:</resource> - <resource name="about_host">Greenshot è disponibile su sourceforge.net a</resource> + <resource name="about_host">Greenshot è disponibile su GitHub a</resource> <resource name="about_icons">Icone prese da Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene fornito SENZA ALCUNA GARANZIA. Questo è "free software", e potete ri-distribuirlo secondo certe condizioni. diff --git a/Greenshot/Languages/language-ja-JP.xml b/Greenshot/Languages/language-ja-JP.xml index 4b4cf79aa..88eb4b242 100644 --- a/Greenshot/Languages/language-ja-JP.xml +++ b/Greenshot/Languages/language-ja-JP.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">バグ等の報告先 :</resource> <resource name="about_donations">Greenshot がお気に召したなら、是非支援をお願いします :</resource> - <resource name="about_host">Greenshot は sourceforge.net によって運営されています :</resource> + <resource name="about_host">Greenshot は GitHub によって運営されています :</resource> <resource name="about_icons">上山根 祐輔氏の Fugue Icons を使用しています (Creative Commons Attribution 3.0 license) :</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot には一切の保障がありません。GNU General Public License に定められた条件下で再配布をおこなうことができます。:</resource> diff --git a/Greenshot/Languages/language-ko-KR.xml b/Greenshot/Languages/language-ko-KR.xml index c1896f8c7..50930abb9 100644 --- a/Greenshot/Languages/language-ko-KR.xml +++ b/Greenshot/Languages/language-ko-KR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">버그는 아래 URL로 전달바랍니다.</resource> <resource name="about_donations">Greenshot이 좋다면 아래 URL로 방문하셔서 지원할 수 있습니다.</resource> - <resource name="about_host">Greenshot은 sourceforge.net 관리하에 아래 링크에서 호스팅되고 있습니다</resource> + <resource name="about_host">Greenshot은 GitHub 관리하에 아래 링크에서 호스팅되고 있습니다</resource> <resource name="about_icons">아이콘은 Yusuke Kamiyamane's Fugue icon set으로부터 제공받은 것입니다. (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2010 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-lt-LT.xml b/Greenshot/Languages/language-lt-LT.xml index c67f49f92..2a84f330a 100644 --- a/Greenshot/Languages/language-lt-LT.xml +++ b/Greenshot/Languages/language-lt-LT.xml @@ -3,18 +3,18 @@ <resources> <resource name="about_bugs">Apie klaidas praneškite</resource> <resource name="about_donations">Jei jums patiko Greenshot, galite mus paremti:</resource> - <resource name="about_host">Greenshot talpinamas sourceforge.net</resource> + <resource name="about_host">Greenshot talpinamas GitHub</resource> <resource name="about_icons">IIkonų rinkinys Fugue, аutorius Yusuke Kamiyamane, licencija Creative Commons Attribution 3.0</resource> - <resource name="about_license">Visos teisės saugomos (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + <resource name="about_license">Visos teisės saugomos (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot pateikiama BE JOKIŲ GARANTIJŲ. Greenshot — laisvai platinama PĮ su GPL licencija ir jūs galite laisvai ją platinti, laikydamasi licencinės sutarties:</resource> <resource name="about_title">Apie Greenshot</resource> <resource name="application_title">Greenshot — revoliucinis įrankis ekrano nuotraukoms daryti</resource> <resource name="bugreport_cancel">Uždaryti</resource> - <resource name="bugreport_info">Nenumatyta klaida. - -Gera žinia: jūs galite padėti ištaisyti programą, jei atsiųsite ataskaitą apie klaidą. -Nurodytu adresu sukurkite klaidos ataskaitą ir nukopijuokite klaidos tekstą į aprašymą. Galite pridėti bet kokią informaciją, kuri galėtų padėti atkatoti klaidos įvykio aplinkybes. Be to, būtume labai dėkingi, jei patikrintumėte ar panašios klaidos jau neužregistravo kas nors kitas (galite pasinaudoti paieška tinklapyje). - + <resource name="bugreport_info">Nenumatyta klaida. + +Gera žinia: jūs galite padėti ištaisyti programą, jei atsiųsite ataskaitą apie klaidą. +Nurodytu adresu sukurkite klaidos ataskaitą ir nukopijuokite klaidos tekstą į aprašymą. Galite pridėti bet kokią informaciją, kuri galėtų padėti atkatoti klaidos įvykio aplinkybes. Be to, būtume labai dėkingi, jei patikrintumėte ar panašios klaidos jau neužregistravo kas nors kitas (galite pasinaudoti paieška tinklapyje). + Dėkojame už pagalbą :)</resource> <resource name="bugreport_title">Klaida</resource> <resource name="clipboard_error">Netikėta klaida įrašant į apsikeitimo podelį.</resource> @@ -111,7 +111,7 @@ Dėkojame už pagalbą :)</resource> <resource name="editor_uptotop">Į priekį</resource> <resource name="error">Klaida</resource> <resource name="error_multipleinstances">Greenshot jau paleistas.</resource> - <resource name="error_nowriteaccess">Neįmanoma išsaugoti failo į {0}. + <resource name="error_nowriteaccess">Neįmanoma išsaugoti failo į {0}. Patikrinkite ar turite tam teises.</resource> <resource name="error_openfile">Nepavyko atidaryti failo "{0}".</resource> <resource name="error_openlink">Nepavyko atidaryti nuorodos.</resource> @@ -149,19 +149,19 @@ Patikrinkite ar turite tam teises.</resource> <resource name="settings_jpegquality">Кokybė</resource> <resource name="settings_jpegsettings">JPEG parametrai</resource> <resource name="settings_language">Kalba (Language)</resource> - <resource name="settings_message_filenamepattern">Numatyti simboliai: - -${YYYY} metai, 4 skaičiai -${MM} menuo, 2 skaičiai -${DD} diena, 2 skaičiai -${hh} valanda, 2 skaičiai -${mm} minutės, 2 skaičiai -${ss} sekundės, 2 skaičiai -${NUM} eilės numeris, 6 skaičiai -${title} lango pavadinimas - -Greenshot gali pavadinti pagal šabloną ne tik failus, bet ir katalogus, jei pavadinime naudojamas atvirkščias pasviręs brūkšnys "\" - + <resource name="settings_message_filenamepattern">Numatyti simboliai: + +${YYYY} metai, 4 skaičiai +${MM} menuo, 2 skaičiai +${DD} diena, 2 skaičiai +${hh} valanda, 2 skaičiai +${mm} minutės, 2 skaičiai +${ss} sekundės, 2 skaičiai +${NUM} eilės numeris, 6 skaičiai +${title} lango pavadinimas + +Greenshot gali pavadinti pagal šabloną ne tik failus, bet ir katalogus, jei pavadinime naudojamas atvirkščias pasviręs brūkšnys "\" + Pvz, šablonas ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} rodo, kad šios dienos datos kataloge "2011-04-27", nuotrauka bus pavadinta "16-40-23" (plius nuotraukos plėtinys, nurodytas nustatymuose)</resource> <resource name="settings_output">Nuotraukos</resource> <resource name="settings_playsound">Fotoaparato garsas</resource> @@ -176,15 +176,15 @@ Pvz, šablonas ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} rodo, kad šios dienos dato <resource name="settings_tooltip_filenamepattern">Nuotraukų vardų generavimo šablonas išsaugant nuotraukas</resource> <resource name="settings_tooltip_language">Programos kalba (programą reikės startuoti iš naujo)</resource> <resource name="settings_tooltip_primaryimageformat">Numatytas formatas</resource> - <resource name="settings_tooltip_registerhotkeys">Mygtukas Print (PrintScreen), derinys Ctrl-Print, Alt-Print + <resource name="settings_tooltip_registerhotkeys">Mygtukas Print (PrintScreen), derinys Ctrl-Print, Alt-Print bus perimti Greenshot programos, kai ji yra paleista.</resource> <resource name="settings_tooltip_storagelocation">Numatytas nuotraukų saugojimo katalogas (jei nenurodyta - į darbastalį)</resource> <resource name="settings_visualization">Fotoefektai</resource> <resource name="settings_waittime">Išlaikymas prieš fotografuojant (ms)</resource> <resource name="tooltip_firststart">Spauskite dešiniu pelės klavišu arba spauskite "PrintScreen".</resource> <resource name="warning">Dėmesio</resource> - <resource name="warning_hotkeys">Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. -Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, + <resource name="warning_hotkeys">Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. +Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, kurios naudoja šiuos mygtukus. Arba galima naudoti komandas iš Greenshot programos kontekstinio meniu.</resource> </resources> </language> \ No newline at end of file diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index cb18e6672..709c30615 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Meld problemen bij</resource> <resource name="about_donations">Als U Greenshot goed vindt kunt U ons ondersteunen:</resource> - <resource name="about_host">Greenshot word gehost door sourceforge.net op</resource> + <resource name="about_host">Greenshot word gehost door GitHub op</resource> <resource name="about_icons">Iconen van de icon set van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot komt zonder enige garantie! Dit is gratis software, en U kunt het distribueren onder bepaalde voorwaarden. diff --git a/Greenshot/Languages/language-nn-NO.xml b/Greenshot/Languages/language-nn-NO.xml index 67d8cb214..9ae31d78f 100644 --- a/Greenshot/Languages/language-nn-NO.xml +++ b/Greenshot/Languages/language-nn-NO.xml @@ -3,20 +3,20 @@ <resources> <resource name="about_bugs">Ver venleg å melde frå om feil til</resource> <resource name="about_donations">Om du likar Greenshot er du velkomen til å støtte oss:</resource> - <resource name="about_host">Greenshot held virtuelt hus hjå sourceforge.net:</resource> + <resource name="about_host">Greenshot held virtuelt hus hjå GitHub:</resource> <resource name="about_icons">Ikon frå Yusuke Kamiyamane sit "Fugue" ikonsett (Creative Commons Attribution 3.0-lisens)</resource> - <resource name="about_license">Med kopirett (C) 2007-2012 Thomas Braun, Jens Klingen og Robin Krom. Norsk omsetjing av Ivar Barstad. -Greenshot har ABSOLUTT INGEN GARANTI. Dette er gratis programvare, og du står fritt til å distribuere det under visse vilkår. + <resource name="about_license">Med kopirett (C) 2007-2012 Thomas Braun, Jens Klingen og Robin Krom. Norsk omsetjing av Ivar Barstad. +Greenshot har ABSOLUTT INGEN GARANTI. Dette er gratis programvare, og du står fritt til å distribuere det under visse vilkår. Detaljar om GNU General Public-lisens:</resource> <resource name="about_title">Om Greenshot</resource> <resource name="application_title">Greenshot - det revolusjonerande skjermknipsverktøyet</resource> <resource name="bugreport_cancel">Lukk</resource> - <resource name="bugreport_info">Orsak, ein ukjend feil oppstod! - -På den ljose sida kan du hjelpe oss med å finne ut av dette ved å fylle ut ein feilrapport! -Ver venleg og kopier innhaldet frå tekstområdet inn i "description"-feltet på nettsida bak lenkja under. - -Om du legg til ei forståeleg oppsummering (helst på engelsk) av kva som skjedde og kva som kan ha forårsaka feilen er det lettare for oss å finne ut av det. + <resource name="bugreport_info">Orsak, ein ukjend feil oppstod! + +På den ljose sida kan du hjelpe oss med å finne ut av dette ved å fylle ut ein feilrapport! +Ver venleg og kopier innhaldet frå tekstområdet inn i "description"-feltet på nettsida bak lenkja under. + +Om du legg til ei forståeleg oppsummering (helst på engelsk) av kva som skjedde og kva som kan ha forårsaka feilen er det lettare for oss å finne ut av det. Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om det alt er registrert ei sak på denne feilen. Tusen takk!</resource> <resource name="bugreport_title">Trøbbel!</resource> <resource name="CANCEL">Avbryt</resource> @@ -145,7 +145,7 @@ Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om d <resource name="EmailFormat.OUTLOOK_TXT">Outlook med tekst</resource> <resource name="error">Feil!</resource> <resource name="error_multipleinstances">Greenshot køyrer alt!</resource> - <resource name="error_nowriteaccess">Kan ikkje lagre fila som {0}. + <resource name="error_nowriteaccess">Kan ikkje lagre fila som {0}. Har du skrivetilgang til det valde området?</resource> <resource name="error_openfile">Fila "{0}" kunne ikkje opnast!</resource> <resource name="error_openlink">Kunne ikkje opne lenkja "{0}".</resource> @@ -203,21 +203,21 @@ Har du skrivetilgang til det valde området?</resource> <resource name="settings_iecapture">Internet Explorer-knipsing</resource> <resource name="settings_jpegquality">JPEG-kvalitet</resource> <resource name="settings_language">Språk</resource> - <resource name="settings_message_filenamepattern">Dei fylgjande felta vil bli fylt ut automatisk etter definert regel: -${YYYY} - Årstal, 4 siffer -${MM} - Månad, 2 siffer -${DD} - Dag, 2 siffer -${hh} - Time, 2 siffer -${mm} - Minutt, 2 siffer -${ss} - Sekund, 2 siffer -${NUM} - Automatisk teljar, 6 sifer -${title} - Vindaugstittel -${user} - Brukarnamn i Windows -${domain} - Windows-domene -${hostname} - Maskinnamn på nettverket - -Du kan òg setje Greenshot til å lage mapper dynamisk ved å bruke bakvendt skråstrek ( \ ) til å skilje mappe- og filnamn. -Eksempelregel: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} + <resource name="settings_message_filenamepattern">Dei fylgjande felta vil bli fylt ut automatisk etter definert regel: +${YYYY} - Årstal, 4 siffer +${MM} - Månad, 2 siffer +${DD} - Dag, 2 siffer +${hh} - Time, 2 siffer +${mm} - Minutt, 2 siffer +${ss} - Sekund, 2 siffer +${NUM} - Automatisk teljar, 6 sifer +${title} - Vindaugstittel +${user} - Brukarnamn i Windows +${domain} - Windows-domene +${hostname} - Maskinnamn på nettverket + +Du kan òg setje Greenshot til å lage mapper dynamisk ved å bruke bakvendt skråstrek ( \ ) til å skilje mappe- og filnamn. +Eksempelregel: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med tidspunktet som namn, fylgt av filtype definert i innstillingane (f.eks. 10_14_31.JPG).</resource> <resource name="settings_network">Nettverk og oppdateringar</resource> <resource name="settings_output">Utformat</resource> @@ -248,8 +248,8 @@ vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med ti <resource name="update_found">Ein nyare versjon av skjermknipsaren er tilgjengeleg! Vil du laste ned Greenshot {0}?</resource> <resource name="wait_ie_capture">Ver venleg og vent medan Internet Explorer-sida blir knipsa...</resource> <resource name="warning">Åtvaring!</resource> - <resource name="warning_hotkeys">Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. - + <resource name="warning_hotkeys">Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. + Alle Greenshot-funksjonar er likevel tilgjengeleg via høgreklikkmenyen i varslingsfeltet nedst til høgre på skjermen.</resource> <resource name="WindowCaptureMode.Aero">Bruk eigendefinert farge</resource> <resource name="WindowCaptureMode.AeroTransparent">Hald på gjennomsynlegheit</resource> diff --git a/Greenshot/Languages/language-pl-PL.xml b/Greenshot/Languages/language-pl-PL.xml index 6962ad536..b9dc55886 100644 --- a/Greenshot/Languages/language-pl-PL.xml +++ b/Greenshot/Languages/language-pl-PL.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Tutaj proszę zgłaszać błędy:</resource> <resource name="about_donations">Jeśli podoba Ci się Greenshot, chętnie przyjmiemy Twoje wsparcie:</resource> - <resource name="about_host">Greenshot jest utrzymywany przez sourceforge.net pod adresem:</resource> + <resource name="about_host">Greenshot jest utrzymywany przez GitHub pod adresem:</resource> <resource name="about_icons">Ikony z zestawu Fugue od Yusuke Kamiyamane (licencja Creative Commons Attribution 3.0):</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot nie jest objęty JAKĄKOLWIEK GWARANCJĄ. Jako wolne oprogramowanie może być rozpowszechniany na określonych warunkach. diff --git a/Greenshot/Languages/language-pt-BR.xml b/Greenshot/Languages/language-pt-BR.xml index 280068294..e53dc2ca8 100644 --- a/Greenshot/Languages/language-pt-BR.xml +++ b/Greenshot/Languages/language-pt-BR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Por favor envie erros para</resource> <resource name="about_donations">Se você gostou do Greenshot, por favor contribua:</resource> - <resource name="about_host">O Greenshot está armazenado no sourceforge.net em</resource> + <resource name="about_host">O Greenshot está armazenado no GitHub em</resource> <resource name="about_icons">Ícones de Yusuke Kamiyamane (Biblioteca Fugue, licença "Creative Commons Attribution 3.0")</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuido sob algumas condições. diff --git a/Greenshot/Languages/language-pt-PT.xml b/Greenshot/Languages/language-pt-PT.xml index cd7fb8869..a39bdc7b4 100644 --- a/Greenshot/Languages/language-pt-PT.xml +++ b/Greenshot/Languages/language-pt-PT.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Por favor envie erros para</resource> <resource name="about_donations">Se gostou do Greenshot, por favor contribua:</resource> - <resource name="about_host">O Greenshot está armazenado no sourceforge.net em</resource> + <resource name="about_host">O Greenshot está armazenado no GitHub em</resource> <resource name="about_icons">Ícones da colecção Fugue de Yusuke Kamiyamane (Licença "Creative Commons Attribution 3.0")</resource> <resource name="about_license">Direitos de Autor (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuído sob algumas condições. diff --git a/Greenshot/Languages/language-ro-RO.xml b/Greenshot/Languages/language-ro-RO.xml index de435b088..11f17a736 100644 --- a/Greenshot/Languages/language-ro-RO.xml +++ b/Greenshot/Languages/language-ro-RO.xml @@ -102,7 +102,7 @@ Detalii despre licența GNU General Public License: Pictograme din setul de icoane Fugue al lui Yusuke Kamiyamane (Creative Commons Attribution 3.0 license) </resource> <resource name="about_host"> - Greenshot e hostat de sourceforge.net la + Greenshot e hostat de GitHub la </resource> <resource name="about_bugs"> Raportați bug-uri la diff --git a/Greenshot/Languages/language-ru-RU.xml b/Greenshot/Languages/language-ru-RU.xml index 7506dae8b..b7df2b940 100644 --- a/Greenshot/Languages/language-ru-RU.xml +++ b/Greenshot/Languages/language-ru-RU.xml @@ -3,21 +3,21 @@ <resources> <resource name="about_bugs">Просьба сообщать об ошибках на</resource> <resource name="about_donations">Если вам нравится Greenshot, вы можете поддержать нас:</resource> - <resource name="about_host">Greenshot размещается на sourceforge.net</resource> + <resource name="about_host">Greenshot размещается на GitHub</resource> <resource name="about_icons">Набор иконок Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license)</resource> - <resource name="about_license">Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom -Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.Это бесплатная программа и вы можете распространять её на определённых условиях. + <resource name="about_license">Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom +Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.Это бесплатная программа и вы можете распространять её на определённых условиях. Подробно о GNU General Public License:</resource> <resource name="about_title">О программе Greenshot</resource> <resource name="about_translation">Русский перевод Андрея Кравцова, http://sapfir.ucoz.ru</resource> <resource name="application_title">Greenshot — передовая утилита для получения скриншотов</resource> <resource name="bugreport_cancel">Закрыть</resource> - <resource name="bugreport_info">Извините, произошла непредвиденная ошибка. - -Это хорошая новость: Вы можете помочь нам избавиться от неё, отправив сообщение об ошибке. -Посетите URL ниже, создайте новый отчёт об ошибке и вставьте содержимое в текстовое поле. - -Пожалуйста, добавьте значимое резюме и приложите любую информацию, которую вы считаете полезной для воспроизведения проблемы. + <resource name="bugreport_info">Извините, произошла непредвиденная ошибка. + +Это хорошая новость: Вы можете помочь нам избавиться от неё, отправив сообщение об ошибке. +Посетите URL ниже, создайте новый отчёт об ошибке и вставьте содержимое в текстовое поле. + +Пожалуйста, добавьте значимое резюме и приложите любую информацию, которую вы считаете полезной для воспроизведения проблемы. Кроме того, мы были бы весьма признательны, если вы попробуете найти решение этой ошибки, вользовавшись поисковиком. Спасибо:)</resource> <resource name="bugreport_title">Ошибка</resource> <resource name="CANCEL">Отмена</resource> @@ -168,7 +168,7 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. <resource name="EmailFormat.OUTLOOK_TXT">Outlook с текстом</resource> <resource name="error">Ошибка</resource> <resource name="error_multipleinstances">Экземпляр Greenshot уже запущен.</resource> - <resource name="error_nowriteaccess">Не удалось сохранить файл на {0}. + <resource name="error_nowriteaccess">Не удалось сохранить файл на {0}. Проверьте доступность записи в выбраном месте расположения.</resource> <resource name="error_openfile">Файл "{0}" не может быть открыт.</resource> <resource name="error_openlink">Не удалось открыть ссылку '{0}'.</resource> @@ -232,22 +232,22 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. <resource name="settings_iecapture">Захват Internet Explorer</resource> <resource name="settings_jpegquality">Качество JPEG</resource> <resource name="settings_language">Язык</resource> - <resource name="settings_message_filenamepattern">В определённом шаблоне автоматически будут заменены следующие заполнители: -${YYYY} Год, 4 цифры -${MM} Месяц, 2 цифры -${DD} День, 2 цифры -${hh} Часы, 2 цифры -${mm} Минуты, 2 цифры -${ss} Секунды, 2 цифры -${NUM} Увеличивающееся число, 6 цифр -${title} Заголовок окна -${user} Пользователь Windows -${domain} Домен Windows -${hostname} Имя ПК - -Вы также можете создавать динамичные каталоги Greenshot, используя символ обратную косую черту (\) для отдельных папок и названий файлов. -Пример шаблона: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -Будет создана папка на текущий день, в вашем хранилище по умолчанию, например 2008-06-29.Содержащее имя файла скриншота будет основываться на текущем + <resource name="settings_message_filenamepattern">В определённом шаблоне автоматически будут заменены следующие заполнители: +${YYYY} Год, 4 цифры +${MM} Месяц, 2 цифры +${DD} День, 2 цифры +${hh} Часы, 2 цифры +${mm} Минуты, 2 цифры +${ss} Секунды, 2 цифры +${NUM} Увеличивающееся число, 6 цифр +${title} Заголовок окна +${user} Пользователь Windows +${domain} Домен Windows +${hostname} Имя ПК + +Вы также можете создавать динамичные каталоги Greenshot, используя символ обратную косую черту (\) для отдельных папок и названий файлов. +Пример шаблона: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +Будет создана папка на текущий день, в вашем хранилище по умолчанию, например 2008-06-29.Содержащее имя файла скриншота будет основываться на текущем времени, например 11_58_32 (плюс расширения, определённые в настройках)</resource> <resource name="settings_network">Сеть и обновления</resource> <resource name="settings_output">Выходные данные</resource> @@ -283,8 +283,8 @@ ${hostname} Имя ПК <resource name="update_found">Доступна новая версия Greenshot! Вы хотите скачать Greenshot {0}?</resource> <resource name="wait_ie_capture">Пожалуйста, подождите, пока страница в Internet Explorer захватывается...</resource> <resource name="warning">Внимание</resource> - <resource name="warning_hotkeys">Горячие клавиши "{0}" не могут быть зарегистрированы. Эта проблема может быть связана с ещё одним инструментом, использующим те же клавиши! Нужно либо изменить настройки клавиш или деактивировать/изменить программное обеспечение, использующее горячие клавиши. - + <resource name="warning_hotkeys">Горячие клавиши "{0}" не могут быть зарегистрированы. Эта проблема может быть связана с ещё одним инструментом, использующим те же клавиши! Нужно либо изменить настройки клавиш или деактивировать/изменить программное обеспечение, использующее горячие клавиши. + Все функции Greenshot по-прежнему работают прямо из контекстного меню через значок в трее.</resource> <resource name="WindowCaptureMode.Aero">Использовать другой цвет</resource> <resource name="WindowCaptureMode.AeroTransparent">Сохранить прозрачность</resource> diff --git a/Greenshot/Languages/language-sk-SK.xml b/Greenshot/Languages/language-sk-SK.xml index d8d526216..9691b3d67 100644 --- a/Greenshot/Languages/language-sk-SK.xml +++ b/Greenshot/Languages/language-sk-SK.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Prosím oznámte chyby na</resource> <resource name="about_donations">Ak se vám Greenshot páči, uvítame vašu podporu:</resource> - <resource name="about_host">Greenshot je na sourceforge.net</resource> + <resource name="about_host">Greenshot je na GitHub</resource> <resource name="about_icons">Ikony z Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ÚPLNE BEZ ZÁRUKY. Toto je FREE software, a môžete ho distribuovať za určitých podmienok. diff --git a/Greenshot/Languages/language-sr-RS.xml b/Greenshot/Languages/language-sr-RS.xml index ded34237a..24e1af87e 100644 --- a/Greenshot/Languages/language-sr-RS.xml +++ b/Greenshot/Languages/language-sr-RS.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Пријавите грешке на:</resource> <resource name="about_donations">Ако вам се свиђа Гриншот, помозите нам:</resource> - <resource name="about_host">Гриншот покреће Сорсфорџ (sourceforge.net):</resource> + <resource name="about_host">Гриншот покреће Сорсфорџ (GitHub):</resource> <resource name="about_icons">Иконе су преузете из пакета „Fugue“ Јусуке Камијамане (лиценца Кријејтив комонс Ауторство 3.0)</resource> <resource name="about_license">Ауторска права © 2007–2012 Томас Браун, Џенс Клинџен, Робин Кром Гриншот се издаје БЕЗ ИКАКВЕ ГАРАНЦИЈЕ. Он је бесплатан програм, који можете да делите под одређеним условима. diff --git a/Greenshot/Languages/language-sv-SE.xml b/Greenshot/Languages/language-sv-SE.xml index 27977474b..be5687fc3 100644 --- a/Greenshot/Languages/language-sv-SE.xml +++ b/Greenshot/Languages/language-sv-SE.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Var vänlig att rapportera in fel till</resource> <resource name="about_donations">Om du gillar Greenshot, så är du välkommen att stödja oss:</resource> - <resource name="about_host">Greenshots hemsida tillhandahålls av sourceforge.net på</resource> + <resource name="about_host">Greenshots hemsida tillhandahålls av GitHub på</resource> <resource name="about_icons">Ikoner från "Yusuke Kamiyamane's Fugue icon set" (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot lämnar ABSOLUT INGA GARANTIER. Detta är ett gratisprogram, och du får vidaredistribuera programmet under vissa villkor. diff --git a/Greenshot/Languages/language-tr-TR.xml b/Greenshot/Languages/language-tr-TR.xml index 7a4bafa85..a0c8783c3 100644 --- a/Greenshot/Languages/language-tr-TR.xml +++ b/Greenshot/Languages/language-tr-TR.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Hataları şu adrese bildirebilirsiniz:</resource> <resource name="about_donations">Greenshot'ı sevdiyseniz, bizi destekleyin:</resource> - <resource name="about_host">Greenshot sourceforge.net üzerinde şu adreste barındırılmaktadır:</resource> + <resource name="about_host">Greenshot GitHub üzerinde şu adreste barındırılmaktadır:</resource> <resource name="about_icons">Simgeler Yusuke Kamiyamane'nin Fugue simge setidir (Creative Commons Attribution 3.0 lisansı)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot HİÇ BİR GARANTİ vermez. Serbest bir yazılımdır ve belirli koşullar altında dağıtmakta serbestsiniz. GNU diff --git a/Greenshot/Languages/language-uk-UA.xml b/Greenshot/Languages/language-uk-UA.xml index 855cf3afa..30ca49fe5 100644 --- a/Greenshot/Languages/language-uk-UA.xml +++ b/Greenshot/Languages/language-uk-UA.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Про помилки повідомляйте на</resource> <resource name="about_donations">Якщо Вам подобається Greenshot, то можете підтримати нас:</resource> - <resource name="about_host">Greenshot is розташовується на sourceforge.net</resource> + <resource name="about_host">Greenshot is розташовується на GitHub</resource> <resource name="about_icons">Набір іконок Fugue від Yusuke Kamiyamane (ліцензія Creative Commons Attribution 3.0)</resource> <resource name="about_license">Авторство © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot постачається АБСОЛЮТНО БЕЗ ҐАРАНТІЇ. Це вільне програмне забезпечення, Ви можете розповсюджувати його за певних умов. diff --git a/Greenshot/Languages/language-vi-VN.xml b/Greenshot/Languages/language-vi-VN.xml index 6611abd16..f31104799 100644 --- a/Greenshot/Languages/language-vi-VN.xml +++ b/Greenshot/Languages/language-vi-VN.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Địa chỉ gửi báo cáo lỗi:</resource> <resource name="about_donations">Hãy ủng hộ nếu bạn thấy Greenshot hữu dụng:</resource> - <resource name="about_host">Greenshot được tài trợ bởi sourceforge.net</resource> + <resource name="about_host">Greenshot được tài trợ bởi GitHub</resource> <resource name="about_icons">Dùng biểu tượng Fugue (Giấy phép Commons Attribution 3.0 license) :</resource> <resource name="about_license">Bản quyền (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot không đi kèm theo đảm bảo nào và được phân phối dưới giấy phép GNU General Public License.</resource> diff --git a/Greenshot/Languages/language-zh-CN.xml b/Greenshot/Languages/language-zh-CN.xml index 8d1f2fff6..9b6bd73f6 100644 --- a/Greenshot/Languages/language-zh-CN.xml +++ b/Greenshot/Languages/language-zh-CN.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">如果发现任何错误,请到以下网址报告</resource> <resource name="about_donations">如果您喜欢这个软件,希望您可以捐助我们:</resource> - <resource name="about_host">Greenshot 托管在 sourceforge.net</resource> + <resource name="about_host">Greenshot 托管在 GitHub</resource> <resource name="about_icons">图标来源:Yusuke Kamiyamane的Fugue图标基于(Creative Commons Attribution 3.0 协议)</resource> <resource name="about_license">版权所有 (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom 作者不会对程序进行任何担保。 diff --git a/Greenshot/Languages/language-zh-TW.xml b/Greenshot/Languages/language-zh-TW.xml index 9b2a4f62d..ded5485cb 100644 --- a/Greenshot/Languages/language-zh-TW.xml +++ b/Greenshot/Languages/language-zh-TW.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">請回報錯誤到以下網址</resource> <resource name="about_donations">如果您喜歡 Greenshot,歡迎您支持我們:</resource> - <resource name="about_host">Greenshot 的主機在 sourceforge.net 網址是</resource> + <resource name="about_host">Greenshot 的主機在 GitHub 網址是</resource> <resource name="about_icons">圖片來源: Yusuke Kamiyamane's Fugue 圖示集 (Creative Commons Attribution 3.0 授權)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot 不對這個程式做任何擔保。 這個程式是自由軟體,您可以在 GNU General Public License 下任意散佈本軟體。 diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 91f3fcd3b..30b79e745 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index 0c4911ae1..f64b7762d 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index ba532b11c..b44ddd784 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index e4aded8c6..2e4241068 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/IMemento.cs b/Greenshot/Memento/IMemento.cs index 96e8d97d4..c0a28417c 100644 --- a/Greenshot/Memento/IMemento.cs +++ b/Greenshot/Memento/IMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs index 9c8935abc..0fcacbdb6 100644 --- a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs +++ b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index 541b4c06e..0f954e58c 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/Greenshot/Processors/TitleFixProcessor.cs b/Greenshot/Processors/TitleFixProcessor.cs index d20798db2..bbd3c61be 100644 --- a/Greenshot/Processors/TitleFixProcessor.cs +++ b/Greenshot/Processors/TitleFixProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxConfiguration.cs b/GreenshotBoxPlugin/BoxConfiguration.cs index b75a3c2ae..5c42cb1a5 100644 --- a/GreenshotBoxPlugin/BoxConfiguration.cs +++ b/GreenshotBoxPlugin/BoxConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxCredentials.cs b/GreenshotBoxPlugin/BoxCredentials.cs index 5d70729ed..bff044e9f 100644 --- a/GreenshotBoxPlugin/BoxCredentials.cs +++ b/GreenshotBoxPlugin/BoxCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxDestination.cs b/GreenshotBoxPlugin/BoxDestination.cs index 6e2606fbd..653f92ffa 100644 --- a/GreenshotBoxPlugin/BoxDestination.cs +++ b/GreenshotBoxPlugin/BoxDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxEntities.cs b/GreenshotBoxPlugin/BoxEntities.cs index afc567121..99b51fe7a 100644 --- a/GreenshotBoxPlugin/BoxEntities.cs +++ b/GreenshotBoxPlugin/BoxEntities.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxPlugin.cs b/GreenshotBoxPlugin/BoxPlugin.cs index 717db960e..6131a4654 100644 --- a/GreenshotBoxPlugin/BoxPlugin.cs +++ b/GreenshotBoxPlugin/BoxPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/BoxUtils.cs b/GreenshotBoxPlugin/BoxUtils.cs index e0e1566d5..6737d1c28 100644 --- a/GreenshotBoxPlugin/BoxUtils.cs +++ b/GreenshotBoxPlugin/BoxUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Forms/BoxForm.cs b/GreenshotBoxPlugin/Forms/BoxForm.cs index dc1b5f22f..42de01744 100644 --- a/GreenshotBoxPlugin/Forms/BoxForm.cs +++ b/GreenshotBoxPlugin/Forms/BoxForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs index b91b206a1..88c97a400 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.cs b/GreenshotBoxPlugin/Forms/SettingsForm.cs index 07b32373d..fc2524f60 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/LanguageKeys.cs b/GreenshotBoxPlugin/LanguageKeys.cs index ac3765582..cade07532 100644 --- a/GreenshotBoxPlugin/LanguageKeys.cs +++ b/GreenshotBoxPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs index 4dbee7804..413f7d5fe 100644 --- a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 05651949d..b6852fcdb 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs index b8745054e..a57c52591 100644 --- a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs +++ b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 10e212d5e..0f52ceb9b 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluencePlugin.cs b/GreenshotConfluencePlugin/ConfluencePlugin.cs index 9a3e459c7..c8a86ec20 100644 --- a/GreenshotConfluencePlugin/ConfluencePlugin.cs +++ b/GreenshotConfluencePlugin/ConfluencePlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index 3ffafbfd6..d216f6028 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index 102bf6732..e98f85aac 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index 63b72292d..889b5f665 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index a8ddec0dd..1b161d7d9 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index 3c816a2f9..400d20d42 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index b639a5f98..71ffe073e 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index 3c3d9442e..ea3732328 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/LanguageKeys.cs b/GreenshotConfluencePlugin/LanguageKeys.cs index 3936ac398..dd199103d 100644 --- a/GreenshotConfluencePlugin/LanguageKeys.cs +++ b/GreenshotConfluencePlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs index b9720505b..e3889aea4 100644 --- a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropBoxCredentials.cs b/GreenshotDropboxPlugin/DropBoxCredentials.cs index bd6f17366..51f497b7d 100644 --- a/GreenshotDropboxPlugin/DropBoxCredentials.cs +++ b/GreenshotDropboxPlugin/DropBoxCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index c4f79732f..16be2bd05 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index 772545395..0deace234 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs index 090fdccbf..2d75754ad 100644 --- a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs +++ b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/DropboxUtils.cs b/GreenshotDropboxPlugin/DropboxUtils.cs index 126a41cd3..66e0f15b8 100644 --- a/GreenshotDropboxPlugin/DropboxUtils.cs +++ b/GreenshotDropboxPlugin/DropboxUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Forms/DropboxForm.cs b/GreenshotDropboxPlugin/Forms/DropboxForm.cs index b2c87ec61..62d219a01 100644 --- a/GreenshotDropboxPlugin/Forms/DropboxForm.cs +++ b/GreenshotDropboxPlugin/Forms/DropboxForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs index 2549c2018..3e8226dc9 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2011 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.cs index 280ded7f1..e0157343a 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/LanguageKeys.cs b/GreenshotDropboxPlugin/LanguageKeys.cs index daa6fb14c..de9325019 100644 --- a/GreenshotDropboxPlugin/LanguageKeys.cs +++ b/GreenshotDropboxPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs index 67d20ede5..a7905990f 100644 --- a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index f83bc9370..4e64daf5d 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index ee13f6eee..1c4ec1469 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs index 29441232a..c8d5f0a89 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index 9531b0066..462722e8b 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs index 812fd723c..39543feca 100644 --- a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs index c0a9d3043..28ad2552a 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 247e38b59..0c95b7a44 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs index 96efa4063..d655815e0 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index ae9d4b030..bd9c7f8db 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrConfiguration.cs b/GreenshotFlickrPlugin/FlickrConfiguration.cs index 94e767698..6c784dc9d 100644 --- a/GreenshotFlickrPlugin/FlickrConfiguration.cs +++ b/GreenshotFlickrPlugin/FlickrConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrCredentials.cs b/GreenshotFlickrPlugin/FlickrCredentials.cs index 75d888219..74f57c320 100644 --- a/GreenshotFlickrPlugin/FlickrCredentials.cs +++ b/GreenshotFlickrPlugin/FlickrCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrDestination.cs b/GreenshotFlickrPlugin/FlickrDestination.cs index 7155937aa..4d0c19c07 100644 --- a/GreenshotFlickrPlugin/FlickrDestination.cs +++ b/GreenshotFlickrPlugin/FlickrDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrPlugin.cs b/GreenshotFlickrPlugin/FlickrPlugin.cs index ba6210b6e..f6d06f15d 100644 --- a/GreenshotFlickrPlugin/FlickrPlugin.cs +++ b/GreenshotFlickrPlugin/FlickrPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/FlickrUtils.cs b/GreenshotFlickrPlugin/FlickrUtils.cs index 8737f85e0..3a4502353 100644 --- a/GreenshotFlickrPlugin/FlickrUtils.cs +++ b/GreenshotFlickrPlugin/FlickrUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Forms/FlickrForm.cs b/GreenshotFlickrPlugin/Forms/FlickrForm.cs index 59358436e..63951c68b 100644 --- a/GreenshotFlickrPlugin/Forms/FlickrForm.cs +++ b/GreenshotFlickrPlugin/Forms/FlickrForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs index 3f47f6b31..7da57baf1 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.cs index 0835e2ea5..45dcebbae 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/LanguageKeys.cs b/GreenshotFlickrPlugin/LanguageKeys.cs index 63849aa3c..52c96b7f1 100644 --- a/GreenshotFlickrPlugin/LanguageKeys.cs +++ b/GreenshotFlickrPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs index 810171a92..47e084756 100644 --- a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/ImgurForm.cs b/GreenshotImgurPlugin/Forms/ImgurForm.cs index d476f9313..5a6c59a0b 100644 --- a/GreenshotImgurPlugin/Forms/ImgurForm.cs +++ b/GreenshotImgurPlugin/Forms/ImgurForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs index f3d3d221f..78350ec53 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index 064fcc21f..b18a44f8f 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs index c24d1f67d..59c12786a 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index 8a35fc06e..79c3faaca 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 104839352..48bba7c4b 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurCredentials.cs b/GreenshotImgurPlugin/ImgurCredentials.cs index 4eee20fba..8d268154d 100644 --- a/GreenshotImgurPlugin/ImgurCredentials.cs +++ b/GreenshotImgurPlugin/ImgurCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index 9002463f3..cd1349fa2 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index 37e5a3ce8..a39c2326a 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index c5c354eec..65d2c41e7 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index 3bb80e0f8..cb4beaa3b 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/LanguageKeys.cs b/GreenshotImgurPlugin/LanguageKeys.cs index b5d81646e..bfc73e7ec 100644 --- a/GreenshotImgurPlugin/LanguageKeys.cs +++ b/GreenshotImgurPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs index 06afabdf8..9e66e2995 100644 --- a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs index 8b60e5c4c..a749454d0 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 535a039bf..3a35a95de 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/JiraFormBase.cs b/GreenshotJiraPlugin/Forms/JiraFormBase.cs index 6cba807a3..0f9ecdcf0 100644 --- a/GreenshotJiraPlugin/Forms/JiraFormBase.cs +++ b/GreenshotJiraPlugin/Forms/JiraFormBase.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs index ab6257839..0b2132df6 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.cs b/GreenshotJiraPlugin/Forms/SettingsForm.cs index 1ecaecfbf..a08b8fc17 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Jira.cs b/GreenshotJiraPlugin/Jira.cs index cdaaae97a..4f03cb9ad 100644 --- a/GreenshotJiraPlugin/Jira.cs +++ b/GreenshotJiraPlugin/Jira.cs @@ -4,7 +4,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 1ebb03186..8dbdfb471 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index bd443b37e..fcf69899b 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 18e6576b9..045027cf0 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index cd78c4bde..4d43d9ace 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/LanguageKeys.cs b/GreenshotJiraPlugin/LanguageKeys.cs index 0d7a8fefc..a3204ae3e 100644 --- a/GreenshotJiraPlugin/LanguageKeys.cs +++ b/GreenshotJiraPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs index 080ba5f3d..4bf25d8b6 100644 --- a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index af7ef4bb0..73aa72444 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 231786e12..5b0405723 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/ModiInterop.cs b/GreenshotOCRCommand/ModiInterop.cs index a73586172..3f52c2127 100644 --- a/GreenshotOCRCommand/ModiInterop.cs +++ b/GreenshotOCRCommand/ModiInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRCommand/Properties/AssemblyInfo.cs b/GreenshotOCRCommand/Properties/AssemblyInfo.cs index 419eb53b6..e2f7a415d 100644 --- a/GreenshotOCRCommand/Properties/AssemblyInfo.cs +++ b/GreenshotOCRCommand/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRConfiguration.cs b/GreenshotOCRPlugin/OCRConfiguration.cs index 87b42f6be..2d67d0d33 100644 --- a/GreenshotOCRPlugin/OCRConfiguration.cs +++ b/GreenshotOCRPlugin/OCRConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRDestination.cs b/GreenshotOCRPlugin/OCRDestination.cs index ac50ad74a..5080678f5 100644 --- a/GreenshotOCRPlugin/OCRDestination.cs +++ b/GreenshotOCRPlugin/OCRDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRForm.cs b/GreenshotOCRPlugin/OCRForm.cs index f6fe326a2..26cb9b274 100644 --- a/GreenshotOCRPlugin/OCRForm.cs +++ b/GreenshotOCRPlugin/OCRForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 3c832b5c5..29663f698 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs index c524510e1..c98d2649d 100644 --- a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/SettingsForm.Designer.cs b/GreenshotOCRPlugin/SettingsForm.Designer.cs index 84a8c1e91..533315915 100644 --- a/GreenshotOCRPlugin/SettingsForm.Designer.cs +++ b/GreenshotOCRPlugin/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index 88b1d029a..dc9cb7052 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs index 1b9e6febb..f634c1072 100644 --- a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs +++ b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs index 9a72feee5..8d57f7f32 100644 --- a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs index 66db19b40..ffbe0be2d 100644 --- a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs index 30a5d3df5..8b911ab86 100644 --- a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs +++ b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Destinations/WordDestination.cs b/GreenshotOfficePlugin/Destinations/WordDestination.cs index 202b2ee72..a2da6e2fd 100644 --- a/GreenshotOfficePlugin/Destinations/WordDestination.cs +++ b/GreenshotOfficePlugin/Destinations/WordDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeConfiguration.cs b/GreenshotOfficePlugin/OfficeConfiguration.cs index f89b7f73a..982411901 100644 --- a/GreenshotOfficePlugin/OfficeConfiguration.cs +++ b/GreenshotOfficePlugin/OfficeConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 0a5bfd161..ac4ed4675 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs index f2e419411..3569c2da2 100644 --- a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index 39e0ea13c..03919db89 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs index a8318b6a0..8474e1c4a 100644 --- a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index bd45749e2..c8e72f2b2 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs index 43d122c19..4c5b3b201 100644 --- a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs index b41211cb5..3090c9591 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs index 411ceaf4c..2d1ecd0e7 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs index 904693ddb..1b3e90f2e 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs index 3f1532cef..42a31fa24 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs index 3e5fa215f..681053801 100644 --- a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs index 60ab99216..99433ebb3 100644 --- a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/OfficePlugin.cs b/GreenshotOfficePlugin/OfficePlugin.cs index 234171a74..142b9dee0 100644 --- a/GreenshotOfficePlugin/OfficePlugin.cs +++ b/GreenshotOfficePlugin/OfficePlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs index 79ad89124..203d02cd8 100644 --- a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs index 63f6636c4..c58aa8d20 100644 --- a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs index cb2b9d569..3f8530ed5 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs index 560a29b39..f45492e53 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/LanguageKeys.cs b/GreenshotPhotobucketPlugin/LanguageKeys.cs index 5e6f33437..d240fb14b 100644 --- a/GreenshotPhotobucketPlugin/LanguageKeys.cs +++ b/GreenshotPhotobucketPlugin/LanguageKeys.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs index bd7e20043..1b7d8c829 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs index d03ee597a..1f95aeda1 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs index 68f467c53..5a1976ec1 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs index 9a8fd8843..c23d4a351 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index 63fd3f035..7e9d53a9c 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs index 3030f5059..58d64ed93 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs index d732925da..ca598ebf8 100644 --- a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPicasaPlugin/PicasaCredentials.cs b/GreenshotPicasaPlugin/PicasaCredentials.cs index 83c6059b6..670ef7182 100644 --- a/GreenshotPicasaPlugin/PicasaCredentials.cs +++ b/GreenshotPicasaPlugin/PicasaCredentials.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs index 4e50cceda..b7003ce97 100644 --- a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index 17f8baa38..ebbf5fda4 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs index e372f6316..690420195 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index e3d73ac4d..765ae7e22 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index 785fb37ee..66c7273e2 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/FormWithoutActivation.cs b/GreenshotPlugin/Controls/FormWithoutActivation.cs index 2b92989a5..699dcd93f 100644 --- a/GreenshotPlugin/Controls/FormWithoutActivation.cs +++ b/GreenshotPlugin/Controls/FormWithoutActivation.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotButton.cs b/GreenshotPlugin/Controls/GreenshotButton.cs index 530c34a89..64dc6f127 100644 --- a/GreenshotPlugin/Controls/GreenshotButton.cs +++ b/GreenshotPlugin/Controls/GreenshotButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotCheckBox.cs b/GreenshotPlugin/Controls/GreenshotCheckBox.cs index 30aa74712..67d74172f 100644 --- a/GreenshotPlugin/Controls/GreenshotCheckBox.cs +++ b/GreenshotPlugin/Controls/GreenshotCheckBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs index a64a4aabb..fe47b59eb 100644 --- a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs +++ b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotComboBox.cs b/GreenshotPlugin/Controls/GreenshotComboBox.cs index 0fe165061..e304e0f25 100644 --- a/GreenshotPlugin/Controls/GreenshotComboBox.cs +++ b/GreenshotPlugin/Controls/GreenshotComboBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotForm.cs b/GreenshotPlugin/Controls/GreenshotForm.cs index ab151675a..36a909462 100644 --- a/GreenshotPlugin/Controls/GreenshotForm.cs +++ b/GreenshotPlugin/Controls/GreenshotForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotGroupBox.cs b/GreenshotPlugin/Controls/GreenshotGroupBox.cs index b83ce53c9..6f1ef9f10 100644 --- a/GreenshotPlugin/Controls/GreenshotGroupBox.cs +++ b/GreenshotPlugin/Controls/GreenshotGroupBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotLabel.cs b/GreenshotPlugin/Controls/GreenshotLabel.cs index 813eb7aa5..396977c3b 100644 --- a/GreenshotPlugin/Controls/GreenshotLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotLabel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotRadioButton.cs b/GreenshotPlugin/Controls/GreenshotRadioButton.cs index 9de1d2147..403f939d0 100644 --- a/GreenshotPlugin/Controls/GreenshotRadioButton.cs +++ b/GreenshotPlugin/Controls/GreenshotRadioButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotTabPage.cs b/GreenshotPlugin/Controls/GreenshotTabPage.cs index 9e95517b1..03922b1e2 100644 --- a/GreenshotPlugin/Controls/GreenshotTabPage.cs +++ b/GreenshotPlugin/Controls/GreenshotTabPage.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotTextBox.cs b/GreenshotPlugin/Controls/GreenshotTextBox.cs index 772520bcd..cc599587c 100644 --- a/GreenshotPlugin/Controls/GreenshotTextBox.cs +++ b/GreenshotPlugin/Controls/GreenshotTextBox.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs index 48301b72d..addc626d2 100644 --- a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs index 3678081f0..e23d981db 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs index 615b9206e..f543ffe83 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs index 2ef417fd9..8629bc6e1 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 706e5316f..f61217c72 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs index e17e9f112..a83c90fa9 100644 --- a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs index 899f78134..0b7ebaf6e 100644 --- a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs index f7d47f4c5..a46972a0d 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index e562b1185..b5cdd8cd1 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs index e5b631849..a66a66e30 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index 63a0c783b..d02d05a8d 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/QualityDialog.Designer.cs b/GreenshotPlugin/Controls/QualityDialog.Designer.cs index 9b7e03fa4..23734de5f 100644 --- a/GreenshotPlugin/Controls/QualityDialog.Designer.cs +++ b/GreenshotPlugin/Controls/QualityDialog.Designer.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/QualityDialog.cs b/GreenshotPlugin/Controls/QualityDialog.cs index c601c8e88..81cef1be8 100644 --- a/GreenshotPlugin/Controls/QualityDialog.cs +++ b/GreenshotPlugin/Controls/QualityDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/SaveImageFileDialog.cs b/GreenshotPlugin/Controls/SaveImageFileDialog.cs index bf14f2be0..ac99facbb 100644 --- a/GreenshotPlugin/Controls/SaveImageFileDialog.cs +++ b/GreenshotPlugin/Controls/SaveImageFileDialog.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index 7f5053399..a3cf5de35 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index af74efb41..64acf4f75 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AbstractProcessor.cs b/GreenshotPlugin/Core/AbstractProcessor.cs index c0d22ea18..667bce3f7 100644 --- a/GreenshotPlugin/Core/AbstractProcessor.cs +++ b/GreenshotPlugin/Core/AbstractProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index 914b27733..8613f82f8 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/AnimationHelpers.cs b/GreenshotPlugin/Core/AnimationHelpers.cs index fe70fff73..1cdf9547c 100644 --- a/GreenshotPlugin/Core/AnimationHelpers.cs +++ b/GreenshotPlugin/Core/AnimationHelpers.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/BinaryStructHelper.cs b/GreenshotPlugin/Core/BinaryStructHelper.cs index 0a1c64016..0d43679b4 100644 --- a/GreenshotPlugin/Core/BinaryStructHelper.cs +++ b/GreenshotPlugin/Core/BinaryStructHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index 894e389cc..c13f7c9dd 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/CaptureHandler.cs b/GreenshotPlugin/Core/CaptureHandler.cs index 660da5527..da4dfa7ed 100644 --- a/GreenshotPlugin/Core/CaptureHandler.cs +++ b/GreenshotPlugin/Core/CaptureHandler.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7bb88cd61..7b3819836 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -349,7 +349,7 @@ EndSelection:<<<<<<<4 /// <summary> /// Helper method to try to get an image in the specified format from the dataObject - /// the DIB readed should solve the issue reported here: https://sourceforge.net/projects/greenshot/forums/forum/676083/topic/6354353/index/page/1 + /// the DIB reader should solve some issues /// It also supports Format17/DibV5, by using the following information: http://stackoverflow.com/a/14335591 /// </summary> /// <param name="format">string with the format</param> diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index b5bff9abb..d4a367090 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 539ab244a..31038e3ae 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/DisplayKeyAttribute.cs b/GreenshotPlugin/Core/DisplayKeyAttribute.cs index b7c2d71f5..e66d7acff 100644 --- a/GreenshotPlugin/Core/DisplayKeyAttribute.cs +++ b/GreenshotPlugin/Core/DisplayKeyAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs index 70c45bfb9..567dc4f29 100644 --- a/GreenshotPlugin/Core/Effects.cs +++ b/GreenshotPlugin/Core/Effects.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/EmailConfigHelper.cs b/GreenshotPlugin/Core/EmailConfigHelper.cs index 9f1903897..673b1a9b6 100644 --- a/GreenshotPlugin/Core/EmailConfigHelper.cs +++ b/GreenshotPlugin/Core/EmailConfigHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/EnumExtensions.cs b/GreenshotPlugin/Core/EnumExtensions.cs index 780b59a2c..3f4e605c0 100644 --- a/GreenshotPlugin/Core/EnumExtensions.cs +++ b/GreenshotPlugin/Core/EnumExtensions.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/EventDelay.cs b/GreenshotPlugin/Core/EventDelay.cs index 848d19dd9..db36fba1e 100644 --- a/GreenshotPlugin/Core/EventDelay.cs +++ b/GreenshotPlugin/Core/EventDelay.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ExtensionAttribute.cs b/GreenshotPlugin/Core/ExtensionAttribute.cs index eed21f8ae..69916ac74 100644 --- a/GreenshotPlugin/Core/ExtensionAttribute.cs +++ b/GreenshotPlugin/Core/ExtensionAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index 228e1e4bf..26da6df48 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 30c7b3f59..6fb51b764 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/GreenshotResources.cs b/GreenshotPlugin/Core/GreenshotResources.cs index 701786e80..8244775de 100644 --- a/GreenshotPlugin/Core/GreenshotResources.cs +++ b/GreenshotPlugin/Core/GreenshotResources.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/IEHelper.cs b/GreenshotPlugin/Core/IEHelper.cs index 0aa8db457..43bffff57 100644 --- a/GreenshotPlugin/Core/IEHelper.cs +++ b/GreenshotPlugin/Core/IEHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 86abd0dab..f5998b0c3 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 9b961b0f3..0f98ae73e 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/InterfaceUtils.cs b/GreenshotPlugin/Core/InterfaceUtils.cs index 0b02a9103..0e3e7044a 100644 --- a/GreenshotPlugin/Core/InterfaceUtils.cs +++ b/GreenshotPlugin/Core/InterfaceUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index e897c6a66..44790752a 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 253493f58..11172bd92 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index dc816eab7..30e3ec020 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index 110736f5e..f7adc99fd 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/Objects.cs b/GreenshotPlugin/Core/Objects.cs index 4589b9b01..3727d4ef9 100644 --- a/GreenshotPlugin/Core/Objects.cs +++ b/GreenshotPlugin/Core/Objects.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 122fbc150..645904e5f 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index d9bfa1713..e7c03c7c1 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/SourceForgeHelper.cs b/GreenshotPlugin/Core/RssHelper.cs similarity index 68% rename from GreenshotPlugin/Core/SourceForgeHelper.cs rename to GreenshotPlugin/Core/RssHelper.cs index 3a027cbbb..f2293b6dd 100644 --- a/GreenshotPlugin/Core/SourceForgeHelper.cs +++ b/GreenshotPlugin/Core/RssHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -28,7 +28,7 @@ using System.Xml; using log4net; namespace GreenshotPlugin.Core { - public class SourceforgeFile { + public class RssFile { private readonly string _file; public string File { get {return _file;} @@ -41,10 +41,6 @@ namespace GreenshotPlugin.Core { public string Link { get {return _link;} } - private readonly string _directLink; - public string DirectLink { - get {return _directLink;} - } private Version _version; public Version Version { get {return _version;} @@ -85,18 +81,21 @@ namespace GreenshotPlugin.Core { } } - public SourceforgeFile(string file, string pubdate, string link, string directLink) { - this._file = file; - DateTime.TryParse(pubdate, out _pubdate); - this._link = link; - this._directLink = directLink; + public RssFile(string file, string pubdate, string link) { + _file = file; + if (!DateTime.TryParse(pubdate, out _pubdate)) + { + DateTime.TryParseExact(pubdate.Replace(" UT", ""), "ddd, dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out _pubdate); + } + _link = link; } } + /// <summary> - /// Description of SourceForgeHelper. + /// Description of RssHelper. /// </summary> - public class SourceForgeHelper { - private static ILog LOG = LogManager.GetLogger(typeof(SourceForgeHelper)); + public class RssHelper { + private static ILog LOG = LogManager.GetLogger(typeof(RssHelper)); private const string RSSFEED = "http://getgreenshot.org/project-feed/"; /// <summary> @@ -118,8 +117,8 @@ namespace GreenshotPlugin.Core { /// <summary> /// Read the Greenshot RSS feed, so we can use this information to check for updates /// </summary> - /// <returns>Dictionary<string, Dictionary<string, RssFile>> with files and their RssFile "description"</returns> - public static Dictionary<string, Dictionary<string, SourceforgeFile>> readRSS() { + /// <returns>List with RssFile(s)</returns> + public static IList<RssFile> readRSS() { XmlDocument rssDoc = new XmlDocument(); try { HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(RSSFEED); @@ -163,7 +162,7 @@ namespace GreenshotPlugin.Core { return null; } - Dictionary<string, Dictionary<string, SourceforgeFile>> rssFiles = new Dictionary<string, Dictionary<string, SourceforgeFile>>(); + IList<RssFile> rssFiles = new List<RssFile>(); // Loop for the <title>, <link>, <description> and all the other tags for (int i = 0; i < nodeChannel.ChildNodes.Count; i++) { @@ -171,26 +170,14 @@ namespace GreenshotPlugin.Core { if (nodeChannel.ChildNodes[i].Name == "item") { XmlNode nodeItem = nodeChannel.ChildNodes[i]; - string sfLink = nodeItem["link"].InnerText; + string link = nodeItem["link"].InnerText; string pubdate = nodeItem["pubDate"].InnerText; try { - Match match= Regex.Match(Uri.UnescapeDataString(sfLink), @"^http.*sourceforge.*\/projects\/([^\/]+)\/files\/([^\/]+)\/([^\/]+)\/(.+)\/download$"); + Match match= Regex.Match(Uri.UnescapeDataString(link), @"^.*\/(Greenshot.+)\/download$"); if (match.Success) { - string project = match.Groups[1].Value; - string subdir = match.Groups[2].Value; - string type = match.Groups[3].Value; - string file = match.Groups[4].Value; - // !!! Change this to the mirror !!! - string mirror = "kent"; - string directLink = Uri.EscapeUriString("http://"+mirror+".dl.sourceforge.net/project/"+project+"/"+subdir+"/"+type+"/"+file); - Dictionary<string, SourceforgeFile> filesForType; - if (rssFiles.ContainsKey(type)) { - filesForType = rssFiles[type]; - } else { - filesForType = new Dictionary<string, SourceforgeFile>(); - rssFiles.Add(type, filesForType); - } - SourceforgeFile rssFile = new SourceforgeFile(file, pubdate, sfLink, directLink); + string file = match.Groups[1].Value; + + RssFile rssFile = new RssFile(file, pubdate, link); if (file.EndsWith(".exe") ||file.EndsWith(".zip")) { string version = Regex.Replace(file, @".*[a-zA-Z_]\-", ""); version = version.Replace(@"\-[a-zA-Z]+.*",""); @@ -209,16 +196,8 @@ namespace GreenshotPlugin.Core { LOG.DebugFormat("Found invalid version {0} in file {1}", version, file); } } - } else if (type.Equals("Translations")) { - string culture = Regex.Replace(file, @"[a-zA-Z]+-(..-..)\.(xml|html)", "$1"); - try { - //CultureInfo cultureInfo = new CultureInfo(culture); - rssFile.Language = culture;//cultureInfo.NativeName; - } catch (Exception) { - LOG.WarnFormat("Can't read the native name of the culture {0}", culture); - } + rssFiles.Add(rssFile); } - filesForType.Add(file, rssFile); } } catch (Exception ex) { LOG.WarnFormat("Couldn't read RSS entry for: {0}", nodeChannel["title"].InnerText); diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index 9cbec97b4..4414e05c0 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index 733aa12f0..df217342e 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 4b69f88ad..71f930686 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs index f1caf717c..e5954ddda 100644 --- a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs +++ b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 917a12654..d4da13521 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -180,7 +180,7 @@ <Compile Include="Core\Objects.cs" /> <Compile Include="Core\PluginUtils.cs" /> <Compile Include="Core\QuantizerHelper.cs" /> - <Compile Include="Core\SourceForgeHelper.cs" /> + <Compile Include="Core\RssHelper.cs" /> <Compile Include="Core\WindowCapture.cs" /> <Compile Include="Core\WindowsHelper.cs" /> <Compile Include="IniFile\IniAttributes.cs" /> diff --git a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs index eb5b399e2..107027365 100644 --- a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs index 0bab7edf0..089b9bb58 100644 --- a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument.cs b/GreenshotPlugin/IEInterop/IHTMLDocument.cs index 176b66fea..ddbcdfe8a 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs index a7a2e26e4..ae7a7c8eb 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs index 8d4825044..f164237e3 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs index 2ee041264..b84d0d871 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs index 10c603d7d..99c4c26a3 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElement.cs b/GreenshotPlugin/IEInterop/IHTMLElement.cs index 5bdf3bf6f..003f4b034 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElement2.cs b/GreenshotPlugin/IEInterop/IHTMLElement2.cs index 44a278179..e5b5231bc 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs index 3a393c69c..fdd216e5d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs index a41922c14..f520a59df 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs index 07c2fab8a..75c5c44d6 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLRect.cs b/GreenshotPlugin/IEInterop/IHTMLRect.cs index 943081b03..f894fe67b 100644 --- a/GreenshotPlugin/IEInterop/IHTMLRect.cs +++ b/GreenshotPlugin/IEInterop/IHTMLRect.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen.cs b/GreenshotPlugin/IEInterop/IHTMLScreen.cs index f51807b0d..4ebff42f0 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs index 459aeb741..4412f5e55 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs index 43fb5434c..d7fe06570 100644 --- a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs +++ b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLStyle.cs b/GreenshotPlugin/IEInterop/IHTMLStyle.cs index 31433a84c..a604203e9 100644 --- a/GreenshotPlugin/IEInterop/IHTMLStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLStyle.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs index 21e2997b8..c198ef772 100644 --- a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs +++ b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs index 16e1fd9cc..42f03dc63 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs index 0fb76e227..ab8732654 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs index 276f2bc73..6e06bd75f 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IEInterop/IWebBrowser2.cs b/GreenshotPlugin/IEInterop/IWebBrowser2.cs index 00abda678..40eff770b 100644 --- a/GreenshotPlugin/IEInterop/IWebBrowser2.cs +++ b/GreenshotPlugin/IEInterop/IWebBrowser2.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniAttributes.cs b/GreenshotPlugin/IniFile/IniAttributes.cs index a885bb7e1..01b119404 100644 --- a/GreenshotPlugin/IniFile/IniAttributes.cs +++ b/GreenshotPlugin/IniFile/IniAttributes.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index a6bbfca12..c00b5bae0 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniReader.cs b/GreenshotPlugin/IniFile/IniReader.cs index 3447bf9db..fbaea2680 100644 --- a/GreenshotPlugin/IniFile/IniReader.cs +++ b/GreenshotPlugin/IniFile/IniReader.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniSection.cs b/GreenshotPlugin/IniFile/IniSection.cs index 40aba49f9..cf29ab2d7 100644 --- a/GreenshotPlugin/IniFile/IniSection.cs +++ b/GreenshotPlugin/IniFile/IniSection.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index c7fe99d01..70d9b1bb6 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Capture.cs b/GreenshotPlugin/Interfaces/Capture.cs index 3ac0d0a15..c8170ceb9 100644 --- a/GreenshotPlugin/Interfaces/Capture.cs +++ b/GreenshotPlugin/Interfaces/Capture.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index 7be49e852..e2a253a49 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs index 8c49e4e2d..1f589e41c 100644 --- a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs +++ b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 73e6c2cf6..e21141206 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index e7da7eb9a..4da036457 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/IProcessor.cs b/GreenshotPlugin/Interfaces/IProcessor.cs index 40737888f..131e4ab6b 100644 --- a/GreenshotPlugin/Interfaces/IProcessor.cs +++ b/GreenshotPlugin/Interfaces/IProcessor.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index b21963bf2..5416aa294 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 49c3e1d8d..98bda9f1c 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/ComProgIdAttribute.cs b/GreenshotPlugin/Interop/ComProgIdAttribute.cs index c2d9e1434..31fd60f2e 100644 --- a/GreenshotPlugin/Interop/ComProgIdAttribute.cs +++ b/GreenshotPlugin/Interop/ComProgIdAttribute.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IAppVisibility.cs b/GreenshotPlugin/Interop/IAppVisibility.cs index edcfcf915..97e052037 100644 --- a/GreenshotPlugin/Interop/IAppVisibility.cs +++ b/GreenshotPlugin/Interop/IAppVisibility.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IDispatch.cs b/GreenshotPlugin/Interop/IDispatch.cs index e83bc4488..bd3b5aabf 100644 --- a/GreenshotPlugin/Interop/IDispatch.cs +++ b/GreenshotPlugin/Interop/IDispatch.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IOleCommandTarget.cs b/GreenshotPlugin/Interop/IOleCommandTarget.cs index 6dc6deb28..8a2f7d45f 100644 --- a/GreenshotPlugin/Interop/IOleCommandTarget.cs +++ b/GreenshotPlugin/Interop/IOleCommandTarget.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IOleWindow.cs b/GreenshotPlugin/Interop/IOleWindow.cs index b34945312..ba2105f17 100644 --- a/GreenshotPlugin/Interop/IOleWindow.cs +++ b/GreenshotPlugin/Interop/IOleWindow.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IServiceProvider.cs b/GreenshotPlugin/Interop/IServiceProvider.cs index 1152fa7b8..207d02d55 100644 --- a/GreenshotPlugin/Interop/IServiceProvider.cs +++ b/GreenshotPlugin/Interop/IServiceProvider.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Interop/IUnknown.cs b/GreenshotPlugin/Interop/IUnknown.cs index 8f19c9beb..a13d15287 100644 --- a/GreenshotPlugin/Interop/IUnknown.cs +++ b/GreenshotPlugin/Interop/IUnknown.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/Properties/AssemblyInfo.cs b/GreenshotPlugin/Properties/AssemblyInfo.cs index f4e66e2f6..3fa090e3b 100644 --- a/GreenshotPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPlugin/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/DWM.cs b/GreenshotPlugin/UnmanagedHelpers/DWM.cs index 7a5c77b72..8488ea45d 100644 --- a/GreenshotPlugin/UnmanagedHelpers/DWM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/DWM.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index 9a3fbbaf4..6a3bd273f 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index 2d12a4a81..dd225e914 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs index dd446b425..b4feab39b 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs index 677e1a0f4..e72bf53ba 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs index 1d20744d2..9e0bdba0b 100644 --- a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs +++ b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index 945c3b292..8d807a4c1 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index e0e3cadcb..82037faba 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index 416a38823..a526daf65 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index 23c9085f8..f6614d1b5 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs index 2ad24e99c..be2451c21 100644 --- a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 From ea6d5ee2f2a4c5aea417c68d06dfa10a264a5da2 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Thu, 24 Mar 2016 23:09:57 +0100 Subject: [PATCH 015/170] Fixed PS1 call --- appveyor12.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor12.yml b/appveyor12.yml index a9e0d6b08..af9116897 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -42,12 +42,12 @@ environment: rsakey: secure: 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 before_build: -- ps: prebuild.ps1 +- ps: .\prebuild.ps1 build: project: greenshot\greenshot.sln verbosity: normal after_build: -- ps: build.ps1 +- ps: .\build.ps1 test: off artifacts: - path: Greenshot\releases\Greenshot*INSTALLER*.exe From 5854c771bd88e1c3e62d308481ed7fce52e7822c Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Thu, 24 Mar 2016 23:29:06 +0100 Subject: [PATCH 016/170] More SF references removed --- Greenshot/Helpers/LogHelper.cs | 38 ---- Greenshot/Languages/language-da-DK.xml | 2 +- .../Languages/language-de-x-franconia.xml | 2 +- Greenshot/Languages/language-et-EE.xml | 2 +- Greenshot/Languages/language-id-ID.xml | 2 +- Greenshot/Languages/language-lv-LV.xml | 2 +- Greenshot/Languages/language-sl-SI.xml | 2 +- .../Languages/plugin-translations-readme.txt | 10 - GreenshotTest/GreenshotTest.csproj | 50 ----- GreenshotTest/Properties/AssemblyInfo.cs | 52 ----- .../Drawing/Filters/BitmapByteBufferTest.cs | 198 ----------------- .../Properties/PropertyAggregatorTest.cs | 111 ---------- .../Drawing/Properties/SerializationTest.cs | 90 -------- GreenshotTest/Test/Helpers/ScaleHelperTest.cs | 207 ------------------ GreenshotTest/Test/SaveImageFileDialogTest.cs | 78 ------- GreenshotTest/lib/nunit.framework.dll | Bin 131072 -> 0 bytes PluginExample/AnnotateProcessor.cs | 79 ------- PluginExample/ExampleForm.cs | 29 --- PluginExample/GreyscaleProcessor.cs | 77 ------- PluginExample/PluginExample.cs | 82 ------- PluginExample/PluginExample.csproj | 55 ----- PluginExample/PluginExampleConfiguration.cs | 40 ---- PluginExample/Properties/AssemblyInfo.cs | 51 ----- PluginExample/SettingsForm.Designer.cs | 119 ---------- PluginExample/SettingsForm.cs | 49 ----- PluginExample/SimpleOutputDestination.cs | 76 ------- build.ps1 | 4 +- prebuild.ps1 | 4 +- 28 files changed, 10 insertions(+), 1501 deletions(-) delete mode 100644 Greenshot/Helpers/LogHelper.cs delete mode 100644 Greenshot/Languages/plugin-translations-readme.txt delete mode 100644 GreenshotTest/GreenshotTest.csproj delete mode 100644 GreenshotTest/Properties/AssemblyInfo.cs delete mode 100644 GreenshotTest/Test/Drawing/Filters/BitmapByteBufferTest.cs delete mode 100644 GreenshotTest/Test/Drawing/Properties/PropertyAggregatorTest.cs delete mode 100644 GreenshotTest/Test/Drawing/Properties/SerializationTest.cs delete mode 100644 GreenshotTest/Test/Helpers/ScaleHelperTest.cs delete mode 100644 GreenshotTest/Test/SaveImageFileDialogTest.cs delete mode 100644 GreenshotTest/lib/nunit.framework.dll delete mode 100644 PluginExample/AnnotateProcessor.cs delete mode 100644 PluginExample/ExampleForm.cs delete mode 100644 PluginExample/GreyscaleProcessor.cs delete mode 100644 PluginExample/PluginExample.cs delete mode 100644 PluginExample/PluginExample.csproj delete mode 100644 PluginExample/PluginExampleConfiguration.cs delete mode 100644 PluginExample/Properties/AssemblyInfo.cs delete mode 100644 PluginExample/SettingsForm.Designer.cs delete mode 100644 PluginExample/SettingsForm.cs delete mode 100644 PluginExample/SimpleOutputDestination.cs diff --git a/Greenshot/Helpers/LogHelper.cs b/Greenshot/Helpers/LogHelper.cs deleted file mode 100644 index b4edb94be..000000000 --- a/Greenshot/Helpers/LogHelper.cs +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.IO; -using System.Windows.Forms; - -namespace Greenshot.Helpers { - public class SpecialFolderPatternConverter : log4net.Util.PatternConverter { - protected override void Convert(System.IO.TextWriter writer, object state) { - // Making Greenshot portable - string pafPath = Path.Combine(Application.StartupPath, @"App\Greenshot"); - if (Directory.Exists(pafPath)) { - writer.Write(Path.Combine(Application.StartupPath, @"Data")); - return; - } - Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true); - writer.Write(Environment.GetFolderPath(specialFolder)); - } - } -} diff --git a/Greenshot/Languages/language-da-DK.xml b/Greenshot/Languages/language-da-DK.xml index ed93e40d1..7e8b6c01a 100644 --- a/Greenshot/Languages/language-da-DK.xml +++ b/Greenshot/Languages/language-da-DK.xml @@ -102,7 +102,7 @@ Detaljer om GNU General Public License: Ikoner fra Yusuke Kamiyamanes Fugue ikon-sæt (Creative Commons Attribution 3.0 license): </resource> <resource name="about_host"> - Greenshot hostes af sourceforge.net på: + Greenshot hostes af GitHub på: </resource> <resource name="about_bugs"> Rapporter venligst fejl til: diff --git a/Greenshot/Languages/language-de-x-franconia.xml b/Greenshot/Languages/language-de-x-franconia.xml index 89cf7597c..f2b69af5c 100644 --- a/Greenshot/Languages/language-de-x-franconia.xml +++ b/Greenshot/Languages/language-de-x-franconia.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Lefft was falsch, meldst di hier</resource> <resource name="about_donations">Wenn der Greenshot gfälld, kannsd uns gern a weng helfn:</resource> - <resource name="about_host">Greenshot is a bei sourceforge, und zwa dordn:</resource> + <resource name="about_host">Greenshot is a bei GitHub, und zwa dordn:</resource> <resource name="about_icons">Dei Fuztl-Bildla sin vom Yusuke Kamiyamane's Fugue icon set (Griäidif Gommens Äddribuschn 3.0 Laisns)</resource> <resource name="about_license">Kobbireid (C) 2007-2012 Domas Braun, Jens Glingen, Robin Grohm A Garandie gibds für Greenshot ned, des kannst vergessn. Greenshot is umsonsd und wennsd mogst, kannsd es a rumreichn. diff --git a/Greenshot/Languages/language-et-EE.xml b/Greenshot/Languages/language-et-EE.xml index 474124f4f..fbe51c0d4 100644 --- a/Greenshot/Languages/language-et-EE.xml +++ b/Greenshot/Languages/language-et-EE.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Palun saatke veateated</resource> <resource name="about_donations">Greenshoti kasutamismugavust ja arendust saate toetada siin:</resource> - <resource name="about_host">Greenshot asub portaalis sourceforge.net</resource> + <resource name="about_host">Greenshot asub portaalis GitHub</resource> <resource name="about_icons">Yusuke Kamiyamane on ikoonide tegija Fugue ikooni paketist (Creative Commons Attribution 3.0 litsents)</resource> <resource name="about_license">Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot ei paku GARANTIID. See on vabaravaline programm ja Te võite seda levitava vabalt teatud tingimuste alusel. diff --git a/Greenshot/Languages/language-id-ID.xml b/Greenshot/Languages/language-id-ID.xml index 2b6db4d4b..315dcba9f 100644 --- a/Greenshot/Languages/language-id-ID.xml +++ b/Greenshot/Languages/language-id-ID.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Harap laporkan kesalahan ke</resource> <resource name="about_donations">Jika anda menyukai Greenshot, anda dipersilahkan untuk mendukung kami:</resource> - <resource name="about_host">Greenshot dikelola oleh sourceforge.net di</resource> + <resource name="about_host">Greenshot dikelola oleh GitHub di</resource> <resource name="about_icons">Ikon dari Yusuke Kamiyamane Fugue ikon set (lisensi Creative Commons Attribution 3.0)</resource> <resource name="about_license">Hak Cipta milik Thomas Braun, Jens Klingen, Robin Krom 2007-2015 Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. diff --git a/Greenshot/Languages/language-lv-LV.xml b/Greenshot/Languages/language-lv-LV.xml index 3530c1af1..bcf3eb9e0 100644 --- a/Greenshot/Languages/language-lv-LV.xml +++ b/Greenshot/Languages/language-lv-LV.xml @@ -4,7 +4,7 @@ <resources> <resource name="about_bugs">Kļūdu ziņojumus sūtiet uz</resource> <resource name="about_donations">Ja Tev patīk „Greenshot”, Tu vari mūs atbalstīt:</resource> - <resource name="about_host">„Greenshot” atrodams sourceforge.net adresē</resource> + <resource name="about_host">„Greenshot” atrodams GitHub adresē</resource> <resource name="about_icons">Ikonas veidojis Yusuke Kamiyamane's Fugue (Radošās kopienas Atsaucoties 3.0 licence)</resource> <resource name="about_license">Autortiesības (C): 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Ņemot vērā, ka „Greenshot” tiek licencēta bez maksas, šai programmai NAV NEKĀDU GARANTIJU. Tu vari to izplatīt un lietot ievērojot GNU Vispārīgo Publisko licenci:</resource> diff --git a/Greenshot/Languages/language-sl-SI.xml b/Greenshot/Languages/language-sl-SI.xml index 18299a348..3ea4f2025 100644 --- a/Greenshot/Languages/language-sl-SI.xml +++ b/Greenshot/Languages/language-sl-SI.xml @@ -3,7 +3,7 @@ <resources> <resource name="about_bugs">Napake prosimo javite na</resource> <resource name="about_donations">Če vam je Greenshot všeč nas prosim podprite:</resource> - <resource name="about_host">Greenshot gostuje pri sourceforge.net</resource> + <resource name="about_host">Greenshot gostuje pri GitHub</resource> <resource name="about_icons">Ikone: Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license)</resource> <resource name="about_license">Avtorske pravice (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom Greenshot absolutno ne ponuja NOBENE GARANCIJE. Program je brezplačen in ga lahko distribuirate pod določenimi pogoji. diff --git a/Greenshot/Languages/plugin-translations-readme.txt b/Greenshot/Languages/plugin-translations-readme.txt deleted file mode 100644 index 1864a9965..000000000 --- a/Greenshot/Languages/plugin-translations-readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -Looking for language files for translatabe plugins? -Please refer to these: - - * http://greenshot.svn.sourceforge.net/svnroot/greenshot/trunk/GreenshotConfluencePlugin/Languages/ - * http://greenshot.svn.sourceforge.net/viewvc/greenshot/trunk/GreenshotImgurPlugin/Languages/ - * http://greenshot.svn.sourceforge.net/viewvc/greenshot/trunk/GreenshotJiraPlugin/Languages/ - * http://greenshot.svn.sourceforge.net/viewvc/greenshot/trunk/Greenshot-OCR-Plugin/Languages/ - - Thanks a lot :) - diff --git a/GreenshotTest/GreenshotTest.csproj b/GreenshotTest/GreenshotTest.csproj deleted file mode 100644 index 8fb9d35d5..000000000 --- a/GreenshotTest/GreenshotTest.csproj +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="..\CommonProject.properties" /> - <PropertyGroup> - <ProjectGuid>{EFD01BC7-15E5-48AD-BE68-D7B62FEEED2D}</ProjectGuid> - <OutputType>Library</OutputType> - <RootNamespace>GreenshotTest</RootNamespace> - <AssemblyName>GreenshotTest</AssemblyName> - <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> - <AppDesignerFolder>Properties</AppDesignerFolder> - <AllowUnsafeBlocks>False</AllowUnsafeBlocks> - <NoStdLib>False</NoStdLib> - <WarningLevel>4</WarningLevel> - <TreatWarningsAsErrors>false</TreatWarningsAsErrors> - <TargetFrameworkProfile /> - </PropertyGroup> - <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> - <ItemGroup> - <Reference Include="nunit.framework"> - <HintPath>lib\nunit.framework.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.Windows.Forms" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="Test\Drawing\Filters\BitmapByteBufferTest.cs" /> - <Compile Include="Test\Drawing\Properties\PropertyAggregatorTest.cs" /> - <Compile Include="Test\Helpers\ScaleHelperTest.cs" /> - <Compile Include="Test\SaveImageFileDialogTest.cs" /> - <None Include="lib\nunit.framework.dll" /> - </ItemGroup> - <ItemGroup> - <Folder Include="lib" /> - <Folder Include="Test" /> - <Folder Include="Test\Drawing" /> - <Folder Include="Test\Drawing\Filters" /> - <Folder Include="Test\Drawing\Properties" /> - <Folder Include="Test\Helpers" /> - <ProjectReference Include="..\GreenshotPlugin\GreenshotPlugin.csproj"> - <Project>{5B924697-4DCD-4F98-85F1-105CB84B7341}</Project> - <Name>GreenshotPlugin</Name> - </ProjectReference> - <ProjectReference Include="..\Greenshot\Greenshot.csproj"> - <Project>{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}</Project> - <Name>Greenshot</Name> - </ProjectReference> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/GreenshotTest/Properties/AssemblyInfo.cs b/GreenshotTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 0eb8a7c24..000000000 --- a/GreenshotTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -#region Using directives - -using System; -using System.Reflection; -using System.Runtime.InteropServices; - -#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("GreenshotTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GreenshotTest")] -[assembly: AssemblyCopyright("Copyright 2007-2012")] -[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 the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("1.2.0.7")] -[assembly: AssemblyInformationalVersion("1.2.0.7-gdb8b2cb")] diff --git a/GreenshotTest/Test/Drawing/Filters/BitmapByteBufferTest.cs b/GreenshotTest/Test/Drawing/Filters/BitmapByteBufferTest.cs deleted file mode 100644 index 8a47371ff..000000000 --- a/GreenshotTest/Test/Drawing/Filters/BitmapByteBufferTest.cs +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using NUnit.Framework; -using System; -using System.Drawing; -using System.Drawing.Imaging; -using Greenshot.Drawing; -using Greenshot.Drawing.Filters; -using GreenshotPlugin.Core; - -namespace Greenshot.Test.Drawing.Filters { - /// <summary> - /// Description of BitmapBufferTest. - /// </summary> - [TestFixture] - public class BitmapBufferTest - { - private Bitmap bmp; - private BitmapBuffer buf; - private Bitmap bmpRect; - private BitmapBuffer bufRect; - - - - [SetUp] - public void Init() - { - bmp = new Bitmap(6,6); - for(int i=0; i<6; i++) { - int col = 255-i*51; - bmp.SetPixel(0,i, Color.FromArgb(col,0,0)); - bmp.SetPixel(1,i, Color.FromArgb(col,col,0)); - bmp.SetPixel(2,i, Color.FromArgb(0,col,0)); - bmp.SetPixel(3,i, Color.FromArgb(0,col,col)); - bmp.SetPixel(4,i, Color.FromArgb(0,0,col)); - bmp.SetPixel(5,i, Color.FromArgb(col,0,col)); - } - buf = new BitmapBuffer(bmp); - - bmpRect = new Bitmap(6,6); - for(int i=0; i<6; i++) { - int col = 255-i*51; - bmpRect.SetPixel(0,i, Color.FromArgb(col,0,0)); - bmpRect.SetPixel(1,i, Color.FromArgb(col,col,0)); - bmpRect.SetPixel(2,i, Color.FromArgb(0,col,0)); - bmpRect.SetPixel(3,i, Color.FromArgb(0,col,col)); - bmpRect.SetPixel(4,i, Color.FromArgb(0,0,col)); - bmpRect.SetPixel(5,i, Color.FromArgb(col,0,col)); - } - bufRect = new BitmapBuffer(bmpRect,new Rectangle(2,2,2,2)); - } - - - - [TearDown] - public void Dispose() - { - buf.Dispose(); - buf = null; - bmp.Dispose(); - bmp = null; - } - - [Test] - public void TestGetSetColor() - { -// Assert.AreEqual(255, buf.R); -// Assert.AreEqual(0, buf.G); -// Assert.AreEqual(0, buf.B); -// Assert.AreEqual(Color.FromArgb(255,0,0), buf.Color); -// -// buf.B = 255; -// Assert.AreEqual(255, buf.R); -// Assert.AreEqual(0, buf.G); -// Assert.AreEqual(255, buf.B); -// Assert.AreEqual(Color.FromArgb(255,0,255), buf.Color); -// -// buf.Color = Color.Red; -// Assert.AreEqual(255, buf.R); -// Assert.AreEqual(0, buf.G); -// Assert.AreEqual(0, buf.B); -// Assert.AreEqual(Color.FromArgb(255,0,0), buf.Color); - } - - [Test] - public void TestGetSetColorRect() - { -// Assert.AreEqual(0, bufRect.R); -// Assert.AreEqual(153, bufRect.G); -// Assert.AreEqual(0, bufRect.B); -// Assert.AreEqual(Color.FromArgb(0,153,0), bufRect.Color); -// -// bufRect.B = 255; -// Assert.AreEqual(0, bufRect.R); -// Assert.AreEqual(153, bufRect.G); -// Assert.AreEqual(255, bufRect.B); -// Assert.AreEqual(Color.FromArgb(0,153,255), bufRect.Color); -// -// bufRect.Color = Color.FromArgb(0,153,0); -// Assert.AreEqual(0, bufRect.R); -// Assert.AreEqual(153, bufRect.G); -// Assert.AreEqual(0, bufRect.B); -// Assert.AreEqual(Color.FromArgb(0,153,0), bufRect.Color); - } - - [Test] - public void TestModifyBitmap() - { -// //buf.MoveTo(0,0); -// buf.Color = Color.FromArgb(255,255,255); -// buf.Dispose(); -// buf = new BitmapBuffer(bmp); -// Assert.AreEqual(Color.FromArgb(255,255,255), buf.Color); -// buf.Color = Color.FromArgb(255,0,0); - } - - [Test] - public void TestTraverse() - { - /*buf.MoveTo(0,0); - buf.Traverse(1,0); - Assert.AreEqual(Color.FromArgb(255,255,0), buf.Color); - buf.Traverse(0,1); - Assert.AreEqual(Color.FromArgb(204,204,0), buf.Color); - buf.Traverse(2,2); - Assert.AreEqual(Color.FromArgb(0,102,102), buf.Color); - buf.MoveTo(4,4); - Assert.AreEqual(Color.FromArgb(0,0,51), buf.Color); - buf.MoveTo(2,2); - Assert.AreEqual(Color.FromArgb(0,153,0), buf.Color); - buf.MoveTo(0,0); - Assert.AreEqual(Color.FromArgb(255,0,0), buf.Color);*/ - } - - [Test] - public void TestColorAt(){ - Assert.AreEqual(Color.FromArgb(255,0,0),buf.GetColorAt(0,0)); - Assert.AreEqual(Color.FromArgb(255,255,0),buf.GetColorAt(1,0)); - Assert.AreEqual(Color.FromArgb(204,204,0),buf.GetColorAt(1,1)); - Assert.AreEqual(Color.FromArgb(0,153,0),buf.GetColorAt(2,2)); - Assert.AreEqual(Color.FromArgb(204,204,0),buf.GetColorAt(1,1)); - Assert.AreEqual(Color.FromArgb(0,0,51),buf.GetColorAt(4,4)); - } - - [Test] - public void TestIterate() - { -// buf.IteratePixel += delegate { -// if(buf.Location.X == 0 && buf.Location.Y == 0) -// { -// Assert.AreEqual(Color.FromArgb(255,0,0), buf.Color); -// } -// else if(buf.Location.X == 3 && buf.Location.Y == 3) -// { -// Assert.AreEqual(Color.FromArgb(0,102,102), buf.Color); -// } -// }; -// buf.Iterate(); - } - - [Test] - public void TestIterateRect() - { -// bufRect.IteratePixel += delegate { -// if(bufRect.Location.X == 0 && bufRect.Location.Y == 0) -// { -// Assert.AreEqual(Color.FromArgb(0,153,0), bufRect.Color); -// } -// else if(bufRect.Location.X == 1 && bufRect.Location.Y == 0) -// { -// Assert.AreEqual(Color.FromArgb(0,153,153), bufRect.Color); -// } -// }; -// bufRect.Iterate(); - } - - - - } -} diff --git a/GreenshotTest/Test/Drawing/Properties/PropertyAggregatorTest.cs b/GreenshotTest/Test/Drawing/Properties/PropertyAggregatorTest.cs deleted file mode 100644 index 0ecffd060..000000000 --- a/GreenshotTest/Test/Drawing/Properties/PropertyAggregatorTest.cs +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using NUnit.Framework; -using System; -using System.Drawing; -using System.Windows.Forms; -using Greenshot.Drawing; - - -using Greenshot.Drawing.Fields; - - -namespace Greenshot.Test.Drawing.Properties -{ - /// <summary> - /// Description of PropertyAggregatorTest. - /// </summary> - [TestFixture] - public class PropertyAggregatorTest - { - - - [SetUp] - public void Init() - { - - } - - - - [TearDown] - public void Dispose() - { - } - - - [Test] - public void Test() - { - - FieldType t = FieldType.LINE_THICKNESS; - - Surface s = new Surface(); - FieldAggregator ep = new FieldAggregator(); - //ep.SetFieldValue(t,598); - - RectangleContainer rc = new RectangleContainer(s); - rc.SetFieldValue(t,597); - //Assert.AreNotEqual(ep.GetField(t), rc.GetField(t)); - ep.BindElement(rc); - Assert.AreEqual(597, ep.GetField(t).Value); - Assert.AreEqual(597, rc.GetField(t).Value); - - RectangleContainer rc2 = new RectangleContainer(s); - Assert.AreEqual(597, ep.GetField(t).Value); - rc2.SetFieldValue(t,595); - Assert.AreEqual(595, rc2.GetField(t).Value); - ep.BindElement(rc2); - Assert.AreEqual(595, ep.GetField(t).Value); - Assert.AreEqual(597, rc.GetField(t).Value); - - RectangleContainer rc3 = new RectangleContainer(s); - rc3.SetFieldValue(t,600); - ep.BindElement(rc3); - - //Assert.AreEqual(600, ep.GetField(t).Value); - Assert.AreEqual(600, rc3.GetField(t).Value); - Assert.AreEqual(597, rc.GetField(t).Value); - - ep.SetFieldValue(t, 599); - Assert.AreEqual(599, ep.GetField(t).Value); - Assert.AreEqual(599, rc.GetField(t).Value); - Assert.AreEqual(599, rc2.GetField(t).Value); - Assert.AreEqual(599, rc3.GetField(t).Value); - - - - - - } - - public class TestIrrelevantPropertyHolder : RectangleContainer - { - public TestIrrelevantPropertyHolder() : base(new Surface()) - { - } - public int Leet = 1337; - } - - - - } -} diff --git a/GreenshotTest/Test/Drawing/Properties/SerializationTest.cs b/GreenshotTest/Test/Drawing/Properties/SerializationTest.cs deleted file mode 100644 index 38b60037f..000000000 --- a/GreenshotTest/Test/Drawing/Properties/SerializationTest.cs +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using NUnit.Framework; -using System; -using Greenshot.Drawing; -using Greenshot.Drawing.Fields; -using Greenshot.Drawing.Filters; -using Greenshot.Helpers; - -namespace Greenshot.Test.Drawing.Properties -{ - /// <summary> - /// Description of SerializationTest. - /// </summary> - [TestFixture] - public class SerializationTest - { - - public SerializationTest() - { - } - - [Test] - public void TestSerializeField() { - Field f = new Field(FieldType.ARROWHEADS, GetType()); - f.myValue = ArrowContainer.ArrowHeadCombination.BOTH; - - Field clone = (Field) Objects.DeepClone(f); - Assert.AreEqual(f, clone); - Assert.AreEqual(f.Value, clone.Value); - Assert.AreEqual(f.Scope, clone.Scope); - - f.Scope = this.GetType().ToString(); - - clone = (Field) Objects.DeepClone(f); - Assert.AreEqual(f, clone); - Assert.AreEqual(f.Value, clone.Value); - Assert.AreEqual(f.Scope, clone.Scope); - } - - [Test] - public void TestSerializeFieldHolder() { - AbstractFieldHolder afh = new TestFieldHolder(); - AbstractFieldHolder clone = (AbstractFieldHolder)Objects.DeepClone(afh); - Assert.AreEqual(afh.GetFields(), clone.GetFields()); - } - - [Test] - public void TestSerializeFieldHolderWithChildren() { - AbstractFieldHolderWithChildren afh = new TestFieldHolderWithChildren(); - AbstractFieldHolderWithChildren clone = (AbstractFieldHolderWithChildren)Objects.DeepClone(afh); - Assert.AreEqual(afh.GetFields(), clone.GetFields()); - } - - [Test] - public void TestSerializeFilterContainer() { - ObfuscateContainer oc = new ObfuscateContainer(new Surface()); - - ObfuscateContainer clone = (ObfuscateContainer)Objects.DeepClone(oc); - Assert.AreEqual(oc.Children.GetType(), clone.Children.GetType()); - System.Collections.Generic.List<Field> ocFields = oc.GetFields(); - System.Collections.Generic.List<Field> cloneFields = clone.GetFields(); - Assert.AreEqual(ocFields, cloneFields); - } - - [Serializable] - private class TestFieldHolder : AbstractFieldHolder {} - [Serializable] - private class TestFieldHolderWithChildren : AbstractFieldHolderWithChildren {} - } - -} diff --git a/GreenshotTest/Test/Helpers/ScaleHelperTest.cs b/GreenshotTest/Test/Helpers/ScaleHelperTest.cs deleted file mode 100644 index 5acb09544..000000000 --- a/GreenshotTest/Test/Helpers/ScaleHelperTest.cs +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Drawing; -using System.Windows.Forms; -using Greenshot.Configuration; -using Greenshot.Drawing; -using Greenshot.Forms; -using Greenshot.Helpers; -using GreenshotPlugin.Core; -using Greenshot.IniFile; -using NUnit.Framework; - -namespace Greenshot.Test -{ - [TestFixture] - public class ScaleHelperTest { - - [Test] - public void FreeScaleTest() { - RectangleF r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(10,20)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(10, r.Width); - Assert.AreEqual(20, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(30,40)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(30, r.Width); - Assert.AreEqual(40, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_CENTER, new PointF(9999,40)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(10, r.Width); - Assert.AreEqual(40, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_BOTTOM_LEFT, new PointF(3,40)); - Assert.AreEqual(3, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(7, r.Width); - Assert.AreEqual(40, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(48,9999)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(48, r.Width); - Assert.AreEqual(20, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(8,9999)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(8, r.Width); - Assert.AreEqual(20, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_TOP_RIGHT, new PointF(17,-37)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(-37, r.Top); - Assert.AreEqual(17, r.Width); - Assert.AreEqual(57, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_TOP_CENTER, new PointF(9998,-77)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(-77, r.Top); - Assert.AreEqual(10, r.Width); - Assert.AreEqual(97, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.Scale(ref r, Gripper.POSITION_TOP_LEFT, new PointF(-23,-54)); - Assert.AreEqual(-23, r.Left); - Assert.AreEqual(-54, r.Top); - Assert.AreEqual(33, r.Width); - Assert.AreEqual(74, r.Height); - } - - [Test] - public void RationalScaleTest() { - RectangleF r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(10,20)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(10, r.Width); - Assert.AreEqual(20, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(30,60)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(30, r.Width); - Assert.AreEqual(60, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_RIGHT, new PointF(30,96768)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(30, r.Width); - Assert.AreEqual(60, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_CENTER, new PointF(9999,40)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(10, r.Width); - Assert.AreEqual(40, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_BOTTOM_LEFT, new PointF(-90, 9234)); - Assert.AreEqual(-90, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(100, r.Width); - Assert.AreEqual(200, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(48,9999)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(48, r.Width); - Assert.AreEqual(20, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_MIDDLE_RIGHT, new PointF(8,9999)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(8, r.Width); - Assert.AreEqual(20, r.Height); - - r = new RectangleF(0,20,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_TOP_RIGHT, new PointF(20,829634235)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(20, r.Width); - Assert.AreEqual(40, r.Height); - - r = new RectangleF(0,0,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_TOP_CENTER, new PointF(9998,-77)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(-77, r.Top); - Assert.AreEqual(10, r.Width); - Assert.AreEqual(97, r.Height); - - r = new RectangleF(10,20,10,20); - ScaleHelper.RationalScale(ref r, Gripper.POSITION_TOP_LEFT, new PointF(0,0)); - Assert.AreEqual(0, r.Left); - Assert.AreEqual(0, r.Top); - Assert.AreEqual(20, r.Width); - Assert.AreEqual(40, r.Height); - } - - /*[Test] - public void GetFileNameWithExtensionTest() { - SaveImageFileDialog sifd = new SaveImageFileDialog(); - - sifd.InitialDirectory = @"C:\some\path"; - sifd.FileName = "myimage.jpg"; - sifd.Extension = "jpg"; - Assert.AreEqual("myimage.jpg",sifd.FileNameWithExtension); - - sifd.Extension = "gif"; - Assert.AreEqual("myimage.jpg.gif",sifd.FileNameWithExtension); - - sifd.FileName = "myimage"; - Assert.AreEqual("myimage.gif",sifd.FileNameWithExtension); - - } - - [Test] - public void SuggestBasicFileNameTest() { - //conf.Output_FileAs_Fullpath = @"c:\path\to\greenshot_testdir\gstest_28.jpg"; - conf.OutputFilePath = @"c:\path\to\greenshot_testdir\"; - conf.OutputFileFilenamePattern = "gstest_${NUM}"; - conf.OutputFileFormat = OutputFormat.png; - conf.OutputFileIncrementingNumber = 28; - SaveImageFileDialog sifd = new SaveImageFileDialog(); - - Assert.AreEqual(sifd.InitialDirectory, @"c:\path\to\greenshot_testdir"); - Assert.AreEqual(sifd.FileNameWithExtension, "gstest_000028.jpg"); - - }*/ - } -} diff --git a/GreenshotTest/Test/SaveImageFileDialogTest.cs b/GreenshotTest/Test/SaveImageFileDialogTest.cs deleted file mode 100644 index 6abfff2bd..000000000 --- a/GreenshotTest/Test/SaveImageFileDialogTest.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Windows.Forms; -using Greenshot.Configuration; -using Greenshot.Forms; -using GreenshotPlugin.Core; -using Greenshot.IniFile; -using NUnit.Framework; - -namespace Greenshot.Test -{ - [TestFixture] - public class SaveImageFileDialogTest { - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - [Test] - public void GetSetExtensionTest() { - SaveImageFileDialog sifd = new SaveImageFileDialog(); - sifd.Extension = "jpg"; - Assert.AreEqual(sifd.Extension, "jpg"); - sifd.Extension = "gif"; - Assert.AreEqual(sifd.Extension, "gif"); - sifd.Extension = "png"; - Assert.AreEqual(sifd.Extension, "png"); - sifd.Extension = "bmp"; - Assert.AreEqual(sifd.Extension, "bmp"); - } - - [Test] - public void GetFileNameWithExtensionTest() { - SaveImageFileDialog sifd = new SaveImageFileDialog(); - - sifd.InitialDirectory = @"C:\some\path"; - sifd.FileName = "myimage.jpg"; - sifd.Extension = "jpg"; - Assert.AreEqual("myimage.jpg",sifd.FileNameWithExtension); - - sifd.Extension = "gif"; - Assert.AreEqual("myimage.jpg.gif",sifd.FileNameWithExtension); - - sifd.FileName = "myimage"; - Assert.AreEqual("myimage.gif",sifd.FileNameWithExtension); - - } - - [Test] - public void SuggestBasicFileNameTest() { - //conf.Output_FileAs_Fullpath = @"c:\path\to\greenshot_testdir\gstest_28.jpg"; - conf.OutputFilePath = @"c:\path\to\greenshot_testdir\"; - conf.OutputFileFilenamePattern = "gstest_${NUM}"; - conf.OutputFileFormat = OutputFormat.png; - conf.OutputFileIncrementingNumber = 28; - SaveImageFileDialog sifd = new SaveImageFileDialog(); - - Assert.AreEqual(sifd.InitialDirectory, @"c:\path\to\greenshot_testdir"); - Assert.AreEqual(sifd.FileNameWithExtension, "gstest_000028.jpg"); - - } - } -} diff --git a/GreenshotTest/lib/nunit.framework.dll b/GreenshotTest/lib/nunit.framework.dll deleted file mode 100644 index 88f3fa3b51eb43a42a63d0a08c7dde480b28adea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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 diff --git a/PluginExample/AnnotateProcessor.cs b/PluginExample/AnnotateProcessor.cs deleted file mode 100644 index faa3fa2d2..000000000 --- a/PluginExample/AnnotateProcessor.cs +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Drawing; -using System.Windows.Forms; - -using Greenshot.Plugin; -using GreenshotPlugin.Core; -using Greenshot.IniFile; - -namespace PluginExample { - /// <summary> - /// This processor shows how the current surface could be modified before it's passed to the editor or another destination - /// </summary> - public class AnnotateProcessor : AbstractProcessor { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(AnnotateProcessor)); - private static PluginExampleConfiguration conf = IniConfig.GetIniSection<PluginExampleConfiguration>(); - - private IGreenshotHost host; - - public AnnotateProcessor(IGreenshotHost host) { - this.host = host; - } - - public override string Designation { - get { - return "Annotate"; - } - } - - public override string Description { - get { - return Designation; - } - } - - public override bool isActive { - get { - return conf.AnnotationProcessor; - } - } - - public override bool ProcessCapture(ISurface surface, ICaptureDetails captureDetails) { - surface.SelectElement(surface.AddCursorContainer(Cursors.Hand, 100, 100)); - // Do something with the screenshot - string title = captureDetails.Title; - if (title != null) { - LOG.Debug("Added title to surface: " + title); - surface.SelectElement(surface.AddTextContainer(title, HorizontalAlignment.Center, VerticalAlignment.CENTER, - FontFamily.GenericSansSerif, 12f, false, false, false, 2, Color.Red, Color.White)); - } - surface.SelectElement(surface.AddTextContainer(Environment.UserName, HorizontalAlignment.Right, VerticalAlignment.TOP, - FontFamily.GenericSansSerif, 12f, false, false, false, 2, Color.Red, Color.White)); - surface.SelectElement(surface.AddTextContainer(Environment.MachineName, HorizontalAlignment.Right, VerticalAlignment.BOTTOM, - FontFamily.GenericSansSerif, 12f, false, false, false, 2, Color.Red, Color.White)); - surface.SelectElement(surface.AddTextContainer(captureDetails.DateTime.ToLongDateString(), HorizontalAlignment.Left, VerticalAlignment.BOTTOM, - FontFamily.GenericSansSerif, 12f, false, false, false, 2, Color.Red, Color.White)); - return true; - } - } -} diff --git a/PluginExample/ExampleForm.cs b/PluginExample/ExampleForm.cs deleted file mode 100644 index 144f36a4b..000000000 --- a/PluginExample/ExampleForm.cs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Collections.Generic; -using System.Text; -using GreenshotPlugin.Controls; - -namespace PluginExample { - public class ExampleForm : GreenshotForm{ - } -} diff --git a/PluginExample/GreyscaleProcessor.cs b/PluginExample/GreyscaleProcessor.cs deleted file mode 100644 index 36f4215ff..000000000 --- a/PluginExample/GreyscaleProcessor.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Drawing; -using System.Windows.Forms; - -using Greenshot.Plugin; -using GreenshotPlugin.Core; -using Greenshot.IniFile; - -namespace PluginExample { - /// <summary> - /// This processor shows how the current surface could be modified before it's passed to the editor or another destination - /// </summary> - public class GreyscaleProcessor : AbstractProcessor { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(GreyscaleProcessor)); - private static PluginExampleConfiguration conf = IniConfig.GetIniSection<PluginExampleConfiguration>(); - private IGreenshotHost host; - - public GreyscaleProcessor(IGreenshotHost host) { - this.host = host; - } - - public override string Designation { - get { - return "Greyscale"; - } - } - - public override string Description { - get { - return Designation; - } - } - - public override bool isActive { - get { - return conf.GreyscaleProcessor; - } - } - - public override bool ProcessCapture(ISurface surface, ICaptureDetails captureDetails) { - LOG.DebugFormat("Changing surface to grayscale!"); - using (BitmapBuffer bbb = new BitmapBuffer(surface.Image as Bitmap, false)) { - bbb.Lock(); - for(int y=0;y<bbb.Height; y++) { - for(int x=0;x<bbb.Width; x++) { - 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); - } - } - } - - return true; - } - } -} diff --git a/PluginExample/PluginExample.cs b/PluginExample/PluginExample.cs deleted file mode 100644 index 2452ebedd..000000000 --- a/PluginExample/PluginExample.cs +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; -using System.Windows.Forms; - -using Greenshot.Plugin; -using GreenshotPlugin.Core; -using Greenshot.IniFile; - -namespace PluginExample { - /// <summary> - /// An example Plugin so developers can see how they can develop their own plugin - /// </summary> - public class PluginExample : IGreenshotPlugin { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PluginExample)); - private IGreenshotHost host; - private PluginAttribute myAttributes; - - public PluginExample() { - } - - public IEnumerable<IDestination> Destinations() { - yield return new SimpleOutputDestination(host); - } - - public IEnumerable<IProcessor> Processors() { - yield return new AnnotateProcessor(host); - yield return new GreyscaleProcessor(host); - } - - /// <summary> - /// Implementation of the IGreenshotPlugin.Initialize - /// </summary> - /// <param name="pluginHost">Use the IGreenshotPluginHost interface to register events</param> - /// <param name="captureHost">Use the ICaptureHost interface to register in the MainContextMenu</param> - /// <param name="pluginAttribute">My own attributes</param> - /// <returns>true if plugin is initialized, false if not (doesn't show)</returns> - public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - LOG.Debug("Initialize called of " + myAttributes.Name); - - this.host = pluginHost; - this.myAttributes = myAttributes; - return true; - } - - public virtual void Shutdown() { - LOG.Debug("Shutdown of " + myAttributes.Name); - } - - /// <summary> - /// Implementation of the IPlugin.Configure - /// </summary> - public virtual void Configure() { - LOG.Debug("Configure called"); - SettingsForm settingsForm = new SettingsForm(); - settingsForm.ShowDialog(); - } - } -} \ No newline at end of file diff --git a/PluginExample/PluginExample.csproj b/PluginExample/PluginExample.csproj deleted file mode 100644 index 48ae00b29..000000000 --- a/PluginExample/PluginExample.csproj +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="..\CommonProject.properties" /> - <PropertyGroup> - <ProjectGuid>{6BD38118-B27F-43A1-951C-FB6464D39260}</ProjectGuid> - <OutputType>Library</OutputType> - <RootNamespace>PluginExample</RootNamespace> - <AssemblyName>PluginExample</AssemblyName> - <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent> - <AllowUnsafeBlocks>True</AllowUnsafeBlocks> - <NoStdLib>False</NoStdLib> - <WarningLevel>4</WarningLevel> - <TreatWarningsAsErrors>false</TreatWarningsAsErrors> - <TargetFrameworkProfile /> - </PropertyGroup> - <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> - <ItemGroup> - <Reference Include="log4net"> - <HintPath>..\Greenshot\Lib\log4net.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.Windows.Forms" /> - </ItemGroup> - <ItemGroup> - <Compile Include="ExampleForm.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="GreyscaleProcessor.cs" /> - <Compile Include="PluginExampleConfiguration.cs" /> - <Compile Include="SimpleOutputDestination.cs" /> - <Compile Include="AnnotateProcessor.cs" /> - <Compile Include="PluginExample.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="SettingsForm.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="SettingsForm.Designer.cs"> - <DependentUpon>SettingsForm.cs</DependentUpon> - </Compile> - <None Include="Properties\AssemblyInfo.cs.template" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\GreenshotPlugin\GreenshotPlugin.csproj"> - <Project>{5B924697-4DCD-4F98-85F1-105CB84B7341}</Project> - <Name>GreenshotPlugin</Name> - </ProjectReference> - </ItemGroup> - <PropertyGroup> - <PostBuildEvent>mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp"</PostBuildEvent> - </PropertyGroup> -</Project> \ No newline at end of file diff --git a/PluginExample/PluginExampleConfiguration.cs b/PluginExample/PluginExampleConfiguration.cs deleted file mode 100644 index 9050827d5..000000000 --- a/PluginExample/PluginExampleConfiguration.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Collections.Generic; -using System.IO; - -using GreenshotPlugin.Core; -using Greenshot.IniFile; - -namespace PluginExample { - /// <summary> - /// Description of PluginExampleConfiguration. - /// </summary> - [IniSection("PluginExample", Description="Plugin Example configuration")] - public class PluginExampleConfiguration : IniSection { - [IniProperty("GreyScaleProcessor", Description="Enable or disable the greyscale processor.", DefaultValue="False")] - public bool GreyscaleProcessor; - - [IniProperty("AnnotationProcessor", Description="Enable or disable the annotation processor.", DefaultValue="False")] - public bool AnnotationProcessor; - } -} diff --git a/PluginExample/Properties/AssemblyInfo.cs b/PluginExample/Properties/AssemblyInfo.cs deleted file mode 100644 index ab8835f04..000000000 --- a/PluginExample/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -#region Using directives - -using System; -using System.Reflection; -using System.Runtime.InteropServices; -#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("PluginExample")] -[assembly: AssemblyDescription("An example plugin")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Greenshot")] -[assembly: AssemblyProduct("Example Plugin")] -[assembly: AssemblyCopyright("Copyright 2007-2012")] -[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 the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("1.2.0.7")] -[assembly: AssemblyInformationalVersion("1.2.0.7-gdb8b2cb")] diff --git a/PluginExample/SettingsForm.Designer.cs b/PluginExample/SettingsForm.Designer.cs deleted file mode 100644 index c272dd6db..000000000 --- a/PluginExample/SettingsForm.Designer.cs +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -namespace PluginExample -{ - partial class SettingsForm - { - /// <summary> - /// Designer variable used to keep track of non-visual components. - /// </summary> - private System.ComponentModel.IContainer components = null; - - /// <summary> - /// Disposes resources used by the form. - /// </summary> - /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// <summary> - /// 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. - /// </summary> - private void InitializeComponent() - { - this.checkBox1 = new GreenshotPlugin.Controls.GreenshotCheckBox(); - this.button1 = new System.Windows.Forms.Button(); - this.button2 = new System.Windows.Forms.Button(); - this.checkBox2 = new GreenshotPlugin.Controls.GreenshotCheckBox(); - this.SuspendLayout(); - // - // checkBox1 - // - this.checkBox1.Location = new System.Drawing.Point(12, 12); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.PropertyName = "AnnotationProcessor"; - this.checkBox1.SectionName = "PluginExample"; - this.checkBox1.Size = new System.Drawing.Size(152, 24); - this.checkBox1.TabIndex = 0; - this.checkBox1.Text = "Annotation processor"; - this.checkBox1.UseVisualStyleBackColor = true; - // - // button1 - // - this.button1.Location = new System.Drawing.Point(12, 72); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 1; - this.button1.Text = "Ok"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.Button1Click); - // - // button2 - // - this.button2.Location = new System.Drawing.Point(100, 72); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); - this.button2.TabIndex = 2; - this.button2.Text = "Cancel"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.Button2Click); - // - // checkBox2 - // - this.checkBox2.Location = new System.Drawing.Point(12, 42); - this.checkBox2.Name = "checkBox2"; - this.checkBox2.PropertyName = "GreyScaleProcessor"; - this.checkBox2.SectionName = "PluginExample"; - this.checkBox2.Size = new System.Drawing.Size(152, 24); - this.checkBox2.TabIndex = 3; - this.checkBox2.Text = "Greyscale processor"; - this.checkBox2.UseVisualStyleBackColor = true; - // - // SettingsForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(200, 106); - this.Controls.Add(this.checkBox2); - this.Controls.Add(this.button2); - this.Controls.Add(this.button1); - this.Controls.Add(this.checkBox1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.Name = "SettingsForm"; - this.Text = "Plugin example settings"; - this.ResumeLayout(false); - - } - private GreenshotPlugin.Controls.GreenshotCheckBox checkBox2; - private System.Windows.Forms.Button button2; - private System.Windows.Forms.Button button1; - private GreenshotPlugin.Controls.GreenshotCheckBox checkBox1; - } -} diff --git a/PluginExample/SettingsForm.cs b/PluginExample/SettingsForm.cs deleted file mode 100644 index 6bdcb2a73..000000000 --- a/PluginExample/SettingsForm.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Drawing; -using System.Windows.Forms; - -using Greenshot.IniFile; - -namespace PluginExample { - /// <summary> - /// Description of SettingsForm. - /// </summary> - public partial class SettingsForm : ExampleForm { - private static PluginExampleConfiguration conf = IniConfig.GetIniSection<PluginExampleConfiguration>(); - - public SettingsForm() { - // - // The InitializeComponent() call is required for Windows Forms designer support. - // - InitializeComponent(); - } - - void Button1Click(object sender, EventArgs e) { - DialogResult = DialogResult.OK; - } - - void Button2Click(object sender, EventArgs e) { - DialogResult = DialogResult.Cancel; - } - } -} diff --git a/PluginExample/SimpleOutputDestination.cs b/PluginExample/SimpleOutputDestination.cs deleted file mode 100644 index 02973fc51..000000000 --- a/PluginExample/SimpleOutputDestination.cs +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2014 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 <http://www.gnu.org/licenses/>. - */ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using System.Text.RegularExpressions; - -using Greenshot.Plugin; -using GreenshotPlugin.Controls; -using GreenshotPlugin.Core; -using Greenshot.IniFile; - -namespace PluginExample { - /// <summary> - /// This destination shows a simple save to... - /// </summary> - public class SimpleOutputDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SimpleOutputDestination)); - private IGreenshotHost host; - - public SimpleOutputDestination(IGreenshotHost host) { - this.host = host; - } - - public override string Designation { - get { - return "SimpleOutput"; - } - } - - public override string Description { - get { - return Designation; - } - } - - public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); - CoreConfiguration config = IniConfig.GetIniSection<CoreConfiguration>(); - OutputSettings outputSettings = new OutputSettings(); - - string file = FilenameHelper.GetFilename(OutputFormat.png, null); - string filePath = Path.Combine(config.OutputFilePath, file); - using (FileStream stream = new FileStream(filePath, FileMode.Create)) { - using (Image image = surface.GetImageForExport()) { - ImageOutput.SaveToStream(image, stream, outputSettings); - } - } - exportInformation.Filepath = filePath; - exportInformation.ExportMade = true; - ProcessExport(exportInformation, surface); - return exportInformation; - } - } -} diff --git a/build.ps1 b/build.ps1 index 7e7e2f1d7..59bab841c 100644 --- a/build.ps1 +++ b/build.ps1 @@ -3,10 +3,10 @@ # Assumes the installation of Microsoft .NET Framework 4.5 ################################################################ # Greenshot - a free and open source screenshot tool -# Copyright (C) 2007-2014 Thomas Braun, Jens Klingen, Robin Krom +# Copyright (C) 2007-2015 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/ +# The Greenshot project is hosted on GitHub https://github.com/greenshot/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 diff --git a/prebuild.ps1 b/prebuild.ps1 index 53878727f..60d3be684 100644 --- a/prebuild.ps1 +++ b/prebuild.ps1 @@ -3,10 +3,10 @@ # Assumes the installation of Microsoft .NET Framework 4.5 ################################################################ # Greenshot - a free and open source screenshot tool -# Copyright (C) 2007-2014 Thomas Braun, Jens Klingen, Robin Krom +# Copyright (C) 2007-2016 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/ +# The Greenshot project is hosted on GitHub https://github.com/greenshot/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 From deb054b6fb65de0f689f1f6ae4cb326212110144 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Fri, 25 Mar 2016 12:11:05 +0100 Subject: [PATCH 017/170] Fixed License [skip ci] --- Greenshot/Helpers/ResourceMutex.cs | 118 +++++++++++++---------------- 1 file changed, 54 insertions(+), 64 deletions(-) diff --git a/Greenshot/Helpers/ResourceMutex.cs b/Greenshot/Helpers/ResourceMutex.cs index becab8262..ae5e12bc6 100644 --- a/Greenshot/Helpers/ResourceMutex.cs +++ b/Greenshot/Helpers/ResourceMutex.cs @@ -1,26 +1,25 @@ -/* - Dapplo - building blocks for desktop applications - Copyright (C) 2015-2016 Dapplo - - For more information see: http://dapplo.net/ - Dapplo repositories are hosted on GitHub: https://github.com/dapplo - - This file is part of Dapplo.Addons - - Dapplo.Addons 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 3 of the License, or - (at your option) any later version. - - Dapplo.Addons 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 Dapplo.Addons. If not, see <http://www.gnu.org/licenses/>. - */ +// Dapplo - building blocks for desktop applications +// Copyright (C) 2015-2016 Dapplo +// +// For more information see: http://dapplo.net/ +// Dapplo repositories are hosted on GitHub: https://github.com/dapplo +// +// This file is part of Dapplo.Addons +// +// Dapplo.Addons is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Dapplo.Addons 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 Lesser General Public License for more details. +// +// You should have Config a copy of the GNU Lesser General Public License +// along with Dapplo.Addons. If not, see <http://www.gnu.org/licenses/lgpl.txt>. +#region using using log4net; using System; @@ -28,31 +27,24 @@ using System.Security.AccessControl; using System.Security.Principal; using System.Threading; +#endregion + namespace Greenshot.Helpers { /// <summary> - /// This comes from Dapplo.Addons, which was created for Greenshot, this file is copied here as this is the only part we use in 1.2.8 - /// This protects your resources or application from running more than once - /// Simplifies the usage of the Mutex class, as described here: https://msdn.microsoft.com/en-us/library/System.Threading.Mutex.aspx + /// This protects your resources or application from running more than once + /// Simplifies the usage of the Mutex class, as described here: + /// https://msdn.microsoft.com/en-us/library/System.Threading.Mutex.aspx /// </summary> public class ResourceMutex : IDisposable { - private static ILog LOG = LogManager.GetLogger(typeof(DestinationHelper)); + private static readonly ILog Log = LogManager.GetLogger(typeof(DestinationHelper)); private readonly string _mutexId; private readonly string _resourceName; private Mutex _applicationMutex; /// <summary> - /// Test if the Mutex was created and locked. - /// </summary> - public bool IsLocked - { - get; - set; - } - - /// <summary> - /// Private constructor + /// Private constructor /// </summary> /// <param name="mutexId"></param> /// <param name="resourceName"></param> @@ -63,7 +55,12 @@ namespace Greenshot.Helpers } /// <summary> - /// Create a ResourceMutex for the specified mutex id and resource-name + /// Test if the Mutex was created and locked. + /// </summary> + public bool IsLocked { get; set; } + + /// <summary> + /// Create a ResourceMutex for the specified mutex id and resource-name /// </summary> /// <param name="mutexId">ID of the mutex, preferably a Guid as string</param> /// <param name="resourceName">Name of the resource to lock, e.g your application name, usefull for logs</param> @@ -76,12 +73,12 @@ namespace Greenshot.Helpers } /// <summary> - /// This tries to get the Mutex, which takes care of having multiple instances running + /// This tries to get the Mutex, which takes care of having multiple instances running /// </summary> /// <returns>true if it worked, false if another instance is already running or something went wrong</returns> public bool Lock() { - LOG.DebugFormat("{0} is trying to get Mutex {1}", _resourceName, _mutexId); + Log.DebugFormat("{0} is trying to get Mutex {1}", _resourceName, _mutexId); IsLocked = true; // check whether there's an local instance running already, but use local so this works in a multi-user environment @@ -100,7 +97,7 @@ namespace Greenshot.Helpers // 2) if the mutex wasn't created new get the right to it, this returns false if it's already locked if (!createdNew && !_applicationMutex.WaitOne(100, false)) { - LOG.InfoFormat("{0} is already in use, mutex {1} is NOT locked for the caller", _resourceName, _mutexId); + Log.InfoFormat("{0} is already in use, mutex {1} is NOT locked for the caller", _resourceName, _mutexId); IsLocked = false; // Clean up _applicationMutex.Close(); @@ -108,45 +105,38 @@ namespace Greenshot.Helpers } else { - if (createdNew) - { - LOG.InfoFormat("{0} has created & claimed the mutex {1}", _resourceName, _mutexId); - } - else - { - LOG.InfoFormat("{0} has claimed the mutex {1}", _resourceName, _mutexId); - - } + Log.InfoFormat(createdNew ? "{0} has created & claimed the mutex {1}" : "{0} has claimed the mutex {1}", _resourceName, _mutexId); } } catch (AbandonedMutexException e) { // Another instance didn't cleanup correctly! // we can ignore the exception, it happend on the "waitone" but still the mutex belongs to us - LOG.WarnFormat("{0} didn't cleanup correctly, but we got the mutex {1}.", _resourceName, _mutexId); - LOG.Warn(e); + Log.WarnFormat("{0} didn't cleanup correctly, but we got the mutex {1}.", _resourceName, _mutexId); + Log.Warn(e); } catch (UnauthorizedAccessException e) { - LOG.ErrorFormat("{0} is most likely already running for a different user in the same session, can't create/get mutex {1} due to error.", _resourceName, _mutexId); - LOG.Error(e); + Log.ErrorFormat("{0} is most likely already running for a different user in the same session, can't create/get mutex {1} due to error.", _resourceName, _mutexId); + Log.Error(e); IsLocked = false; } catch (Exception ex) { - LOG.ErrorFormat("Problem obtaining the Mutex {1} for {0}, assuming it was already taken!", _resourceName, _mutexId); - LOG.Error(ex); + Log.ErrorFormat("Problem obtaining the Mutex {1} for {0}, assuming it was already taken!", _resourceName, _mutexId); + Log.Error(ex); IsLocked = false; } return IsLocked; } #region IDisposable Support + // To detect redundant Dispose calls - private bool _disposedValue = false; + private bool _disposedValue; /// <summary> - /// The real disposing code + /// The real disposing code /// </summary> /// <param name="disposing">true if dispose is called, false when the finalizer is called</param> protected virtual void Dispose(bool disposing) @@ -159,21 +149,20 @@ namespace Greenshot.Helpers { _applicationMutex.ReleaseMutex(); _applicationMutex = null; - LOG.InfoFormat("Released Mutex {0} for {1}", _mutexId, _resourceName); + Log.InfoFormat("Released Mutex {0} for {1}", _mutexId, _resourceName); } catch (Exception ex) { - LOG.ErrorFormat("Error releasing Mutex {0} for {1}", _mutexId, _resourceName); - LOG.Error(ex); + Log.ErrorFormat("Error releasing Mutex {0} for {1}", _mutexId, _resourceName); + Log.Error(ex); } - } _disposedValue = true; } } /// <summary> - /// Make sure the ApplicationMutex is disposed when the finalizer is called + /// Make sure the ApplicationMutex is disposed when the finalizer is called /// </summary> ~ResourceMutex() { @@ -182,7 +171,7 @@ namespace Greenshot.Helpers } /// <summary> - /// The dispose interface, which calls Dispose(true) to signal that dispose is called. + /// The dispose interface, which calls Dispose(true) to signal that dispose is called. /// </summary> public void Dispose() { @@ -190,6 +179,7 @@ namespace Greenshot.Helpers Dispose(true); GC.SuppressFinalize(this); } + #endregion } -} +} \ No newline at end of file From 7ff53bdb69435762dafd702db7e31e3b2c5406a2 Mon Sep 17 00:00:00 2001 From: "Krom, Robertus" <Robertus.Krom@ing-diba.de> Date: Wed, 6 Apr 2016 16:40:46 +0200 Subject: [PATCH 018/170] BUG-1933: A change to the Registry permissions, this should solve a security vulnerability. Used the time to fix the file-type registration too. --- .../releases/innosetup/setup.iss.template | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index cc467cda8..94f2d626e 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -143,16 +143,32 @@ Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: no Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; Root: HKCU32; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; Check: IsWin64() Root: HKLM32; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; Check: IsWin64() + +; delete filetype mappings +; HKEY_LOCAL_USER - for current user only +Root: HKCU; Subkey: Software\Classes\.greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; +Root: HKCU; Subkey: Software\Classes\Greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; +; HKEY_LOCAL_MACHINE - for all users when admin (with the noerror this doesn't matter) +Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; +Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; + ; Create the startup entries if requested to do so ; HKEY_LOCAL_USER - for current user only Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: {app}\{#ExeName}.exe; Permissions: users-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: IsRegularUser -; HKEY_LOCAL_MACHINE - for all users -Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: {app}\{#ExeName}.exe; Permissions: users-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: not IsRegularUser -; Register our own filetype for admin -Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Flags: uninsdeletevalue noerror; Check: not IsRegularUser -Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Flags: uninsdeletevalue noerror; Check: not IsRegularUser -Root: HKLM; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: "{app}\Greenshot.EXE,0"; Flags: uninsdeletevalue noerror; Check: not IsRegularUser -Root: HKLM; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Flags: uninsdeletevalue noerror; Check: not IsRegularUser +; HKEY_LOCAL_MACHINE - for all users when admin +Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: {app}\{#ExeName}.exe; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: not IsRegularUser + +; Register our own filetype for all users +; HKEY_LOCAL_USER - for current user only +Root: HKCU; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser +Root: HKCU; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser +Root: HKCU; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: "{app}\Greenshot.EXE,0"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser +Root: HKCU; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser +; HKEY_LOCAL_MACHINE - for all users when admin +Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser +Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser +Root: HKLM; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: "{app}\Greenshot.EXE,0"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser +Root: HKLM; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser [Icons] Name: {group}\{#ExeName}; Filename: {app}\{#ExeName}.exe; WorkingDir: {app} From 189a6de1d602dfa401655ba75ee4698b3e7db661 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Mon, 11 Apr 2016 10:38:52 +0200 Subject: [PATCH 019/170] BUG-1935: Trying to make clipboard actions more stable. --- GreenshotPlugin/Core/ClipboardHelper.cs | 85 +++++++++++++++---------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7b3819836..d2a0ad189 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -40,7 +40,7 @@ namespace GreenshotPlugin.Core { /// </summary> public static class ClipboardHelper { private static readonly ILog LOG = LogManager.GetLogger(typeof(ClipboardHelper)); - private static readonly Object clipboardLockObject = new Object(); + private static readonly object clipboardLockObject = new object(); private static readonly CoreConfiguration config = IniConfig.GetIniSection<CoreConfiguration>(); private static readonly string FORMAT_FILECONTENTS = "FileContents"; private static readonly string FORMAT_PNG = "PNG"; @@ -103,21 +103,36 @@ EndSelection:<<<<<<<4 try { IntPtr hWnd = User32.GetClipboardOwner(); if (hWnd != IntPtr.Zero) { - int pid; - User32.GetWindowThreadProcessId( hWnd, out pid); - using (Process me = Process.GetCurrentProcess()) - using (Process ownerProcess = Process.GetProcessById(pid)) { - // Exclude myself - if (ownerProcess != null && me.Id != ownerProcess.Id) { - // Get Process Name - owner = ownerProcess.ProcessName; - // Try to get the starting Process Filename, this might fail. - try { - owner = ownerProcess.Modules[0].FileName; - } catch (Exception) { + try + { + int pid; + User32.GetWindowThreadProcessId(hWnd, out pid); + using (Process me = Process.GetCurrentProcess()) + using (Process ownerProcess = Process.GetProcessById(pid)) + { + // Exclude myself + if (ownerProcess != null && me.Id != ownerProcess.Id) + { + // Get Process Name + owner = ownerProcess.ProcessName; + // Try to get the starting Process Filename, this might fail. + try + { + owner = ownerProcess.Modules[0].FileName; + } + catch (Exception) + { + } } } } + catch(Exception e) + { + LOG.Warn("Non critical error: Couldn't get clipboard process, trying to use the title.", e); + StringBuilder title = new StringBuilder(260, 260); + User32.GetWindowText(hWnd, title, title.Capacity); + owner = title.ToString(); + } } } catch (Exception e) { LOG.Warn("Non critical error: Couldn't get clipboard owner.", e); @@ -133,27 +148,31 @@ EndSelection:<<<<<<<4 /// <param name="copy"></param> private static void SetDataObject(IDataObject ido, bool copy) { lock (clipboardLockObject) { - int retryCount = 5; - while (retryCount >= 0) { - try { - Clipboard.SetDataObject(ido, copy); - break; - } catch (Exception ee) { - if (retryCount == 0) { - string messageText = null; - string clipboardOwner = GetClipboardOwner(); - if (clipboardOwner != null) { - messageText = Language.GetFormattedString("clipboard_inuse", clipboardOwner); - } else { - messageText = Language.GetString("clipboard_error"); - } - LOG.Error(messageText, ee); - } else { - Thread.Sleep(100); - } - } finally { - --retryCount; + // Clear first, this seems to solve some issues + try + { + Clipboard.Clear(); + } + catch (Exception clearException) + { + LOG.Warn(clearException.Message); + } + try + { + Clipboard.SetDataObject(ido, copy, 5, 200); + } + catch (Exception clipboardSetException) + { + string messageText = null; + string clipboardOwner = GetClipboardOwner(); + if (clipboardOwner != null) + { + messageText = Language.GetFormattedString("clipboard_inuse", clipboardOwner); } + else { + messageText = Language.GetString("clipboard_error"); + } + LOG.Error(messageText, clipboardSetException); } } } From 4435d7669961f9c91f9e98dfabb5db62a1d08875 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Mon, 11 Apr 2016 11:56:52 +0200 Subject: [PATCH 020/170] BUG-1935: increased retries and delay a bit. --- GreenshotPlugin/Core/ClipboardHelper.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index d2a0ad189..ea415d09a 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -159,7 +159,8 @@ EndSelection:<<<<<<<4 } try { - Clipboard.SetDataObject(ido, copy, 5, 200); + // For BUG-1935 this was changed from looping ourselfs, or letting MS retry... + Clipboard.SetDataObject(ido, copy, 15, 150); } catch (Exception clipboardSetException) { From e43339ea90e5000ecfabba9379139470e62a7cbe Mon Sep 17 00:00:00 2001 From: Robin Krom <robin.krom@gmail.com> Date: Mon, 11 Apr 2016 14:25:12 +0200 Subject: [PATCH 021/170] BUG-1935: Increased the retry delay a bit more The maximum waiting time should now be 3 seconds. --- GreenshotPlugin/Core/ClipboardHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index ea415d09a..280f8d6a4 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -160,7 +160,7 @@ EndSelection:<<<<<<<4 try { // For BUG-1935 this was changed from looping ourselfs, or letting MS retry... - Clipboard.SetDataObject(ido, copy, 15, 150); + Clipboard.SetDataObject(ido, copy, 15, 200); } catch (Exception clipboardSetException) { @@ -851,4 +851,4 @@ EndSelection:<<<<<<<4 return GetFromDataObject(GetDataObject(), format); } } -} \ No newline at end of file +} From d780d337e419f6e821e26754bd07c138939ebc09 Mon Sep 17 00:00:00 2001 From: David Bremner <dbremner@gmail.com> Date: Sat, 16 Apr 2016 18:28:44 -0700 Subject: [PATCH 022/170] marshal return types, add CharSet.Unicode to functions that lack it, marshal BOOL parameters --- Greenshot/Helpers/EnvironmentInfo.cs | 4 +++- GreenshotPlugin/Core/CredentialsHelper.cs | 3 ++- GreenshotPlugin/Core/WindowCapture.cs | 1 + GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 4 +++- GreenshotPlugin/UnmanagedHelpers/Kernel32.cs | 2 ++ GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 4 ++-- GreenshotPlugin/UnmanagedHelpers/User32.cs | 10 +++++----- 7 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index 443fe3321..4aa2e9bf7 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -645,6 +645,7 @@ namespace Greenshot.Helpers #region GET #region PRODUCT INFO [DllImport("Kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool GetProductInfo( int osMajorVersion, int osMinorVersion, @@ -654,7 +655,8 @@ namespace Greenshot.Helpers #endregion PRODUCT INFO #region VERSION - [DllImport("kernel32.dll")] + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GetVersionEx(ref OSVERSIONINFOEX osVersionInfo); #endregion VERSION #endregion GET diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 539ab244a..5c9474b55 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -59,6 +59,7 @@ namespace GreenshotPlugin.Core { /// <summary>Encapsulates dialog functionality from the Credential Management API.</summary> public sealed class CredentialsDialog { [DllImport("gdi32.dll", SetLastError=true)] + [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DeleteObject(IntPtr hObject); /// <summary>The only valid bitmap height (in pixels) of a user-defined banner.</summary> @@ -602,6 +603,6 @@ namespace GreenshotPlugin.Core { /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/creduiconfirmcredentials.asp /// </summary> [DllImport("credui.dll", CharSet=CharSet.Unicode)] - public static extern ReturnCodes CredUIConfirmCredentials(string targetName, bool confirm); + public static extern ReturnCodes CredUIConfirmCredentials(string targetName, [MarshalAs(UnmanagedType.Bool)] bool confirm); } } \ No newline at end of file diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index 733aa12f0..a85792162 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -423,6 +423,7 @@ namespace GreenshotPlugin.Core { /// <param name="hObject"></param> /// <returns></returns> [DllImport("gdi32", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DeleteObject(IntPtr hObject); private WindowCapture() { diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index 2d12a4a81..f3e2aff3e 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -62,6 +62,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// </summary> public abstract class SafeObjectHandle : SafeHandleZeroOrMinusOneIsInvalid { [DllImport("gdi32", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DeleteObject(IntPtr hObject); protected SafeObjectHandle(bool ownsHandle) : base(ownsHandle) { @@ -149,7 +150,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// </summary> public class SafeCompatibleDCHandle : SafeDCHandle { [DllImport("gdi32", SetLastError = true)] - private static extern bool DeleteDC(IntPtr hDC); + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteDC(IntPtr hDC); [SecurityCritical] private SafeCompatibleDCHandle() : base(true) { diff --git a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs index 677e1a0f4..c2b347b06 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs @@ -58,12 +58,14 @@ namespace GreenshotPlugin.UnmanagedHelpers { [DllImport("kernel32", SetLastError = true)] public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] + [return: MarshalAs(UnmanagedType.Bool)] public static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags, StringBuilder lpExeName, ref uint lpdwSize); [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] public static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, uint uuchMax); [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] public static extern IntPtr GetModuleHandle(string lpModuleName); [DllImport("kernel32", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CloseHandle(IntPtr hObject); /// <summary> diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index 945c3b292..e74d38310 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -49,12 +49,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { public SHITEMID mkid; } - [StructLayout(LayoutKind.Sequential)] + [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] private struct BROWSEINFO { public IntPtr hwndOwner; public IntPtr pidlRoot; public IntPtr pszDisplayName; - [MarshalAs(UnmanagedType.LPTStr)] + [MarshalAs(UnmanagedType.LPWStr)] public string lpszTitle; public uint ulFlags; public IntPtr lpfn; diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index 416a38823..b3335a204 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -104,14 +104,14 @@ namespace GreenshotPlugin.UnmanagedHelpers { public extern static bool IsZoomed(IntPtr hwnd); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] public extern static int GetClassName (IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); - [DllImport("user32", SetLastError = true)] + [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] public static extern uint GetClassLong(IntPtr hWnd, int nIndex); [DllImport("user32", SetLastError = true, EntryPoint = "GetClassLongPtr")] public static extern IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex); [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags); - [DllImport("user32", SetLastError=true)] + [DllImport("user32", CharSet=CharSet.Unicode, SetLastError=true)] public extern static IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); [DllImport("user32", SetLastError = true)] public extern static IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); @@ -119,7 +119,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { public extern static int GetWindowLong(IntPtr hwnd, int index); [DllImport("user32", SetLastError = true, EntryPoint = "GetWindowLongPtr")] public extern static IntPtr GetWindowLongPtr(IntPtr hwnd, int nIndex); - [DllImport("user32", SetLastError = true)] + [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int SetWindowLong(IntPtr hWnd, int index, int styleFlags); [DllImport("user32", SetLastError = true, EntryPoint = "SetWindowLongPtr")] public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int index, IntPtr styleFlags); @@ -139,9 +139,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { public static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi); [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool ShowScrollBar(IntPtr hwnd, ScrollBarDirection scrollBar, bool show); + public static extern bool ShowScrollBar(IntPtr hwnd, ScrollBarDirection scrollBar, [MarshalAs(UnmanagedType.Bool)] bool show); [DllImport("user32", SetLastError = true)] - public static extern int SetScrollPos(IntPtr hWnd, Orientation nBar, int nPos, bool bRedraw); + public static extern int SetScrollPos(IntPtr hWnd, Orientation nBar, int nPos, [MarshalAs(UnmanagedType.Bool)] bool bRedraw); [DllImport("user32", SetLastError = true)] public static extern RegionResult GetWindowRgn(IntPtr hWnd, SafeHandle hRgn); [DllImport("user32", SetLastError = true)] From 98e6be5eb6218ff47b9ae41884629a1885b78015 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Sun, 17 Apr 2016 23:32:22 +0200 Subject: [PATCH 023/170] Small cleanups [skip ci] --- .../Configuration/EditorConfiguration.cs | 2 +- Greenshot/Controls/BindableToolStripButton.cs | 3 +- .../Controls/BindableToolStripComboBox.cs | 3 +- .../BindableToolStripDropDownButton.cs | 3 - ...ontextMenuToolStripProfessionalRenderer.cs | 2 +- Greenshot/Controls/FontFamilyComboBox.cs | 30 +- Greenshot/Controls/MenuStripEx.cs | 10 +- Greenshot/Controls/NonJumpingPanel.cs | 7 +- Greenshot/Controls/Pipette.cs | 10 +- Greenshot/Controls/ToolStripEx.cs | 10 +- .../Destinations/ClipboardDestination.cs | 4 - Greenshot/Destinations/EditorDestination.cs | 12 +- Greenshot/Destinations/EmailDestination.cs | 6 +- Greenshot/Destinations/FileDestination.cs | 13 +- .../Destinations/FileWithDialogDestination.cs | 2 +- Greenshot/Destinations/PrinterDestination.cs | 6 +- Greenshot/Drawing/ArrowContainer.cs | 2 +- Greenshot/Drawing/CursorContainer.cs | 2 +- Greenshot/Drawing/DrawableContainer.cs | 18 +- Greenshot/Drawing/DrawableContainerList.cs | 8 +- Greenshot/Drawing/EllipseContainer.cs | 9 +- .../Drawing/Fields/AbstractFieldHolder.cs | 8 +- .../Fields/AbstractFieldHolderWithChildren.cs | 3 +- .../Binding/AbstractBindingConverter.cs | 2 - .../Fields/Binding/BidirectionalBinding.cs | 80 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 12 +- Greenshot/Drawing/FilterContainer.cs | 4 +- Greenshot/Drawing/Filters/AbstractFilter.cs | 2 +- Greenshot/Drawing/Filters/BlurFilter.cs | 9 +- Greenshot/Drawing/Filters/MagnifierFilter.cs | 2 +- .../Drawing/Filters/PixelizationFilter.cs | 2 +- Greenshot/Drawing/FreehandContainer.cs | 10 +- Greenshot/Drawing/IconContainer.cs | 2 +- Greenshot/Drawing/ImageContainer.cs | 2 +- Greenshot/Drawing/LineContainer.cs | 2 +- Greenshot/Drawing/RectangleContainer.cs | 4 +- Greenshot/Drawing/RoundedRectangle.cs | 14 +- Greenshot/Drawing/SpeechbubbleContainer.cs | 10 +- Greenshot/Drawing/StepLabelContainer.cs | 8 +- Greenshot/Drawing/Surface.cs | 26 +- Greenshot/Drawing/TextContainer.cs | 6 +- Greenshot/Forms/AboutForm.cs | 110 +-- Greenshot/Forms/CaptureForm.cs | 38 +- Greenshot/Forms/ColorDialog.cs | 4 +- Greenshot/Forms/DropShadowSettingsForm.cs | 7 +- Greenshot/Forms/ImageEditorForm.Designer.cs | 2 +- Greenshot/Forms/ImageEditorForm.cs | 818 +++++++++--------- Greenshot/Forms/LanguageDialog.cs | 4 +- Greenshot/Forms/MainForm.cs | 6 +- Greenshot/Forms/MovableShowColorForm.cs | 4 +- Greenshot/Forms/ResizeSettingsForm.cs | 26 +- Greenshot/Forms/SettingsForm.cs | 7 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 6 +- Greenshot/Forms/TornEdgeSettingsForm.cs | 7 +- Greenshot/Helpers/CaptureHelper.cs | 8 +- Greenshot/Helpers/CopyData.cs | 174 ++-- Greenshot/Helpers/DestinationHelper.cs | 6 +- Greenshot/Helpers/EnvironmentInfo.cs | 84 +- Greenshot/Helpers/GeometryHelper.cs | 4 +- Greenshot/Helpers/IECaptureHelper.cs | 29 +- Greenshot/Helpers/IEInterop/IEContainer.cs | 219 +++-- Greenshot/Helpers/MailHelper.cs | 27 +- Greenshot/Helpers/PluginHelper.cs | 12 +- Greenshot/Helpers/PrintHelper.cs | 6 +- Greenshot/Helpers/ProcessorHelper.cs | 4 +- Greenshot/Helpers/ScaleHelper.cs | 21 +- Greenshot/Helpers/SoundHelper.cs | 24 +- Greenshot/Helpers/UpdateHelper.cs | 2 +- Greenshot/Helpers/WindowWrapper.cs | 2 +- Greenshot/Memento/AddElementMemento.cs | 23 +- Greenshot/Memento/ChangeFieldHolderMemento.cs | 4 +- Greenshot/Memento/DeleteElementMemento.cs | 2 +- .../DrawableContainerBoundsChangeMemento.cs | 4 +- Greenshot/Memento/TextChangeMemento.cs | 2 +- Greenshot/Processors/TitleFixProcessor.cs | 4 +- GreenshotBoxPlugin/BoxCredentials.cs | 1 - GreenshotBoxPlugin/BoxDestination.cs | 3 - GreenshotBoxPlugin/Forms/SettingsForm.cs | 6 - GreenshotPlugin/Controls/AnimatingForm.cs | 36 +- GreenshotPlugin/Controls/BackgroundForm.cs | 12 +- .../Controls/ExtendedWebBrowser.cs | 4 +- .../Controls/FormWithoutActivation.cs | 2 +- GreenshotPlugin/Controls/GreenshotButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotCheckBox.cs | 12 +- .../Controls/GreenshotColumnSorter.cs | 53 +- GreenshotPlugin/Controls/GreenshotComboBox.cs | 35 +- GreenshotPlugin/Controls/GreenshotForm.cs | 21 +- GreenshotPlugin/Controls/GreenshotGroupBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotLabel.cs | 2 +- .../Controls/GreenshotRadioButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotTabPage.cs | 2 +- GreenshotPlugin/Controls/GreenshotTextBox.cs | 12 +- .../Controls/GreenshotToolDropDownButton.cs | 2 +- .../Controls/GreenshotToolStripButton.cs | 2 +- .../Controls/GreenshotToolStripLabel.cs | 2 +- .../Controls/GreenshotToolStripMenuItem.cs | 2 +- GreenshotPlugin/Controls/HotkeyControl.cs | 23 +- .../Controls/IGreenshotConfigBindable.cs | 1 - .../Controls/IGreenshotLanguageBindable.cs | 1 - GreenshotPlugin/Controls/OAuthLoginForm.cs | 8 +- GreenshotPlugin/Controls/PleaseWaitForm.cs | 5 +- GreenshotPlugin/Controls/QualityDialog.cs | 3 +- .../Controls/SaveImageFileDialog.cs | 124 ++- GreenshotPlugin/Controls/ThumbnailForm.cs | 31 +- GreenshotPlugin/Core/AbstractDestination.cs | 5 +- GreenshotPlugin/Core/AccessibleHelper.cs | 2 +- GreenshotPlugin/Core/AnimationHelpers.cs | 178 ++-- GreenshotPlugin/Core/Cache.cs | 10 +- GreenshotPlugin/Core/ClipboardHelper.cs | 8 +- GreenshotPlugin/Core/CoreConfiguration.cs | 3 + GreenshotPlugin/Core/CredentialsHelper.cs | 10 +- GreenshotPlugin/Core/Effects.cs | 35 +- GreenshotPlugin/Core/EventDelay.cs | 4 +- GreenshotPlugin/Core/FastBitmap.cs | 6 +- GreenshotPlugin/Core/FilenameHelper.cs | 20 +- GreenshotPlugin/Core/GreenshotResources.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 30 +- GreenshotPlugin/Core/ImageOutput.cs | 2 +- GreenshotPlugin/Core/InterfaceUtils.cs | 2 +- GreenshotPlugin/Core/JSONHelper.cs | 1 - GreenshotPlugin/Core/Language.cs | 22 +- GreenshotPlugin/Core/LogHelper.cs | 2 +- GreenshotPlugin/Core/NetworkHelper.cs | 20 +- GreenshotPlugin/Core/OAuthHelper.cs | 5 +- GreenshotPlugin/Core/PluginUtils.cs | 4 +- GreenshotPlugin/Core/QuantizerHelper.cs | 18 +- GreenshotPlugin/Core/SourceForgeHelper.cs | 3 +- GreenshotPlugin/Core/StringExtensions.cs | 1 - GreenshotPlugin/Core/WindowCapture.cs | 4 +- GreenshotPlugin/Core/WindowsHelper.cs | 32 +- GreenshotPlugin/IEInterop/IHTMLBodyElement.cs | 2 +- .../IEInterop/IHTMLCurrentStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument4.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument5.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement2.cs | 2 +- .../IEInterop/IHTMLElementCollection.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLFrameBase.cs | 2 +- .../IEInterop/IHTMLFramesCollection2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLRect.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen2.cs | 2 +- .../IEInterop/IHTMLSelectionObject.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLTxtRange.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow4.cs | 2 +- GreenshotPlugin/IEInterop/IWebBrowser2.cs | 2 +- GreenshotPlugin/IniFile/IniConfig.cs | 16 +- GreenshotPlugin/IniFile/IniReader.cs | 4 +- GreenshotPlugin/IniFile/IniSection.cs | 4 +- GreenshotPlugin/IniFile/IniValue.cs | 20 +- .../Interfaces/Forms/ImageEditor.cs | 7 +- GreenshotPlugin/Interfaces/Generic.cs | 1 - GreenshotPlugin/Interfaces/IDestination.cs | 12 +- GreenshotPlugin/Interfaces/IProcessor.cs | 3 - .../Interfaces/Plugin/PluginInterfaces.cs | 5 +- GreenshotPlugin/Interop/Base.cs | 2 - GreenshotPlugin/Interop/COMWrapper.cs | 73 +- GreenshotPlugin/Interop/ComProgIdAttribute.cs | 2 +- GreenshotPlugin/Interop/IAppVisibility.cs | 1 - GreenshotPlugin/Properties/AssemblyInfo.cs | 1 - .../UnmanagedHelpers/Enumerations.cs | 74 +- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 81 +- GreenshotPlugin/UnmanagedHelpers/GDIplus.cs | 27 +- GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 47 +- GreenshotPlugin/UnmanagedHelpers/User32.cs | 42 +- 171 files changed, 1607 insertions(+), 1769 deletions(-) diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index 4c805e5ce..3d3240273 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -73,7 +73,7 @@ namespace Greenshot.Configuration { /// <param name="requestingType">Type of the class for which to create the field</param> /// <param name="fieldType">FieldType of the field to construct</param> - /// <param name="scope">FieldType of the field to construct</param> + /// <param name="preferredDefaultValue"></param> /// <returns>a new Field of the given fieldType, with the scope of it's value being restricted to the Type scope</returns> public Field CreateField(Type requestingType, FieldType fieldType, object preferredDefaultValue) { string requestingTypeName = requestingType.Name; diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index 5641a9c27..a9f41b1a3 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -36,7 +36,8 @@ namespace Greenshot.Controls { set; } - public BindableToolStripButton() :base() { + public BindableToolStripButton() + { CheckedChanged += BindableToolStripButton_CheckedChanged; } diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs index 192e25ecb..f65188a11 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -36,7 +36,8 @@ namespace Greenshot.Controls { set; } - public BindableToolStripComboBox() :base() { + public BindableToolStripComboBox() + { SelectedIndexChanged += BindableToolStripComboBox_SelectedIndexChanged; } diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs index d32b2453d..57cb593b4 100644 --- a/Greenshot/Controls/BindableToolStripDropDownButton.cs +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -38,9 +38,6 @@ namespace Greenshot.Controls { set; } - public BindableToolStripDropDownButton() { - } - public object SelectedTag { get { if(Tag==null && DropDownItems.Count>0) Tag=DropDownItems[0].Tag; return Tag; } set { AdoptFromTag(value); } diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index 6c18554da..d8c8ef68c 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -30,7 +30,7 @@ namespace Greenshot.Controls { /// ToolStripProfessionalRenderer which draws the Check correctly when the icons are larger /// </summary> public class ContextMenuToolStripProfessionalRenderer : ToolStripProfessionalRenderer { - private static CoreConfiguration coreConfiguration = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration coreConfiguration = IniConfig.GetIniSection<CoreConfiguration>(); private static Image scaledCheckbox; protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs index 410c87402..b832247c4 100644 --- a/Greenshot/Controls/FontFamilyComboBox.cs +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -41,12 +41,16 @@ namespace Greenshot.Controls { } } - public FontFamilyComboBox() : base() { - ComboBox.DataSource = FontFamily.Families; - ComboBox.DisplayMember = "Name"; - SelectedIndexChanged += BindableToolStripComboBox_SelectedIndexChanged; - ComboBox.DrawMode = DrawMode.OwnerDrawFixed; - ComboBox.DrawItem += ComboBox_DrawItem; + public FontFamilyComboBox() + { + if (ComboBox != null) + { + ComboBox.DataSource = FontFamily.Families; + ComboBox.DisplayMember = "Name"; + SelectedIndexChanged += BindableToolStripComboBox_SelectedIndexChanged; + ComboBox.DrawMode = DrawMode.OwnerDrawFixed; + ComboBox.DrawItem += ComboBox_DrawItem; + } } void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { @@ -58,7 +62,7 @@ namespace Greenshot.Controls { if (e.Index > -1) { FontFamily fontFamily = Items[e.Index] as FontFamily; FontStyle fontStyle = FontStyle.Regular; - if (!fontFamily.IsStyleAvailable(FontStyle.Regular)) { + if (fontFamily != null && !fontFamily.IsStyleAvailable(FontStyle.Regular)) { if (fontFamily.IsStyleAvailable(FontStyle.Bold)) { fontStyle = FontStyle.Bold; } else if (fontFamily.IsStyleAvailable(FontStyle.Italic)) { @@ -70,10 +74,16 @@ namespace Greenshot.Controls { } } try { - DrawText(e.Graphics, fontFamily, fontStyle, e.Bounds, fontFamily.Name); + if (fontFamily != null) + { + DrawText(e.Graphics, fontFamily, fontStyle, e.Bounds, fontFamily.Name); + } } catch { // If the drawing failed, BUG-1770 seems to have a weird case that causes: Font 'Lucida Sans Typewriter' does not support style 'Regular' - DrawText(e.Graphics, FontFamily.GenericSansSerif, FontStyle.Regular, e.Bounds, fontFamily.Name); + if (fontFamily != null) + { + DrawText(e.Graphics, FontFamily.GenericSansSerif, FontStyle.Regular, e.Bounds, fontFamily.Name); + } } } // Uncomment this if you actually like the way the focus rectangle looks @@ -89,7 +99,7 @@ namespace Greenshot.Controls { /// <param name="bounds"></param> /// <param name="text"></param> private void DrawText(Graphics graphics, FontFamily fontFamily, FontStyle fontStyle, Rectangle bounds, string text) { - using (Font font = new Font(fontFamily, this.Font.Size + 5, fontStyle, GraphicsUnit.Pixel)) { + using (Font font = new Font(fontFamily, Font.Size + 5, fontStyle, GraphicsUnit.Pixel)) { // Make sure the text is visible by centering it in the line using (StringFormat stringFormat = new StringFormat()) { stringFormat.LineAlignment = StringAlignment.Center; diff --git a/Greenshot/Controls/MenuStripEx.cs b/Greenshot/Controls/MenuStripEx.cs index aa880f06e..5400260a0 100644 --- a/Greenshot/Controls/MenuStripEx.cs +++ b/Greenshot/Controls/MenuStripEx.cs @@ -32,11 +32,9 @@ namespace Greenshot.Controls { enum NativeConstants : uint { MA_ACTIVATE = 1, MA_ACTIVATEANDEAT = 2, - MA_NOACTIVATE = 3, - MA_NOACTIVATEANDEAT = 4, } - private bool clickThrough = false; + private bool _clickThrough; /// <summary> /// Gets or sets whether the ToolStripEx honors item clicks when its containing form does not have input focus. /// </summary> @@ -45,17 +43,17 @@ namespace Greenshot.Controls { /// </remarks> public bool ClickThrough { get { - return clickThrough; + return _clickThrough; } set { - clickThrough = value; + _clickThrough = value; } } protected override void WndProc(ref Message m) { base.WndProc(ref m); - if (clickThrough && m.Msg == WM_MOUSEACTIVATE && m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) { + if (_clickThrough && m.Msg == WM_MOUSEACTIVATE && m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) { m.Result = (IntPtr)NativeConstants.MA_ACTIVATE; } } diff --git a/Greenshot/Controls/NonJumpingPanel.cs b/Greenshot/Controls/NonJumpingPanel.cs index 8392b9219..93f2f713c 100644 --- a/Greenshot/Controls/NonJumpingPanel.cs +++ b/Greenshot/Controls/NonJumpingPanel.cs @@ -19,14 +19,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -/// <summary> -/// See: http://nickstips.wordpress.com/2010/03/03/c-panel-resets-scroll-position-after-focus-is-lost-and-regained/ -/// </summary> - using System.Drawing; using System.Windows.Forms; namespace GreenshotPlugin.Controls { + /// <summary> + /// See: http://nickstips.wordpress.com/2010/03/03/c-panel-resets-scroll-position-after-focus-is-lost-and-regained/ + /// </summary> public class NonJumpingPanel : Panel { protected override Point ScrollToControl(Control activeControl) { // Returning the current location prevents the panel from diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index 6aeccf9b5..5a730c4b4 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -34,7 +34,7 @@ namespace Greenshot.Controls { private MovableShowColorForm movableShowColorForm; private bool dragging; private Cursor _cursor; - private Bitmap _image; + private readonly Bitmap _image; private const int VK_ESC = 27; public event EventHandler<PipetteUsedArgs> PipetteUsed; @@ -111,10 +111,14 @@ namespace Greenshot.Controls { /// </summary> /// <param name="e">MouseEventArgs</param> protected override void OnMouseUp(MouseEventArgs e) { - if (e.Button == MouseButtons.Left) { + if (e.Button == MouseButtons.Left) + { //Release Capture should consume MouseUp when canceled with the escape key User32.ReleaseCapture(); - PipetteUsed(this, new PipetteUsedArgs(movableShowColorForm.color)); + if (PipetteUsed != null) + { + PipetteUsed(this, new PipetteUsedArgs(movableShowColorForm.color)); + } } base.OnMouseUp(e); } diff --git a/Greenshot/Controls/ToolStripEx.cs b/Greenshot/Controls/ToolStripEx.cs index 3a32224c3..2ce378d3f 100644 --- a/Greenshot/Controls/ToolStripEx.cs +++ b/Greenshot/Controls/ToolStripEx.cs @@ -32,11 +32,9 @@ namespace Greenshot.Controls { enum NativeConstants : uint { MA_ACTIVATE = 1, MA_ACTIVATEANDEAT = 2, - MA_NOACTIVATE = 3, - MA_NOACTIVATEANDEAT = 4, } - private bool clickThrough = false; + private bool _clickThrough; /// <summary> /// Gets or sets whether the ToolStripEx honors item clicks when its containing form does not have input focus. /// </summary> @@ -46,17 +44,17 @@ namespace Greenshot.Controls { public bool ClickThrough { get { - return clickThrough; + return _clickThrough; } set { - clickThrough = value; + _clickThrough = value; } } protected override void WndProc(ref Message m) { base.WndProc(ref m); - if (clickThrough && m.Msg == WM_MOUSEACTIVATE && m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) { + if (_clickThrough && m.Msg == WM_MOUSEACTIVATE && m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT) { m.Result = (IntPtr)NativeConstants.MA_ACTIVATE; } } diff --git a/Greenshot/Destinations/ClipboardDestination.cs b/Greenshot/Destinations/ClipboardDestination.cs index 25476f64e..5638b7fd1 100644 --- a/Greenshot/Destinations/ClipboardDestination.cs +++ b/Greenshot/Destinations/ClipboardDestination.cs @@ -25,16 +25,12 @@ using System.Windows.Forms; using Greenshot.Configuration; using GreenshotPlugin.Core; using Greenshot.Plugin; -using Greenshot.IniFile; -using log4net; namespace Greenshot.Destinations { /// <summary> /// Description of ClipboardDestination. /// </summary> public class ClipboardDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(ClipboardDestination)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); public const string DESIGNATION = "Clipboard"; public override string Designation { diff --git a/Greenshot/Destinations/EditorDestination.cs b/Greenshot/Destinations/EditorDestination.cs index 0aaed76a2..2f5234705 100644 --- a/Greenshot/Destinations/EditorDestination.cs +++ b/Greenshot/Destinations/EditorDestination.cs @@ -32,11 +32,11 @@ namespace Greenshot.Destinations { /// Description of EditorDestination. /// </summary> public class EditorDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(EditorDestination)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(EditorDestination)); + private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); public const string DESIGNATION = "Editor"; - private IImageEditor editor = null; - private static Image greenshotIcon = GreenshotResources.getGreenshotIcon().ToBitmap(); + private readonly IImageEditor editor; + private static readonly Image greenshotIcon = GreenshotResources.getGreenshotIcon().ToBitmap(); public EditorDestination() { } @@ -79,8 +79,8 @@ namespace Greenshot.Destinations { } public override IEnumerable<IDestination> DynamicDestinations() { - foreach (IImageEditor editor in ImageEditorForm.Editors) { - yield return new EditorDestination(editor); + foreach (IImageEditor someEditor in ImageEditorForm.Editors) { + yield return new EditorDestination(someEditor); } } diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index b82b233b0..16dcf0866 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -36,9 +36,9 @@ namespace Greenshot.Destinations { public class EmailDestination : AbstractDestination { private static ILog LOG = LogManager.GetLogger(typeof(EmailDestination)); private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - private static Image mailIcon = GreenshotResources.getImage("Email.Image"); - private static bool isActiveFlag = false; - private static string mapiClient = null; + private static readonly Image mailIcon = GreenshotResources.getImage("Email.Image"); + private static bool isActiveFlag; + private static string mapiClient; public const string DESIGNATION = "EMail"; static EmailDestination() { diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 24af9bd1d..6b2c0b24d 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -35,8 +35,8 @@ namespace Greenshot.Destinations { /// Description of FileSaveAsDestination. /// </summary> public class FileDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(FileDestination)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(FileDestination)); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); public const string DESIGNATION = "FileNoDialog"; public override string Designation { @@ -103,20 +103,23 @@ namespace Greenshot.Destinations { LOG.InfoFormat("Not overwriting: {0}", ex1.Message); // when we don't allow to overwrite present a new SaveWithDialog fullPath = ImageOutput.SaveWithDialog(surface, captureDetails); - outputMade = (fullPath != null); + outputMade = fullPath != null; } catch (Exception ex2) { LOG.Error("Error saving screenshot!", ex2); // Show the problem MessageBox.Show(Language.GetString(LangKey.error_save), Language.GetString(LangKey.error)); // when save failed we present a SaveWithDialog fullPath = ImageOutput.SaveWithDialog(surface, captureDetails); - outputMade = (fullPath != null); + outputMade = fullPath != null; } // Don't overwrite filename if no output is made if (outputMade) { exportInformation.ExportMade = outputMade; exportInformation.Filepath = fullPath; - captureDetails.Filename = fullPath; + if (captureDetails != null) + { + captureDetails.Filename = fullPath; + } conf.OutputFileAsFullpath = fullPath; } diff --git a/Greenshot/Destinations/FileWithDialogDestination.cs b/Greenshot/Destinations/FileWithDialogDestination.cs index e14b804b6..d5e76ebfb 100644 --- a/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/Greenshot/Destinations/FileWithDialogDestination.cs @@ -34,7 +34,7 @@ namespace Greenshot.Destinations { /// </summary> public class FileWithDialogDestination : AbstractDestination { private static ILog LOG = LogManager.GetLogger(typeof(FileWithDialogDestination)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); public const string DESIGNATION = "FileDialog"; public override string Designation { diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index bc4ce8af0..ec37b8bcf 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -28,18 +28,14 @@ using Greenshot.Configuration; using GreenshotPlugin.Core; using Greenshot.Plugin; using Greenshot.Helpers; -using Greenshot.IniFile; -using log4net; namespace Greenshot.Destinations { /// <summary> /// Description of PrinterDestination. /// </summary> public class PrinterDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(PrinterDestination)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); public const string DESIGNATION = "Printer"; - public string printerName = null; + public string printerName; public PrinterDestination() { } diff --git a/Greenshot/Drawing/ArrowContainer.cs b/Greenshot/Drawing/ArrowContainer.cs index f1c65ff53..57c2fe8c1 100644 --- a/Greenshot/Drawing/ArrowContainer.cs +++ b/Greenshot/Drawing/ArrowContainer.cs @@ -79,7 +79,7 @@ namespace Greenshot.Drawing { Top + currentStep + Height); currentStep++; - alpha = alpha - (basealpha / steps); + alpha = alpha - basealpha / steps; } } diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs index 3911d5940..2b5969c92 100644 --- a/Greenshot/Drawing/CursorContainer.cs +++ b/Greenshot/Drawing/CursorContainer.cs @@ -33,7 +33,7 @@ namespace Greenshot.Drawing { /// </summary> [Serializable] public class CursorContainer : DrawableContainer, ICursorContainer { - private static ILog LOG = LogManager.GetLogger(typeof(CursorContainer)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(CursorContainer)); protected Cursor cursor; diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index aa4ffce43..9b3a10952 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -46,10 +46,8 @@ namespace Greenshot.Drawing { public abstract class DrawableContainer : AbstractFieldHolderWithChildren, IDrawableContainer { private static readonly ILog LOG = LogManager.GetLogger(typeof(DrawableContainer)); protected static readonly EditorConfiguration EditorConfig = IniConfig.GetIniSection<EditorConfiguration>(); - private bool isMadeUndoable; + private bool _isMadeUndoable; private const int M11 = 0; - private const int M12 = 1; - private const int M21 = 2; private const int M22 = 3; @@ -305,7 +303,7 @@ namespace Greenshot.Drawing { Left = _parent.Width - Width - lineThickness/2; } if (horizontalAlignment == HorizontalAlignment.Center) { - Left = (_parent.Width / 2) - (Width / 2) - lineThickness/2; + Left = _parent.Width / 2 - Width / 2 - lineThickness/2; } if (verticalAlignment == VerticalAlignment.TOP) { @@ -315,7 +313,7 @@ namespace Greenshot.Drawing { Top = _parent.Height - Height - lineThickness/2; } if (verticalAlignment == VerticalAlignment.CENTER) { - Top = (_parent.Height / 2) - (Height / 2) - lineThickness/2; + Top = _parent.Height / 2 - Height / 2 - lineThickness/2; } } @@ -455,7 +453,7 @@ namespace Greenshot.Drawing { } else { Status = EditStatus.MOVING; } - isMadeUndoable = false; + _isMadeUndoable = false; } private void GripperMouseUp(object sender, MouseEventArgs e) { @@ -463,7 +461,7 @@ namespace Greenshot.Drawing { if (originatingGripper != _targetGripper) { _boundsBeforeResize = Rectangle.Empty; _boundsAfterResize = RectangleF.Empty; - isMadeUndoable = false; + _isMadeUndoable = false; } Status = EditStatus.IDLE; Invalidate(); @@ -478,9 +476,9 @@ namespace Greenshot.Drawing { TargetGripperMove(absX, absY); } else if (Status.Equals(EditStatus.RESIZING)) { // check if we already made this undoable - if (!isMadeUndoable) { + if (!_isMadeUndoable) { // don't allow another undo until we are finished with this move - isMadeUndoable = true; + _isMadeUndoable = true; // Make undo-able MakeBoundsChangeUndoable(false); } @@ -699,6 +697,8 @@ namespace Greenshot.Drawing { } public override int GetHashCode() { + // TODO: This actually doesn't make sense... + // Place the container in a list, and you can't find it :) return left.GetHashCode() ^ top.GetHashCode() ^ width.GetHashCode() ^ height.GetHashCode() ^ GetFields().GetHashCode(); } diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 570949a40..46daf9773 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -322,7 +322,7 @@ namespace Greenshot.Drawing { if (!elements.Contains(dc)) { continue; } - if (Count > (i+1) && !elements.Contains(this[i+1])) { + if (Count > i+1 && !elements.Contains(this[i+1])) { SwapElements(i,i+1); } } @@ -468,7 +468,7 @@ namespace Greenshot.Drawing { // Copy item = new ToolStripMenuItem(Language.GetString(LangKey.editor_copytoclipboard)); - item.Image = ((Image)(editorFormResources.GetObject("copyToolStripMenuItem.Image"))); + item.Image = (Image)editorFormResources.GetObject("copyToolStripMenuItem.Image"); item.Click += delegate { ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), this); }; @@ -476,7 +476,7 @@ namespace Greenshot.Drawing { // Cut item = new ToolStripMenuItem(Language.GetString(LangKey.editor_cuttoclipboard)); - item.Image = ((Image)(editorFormResources.GetObject("btnCut.Image"))); + item.Image = (Image)editorFormResources.GetObject("btnCut.Image"); item.Click += delegate { ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), this); List<DrawableContainer> containersToDelete = new List<DrawableContainer>(); @@ -492,7 +492,7 @@ namespace Greenshot.Drawing { // Delete item = new ToolStripMenuItem(Language.GetString(LangKey.editor_deleteelement)); - item.Image = ((Image)(editorFormResources.GetObject("removeObjectToolStripMenuItem.Image"))); + item.Image = (Image)editorFormResources.GetObject("removeObjectToolStripMenuItem.Image"); item.Click += delegate { List<DrawableContainer> containersToDelete = new List<DrawableContainer>(); foreach(var drawableContainer in this) { diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs index caf41824b..c4fe278e1 100644 --- a/Greenshot/Drawing/EllipseContainer.cs +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -59,12 +59,15 @@ namespace Greenshot.Drawing { /// <summary> /// This allows another container to draw an ellipse /// </summary> - /// <param name="caller"></param> + /// <param name="rect"></param> /// <param name="graphics"></param> /// <param name="renderMode"></param> + /// <param name="lineThickness"></param> + /// <param name="lineColor"></param> + /// <param name="fillColor"></param> + /// <param name="shadow"></param> public static void DrawEllipse(Rectangle rect, Graphics graphics, RenderMode renderMode, int lineThickness, Color lineColor, Color fillColor, bool shadow) { - - bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); // draw shadow before anything else if (shadow && (lineVisible || Colors.IsVisible(fillColor))) { int basealpha = 100; diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 0f8df4937..4bb0316fb 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -34,7 +34,7 @@ namespace Greenshot.Drawing.Fields { [Serializable] public abstract class AbstractFieldHolder : IFieldHolder { private static readonly ILog LOG = LogManager.GetLogger(typeof(AbstractFieldHolder)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); /// <summary> /// called when a field's value has changed @@ -50,10 +50,8 @@ namespace Greenshot.Drawing.Fields { // this allows us to use default serialization [NonSerialized] private Dictionary<FieldType, Field> fieldsByType = new Dictionary<FieldType, Field>(); - private List<Field> fields = new List<Field>(); - - public AbstractFieldHolder() {} - + private readonly List<Field> fields = new List<Field>(); + [OnDeserialized] private void OnDeserialized(StreamingContext context) { fieldsByType = new Dictionary<FieldType, Field>(); diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index b919edd9b..3114ffc46 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -30,8 +30,7 @@ namespace Greenshot.Drawing.Fields { /// </summary> [Serializable()] public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder { - - FieldChangedEventHandler fieldChangedEventHandler; + readonly FieldChangedEventHandler fieldChangedEventHandler; [NonSerialized] private EventHandler childrenChanged; diff --git a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs index da43dd6f3..5c31e0286 100644 --- a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs @@ -26,8 +26,6 @@ namespace Greenshot.Drawing.Fields.Binding { /// </summary> public abstract class AbstractBindingConverter<T1,T2> : IBindingConverter { - public AbstractBindingConverter() {} - public object convert(object o) { if(o == null) { return null; diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs index 21ebeb1ef..ca109731a 100644 --- a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -29,35 +29,35 @@ namespace Greenshot.Drawing.Fields.Binding { /// behavior (e.g. when binding to a /// </summary> public class BidirectionalBinding { - private INotifyPropertyChanged controlObject; - private INotifyPropertyChanged fieldObject; - private string controlPropertyName; - private string fieldPropertyName; - private bool updatingControl = false; - private bool updatingField = false; - private IBindingConverter converter; - private IBindingValidator validator; + private readonly INotifyPropertyChanged _controlObject; + private readonly INotifyPropertyChanged _fieldObject; + private readonly string _controlPropertyName; + private readonly string _fieldPropertyName; + private bool _updatingControl; + private bool _updatingField; + private IBindingConverter _converter; + private readonly IBindingValidator _validator; /// <summary> /// Whether or not null values are passed on to the other object. /// </summary> protected bool AllowSynchronizeNull = true; - + /// <summary> /// Bind properties of two objects bidirectionally /// </summary> - /// <param name="object1">Object containing 1st property to bind</param> - /// <param name="property1">Property of 1st object to bind</param> - /// <param name="object2">Object containing 2nd property to bind</param> - /// <param name="property2">Property of 2nd object to bind</param> + /// <param name="controlObject">Object containing 1st property to bind</param> + /// <param name="controlPropertyName">Property of 1st object to bind</param> + /// <param name="fieldObject">Object containing 2nd property to bind</param> + /// <param name="fieldPropertyName">Property of 2nd object to bind</param> public BidirectionalBinding(INotifyPropertyChanged controlObject, string controlPropertyName, INotifyPropertyChanged fieldObject, string fieldPropertyName) { - this.controlObject = controlObject; - this.fieldObject = fieldObject; - this.controlPropertyName = controlPropertyName; - this.fieldPropertyName = fieldPropertyName; + _controlObject = controlObject; + _fieldObject = fieldObject; + _controlPropertyName = controlPropertyName; + _fieldPropertyName = fieldPropertyName; - this.controlObject.PropertyChanged += ControlPropertyChanged; - this.fieldObject.PropertyChanged += FieldPropertyChanged; + _controlObject.PropertyChanged += ControlPropertyChanged; + _fieldObject.PropertyChanged += FieldPropertyChanged; } /// <summary> @@ -69,7 +69,7 @@ namespace Greenshot.Drawing.Fields.Binding { /// <param name="fieldPropertyName">Property of 2nd object to bind</param> /// <param name="converter">taking care of converting the synchronized value to the correct target format and back</param> public BidirectionalBinding(INotifyPropertyChanged controlObject, string controlPropertyName, INotifyPropertyChanged fieldObject, string fieldPropertyName, IBindingConverter converter) : this(controlObject, controlPropertyName, fieldObject, fieldPropertyName) { - this.converter = converter; + _converter = converter; } /// <summary> @@ -82,7 +82,7 @@ namespace Greenshot.Drawing.Fields.Binding { /// <param name="fieldPropertyName">Property of 2nd object to bind</param> /// <param name="validator">validator to intercept synchronization if the value does not match certain criteria</param> public BidirectionalBinding(INotifyPropertyChanged controlObject, string controlPropertyName, INotifyPropertyChanged fieldObject, string fieldPropertyName, IBindingValidator validator) : this(controlObject, controlPropertyName, fieldObject, fieldPropertyName) { - this.validator = validator; + _validator = validator; } /// <summary> @@ -96,46 +96,46 @@ namespace Greenshot.Drawing.Fields.Binding { /// <param name="converter">taking care of converting the synchronized value to the correct target format and back</param> /// <param name="validator">validator to intercept synchronization if the value does not match certain criteria</param> public BidirectionalBinding(INotifyPropertyChanged controlObject, string controlPropertyName, INotifyPropertyChanged fieldObject, string fieldPropertyName, IBindingConverter converter, IBindingValidator validator) : this(controlObject, controlPropertyName, fieldObject, fieldPropertyName, converter) { - this.validator = validator; + _validator = validator; } public void ControlPropertyChanged(object sender, PropertyChangedEventArgs e) { - if (!updatingControl && e.PropertyName.Equals(controlPropertyName)) { - updatingField = true; - synchronize(controlObject, controlPropertyName, fieldObject, fieldPropertyName); - updatingField = false; + if (!_updatingControl && e.PropertyName.Equals(_controlPropertyName)) { + _updatingField = true; + Synchronize(_controlObject, _controlPropertyName, _fieldObject, _fieldPropertyName); + _updatingField = false; } } public void FieldPropertyChanged(object sender, PropertyChangedEventArgs e) { - if (!updatingField && e.PropertyName.Equals(fieldPropertyName)) { - updatingControl = true; - synchronize(fieldObject, fieldPropertyName, controlObject, controlPropertyName); - updatingControl = false; + if (!_updatingField && e.PropertyName.Equals(_fieldPropertyName)) { + _updatingControl = true; + Synchronize(_fieldObject, _fieldPropertyName, _controlObject, _controlPropertyName); + _updatingControl = false; } } - private void synchronize(INotifyPropertyChanged sourceObject, string sourceProperty, INotifyPropertyChanged targetObject, string targetProperty) { - PropertyInfo targetPropertyInfo = resolvePropertyInfo(targetObject, targetProperty); - PropertyInfo sourcePropertyInfo = resolvePropertyInfo(sourceObject, sourceProperty); + 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); + if (_converter != null && bValue != null) { + bValue = _converter.convert(bValue); } try { - if (validator == null || validator.validate(bValue)) { + 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); + 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) { + private static PropertyInfo ResolvePropertyInfo(object obj, string property) { PropertyInfo ret = null; string[] properties = property.Split(".".ToCharArray()); for(int i=0; i<properties.Length; i++) { @@ -149,8 +149,8 @@ namespace Greenshot.Drawing.Fields.Binding { } public IBindingConverter Converter { - get { return converter; } - set { converter = value; } + get { return _converter; } + set { _converter = value; } } } diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 1d9e8b6bf..476233f73 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -25,7 +25,6 @@ using System.ComponentModel; using Greenshot.Configuration; using Greenshot.IniFile; using Greenshot.Plugin.Drawing; -using log4net; namespace Greenshot.Drawing.Fields { /// <summary> @@ -41,13 +40,10 @@ namespace Greenshot.Drawing.Fields { /// </summary> public class FieldAggregator : AbstractFieldHolder { - private List<IDrawableContainer> boundContainers; - private bool internalUpdateRunning = false; - - enum Status {IDLE, BINDING, UPDATING}; - - private static readonly ILog LOG = LogManager.GetLogger(typeof(FieldAggregator)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private readonly List<IDrawableContainer> boundContainers; + private bool internalUpdateRunning; + + private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); public FieldAggregator() { foreach(FieldType fieldType in FieldType.Values) { diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs index 630c5c35d..7e6b2336e 100644 --- a/Greenshot/Drawing/FilterContainer.cs +++ b/Greenshot/Drawing/FilterContainer.cs @@ -52,7 +52,7 @@ namespace Greenshot.Drawing { int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); if (lineVisible) { graphics.SmoothingMode = SmoothingMode.HighSpeed; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; @@ -69,7 +69,7 @@ namespace Greenshot.Drawing { Rectangle shadowRect = GuiRectangle.GetGuiRectangle(Left + currentStep, Top + currentStep, Width, Height); graphics.DrawRectangle(shadowPen, shadowRect); currentStep++; - alpha = alpha - (basealpha / steps); + alpha = alpha - basealpha / steps; } } } diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index cd1be85a2..e34f61008 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -41,7 +41,7 @@ namespace Greenshot.Drawing.Filters { remove{ propertyChanged -= value; } } - private bool invert = false; + private bool invert; public bool Invert { get { return invert; diff --git a/Greenshot/Drawing/Filters/BlurFilter.cs b/Greenshot/Drawing/Filters/BlurFilter.cs index 1b2e6ab68..1b9ddf5a0 100644 --- a/Greenshot/Drawing/Filters/BlurFilter.cs +++ b/Greenshot/Drawing/Filters/BlurFilter.cs @@ -18,6 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + using System; using System.Drawing; using Greenshot.Drawing.Fields; @@ -25,13 +26,10 @@ using Greenshot.Plugin.Drawing; using GreenshotPlugin.Core; using GreenshotPlugin.UnmanagedHelpers; using System.Drawing.Drawing2D; -using log4net; namespace Greenshot.Drawing.Filters { [Serializable()] public class BlurFilter : AbstractFilter { - private static ILog LOG = LogManager.GetLogger(typeof(BlurFilter)); - public double previewQuality; public double PreviewQuality { get { return previewQuality; } @@ -43,7 +41,7 @@ namespace Greenshot.Drawing.Filters { AddField(GetType(), FieldType.PREVIEW_QUALITY, 1.0d); } - public unsafe override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { + public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { int blurRadius = GetFieldValueAsInt(FieldType.BLUR_RADIUS); Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (applyRect.Width == 0 || applyRect.Height == 0) { @@ -54,7 +52,7 @@ namespace Greenshot.Drawing.Filters { graphics.SetClip(applyRect); graphics.ExcludeClip(rect); } - if (GDIplus.isBlurPossible(blurRadius)) { + if (GDIplus.IsBlurPossible(blurRadius)) { GDIplus.DrawWithBlur(graphics, applyBitmap, applyRect, null, null, blurRadius, false); } else { using (IFastBitmap fastBitmap = FastBitmap.CreateCloneOf(applyBitmap, applyRect)) { @@ -63,7 +61,6 @@ namespace Greenshot.Drawing.Filters { } } graphics.Restore(state); - return; } } } diff --git a/Greenshot/Drawing/Filters/MagnifierFilter.cs b/Greenshot/Drawing/Filters/MagnifierFilter.cs index 23359546e..c9944b7c3 100644 --- a/Greenshot/Drawing/Filters/MagnifierFilter.cs +++ b/Greenshot/Drawing/Filters/MagnifierFilter.cs @@ -53,7 +53,7 @@ namespace Greenshot.Drawing.Filters { int halfHeight = rect.Height / 2; int newWidth = rect.Width / magnificationFactor; int newHeight = rect.Height / magnificationFactor; - Rectangle source = new Rectangle(rect.X + halfWidth - (newWidth / 2), rect.Y + halfHeight - (newHeight / 2), newWidth, newHeight); + Rectangle source = new Rectangle(rect.X + halfWidth - newWidth / 2, rect.Y + halfHeight - newHeight / 2, newWidth, newHeight); graphics.DrawImage(applyBitmap, rect, source, GraphicsUnit.Pixel); graphics.Restore(state); } diff --git a/Greenshot/Drawing/Filters/PixelizationFilter.cs b/Greenshot/Drawing/Filters/PixelizationFilter.cs index a7f13c096..78e49253f 100644 --- a/Greenshot/Drawing/Filters/PixelizationFilter.cs +++ b/Greenshot/Drawing/Filters/PixelizationFilter.cs @@ -37,7 +37,7 @@ namespace Greenshot.Drawing.Filters { public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) { int pixelSize = GetFieldValueAsInt(FieldType.PIXEL_SIZE); - Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); + ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (pixelSize <= 1 || rect.Width == 0 || rect.Height == 0) { // Nothing to do return; diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index b30937c2b..5294f5bd5 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -22,7 +22,6 @@ using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Plugin.Drawing; -using log4net; using System; using System.Collections.Generic; using System.Drawing; @@ -35,15 +34,14 @@ namespace Greenshot.Drawing { /// </summary> [Serializable] public class FreehandContainer : DrawableContainer { - private static readonly ILog LOG = LogManager.GetLogger(typeof(FreehandContainer)); private static readonly float [] POINT_OFFSET = new float[]{0.5f, 0.25f, 0.75f}; [NonSerialized] private GraphicsPath freehandPath = new GraphicsPath(); private Rectangle myBounds = Rectangle.Empty; private Point lastMouse = Point.Empty; - private List<Point> capturePoints = new List<Point>(); - private bool isRecalculated = false; + private readonly List<Point> capturePoints = new List<Point>(); + private bool isRecalculated; /// <summary> /// Constructor @@ -119,7 +117,7 @@ namespace Greenshot.Drawing { public override bool HandleMouseMove(int mouseX, int mouseY) { Point previousPoint = capturePoints[capturePoints.Count-1]; - if (GeometryHelper.Distance2D(previousPoint.X, previousPoint.Y, mouseX, mouseY) >= (2*EditorConfig.FreehandSensitivity)) { + if (GeometryHelper.Distance2D(previousPoint.X, previousPoint.Y, mouseX, mouseY) >= 2*EditorConfig.FreehandSensitivity) { capturePoints.Add(new Point(mouseX, mouseY)); } if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) >= EditorConfig.FreehandSensitivity) { @@ -232,7 +230,7 @@ namespace Greenshot.Drawing { if (!myBounds.IsEmpty) { int lineThickness = Math.Max(10, GetFieldValueAsInt(FieldType.LINE_THICKNESS)); int safetymargin = 10; - return new Rectangle((myBounds.Left + Left) - (safetymargin+lineThickness), (myBounds.Top + Top) - (safetymargin+lineThickness), myBounds.Width + (2*(lineThickness+safetymargin)), myBounds.Height + (2*(lineThickness+safetymargin))); + return new Rectangle(myBounds.Left + Left - (safetymargin+lineThickness), myBounds.Top + Top - (safetymargin+lineThickness), myBounds.Width + 2*(lineThickness+safetymargin), myBounds.Height + 2*(lineThickness+safetymargin)); } return new Rectangle(0, 0, _parent.Width, _parent.Height); } diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index 86b82a46f..846ee3cde 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -31,7 +31,7 @@ namespace Greenshot.Drawing { /// </summary> [Serializable] public class IconContainer : DrawableContainer, IIconContainer { - private static ILog LOG = LogManager.GetLogger(typeof(IconContainer)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(IconContainer)); protected Icon icon; diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index b9f9c6dc3..25894af74 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -34,7 +34,7 @@ namespace Greenshot.Drawing { /// </summary> [Serializable] public class ImageContainer : DrawableContainer, IImageContainer { - private static ILog LOG = LogManager.GetLogger(typeof(ImageContainer)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageContainer)); private Image image; diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index 4189134ac..b11486901 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -86,7 +86,7 @@ namespace Greenshot.Drawing { Top + currentStep + Height); currentStep++; - alpha = alpha - (basealpha / steps); + alpha = alpha - basealpha / steps; } } } diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index c235346c5..933adb180 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -69,7 +69,7 @@ namespace Greenshot.Drawing { graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.None; - bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); if (shadow && (lineVisible || Colors.IsVisible(fillColor))) { //draw shadow first int basealpha = 100; @@ -86,7 +86,7 @@ namespace Greenshot.Drawing { rect.Height); graphics.DrawRectangle(shadowPen, shadowRect); currentStep++; - alpha = alpha - (basealpha / steps); + alpha = alpha - basealpha / steps; } } } diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs index 51ea777ff..1eaa7485f 100644 --- a/Greenshot/Drawing/RoundedRectangle.cs +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -35,13 +35,13 @@ namespace Greenshot.Drawing { 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.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(); diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index 64ede51e8..eef5e8ef6 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -180,7 +180,7 @@ namespace Greenshot.Drawing { private GraphicsPath CreateTail() { Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Left, TargetGripper.Top); + int tailLength = GeometryHelper.Distance2D(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2, TargetGripper.Left, TargetGripper.Top); int tailWidth = (Math.Abs(rect.Width) + Math.Abs(rect.Height)) / 20; // This should fix a problem with the tail being to wide @@ -192,10 +192,10 @@ namespace Greenshot.Drawing { tail.AddLine(tailWidth, 0, 0, -tailLength); tail.CloseFigure(); - int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Left, TargetGripper.Top); + int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2, TargetGripper.Left, TargetGripper.Top); using (Matrix tailMatrix = new Matrix()) { - tailMatrix.Translate(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2)); + tailMatrix.Translate(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2); tailMatrix.Rotate(tailAngle); tail.Transform(tailMatrix); } @@ -223,7 +223,7 @@ namespace Greenshot.Drawing { bool shadow = GetFieldValueAsBool(FieldType.SHADOW); int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); - bool lineVisible = (lineThickness > 0 && Colors.IsVisible(lineColor)); + bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); if (Selected && renderMode == RenderMode.EDIT) { @@ -253,7 +253,7 @@ namespace Greenshot.Drawing { graphics.DrawPath(shadowPen, bubbleClone); } currentStep++; - alpha = alpha - (basealpha / steps); + alpha = alpha - basealpha / steps; } } } diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 79583c5ab..e42076c82 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -118,7 +118,7 @@ namespace Greenshot.Drawing { /// This makes it possible for the label to be placed exactly in the middle of the pointer. /// </summary> public override bool HandleMouseDown(int mouseX, int mouseY) { - return base.HandleMouseDown(mouseX - (Width / 2), mouseY - (Height / 2)); + return base.HandleMouseDown(mouseX - Width / 2, mouseY - Height / 2); } /// <summary> @@ -146,8 +146,8 @@ namespace Greenshot.Drawing { public override bool HandleMouseMove(int x, int y) { Invalidate(); - Left = x - (Width / 2); - Top = y - (Height / 2); + Left = x - Width / 2; + Top = y - Height / 2; Invalidate(); return true; } @@ -167,7 +167,7 @@ namespace Greenshot.Drawing { int widthAfter = rect.Width; int heightAfter = rect.Height; - float factor = (((float)widthAfter / widthBefore) + ((float)heightAfter / heightBefore)) / 2; + float factor = ((float)widthAfter / widthBefore + (float)heightAfter / heightBefore) / 2; fontSize *= factor; } diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index b28e2a86f..22c1aea93 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -46,9 +46,9 @@ namespace Greenshot.Drawing { /// Description of Surface. /// </summary> public class Surface : Control, ISurface { - private static ILog LOG = LogManager.GetLogger(typeof(Surface)); - public static int Count = 0; - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(Surface)); + public static int Count; + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); // Property to identify the Surface ID private Guid _uniqueId = Guid.NewGuid(); @@ -169,7 +169,7 @@ namespace Greenshot.Drawing { /// all selected elements, do not serialize /// </summary> [NonSerialized] - private DrawableContainerList selectedElements; + private readonly DrawableContainerList selectedElements; /// <summary> /// the element we are drawing with, do not serialize @@ -208,7 +208,7 @@ namespace Greenshot.Drawing { /// <summary> /// all stepLabels for the surface, needed with serialization /// </summary> - private List<StepLabelContainer> _stepLabels = new List<StepLabelContainer>(); + private readonly List<StepLabelContainer> _stepLabels = new List<StepLabelContainer>(); public void AddStepLabel(StepLabelContainer stepLabel) { _stepLabels.Add(stepLabel); @@ -225,7 +225,7 @@ namespace Greenshot.Drawing { public int CountStepLabels(IDrawableContainer stopAtContainer) { int number = 1; foreach (var possibleThis in _stepLabels) { - if (possibleThis == stopAtContainer) { + if (possibleThis.Equals(stopAtContainer)) { break; } if (IsOnSurface(possibleThis)) { @@ -1037,7 +1037,10 @@ namespace Greenshot.Drawing { _drawingElement = _undrawnElement; // if a new element has been drawn, set location and register it if (_drawingElement != null) { - _drawingElement.Status = _undrawnElement.DefaultEditMode; + if (_undrawnElement != null) + { + _drawingElement.Status = _undrawnElement.DefaultEditMode; + } _drawingElement.PropertyChanged += ElementPropertyChanged; if (!_drawingElement.HandleMouseDown(_mouseStart.X, _mouseStart.Y)) { _drawingElement.Left = _mouseStart.X; @@ -1331,7 +1334,7 @@ namespace Greenshot.Drawing { /// <returns></returns> public bool HasSelectedElements { get { - return (selectedElements != null && selectedElements.Count > 0); + return selectedElements != null && selectedElements.Count > 0; } } @@ -1387,6 +1390,10 @@ namespace Greenshot.Drawing { public void ConfirmSelectedConfirmableElements(bool confirm){ // create new collection so that we can iterate safely (selectedElements might change due with confirm/cancel) List<IDrawableContainer> selectedDCs = new List<IDrawableContainer>(selectedElements); + if (_cropContainer == null) + { + return; + } foreach (IDrawableContainer dc in selectedDCs){ if (dc.Equals(_cropContainer)){ DrawingMode = DrawingModes.None; @@ -1397,6 +1404,7 @@ namespace Greenshot.Drawing { } _cropContainer.Dispose(); _cropContainer = null; + break; } } } @@ -1423,7 +1431,7 @@ namespace Greenshot.Drawing { if (dcs != null) { // Make element(s) only move 10,10 if the surface is the same Point moveOffset; - bool isSameSurface = (dcs.ParentID == _uniqueId); + bool isSameSurface = dcs.ParentID == _uniqueId; dcs.Parent = this; if (isSameSurface) { moveOffset = new Point(10, 10); diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 110c40775..f02ecbf39 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -332,8 +332,8 @@ namespace Greenshot.Drawing { if (lineThickness <= 1) { lineWidth = 0; } - _textBox.Width = absRectangle.Width - (2 * lineWidth) + correction; - _textBox.Height = absRectangle.Height - (2 * lineWidth) + correction; + _textBox.Width = absRectangle.Width - 2 * lineWidth + correction; + _textBox.Height = absRectangle.Height - 2 * lineWidth + correction; } public override void ApplyBounds(RectangleF newBounds) { @@ -415,7 +415,7 @@ namespace Greenshot.Drawing { /// <param name="text"></param> /// <param name="font"></param> public static void DrawText(Graphics graphics, Rectangle drawingRectange, int lineThickness, Color fontColor, bool drawShadow, StringFormat stringFormat, string text, Font font) { - int textOffset = (lineThickness > 0) ? (int)Math.Ceiling(lineThickness / 2d) : 0; + int textOffset = lineThickness > 0 ? (int)Math.Ceiling(lineThickness / 2d) : 0; // draw shadow before anything else if (drawShadow) { int basealpha = 100; diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index 64934dea0..f330dcfd6 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -41,21 +41,21 @@ namespace Greenshot { /// The about form /// </summary> public partial class AboutForm : AnimatingBaseForm { - private static ILog LOG = LogManager.GetLogger(typeof(AboutForm)); - private Bitmap gBitmap; - private ColorAnimator backgroundAnimation; - private List<RectangleAnimator> pixels = new List<RectangleAnimator>(); - private List<Color> colorFlow = new List<Color>(); - private List<Color> pixelColors = new List<Color>(); - private Random rand = new Random(); - private readonly Color backColor = Color.FromArgb(61, 61, 61); - private readonly Color pixelColor = Color.FromArgb(138, 255, 0); + private static readonly ILog LOG = LogManager.GetLogger(typeof(AboutForm)); + private Bitmap _bitmap; + private readonly ColorAnimator _backgroundAnimation; + private readonly IList<RectangleAnimator> _pixels = new List<RectangleAnimator>(); + private readonly IList<Color> _colorFlow = new List<Color>(); + private readonly IList<Color> _pixelColors = new List<Color>(); + private readonly Random _rand = new Random(); + private readonly Color _backColor = Color.FromArgb(61, 61, 61); + private readonly Color _pixelColor = Color.FromArgb(138, 255, 0); // Variables used for the color-cycle - private int waitFrames = 0; - private int colorIndex = 0; - private int scrollCount = 0; - private bool hasAnimationsLeft; + private int _waitFrames; + private int _colorIndex; + private int _scrollCount; + private bool _hasAnimationsLeft; // Variables are used to define the location of the dots private const int w = 13; @@ -70,7 +70,7 @@ namespace Greenshot { /// <summary> /// The location of every dot in the "G" /// </summary> - private List<Point> gSpots = new List<Point>() { + private readonly List<Point> gSpots = new List<Point>() { // Top row new Point(p2, p1), // 0 new Point(p3, p1), // 1 @@ -116,15 +116,15 @@ namespace Greenshot { // 18 19 20 21 22 23 // The order in which we draw the dots & flow the collors. - List<int> flowOrder = new List<int>() { 4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 22, 23, 16, 17, 13, 12, 11 }; + readonly List<int> flowOrder = new List<int>() { 4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 22, 23, 16, 17, 13, 12, 11 }; /// <summary> /// Cleanup all the allocated resources /// </summary> private void Cleanup(object sender, EventArgs e) { - if (gBitmap != null) { - gBitmap.Dispose(); - gBitmap = null; + if (_bitmap != null) { + _bitmap.Dispose(); + _bitmap = null; } } @@ -144,22 +144,22 @@ namespace Greenshot { InitializeComponent(); // Only use double-buffering when we are NOT in a Terminal Server session - DoubleBuffered = !isTerminalServerSession; + DoubleBuffered = !IsTerminalServerSession; // Use the self drawn image, first we create the background to be the backcolor (as we animate from this) - gBitmap = ImageHelper.CreateEmpty(90, 90, PixelFormat.Format24bppRgb, BackColor, 96, 96); - pictureBox1.Image = gBitmap; + _bitmap = ImageHelper.CreateEmpty(90, 90, PixelFormat.Format24bppRgb, BackColor, 96, 96); + pictureBox1.Image = _bitmap; 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 + (IniConfig.IsPortable ? " Portable" : "") + (" (" + OSInfo.Bits + " bit)"); + lblTitle.Text = "Greenshot " + v.Major + "." + v.Minor + "." + v.Build + " Build " + v.Revision + (IniConfig.IsPortable ? " Portable" : "") + (" (" + OSInfo.Bits) + " bit)"; //Random rand = new Random(); // Number of frames the pixel animation takes int frames = FramesForMillis(2000); // The number of frames the color-cycle waits before it starts - waitFrames = FramesForMillis(6000); + _waitFrames = FramesForMillis(6000); // Every pixel is created after pixelWaitFrames frames, which is increased in the loop. int pixelWaitFrames = FramesForMillis(2000); @@ -174,7 +174,7 @@ namespace Greenshot { int offset = (w - 2) / 2; // If the optimize for Terminal Server is set we make the animation without much ado - if (isTerminalServerSession) { + if (IsTerminalServerSession) { // No animation pixelAnimation = new RectangleAnimator(new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), new Rectangle(gSpot.X, gSpot.Y, w - 2, w - 2), 1, EasingType.Cubic, EasingMode.EaseIn); } else { @@ -187,23 +187,23 @@ namespace Greenshot { // Increase the wait frames pixelWaitFrames += FramesForMillis(100); // Add to the list of to be animated pixels - pixels.Add(pixelAnimation); + _pixels.Add(pixelAnimation); // Add a color to the list for this pixel. - pixelColors.Add(pixelColor); + _pixelColors.Add(_pixelColor); } // Make sure the frame "loop" knows we have to animate - hasAnimationsLeft = true; + _hasAnimationsLeft = true; // Pixel Color cycle colors, here we use a pre-animated loop which stores the values. - ColorAnimator pixelColorAnimator = new ColorAnimator(pixelColor, Color.FromArgb(255, 255, 255), 6, EasingType.Quadratic, EasingMode.EaseIn); - pixelColorAnimator.QueueDestinationLeg(pixelColor, 6, EasingType.Quadratic, EasingMode.EaseOut); + ColorAnimator pixelColorAnimator = new ColorAnimator(_pixelColor, Color.FromArgb(255, 255, 255), 6, EasingType.Quadratic, EasingMode.EaseIn); + pixelColorAnimator.QueueDestinationLeg(_pixelColor, 6, EasingType.Quadratic, EasingMode.EaseOut); do { - colorFlow.Add(pixelColorAnimator.Current); + _colorFlow.Add(pixelColorAnimator.Current); pixelColorAnimator.Next(); - } while (pixelColorAnimator.hasNext); + } while (pixelColorAnimator.HasNext); // color animation for the background - backgroundAnimation = new ColorAnimator(BackColor, backColor, FramesForMillis(5000), EasingType.Linear, EasingMode.EaseIn); + _backgroundAnimation = new ColorAnimator(BackColor, _backColor, FramesForMillis(5000), EasingType.Linear, EasingMode.EaseIn); } /// <summary> @@ -227,63 +227,63 @@ namespace Greenshot { /// Called from the AnimatingForm, for every frame /// </summary> protected override void Animate() { - if (gBitmap == null) { + if (_bitmap == null) { return; } - if (!isTerminalServerSession) { + if (!IsTerminalServerSession) { // Color cycle - if (waitFrames != 0) { - waitFrames--; + if (_waitFrames != 0) { + _waitFrames--; // Check if there is something else to do, if not we return so we don't occupy the CPU - if (!hasAnimationsLeft) { + if (!_hasAnimationsLeft) { return; } - } else if (scrollCount < (pixelColors.Count + colorFlow.Count)) { + } else if (_scrollCount < _pixelColors.Count + _colorFlow.Count) { // Scroll colors, the scrollCount is the amount of pixels + the amount of colors to cycle. - for (int index = pixelColors.Count - 1; index > 0; index--) { - pixelColors[index] = pixelColors[index - 1]; + for (int index = _pixelColors.Count - 1; index > 0; index--) { + _pixelColors[index] = _pixelColors[index - 1]; } // Keep adding from the colors to cycle until there is nothing left - if (colorIndex < colorFlow.Count) { - pixelColors[0] = colorFlow[colorIndex++]; + if (_colorIndex < _colorFlow.Count) { + _pixelColors[0] = _colorFlow[_colorIndex++]; } - scrollCount++; + _scrollCount++; } else { // Reset values, wait X time for the next one - waitFrames = FramesForMillis(3000 + rand.Next(35000)); - colorIndex = 0; - scrollCount = 0; + _waitFrames = FramesForMillis(3000 + _rand.Next(35000)); + _colorIndex = 0; + _scrollCount = 0; // Check if there is something else to do, if not we return so we don't occupy the CPU - if (!hasAnimationsLeft) { + if (!_hasAnimationsLeft) { return; } } - } else if (!hasAnimationsLeft) { + } else if (!_hasAnimationsLeft) { return; } // Draw the "G" - using (Graphics graphics = Graphics.FromImage(gBitmap)) { + using (Graphics graphics = Graphics.FromImage(_bitmap)) { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; - graphics.Clear(backgroundAnimation.Next()); + graphics.Clear(_backgroundAnimation.Next()); graphics.TranslateTransform(2, -2); graphics.RotateTransform(20); - using (SolidBrush brush = new SolidBrush(pixelColor)) { + using (SolidBrush brush = new SolidBrush(_pixelColor)) { int index = 0; // We asume there is nothing to animate in the next Animate loop - hasAnimationsLeft = false; + _hasAnimationsLeft = false; // Pixels of the G - foreach (RectangleAnimator pixel in pixels) { - brush.Color = pixelColors[index++]; + foreach (RectangleAnimator pixel in _pixels) { + brush.Color = _pixelColors[index++]; graphics.FillEllipse(brush, pixel.Current); // If a pixel still has frames left, the hasAnimationsLeft will be true - hasAnimationsLeft = hasAnimationsLeft | pixel.hasNext; + _hasAnimationsLeft = _hasAnimationsLeft | pixel.HasNext; pixel.Next(); } } diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 528cd6515..3c6398ac5 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -61,9 +61,9 @@ namespace Greenshot.Forms { private int _mX; private int _mY; private Point _mouseMovePos = Point.Empty; - private Point _cursorPos = Point.Empty; - private CaptureMode _captureMode = CaptureMode.None; - private readonly List<WindowDetails> _windows = new List<WindowDetails>(); + private Point _cursorPos; + private CaptureMode _captureMode; + private readonly List<WindowDetails> _windows; private WindowDetails _selectedCaptureWindow; private bool _mouseDown; private Rectangle _captureRect = Rectangle.Empty; @@ -73,7 +73,7 @@ namespace Greenshot.Forms { private RectangleAnimator _windowAnimator; private RectangleAnimator _zoomAnimator; private readonly bool _isZoomerTransparent = Conf.ZoomerOpacity < 1; - private bool _isCtrlPressed = false; + private bool _isCtrlPressed; /// <summary> /// Property to access the selected capture rectangle @@ -153,7 +153,7 @@ namespace Greenshot.Forms { // InitializeComponent(); // Only double-buffer when we are not in a TerminalServerSession - DoubleBuffered = !isTerminalServerSession; + DoubleBuffered = !IsTerminalServerSession; Text = "Greenshot capture form"; // Make sure we never capture the captureform @@ -398,7 +398,7 @@ namespace Greenshot.Forms { if (animator == null) { return false; } - return animator.hasNext; + return animator.HasNext; } /// <summary> @@ -486,7 +486,7 @@ namespace Greenshot.Forms { invalidateRectangle = new Rectangle(x1,y1, x2-x1, y2-y1); Invalidate(invalidateRectangle); } else if (_captureMode != CaptureMode.Window) { - if (!isTerminalServerSession) { + if (!IsTerminalServerSession) { Rectangle allScreenBounds = WindowCapture.GetScreenBounds(); allScreenBounds.Location = WindowCapture.GetLocationRelativeToScreenBounds(allScreenBounds.Location); if (verticalMove) { @@ -570,7 +570,7 @@ namespace Greenshot.Forms { screenBounds.Location = WindowCapture.GetLocationRelativeToScreenBounds(screenBounds.Location); int relativeZoomSize = Math.Min(screenBounds.Width, screenBounds.Height) / 5; // Make sure the final size is a plural of 4, this makes it look better - relativeZoomSize = relativeZoomSize - (relativeZoomSize % 4); + relativeZoomSize = relativeZoomSize - relativeZoomSize % 4; Size zoomSize = new Size(relativeZoomSize, relativeZoomSize); Point zoomOffset = new Point(20, 20); @@ -652,9 +652,9 @@ namespace Greenshot.Forms { // Calculate some values int pixelThickness = destinationRectangle.Width / sourceRectangle.Width; int halfWidth = destinationRectangle.Width / 2; - int halfWidthEnd = (destinationRectangle.Width / 2) - (pixelThickness / 2); + int halfWidthEnd = destinationRectangle.Width / 2 - pixelThickness / 2; int halfHeight = destinationRectangle.Height / 2; - int halfHeightEnd = (destinationRectangle.Height / 2) - (pixelThickness / 2); + int halfHeightEnd = destinationRectangle.Height / 2 - pixelThickness / 2; int drawAtHeight = destinationRectangle.Y + halfHeight; int drawAtWidth = destinationRectangle.X + halfWidth; @@ -673,8 +673,8 @@ namespace Greenshot.Forms { graphics.DrawLine(pen, destinationRectangle.X + halfWidthEnd + 2 * padding, drawAtHeight, destinationRectangle.X + destinationRectangle.Width - padding, drawAtHeight); // Fix offset for drawing the white rectangle around the crosshair-lines - drawAtHeight -= (pixelThickness / 2); - drawAtWidth -= (pixelThickness / 2); + drawAtHeight -= pixelThickness / 2; + drawAtWidth -= pixelThickness / 2; // Fix off by one error with the DrawRectangle pixelThickness -= 1; // Change the color and the pen width @@ -762,7 +762,7 @@ namespace Greenshot.Forms { graphics.DrawPath(rulerPen, p); graphics.DrawString(captureWidth, 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.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); } @@ -780,7 +780,7 @@ namespace Greenshot.Forms { graphics.DrawPath(rulerPen, p); graphics.DrawString(captureHeight, rulerFont, rulerPen.Brush, fixedRect.X - measureHeight.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, 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); } @@ -797,7 +797,7 @@ namespace Greenshot.Forms { string sizeText; if (_captureMode == CaptureMode.Region) { // correct the GUI width to real width for the shown size - sizeText = (_captureRect.Width + 1) + " x " + (_captureRect.Height + 1); + sizeText = _captureRect.Width + 1 + " x " + (_captureRect.Height + 1); } else { sizeText = _captureRect.Width + " x " + _captureRect.Height; } @@ -806,7 +806,7 @@ namespace Greenshot.Forms { 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 ratio = hRatio < wRatio ? hRatio : wRatio; float newSize = sizeFont.Size * ratio; if ( newSize >= 4 ) { @@ -816,13 +816,13 @@ namespace Greenshot.Forms { } // Draw the size. using (Font newSizeFont = new Font(FontFamily.GenericSansSerif, newSize, FontStyle.Bold)) { - PointF sizeLocation = new PointF(fixedRect.X + (_captureRect.Width / 2) - (extent.Width / 2), fixedRect.Y + (_captureRect.Height / 2) - (newSizeFont.GetHeight() / 2)); + PointF sizeLocation = new PointF(fixedRect.X + _captureRect.Width / 2 - extent.Width / 2, fixedRect.Y + _captureRect.Height / 2 - newSizeFont.GetHeight() / 2); graphics.DrawString(sizeText, newSizeFont, Brushes.LightSeaGreen, sizeLocation); } } } } else { - if (!isTerminalServerSession) { + if (!IsTerminalServerSession) { using (Pen pen = new Pen(Color.LightSeaGreen)) { pen.DashStyle = DashStyle.Dot; Rectangle screenBounds = _capture.ScreenBounds; @@ -852,7 +852,7 @@ namespace Greenshot.Forms { const int zoomSourceWidth = 25; const int zoomSourceHeight = 25; - Rectangle sourceRectangle = new Rectangle(_cursorPos.X - (zoomSourceWidth / 2), _cursorPos.Y - (zoomSourceHeight / 2), zoomSourceWidth, zoomSourceHeight); + Rectangle sourceRectangle = new Rectangle(_cursorPos.X - zoomSourceWidth / 2, _cursorPos.Y - zoomSourceHeight / 2, zoomSourceWidth, zoomSourceHeight); Rectangle destinationRectangle = _zoomAnimator.Current; destinationRectangle.Offset(_cursorPos); diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index 2f630d064..00f756317 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -35,7 +35,7 @@ namespace Greenshot { /// </summary> public partial class ColorDialog : BaseForm { private static ColorDialog uniqueInstance; - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); private ColorDialog() { SuspendLayout(); @@ -57,7 +57,7 @@ namespace Greenshot { private readonly List<Button> _colorButtons = new List<Button>(); private readonly List<Button> _recentColorButtons = new List<Button>(); private readonly ToolTip _toolTip = new ToolTip(); - private bool _updateInProgress = false; + private bool _updateInProgress; public Color Color { get { return colorPanel.BackColor; } diff --git a/Greenshot/Forms/DropShadowSettingsForm.cs b/Greenshot/Forms/DropShadowSettingsForm.cs index 1952c6058..358b98970 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.cs @@ -26,7 +26,7 @@ using GreenshotPlugin.Core; namespace Greenshot.Forms { public partial class DropShadowSettingsForm : BaseForm { - private DropShadowEffect effect; + private readonly DropShadowEffect effect; public DropShadowSettingsForm(DropShadowEffect effect) { this.effect = effect; @@ -50,10 +50,5 @@ namespace Greenshot.Forms { effect.ShadowSize = (int)thickness.Value; DialogResult = DialogResult.OK; } - - private void ButtonReset_Click(object sender, EventArgs e) { - effect.Reset(); - ShowSettings(); - } } } diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index 01fda903b..8eb8392f0 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -1022,7 +1022,7 @@ namespace Greenshot { this.propertiesToolStrip.Renderer = new CustomToolStripProfessionalRenderer(); this.propertiesToolStrip.BackColor = System.Drawing.SystemColors.Control; this.propertiesToolStrip.OverflowButton.DropDown.BackColor = System.Drawing.SystemColors.Control; - this.propertiesToolStrip.Paint += propertiesToolStrip_Paint; + this.propertiesToolStrip.Paint += PropertiesToolStrip_Paint; this.propertiesToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.obfuscateModeButton, this.highlightModeButton, diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index c5cc2ddba..e72052944 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -49,20 +49,20 @@ namespace Greenshot { /// </summary> public partial class ImageEditorForm : BaseForm, IImageEditor { private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageEditorForm)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); - private static List<string> ignoreDestinations = new List<string>() { PickerDestination.DESIGNATION, EditorDestination.DESIGNATION }; - private static List<IImageEditor> editorList = new List<IImageEditor>(); + private static readonly EditorConfiguration EditorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private static readonly List<string> IgnoreDestinations = new List<string>() { PickerDestination.DESIGNATION, EditorDestination.DESIGNATION }; + private static readonly List<IImageEditor> EditorList = new List<IImageEditor>(); - private Surface surface; - private GreenshotToolStripButton[] toolbarButtons; + private Surface _surface; + private GreenshotToolStripButton[] _toolbarButtons; - private static string[] SUPPORTED_CLIPBOARD_FORMATS = {typeof(string).FullName, "Text", typeof(DrawableContainerList).FullName}; + private static readonly string[] SupportedClipboardFormats = {typeof(string).FullName, "Text", typeof(DrawableContainerList).FullName}; - private bool originalBoldCheckState = false; - private bool originalItalicCheckState = false; + private bool _originalBoldCheckState; + private bool _originalItalicCheckState; // whether part of the editor controls are disabled depending on selected item(s) - private bool controlsDisabledDueToConfirmable = false; + private bool _controlsDisabledDueToConfirmable; /// <summary> /// An Implementation for the IImageEditor, this way Plugins have access to the HWND handles wich can be used with Win32 API calls. @@ -74,54 +74,58 @@ namespace Greenshot { public static List<IImageEditor> Editors { get { try { - editorList.Sort(delegate(IImageEditor e1, IImageEditor e2) { - return e1.Surface.CaptureDetails.Title.CompareTo(e2.Surface.CaptureDetails.Title); + EditorList.Sort(delegate(IImageEditor e1, IImageEditor e2) { + return String.Compare(e1.Surface.CaptureDetails.Title, e2.Surface.CaptureDetails.Title, StringComparison.Ordinal); }); } catch(Exception ex) { LOG.Warn("Sorting of editors failed.", ex); } - return editorList; + return EditorList; } } public ImageEditorForm(ISurface iSurface, bool outputMade) { - editorList.Add(this); + EditorList.Add(this); // // The InitializeComponent() call is required for Windows Forms designer support. // ManualLanguageApply = true; InitializeComponent(); - + Load += delegate { - var thread = new Thread(delegate() {AddDestinations();}); - thread.Name = "add destinations"; + var thread = new Thread(AddDestinations) + { + Name = "add destinations" + }; thread.Start(); }; // Make sure the editor is placed on the same location as the last editor was on close - WindowDetails thisForm = new WindowDetails(Handle); - thisForm.WindowPlacement = editorConfiguration.GetEditorPlacement(); + WindowDetails thisForm = new WindowDetails(Handle) + { + WindowPlacement = EditorConfiguration.GetEditorPlacement() + }; // init surface Surface = iSurface; // Intial "saved" flag for asking if the image needs to be save - surface.Modified = !outputMade; + _surface.Modified = !outputMade; - updateUI(); + UpdateUi(); // Workaround: As the cursor is (mostly) selected on the surface a funny artifact is visible, this fixes it. - hideToolstripItems(); + HideToolstripItems(); } /// <summary> /// Remove the current surface /// </summary> private void RemoveSurface() { - if (surface != null) { - panel1.Controls.Remove(surface as Control); - surface.Dispose(); - surface = null; + if (_surface != null) { + panel1.Controls.Remove(_surface); + _surface.Dispose(); + _surface = null; } } @@ -138,30 +142,33 @@ namespace Greenshot { panel1.Height = 10; panel1.Width = 10; - surface = newSurface as Surface; - panel1.Controls.Add(surface as Surface); + _surface = newSurface as Surface; + panel1.Controls.Add(_surface); Image backgroundForTransparency = GreenshotResources.getImage("Checkerboard.Image"); - surface.TransparencyBackgroundBrush = new TextureBrush(backgroundForTransparency, WrapMode.Tile); + if (_surface != null) + { + _surface.TransparencyBackgroundBrush = new TextureBrush(backgroundForTransparency, WrapMode.Tile); - surface.MovingElementChanged += delegate { - refreshEditorControls(); - }; - surface.DrawingModeChanged += surface_DrawingModeChanged; - surface.SurfaceSizeChanged += SurfaceSizeChanged; - surface.SurfaceMessage += SurfaceMessageReceived; - surface.FieldAggregator.FieldChanged += FieldAggregatorFieldChanged; - SurfaceSizeChanged(Surface, null); + _surface.MovingElementChanged += delegate { + RefreshEditorControls(); + }; + _surface.DrawingModeChanged += surface_DrawingModeChanged; + _surface.SurfaceSizeChanged += SurfaceSizeChanged; + _surface.SurfaceMessage += SurfaceMessageReceived; + _surface.FieldAggregator.FieldChanged += FieldAggregatorFieldChanged; + SurfaceSizeChanged(Surface, null); - bindFieldControls(); - refreshEditorControls(); - // Fix title - if (surface != null && surface.CaptureDetails != null && surface.CaptureDetails.Title != null) { - Text = surface.CaptureDetails.Title + " - " + Language.GetString(LangKey.editor_title); + BindFieldControls(); + RefreshEditorControls(); + // Fix title + if (_surface != null && _surface.CaptureDetails != null && _surface.CaptureDetails.Title != null) { + Text = _surface.CaptureDetails.Title + " - " + Language.GetString(LangKey.editor_title); + } } WindowDetails.ToForeground(Handle); } - private void updateUI() { + private void UpdateUi() { // Disable access to the settings, for feature #3521446 preferencesToolStripMenuItem.Visible = !coreConfiguration.DisableSettings; toolStripSeparator12.Visible = !coreConfiguration.DisableSettings; @@ -181,7 +188,7 @@ namespace Greenshot { obfuscateModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; highlightModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; - toolbarButtons = new[] { btnCursor, btnRect, btnEllipse, btnText, btnLine, btnArrow, btnFreehand, btnHighlight, btnObfuscate, btnCrop, btnStepLabel, btnSpeechBubble }; + _toolbarButtons = new[] { btnCursor, btnRect, btnEllipse, btnText, btnLine, btnArrow, btnFreehand, btnHighlight, btnObfuscate, btnCrop, btnStepLabel, btnSpeechBubble }; //toolbarDropDownButtons = new ToolStripDropDownButton[]{btnBlur, btnPixeliate, btnTextHighlighter, btnAreaHighlighter, btnMagnifier}; pluginToolStripMenuItem.Visible = pluginToolStripMenuItem.DropDownItems.Count > 0; @@ -198,7 +205,7 @@ namespace Greenshot { /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void propertiesToolStrip_Paint(object sender, PaintEventArgs e) { + private void PropertiesToolStrip_Paint(object sender, PaintEventArgs e) { using (Pen cbBorderPen = new Pen(SystemColors.ActiveBorder)) { // Loop over all items in the propertiesToolStrip foreach (ToolStripItem item in propertiesToolStrip.Items) { @@ -208,10 +215,13 @@ namespace Greenshot { continue; } // Calculate the rectangle - Rectangle r = new Rectangle(cb.ComboBox.Location.X - 1, cb.ComboBox.Location.Y - 1, cb.ComboBox.Size.Width + 1, cb.ComboBox.Size.Height + 1); + if (cb.ComboBox != null) + { + Rectangle r = new Rectangle(cb.ComboBox.Location.X - 1, cb.ComboBox.Location.Y - 1, cb.ComboBox.Size.Width + 1, cb.ComboBox.Size.Height + 1); - // Draw the rectangle - e.Graphics.DrawRectangle(cbBorderPen, r); + // Draw the rectangle + e.Graphics.DrawRectangle(cbBorderPen, r); + } } } } @@ -219,7 +229,7 @@ namespace Greenshot { /// <summary> /// Get all the destinations and display them in the file menu and the buttons /// </summary> - void AddDestinations() { + private void AddDestinations() { Invoke((MethodInvoker)delegate { // Create export buttons foreach(IDestination destination in DestinationHelper.GetAllDestinations()) { @@ -242,29 +252,34 @@ namespace Greenshot { }); } - void AddDestinationButton(IDestination toolstripDestination) { + private void AddDestinationButton(IDestination toolstripDestination) { if (toolstripDestination.isDynamic) { - ToolStripSplitButton destinationButton = new ToolStripSplitButton(); + ToolStripSplitButton destinationButton = new ToolStripSplitButton + { + DisplayStyle = ToolStripItemDisplayStyle.Image, + Size = new Size(23, 22), + Text = toolstripDestination.Description, + Image = toolstripDestination.DisplayIcon + }; //ToolStripDropDownButton destinationButton = new ToolStripDropDownButton(); - destinationButton.DisplayStyle = ToolStripItemDisplayStyle.Image; - destinationButton.Size = new Size(23, 22); - destinationButton.Text = toolstripDestination.Description; - destinationButton.Image = toolstripDestination.DisplayIcon; - ToolStripMenuItem defaultItem = new ToolStripMenuItem(toolstripDestination.Description); - defaultItem.Tag = toolstripDestination; - defaultItem.Image = toolstripDestination.DisplayIcon; + ToolStripMenuItem defaultItem = new ToolStripMenuItem(toolstripDestination.Description) + { + Tag = toolstripDestination, + Image = toolstripDestination.DisplayIcon + }; defaultItem.Click += delegate { - toolstripDestination.ExportCapture(true, surface, surface.CaptureDetails); + toolstripDestination.ExportCapture(true, _surface, _surface.CaptureDetails); }; // The ButtonClick, this is for the icon, gets the current default item - destinationButton.ButtonClick += delegate(object sender, EventArgs e) { - toolstripDestination.ExportCapture(true, surface, surface.CaptureDetails); + destinationButton.ButtonClick += delegate { + toolstripDestination.ExportCapture(true, _surface, _surface.CaptureDetails); }; // Generate the entries for the drop down - destinationButton.DropDownOpening += delegate(object sender, EventArgs e) { + destinationButton.DropDownOpening += delegate + { ClearItems(destinationButton.DropDownItems); destinationButton.DropDownItems.Add(defaultItem); @@ -278,7 +293,7 @@ namespace Greenshot { destinationMenuItem.Tag = closureFixedDestination; destinationMenuItem.Image = closureFixedDestination.DisplayIcon; destinationMenuItem.Click += delegate { - closureFixedDestination.ExportCapture(true, surface, surface.CaptureDetails); + closureFixedDestination.ExportCapture(true, _surface, _surface.CaptureDetails); }; destinationButton.DropDownItems.Add(destinationMenuItem); } @@ -294,8 +309,8 @@ namespace Greenshot { destinationButton.Size = new Size(23, 22); destinationButton.Text = toolstripDestination.Description; destinationButton.Image = toolstripDestination.DisplayIcon; - destinationButton.Click += delegate(object sender, EventArgs e) { - toolstripDestination.ExportCapture(true, surface, surface.CaptureDetails); + destinationButton.Click += delegate { + toolstripDestination.ExportCapture(true, _surface, _surface.CaptureDetails); }; } } @@ -315,12 +330,12 @@ namespace Greenshot { items.Clear(); } - void FileMenuDropDownOpening(object sender, EventArgs eventArgs) { + private void FileMenuDropDownOpening(object sender, EventArgs eventArgs) { ClearItems(fileStripMenuItem.DropDownItems); // Add the destinations foreach(IDestination destination in DestinationHelper.GetAllDestinations()) { - if (ignoreDestinations.Contains(destination.Designation)) { + if (IgnoreDestinations.Contains(destination.Designation)) { continue; } if (!destination.isActive) { @@ -347,7 +362,7 @@ namespace Greenshot { /// <param name="eventArgs"></param> private void SurfaceMessageReceived(object sender, SurfaceMessageEventArgs eventArgs) { if (InvokeRequired) { - this.Invoke(new SurfaceMessageReceivedThreadSafeDelegate(SurfaceMessageReceived), new object[] { sender, eventArgs }); + Invoke(new SurfaceMessageReceivedThreadSafeDelegate(SurfaceMessageReceived), new object[] { sender, eventArgs }); } else { string dateTime = DateTime.Now.ToLongTimeString(); // TODO: Fix that we only open files, like in the tooltip @@ -372,17 +387,18 @@ namespace Greenshot { /// <summary> /// This is called when the size of the surface chances, used for resizing and displaying the size information /// </summary> - /// <param name="source"></param> + /// <param name="sender"></param> + /// <param name="e"></param> private void SurfaceSizeChanged(object sender, EventArgs e) { - if (editorConfiguration.MatchSizeToCapture) { + if (EditorConfiguration.MatchSizeToCapture) { // Set editor's initial size to the size of the surface plus the size of the chrome Size imageSize = Surface.Image.Size; Size currentFormSize = Size; Size currentImageClientSize = panel1.ClientSize; int minimumFormWidth = 650; int minimumFormHeight = 530; - int newWidth = Math.Max(minimumFormWidth, (currentFormSize.Width - currentImageClientSize.Width) + imageSize.Width); - int newHeight = Math.Max(minimumFormHeight, (currentFormSize.Height - currentImageClientSize.Height) + imageSize.Height); + int newWidth = Math.Max(minimumFormWidth, currentFormSize.Width - currentImageClientSize.Width + imageSize.Width); + int newHeight = Math.Max(minimumFormHeight, currentFormSize.Height - currentImageClientSize.Height + imageSize.Height); Size = new Size(newWidth, newHeight); } dimensionsLabel.Text = Surface.Image.Width + "x" + Surface.Image.Height; @@ -391,7 +407,7 @@ namespace Greenshot { public ISurface Surface { get { - return surface; + return _surface; } set { SetSurface(value); @@ -403,7 +419,7 @@ namespace Greenshot { if (fullpath != null && (fullpath.EndsWith(".ico") || fullpath.EndsWith(".wmf"))) { fullpath = null; } - surface.LastSaveFullPath = fullpath; + _surface.LastSaveFullPath = fullpath; if (fullpath == null) { return; @@ -411,8 +427,8 @@ namespace Greenshot { updateStatusLabel(Language.GetFormattedString(LangKey.editor_imagesaved, fullpath), fileSavedStatusContextMenu); Text = Path.GetFileName(fullpath) + " - " + Language.GetString(LangKey.editor_title); } - - void surface_DrawingModeChanged(object source, SurfaceDrawingModeEventArgs eventArgs) { + + private void surface_DrawingModeChanged(object source, SurfaceDrawingModeEventArgs eventArgs) { switch (eventArgs.DrawingMode) { case DrawingModes.None: SetButtonChecked(btnCursor); @@ -460,11 +476,11 @@ namespace Greenshot { */ public Image GetImageForExport() { - return surface.GetImageForExport(); + return _surface.GetImageForExport(); } public ICaptureDetails CaptureDetails { - get { return surface.CaptureDetails; } + get { return _surface.CaptureDetails; } } public ToolStripMenuItem GetPluginMenuItem() { @@ -477,254 +493,253 @@ namespace Greenshot { #endregion #region filesystem options - void BtnSaveClick(object sender, EventArgs e) { + + private void BtnSaveClick(object sender, EventArgs e) { string destinationDesignation = FileDestination.DESIGNATION; - if (surface.LastSaveFullPath == null) { + if (_surface.LastSaveFullPath == null) { destinationDesignation = FileWithDialogDestination.DESIGNATION; } - DestinationHelper.ExportCapture(true, destinationDesignation, surface, surface.CaptureDetails); - } - - void BtnClipboardClick(object sender, EventArgs e) { - DestinationHelper.ExportCapture(true, ClipboardDestination.DESIGNATION, surface, surface.CaptureDetails); + DestinationHelper.ExportCapture(true, destinationDesignation, _surface, _surface.CaptureDetails); } - void BtnPrintClick(object sender, EventArgs e) { + private void BtnClipboardClick(object sender, EventArgs e) { + DestinationHelper.ExportCapture(true, ClipboardDestination.DESIGNATION, _surface, _surface.CaptureDetails); + } + + private void BtnPrintClick(object sender, EventArgs e) { // The BeginInvoke is a solution for the printdialog not having focus BeginInvoke((MethodInvoker) delegate { - DestinationHelper.ExportCapture(true, PrinterDestination.DESIGNATION, surface, surface.CaptureDetails); + DestinationHelper.ExportCapture(true, PrinterDestination.DESIGNATION, _surface, _surface.CaptureDetails); }); } - void CloseToolStripMenuItemClick(object sender, EventArgs e) { + private void CloseToolStripMenuItemClick(object sender, EventArgs e) { Close(); } #endregion #region drawing options - void BtnEllipseClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Ellipse; - refreshFieldControls(); - } - - void BtnCursorClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.None; - refreshFieldControls(); - } - - void BtnRectClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Rect; - refreshFieldControls(); - } - - void BtnTextClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Text; - refreshFieldControls(); + + private void BtnEllipseClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Ellipse; + RefreshFieldControls(); } - void BtnSpeechBubbleClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.SpeechBubble; - refreshFieldControls(); - } - void BtnStepLabelClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.StepLabel; - refreshFieldControls(); - } - - void BtnLineClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Line; - refreshFieldControls(); - } - - void BtnArrowClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Arrow; - refreshFieldControls(); - } - - void BtnCropClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Crop; - refreshFieldControls(); - } - - void BtnHighlightClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Highlight; - refreshFieldControls(); - } - - void BtnObfuscateClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Obfuscate; - refreshFieldControls(); + private void BtnCursorClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.None; + RefreshFieldControls(); } - void BtnFreehandClick(object sender, EventArgs e) { - surface.DrawingMode = DrawingModes.Path; - refreshFieldControls(); + private void BtnRectClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Rect; + RefreshFieldControls(); } - - void SetButtonChecked(ToolStripButton btn) { + + private void BtnTextClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Text; + RefreshFieldControls(); + } + + private void BtnSpeechBubbleClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.SpeechBubble; + RefreshFieldControls(); + } + + private void BtnStepLabelClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.StepLabel; + RefreshFieldControls(); + } + + private void BtnLineClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Line; + RefreshFieldControls(); + } + + private void BtnArrowClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Arrow; + RefreshFieldControls(); + } + + private void BtnCropClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Crop; + RefreshFieldControls(); + } + + private void BtnHighlightClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Highlight; + RefreshFieldControls(); + } + + private void BtnObfuscateClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Obfuscate; + RefreshFieldControls(); + } + + private void BtnFreehandClick(object sender, EventArgs e) { + _surface.DrawingMode = DrawingModes.Path; + RefreshFieldControls(); + } + + private void SetButtonChecked(ToolStripButton btn) { UncheckAllToolButtons(); btn.Checked = true; } private void UncheckAllToolButtons() { - if (toolbarButtons != null) { - foreach (ToolStripButton butt in toolbarButtons) { + if (_toolbarButtons != null) { + foreach (GreenshotToolStripButton butt in _toolbarButtons) { butt.Checked = false; } } } - - void AddRectangleToolStripMenuItemClick(object sender, EventArgs e) { + + private void AddRectangleToolStripMenuItemClick(object sender, EventArgs e) { BtnRectClick(sender, e); } - void DrawFreehandToolStripMenuItemClick(object sender, EventArgs e) { + private void DrawFreehandToolStripMenuItemClick(object sender, EventArgs e) { BtnFreehandClick(sender, e); } - - void AddEllipseToolStripMenuItemClick(object sender, EventArgs e) { + + private void AddEllipseToolStripMenuItemClick(object sender, EventArgs e) { BtnEllipseClick(sender, e); } - - void AddTextBoxToolStripMenuItemClick(object sender, EventArgs e) { + + private void AddTextBoxToolStripMenuItemClick(object sender, EventArgs e) { BtnTextClick(sender, e); } - - void AddSpeechBubbleToolStripMenuItemClick(object sender, EventArgs e) { + + private void AddSpeechBubbleToolStripMenuItemClick(object sender, EventArgs e) { BtnSpeechBubbleClick(sender, e); } - - void AddCounterToolStripMenuItemClick(object sender, EventArgs e) { + + private void AddCounterToolStripMenuItemClick(object sender, EventArgs e) { BtnStepLabelClick(sender, e); } - - void DrawLineToolStripMenuItemClick(object sender, EventArgs e) { + + private void DrawLineToolStripMenuItemClick(object sender, EventArgs e) { BtnLineClick(sender, e); } - - void DrawArrowToolStripMenuItemClick(object sender, EventArgs e) { + + private void DrawArrowToolStripMenuItemClick(object sender, EventArgs e) { BtnArrowClick(sender, e); } - - void DrawHighlightToolStripMenuItemClick(object sender, EventArgs e) { - BtnHighlightClick(sender, e); - } - - void BlurToolStripMenuItemClick(object sender, EventArgs e) { - BtnObfuscateClick(sender, e); - } - - void RemoveObjectToolStripMenuItemClick(object sender, EventArgs e) { - surface.RemoveSelectedElements(); + + private void RemoveObjectToolStripMenuItemClick(object sender, EventArgs e) { + _surface.RemoveSelectedElements(); } - void BtnDeleteClick(object sender, EventArgs e) { + private void BtnDeleteClick(object sender, EventArgs e) { RemoveObjectToolStripMenuItemClick(sender, e); } #endregion #region copy&paste options - void CutToolStripMenuItemClick(object sender, EventArgs e) { - surface.CutSelectedElements(); - updateClipboardSurfaceDependencies(); + + private void CutToolStripMenuItemClick(object sender, EventArgs e) { + _surface.CutSelectedElements(); + UpdateClipboardSurfaceDependencies(); } - void BtnCutClick(object sender, EventArgs e) { + private void BtnCutClick(object sender, EventArgs e) { CutToolStripMenuItemClick(sender, e); } - - void CopyToolStripMenuItemClick(object sender, EventArgs e) { - surface.CopySelectedElements(); - updateClipboardSurfaceDependencies(); + + private void CopyToolStripMenuItemClick(object sender, EventArgs e) { + _surface.CopySelectedElements(); + UpdateClipboardSurfaceDependencies(); } - void BtnCopyClick(object sender, EventArgs e) { + private void BtnCopyClick(object sender, EventArgs e) { CopyToolStripMenuItemClick(sender, e); } - - void PasteToolStripMenuItemClick(object sender, EventArgs e) { - surface.PasteElementFromClipboard(); - updateClipboardSurfaceDependencies(); + + private void PasteToolStripMenuItemClick(object sender, EventArgs e) { + _surface.PasteElementFromClipboard(); + UpdateClipboardSurfaceDependencies(); } - void BtnPasteClick(object sender, EventArgs e) { + private void BtnPasteClick(object sender, EventArgs e) { PasteToolStripMenuItemClick(sender, e); } - void UndoToolStripMenuItemClick(object sender, EventArgs e) { - surface.Undo(); - updateUndoRedoSurfaceDependencies(); + private void UndoToolStripMenuItemClick(object sender, EventArgs e) { + _surface.Undo(); + UpdateUndoRedoSurfaceDependencies(); } - void BtnUndoClick(object sender, EventArgs e) { + private void BtnUndoClick(object sender, EventArgs e) { UndoToolStripMenuItemClick(sender, e); } - void RedoToolStripMenuItemClick(object sender, EventArgs e) { - surface.Redo(); - updateUndoRedoSurfaceDependencies(); + private void RedoToolStripMenuItemClick(object sender, EventArgs e) { + _surface.Redo(); + UpdateUndoRedoSurfaceDependencies(); } - void BtnRedoClick(object sender, EventArgs e) { + private void BtnRedoClick(object sender, EventArgs e) { RedoToolStripMenuItemClick(sender, e); } - void DuplicateToolStripMenuItemClick(object sender, EventArgs e) { - surface.DuplicateSelectedElements(); - updateClipboardSurfaceDependencies(); + private void DuplicateToolStripMenuItemClick(object sender, EventArgs e) { + _surface.DuplicateSelectedElements(); + UpdateClipboardSurfaceDependencies(); } #endregion #region element properties - void UpOneLevelToolStripMenuItemClick(object sender, EventArgs e) { - surface.PullElementsUp(); + + private void UpOneLevelToolStripMenuItemClick(object sender, EventArgs e) { + _surface.PullElementsUp(); } - - void DownOneLevelToolStripMenuItemClick(object sender, EventArgs e) { - surface.PushElementsDown(); + + private void DownOneLevelToolStripMenuItemClick(object sender, EventArgs e) { + _surface.PushElementsDown(); } - - void UpToTopToolStripMenuItemClick(object sender, EventArgs e) { - surface.PullElementsToTop(); + + private void UpToTopToolStripMenuItemClick(object sender, EventArgs e) { + _surface.PullElementsToTop(); } - - void DownToBottomToolStripMenuItemClick(object sender, EventArgs e) { - surface.PushElementsToBottom(); + + private void DownToBottomToolStripMenuItemClick(object sender, EventArgs e) { + _surface.PushElementsToBottom(); } #endregion #region help - void HelpToolStripMenuItem1Click(object sender, EventArgs e) { + + private void HelpToolStripMenuItem1Click(object sender, EventArgs e) { HelpFileLoader.LoadHelp(); } - void AboutToolStripMenuItemClick(object sender, EventArgs e) { + private void AboutToolStripMenuItemClick(object sender, EventArgs e) { MainForm.Instance.ShowAbout(); } - void PreferencesToolStripMenuItemClick(object sender, EventArgs e) { + private void PreferencesToolStripMenuItemClick(object sender, EventArgs e) { MainForm.Instance.ShowSetting(); } - void BtnSettingsClick(object sender, EventArgs e) { + private void BtnSettingsClick(object sender, EventArgs e) { PreferencesToolStripMenuItemClick(sender, e); } - void BtnHelpClick(object sender, EventArgs e) { + private void BtnHelpClick(object sender, EventArgs e) { HelpToolStripMenuItem1Click(sender, e); } #endregion #region image editor event handlers - void ImageEditorFormActivated(object sender, EventArgs e) { - updateClipboardSurfaceDependencies(); - updateUndoRedoSurfaceDependencies(); + + private void ImageEditorFormActivated(object sender, EventArgs e) { + UpdateClipboardSurfaceDependencies(); + UpdateUndoRedoSurfaceDependencies(); } - void ImageEditorFormFormClosing(object sender, FormClosingEventArgs e) { - if (surface.Modified && !editorConfiguration.SuppressSaveDialogAtClose) { + private void ImageEditorFormFormClosing(object sender, FormClosingEventArgs e) { + if (_surface.Modified && !EditorConfiguration.SuppressSaveDialogAtClose) { // Make sure the editor is visible WindowDetails.ToForeground(Handle); @@ -741,20 +756,20 @@ namespace Greenshot { if (result.Equals(DialogResult.Yes)) { BtnSaveClick(sender,e); // Check if the save was made, if not it was cancelled so we cancel the closing - if (surface.Modified) { + if (_surface.Modified) { e.Cancel = true; return; } } } // persist our geometry string. - editorConfiguration.SetEditorPlacement(new WindowDetails(Handle).WindowPlacement); + EditorConfiguration.SetEditorPlacement(new WindowDetails(Handle).WindowPlacement); IniConfig.Save(); // remove from the editor list - editorList.Remove(this); + EditorList.Remove(this); - surface.Dispose(); + _surface.Dispose(); GC.Collect(); if (coreConfiguration.MinimizeWorkingSetSize) { @@ -762,11 +777,11 @@ namespace Greenshot { } } - void ImageEditorFormKeyDown(object sender, KeyEventArgs e) { + private void ImageEditorFormKeyDown(object sender, KeyEventArgs e) { // LOG.Debug("Got key event "+e.KeyCode + ", " + e.Modifiers); // avoid conflict with other shortcuts and // make sure there's no selected element claiming input focus - if(e.Modifiers.Equals(Keys.None) && !surface.KeysLocked) { + if(e.Modifiers.Equals(Keys.None) && !_surface.KeysLocked) { switch(e.KeyCode) { case Keys.Escape: BtnCursorClick(sender, e); @@ -854,7 +869,7 @@ namespace Greenshot { #region key handling protected override bool ProcessKeyPreview(ref Message msg) { // disable default key handling if surface has requested a lock - if (!surface.KeysLocked) { + if (!_surface.KeysLocked) { return base.ProcessKeyPreview(ref msg); } return false; @@ -862,13 +877,13 @@ namespace Greenshot { protected override bool ProcessCmdKey(ref Message msg, Keys keys) { // disable default key handling if surface has requested a lock - if (!surface.KeysLocked) { + if (!_surface.KeysLocked) { // Go through the destinations to check the EditorShortcut Keys // this way the menu entries don't need to be enabled. // This also fixes bugs #3526974 & #3527020 foreach (IDestination destination in DestinationHelper.GetAllDestinations()) { - if (ignoreDestinations.Contains(destination.Designation)) { + if (IgnoreDestinations.Contains(destination.Designation)) { continue; } if (!destination.isActive) { @@ -876,11 +891,11 @@ namespace Greenshot { } if (destination.EditorShortcutKeys == keys) { - destination.ExportCapture(true, surface, surface.CaptureDetails); + destination.ExportCapture(true, _surface, _surface.CaptureDetails); return true; } } - if (!surface.ProcessCmdKey(keys)) { + if (!_surface.ProcessCmdKey(keys)) { return base.ProcessCmdKey(ref msg, keys); } } @@ -890,30 +905,30 @@ namespace Greenshot { #region helpers - private void updateUndoRedoSurfaceDependencies() { - if (surface == null) { + private void UpdateUndoRedoSurfaceDependencies() { + if (_surface == null) { return; } - bool canUndo = surface.CanUndo; + bool canUndo = _surface.CanUndo; btnUndo.Enabled = canUndo; undoToolStripMenuItem.Enabled = canUndo; string undoAction = ""; if (canUndo) { - if (surface.UndoActionLanguageKey != LangKey.none) { - undoAction = Language.GetString(surface.UndoActionLanguageKey); + if (_surface.UndoActionLanguageKey != LangKey.none) { + undoAction = Language.GetString(_surface.UndoActionLanguageKey); } } string undoText = Language.GetFormattedString(LangKey.editor_undo, undoAction); btnUndo.Text = undoText; undoToolStripMenuItem.Text = undoText; - bool canRedo = surface.CanRedo; + bool canRedo = _surface.CanRedo; btnRedo.Enabled = canRedo; redoToolStripMenuItem.Enabled = canRedo; string redoAction = ""; if (canRedo) { - if (surface.RedoActionLanguageKey != LangKey.none) { - redoAction = Language.GetString(surface.RedoActionLanguageKey); + if (_surface.RedoActionLanguageKey != LangKey.none) { + redoAction = Language.GetString(_surface.RedoActionLanguageKey); } } string redoText = Language.GetFormattedString(LangKey.editor_redo, redoAction); @@ -922,13 +937,13 @@ namespace Greenshot { } - private void updateClipboardSurfaceDependencies() { - if (surface == null) { + private void UpdateClipboardSurfaceDependencies() { + if (_surface == null) { return; } // check dependencies for the Surface - bool hasItems = surface.HasSelectedElements; - bool actionAllowedForSelection = hasItems && !controlsDisabledDueToConfirmable; + bool hasItems = _surface.HasSelectedElements; + bool actionAllowedForSelection = hasItems && !_controlsDisabledDueToConfirmable; // buttons btnCut.Enabled = actionAllowedForSelection; @@ -942,9 +957,9 @@ namespace Greenshot { duplicateToolStripMenuItem.Enabled = actionAllowedForSelection; // check dependencies for the Clipboard - bool hasClipboard = ClipboardHelper.ContainsFormat(SUPPORTED_CLIPBOARD_FORMATS) || ClipboardHelper.ContainsImage(); - btnPaste.Enabled = hasClipboard && !controlsDisabledDueToConfirmable; - pasteToolStripMenuItem.Enabled = hasClipboard && !controlsDisabledDueToConfirmable; + bool hasClipboard = ClipboardHelper.ContainsFormat(SupportedClipboardFormats) || ClipboardHelper.ContainsImage(); + btnPaste.Enabled = hasClipboard && !_controlsDisabledDueToConfirmable; + pasteToolStripMenuItem.Enabled = hasClipboard && !_controlsDisabledDueToConfirmable; } #endregion @@ -958,25 +973,27 @@ namespace Greenshot { private void updateStatusLabel(string text) { updateStatusLabel(text, null); } - private void clearStatusLabel() { + private void ClearStatusLabel() { updateStatusLabel(null, null); } - - void StatusLabelClicked(object sender, MouseEventArgs e) { + + private void StatusLabelClicked(object sender, MouseEventArgs e) { ToolStrip ss = (StatusStrip)((ToolStripStatusLabel)sender).Owner; if(ss.ContextMenuStrip != null) { ss.ContextMenuStrip.Show(ss, e.X, e.Y); } } - - void CopyPathMenuItemClick(object sender, EventArgs e) { - ClipboardHelper.SetClipboardData(surface.LastSaveFullPath); + + private void CopyPathMenuItemClick(object sender, EventArgs e) { + ClipboardHelper.SetClipboardData(_surface.LastSaveFullPath); } - - void OpenDirectoryMenuItemClick(object sender, EventArgs e) { - ProcessStartInfo psi = new ProcessStartInfo("explorer"); - psi.Arguments = Path.GetDirectoryName(surface.LastSaveFullPath); - psi.UseShellExecute = false; + + private void OpenDirectoryMenuItemClick(object sender, EventArgs e) { + ProcessStartInfo psi = new ProcessStartInfo("explorer") + { + Arguments = Path.GetDirectoryName(_surface.LastSaveFullPath), + UseShellExecute = false + }; using (Process p = new Process()) { p.StartInfo = psi; p.Start(); @@ -984,33 +1001,33 @@ namespace Greenshot { } #endregion - private void bindFieldControls() { - new BidirectionalBinding(btnFillColor, "SelectedColor", surface.FieldAggregator.GetField(FieldType.FILL_COLOR), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(btnLineColor, "SelectedColor", surface.FieldAggregator.GetField(FieldType.LINE_COLOR), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(lineThicknessUpDown, "Value", surface.FieldAggregator.GetField(FieldType.LINE_THICKNESS), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(blurRadiusUpDown, "Value", surface.FieldAggregator.GetField(FieldType.BLUR_RADIUS), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(magnificationFactorUpDown, "Value", surface.FieldAggregator.GetField(FieldType.MAGNIFICATION_FACTOR), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(pixelSizeUpDown, "Value", surface.FieldAggregator.GetField(FieldType.PIXEL_SIZE), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(brightnessUpDown, "Value", surface.FieldAggregator.GetField(FieldType.BRIGHTNESS), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(fontFamilyComboBox, "Text", surface.FieldAggregator.GetField(FieldType.FONT_FAMILY), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(fontSizeUpDown, "Value", surface.FieldAggregator.GetField(FieldType.FONT_SIZE), "Value", DecimalFloatConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(fontBoldButton, "Checked", surface.FieldAggregator.GetField(FieldType.FONT_BOLD), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(fontItalicButton, "Checked", surface.FieldAggregator.GetField(FieldType.FONT_ITALIC), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(textHorizontalAlignmentButton, "SelectedTag", surface.FieldAggregator.GetField(FieldType.TEXT_HORIZONTAL_ALIGNMENT), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(textVerticalAlignmentButton, "SelectedTag", surface.FieldAggregator.GetField(FieldType.TEXT_VERTICAL_ALIGNMENT), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(shadowButton, "Checked", surface.FieldAggregator.GetField(FieldType.SHADOW), "Value", NotNullValidator.GetInstance()); - new BidirectionalBinding(previewQualityUpDown, "Value", surface.FieldAggregator.GetField(FieldType.PREVIEW_QUALITY), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); - new BidirectionalBinding(obfuscateModeButton, "SelectedTag", surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_OBFUSCATE), "Value"); - new BidirectionalBinding(highlightModeButton, "SelectedTag", surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_HIGHLIGHT), "Value"); + private void BindFieldControls() { + new BidirectionalBinding(btnFillColor, "SelectedColor", _surface.FieldAggregator.GetField(FieldType.FILL_COLOR), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(btnLineColor, "SelectedColor", _surface.FieldAggregator.GetField(FieldType.LINE_COLOR), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(lineThicknessUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.LINE_THICKNESS), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(blurRadiusUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.BLUR_RADIUS), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(magnificationFactorUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.MAGNIFICATION_FACTOR), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(pixelSizeUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.PIXEL_SIZE), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(brightnessUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.BRIGHTNESS), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(fontFamilyComboBox, "Text", _surface.FieldAggregator.GetField(FieldType.FONT_FAMILY), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(fontSizeUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.FONT_SIZE), "Value", DecimalFloatConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(fontBoldButton, "Checked", _surface.FieldAggregator.GetField(FieldType.FONT_BOLD), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(fontItalicButton, "Checked", _surface.FieldAggregator.GetField(FieldType.FONT_ITALIC), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(textHorizontalAlignmentButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.TEXT_HORIZONTAL_ALIGNMENT), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(textVerticalAlignmentButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.TEXT_VERTICAL_ALIGNMENT), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(shadowButton, "Checked", _surface.FieldAggregator.GetField(FieldType.SHADOW), "Value", NotNullValidator.GetInstance()); + new BidirectionalBinding(previewQualityUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.PREVIEW_QUALITY), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(obfuscateModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_OBFUSCATE), "Value"); + new BidirectionalBinding(highlightModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_HIGHLIGHT), "Value"); } /// <summary> /// shows/hides field controls (2nd toolbar on top) depending on fields of selected elements /// </summary> - private void refreshFieldControls() { + private void RefreshFieldControls() { propertiesToolStrip.SuspendLayout(); - if(surface.HasSelectedElements || surface.DrawingMode != DrawingModes.None) { - FieldAggregator props = surface.FieldAggregator; + if(_surface.HasSelectedElements || _surface.DrawingMode != DrawingModes.None) { + FieldAggregator props = _surface.FieldAggregator; btnFillColor.Visible = props.HasFieldValue(FieldType.FILL_COLOR); btnLineColor.Visible = props.HasFieldValue(FieldType.LINE_COLOR); lineThicknessLabel.Visible = lineThicknessUpDown.Visible = props.HasFieldValue(FieldType.LINE_THICKNESS); @@ -1033,12 +1050,12 @@ namespace Greenshot { obfuscateModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_OBFUSCATE); highlightModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_HIGHLIGHT); } else { - hideToolstripItems(); + HideToolstripItems(); } propertiesToolStrip.ResumeLayout(); } - private void hideToolstripItems() { + private void HideToolstripItems() { foreach(ToolStripItem toolStripItem in propertiesToolStrip.Items) { toolStripItem.Visible = false; } @@ -1047,23 +1064,23 @@ namespace Greenshot { /// <summary> /// refreshes all editor controls depending on selected elements and their fields /// </summary> - private void refreshEditorControls() { - int stepLabels = surface.CountStepLabels(null); + private void RefreshEditorControls() { + int stepLabels = _surface.CountStepLabels(null); Image icon; if (stepLabels <= 20) { - icon = ((System.Drawing.Image)(resources.GetObject(string.Format("btnStepLabel{0:00}.Image", stepLabels)))); + icon = (Image)resources.GetObject(string.Format("btnStepLabel{0:00}.Image", stepLabels)); } else { - icon = ((System.Drawing.Image)(resources.GetObject("btnStepLabel20+.Image"))); + icon = (Image)resources.GetObject("btnStepLabel20+.Image"); } - this.btnStepLabel.Image = icon; - this.addCounterToolStripMenuItem.Image = icon; + btnStepLabel.Image = icon; + addCounterToolStripMenuItem.Image = icon; - FieldAggregator props = surface.FieldAggregator; + FieldAggregator props = _surface.FieldAggregator; // if a confirmable element is selected, we must disable most of the controls // since we demand confirmation or cancel for confirmable element if (props.HasFieldValue(FieldType.FLAGS) && ((FieldType.Flag)props.GetFieldValue(FieldType.FLAGS) & FieldType.Flag.CONFIRMABLE) == FieldType.Flag.CONFIRMABLE) { // disable most controls - if(!controlsDisabledDueToConfirmable) { + if(!_controlsDisabledDueToConfirmable) { ToolStripItemEndisabler.Disable(menuStrip1); ToolStripItemEndisabler.Disable(destinationsToolStrip); ToolStripItemEndisabler.Disable(toolsToolStrip); @@ -1071,25 +1088,25 @@ namespace Greenshot { ToolStripItemEndisabler.Enable(helpToolStripMenuItem); ToolStripItemEndisabler.Enable(aboutToolStripMenuItem); ToolStripItemEndisabler.Enable(preferencesToolStripMenuItem); - controlsDisabledDueToConfirmable = true; + _controlsDisabledDueToConfirmable = true; } - } else if(controlsDisabledDueToConfirmable) { + } else if(_controlsDisabledDueToConfirmable) { // re-enable disabled controls, confirmable element has either been confirmed or cancelled ToolStripItemEndisabler.Enable(menuStrip1); ToolStripItemEndisabler.Enable(destinationsToolStrip); ToolStripItemEndisabler.Enable(toolsToolStrip); - controlsDisabledDueToConfirmable = false; + _controlsDisabledDueToConfirmable = false; } // en/disable controls depending on whether an element is selected at all - updateClipboardSurfaceDependencies(); - updateUndoRedoSurfaceDependencies(); + UpdateClipboardSurfaceDependencies(); + UpdateUndoRedoSurfaceDependencies(); // en/disablearrage controls depending on hierarchy of selected elements - bool actionAllowedForSelection = surface.HasSelectedElements && !controlsDisabledDueToConfirmable; - bool push = actionAllowedForSelection && surface.CanPushSelectionDown(); - bool pull = actionAllowedForSelection && surface.CanPullSelectionUp(); - arrangeToolStripMenuItem.Enabled = (push || pull); + bool actionAllowedForSelection = _surface.HasSelectedElements && !_controlsDisabledDueToConfirmable; + bool push = actionAllowedForSelection && _surface.CanPushSelectionDown(); + bool pull = actionAllowedForSelection && _surface.CanPullSelectionUp(); + arrangeToolStripMenuItem.Enabled = push || pull; if (arrangeToolStripMenuItem.Enabled) { upToTopToolStripMenuItem.Enabled = pull; upOneLevelToolStripMenuItem.Enabled = pull; @@ -1098,29 +1115,35 @@ namespace Greenshot { } // finally show/hide field controls depending on the fields of selected elements - refreshFieldControls(); - } - - - void ArrowHeadsToolStripMenuItemClick(object sender, EventArgs e) { - surface.FieldAggregator.GetField(FieldType.ARROWHEADS).Value = (ArrowContainer.ArrowHeadCombination)((ToolStripMenuItem)sender).Tag; - } - - void EditToolStripMenuItemClick(object sender, EventArgs e) { - updateClipboardSurfaceDependencies(); - updateUndoRedoSurfaceDependencies(); + RefreshFieldControls(); } - void FontPropertyChanged(object sender, EventArgs e) { + + private void ArrowHeadsToolStripMenuItemClick(object sender, EventArgs e) { + _surface.FieldAggregator.GetField(FieldType.ARROWHEADS).Value = (ArrowContainer.ArrowHeadCombination)((ToolStripMenuItem)sender).Tag; + } + + private void EditToolStripMenuItemClick(object sender, EventArgs e) { + UpdateClipboardSurfaceDependencies(); + UpdateUndoRedoSurfaceDependencies(); + } + + private void FontPropertyChanged(object sender, EventArgs e) { // in case we forced another FontStyle before, reset it first. - if(originalBoldCheckState != fontBoldButton.Checked) fontBoldButton.Checked = originalBoldCheckState; - if(originalItalicCheckState != fontItalicButton.Checked) fontItalicButton.Checked = originalItalicCheckState; + if (fontBoldButton != null && _originalBoldCheckState != fontBoldButton.Checked) + { + fontBoldButton.Checked = _originalBoldCheckState; + } + if (fontItalicButton != null && _originalItalicCheckState != fontItalicButton.Checked) + { + fontItalicButton.Checked = _originalItalicCheckState; + } FontFamily fam = fontFamilyComboBox.FontFamily; bool boldAvailable = fam.IsStyleAvailable(FontStyle.Bold); if(!boldAvailable) { - originalBoldCheckState = fontBoldButton.Checked; + _originalBoldCheckState = fontBoldButton.Checked; fontBoldButton.Checked = false; } fontBoldButton.Enabled = boldAvailable; @@ -1137,55 +1160,56 @@ namespace Greenshot { fontItalicButton.Checked = true; } } - } - - void FieldAggregatorFieldChanged(object sender, FieldChangedEventArgs e) { + } + + private void FieldAggregatorFieldChanged(object sender, FieldChangedEventArgs e) { // in addition to selection, deselection of elements, we need to // refresh toolbar if prepared filter mode is changed if(e.Field.FieldType == FieldType.PREPARED_FILTER_HIGHLIGHT) { - refreshFieldControls(); + RefreshFieldControls(); } } - - void FontBoldButtonClick(object sender, EventArgs e) { - originalBoldCheckState = fontBoldButton.Checked; + + private void FontBoldButtonClick(object sender, EventArgs e) { + _originalBoldCheckState = fontBoldButton.Checked; } - void FontItalicButtonClick(object sender, EventArgs e) { - originalItalicCheckState = fontItalicButton.Checked; + private void FontItalicButtonClick(object sender, EventArgs e) { + _originalItalicCheckState = fontItalicButton.Checked; } - - void ToolBarFocusableElementGotFocus(object sender, EventArgs e) { - surface.KeysLocked = true; + + private void ToolBarFocusableElementGotFocus(object sender, EventArgs e) { + _surface.KeysLocked = true; } - void ToolBarFocusableElementLostFocus(object sender, EventArgs e) { - surface.KeysLocked = false; + + private void ToolBarFocusableElementLostFocus(object sender, EventArgs e) { + _surface.KeysLocked = false; } - - void SaveElementsToolStripMenuItemClick(object sender, EventArgs e) { + + private void SaveElementsToolStripMenuItemClick(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Greenshot templates (*.gst)|*.gst"; - saveFileDialog.FileName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(coreConfiguration.OutputFileFilenamePattern, surface.CaptureDetails); + saveFileDialog.FileName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(coreConfiguration.OutputFileFilenamePattern, _surface.CaptureDetails); DialogResult dialogResult = saveFileDialog.ShowDialog(); if(dialogResult.Equals(DialogResult.OK)) { using (Stream streamWrite = File.OpenWrite(saveFileDialog.FileName)) { - surface.SaveElementsToStream(streamWrite); + _surface.SaveElementsToStream(streamWrite); } } } - - void LoadElementsToolStripMenuItemClick(object sender, EventArgs e) { + + private void LoadElementsToolStripMenuItemClick(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Greenshot templates (*.gst)|*.gst"; if (openFileDialog.ShowDialog() == DialogResult.OK) { using (Stream streamRead = File.OpenRead(openFileDialog.FileName)) { - surface.LoadElementsFromStream(streamRead); + _surface.LoadElementsFromStream(streamRead); } - surface.Refresh(); + _surface.Refresh(); } } - void DestinationToolStripMenuItemClick(object sender, EventArgs e) { + private void DestinationToolStripMenuItemClick(object sender, EventArgs e) { IDestination clickedDestination = null; if (sender is Control) { Control clickedControl = sender as Control; @@ -1199,39 +1223,39 @@ namespace Greenshot { clickedDestination = (IDestination)clickedMenuItem.Tag; } if (clickedDestination != null) { - ExportInformation exportInformation = clickedDestination.ExportCapture(true, surface, surface.CaptureDetails); + ExportInformation exportInformation = clickedDestination.ExportCapture(true, _surface, _surface.CaptureDetails); if (exportInformation != null && exportInformation.ExportMade) { - surface.Modified = false; + _surface.Modified = false; } } } protected void FilterPresetDropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) { - refreshFieldControls(); + RefreshFieldControls(); Invalidate(true); } - - void SelectAllToolStripMenuItemClick(object sender, EventArgs e) { - surface.SelectAllElements(); + + private void SelectAllToolStripMenuItemClick(object sender, EventArgs e) { + _surface.SelectAllElements(); } - - void BtnConfirmClick(object sender, EventArgs e) { - surface.ConfirmSelectedConfirmableElements(true); - refreshFieldControls(); + + private void BtnConfirmClick(object sender, EventArgs e) { + _surface.ConfirmSelectedConfirmableElements(true); + RefreshFieldControls(); } - - void BtnCancelClick(object sender, EventArgs e) { - surface.ConfirmSelectedConfirmableElements(false); - refreshFieldControls(); + + private void BtnCancelClick(object sender, EventArgs e) { + _surface.ConfirmSelectedConfirmableElements(false); + RefreshFieldControls(); } - - void Insert_window_toolstripmenuitemMouseEnter(object sender, EventArgs e) { + + private void Insert_window_toolstripmenuitemMouseEnter(object sender, EventArgs e) { ToolStripMenuItem captureWindowMenuItem = (ToolStripMenuItem)sender; MainForm.Instance.AddCaptureWindowMenuItems(captureWindowMenuItem, Contextmenu_window_Click); } - void Contextmenu_window_Click(object sender, EventArgs e) { + private void Contextmenu_window_Click(object sender, EventArgs e) { ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; try { WindowDetails windowToCapture = (WindowDetails)clickedItem.Tag; @@ -1245,7 +1269,7 @@ namespace Greenshot { capture = CaptureHelper.CaptureWindow(windowToCapture, capture, coreConfiguration.WindowCaptureMode); if (capture != null && capture.CaptureDetails != null && capture.Image != null) { ((Bitmap)capture.Image).SetResolution(capture.CaptureDetails.DpiX, capture.CaptureDetails.DpiY); - surface.AddImageContainer((Bitmap)capture.Image, 100, 100); + _surface.AddImageContainer((Bitmap)capture.Image, 100, 100); } Activate(); WindowDetails.ToForeground(Handle); @@ -1259,15 +1283,15 @@ namespace Greenshot { } } - void AutoCropToolStripMenuItemClick(object sender, EventArgs e) { - if (surface.AutoCrop()) { - refreshFieldControls(); + private void AutoCropToolStripMenuItemClick(object sender, EventArgs e) { + if (_surface.AutoCrop()) { + RefreshFieldControls(); } } - void AddBorderToolStripMenuItemClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(new BorderEffect()); - updateUndoRedoSurfaceDependencies(); + private void AddBorderToolStripMenuItemClick(object sender, EventArgs e) { + _surface.ApplyBitmapEffect(new BorderEffect()); + UpdateUndoRedoSurfaceDependencies(); } /// <summary> @@ -1275,13 +1299,13 @@ namespace Greenshot { /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void AddDropshadowToolStripMenuItemClick(object sender, EventArgs e) { - DropShadowEffect dropShadowEffect = editorConfiguration.DropShadowEffectSettings; + private void AddDropshadowToolStripMenuItemClick(object sender, EventArgs e) { + DropShadowEffect dropShadowEffect = EditorConfiguration.DropShadowEffectSettings; // TODO: Use the dropshadow settings form to make it possible to change the default values DialogResult result = new DropShadowSettingsForm(dropShadowEffect).ShowDialog(this); if (result == DialogResult.OK) { - surface.ApplyBitmapEffect(dropShadowEffect); - updateUndoRedoSurfaceDependencies(); + _surface.ApplyBitmapEffect(dropShadowEffect); + UpdateUndoRedoSurfaceDependencies(); } } @@ -1290,13 +1314,13 @@ namespace Greenshot { /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void BtnResizeClick(object sender, EventArgs e) { - ResizeEffect resizeEffect = new ResizeEffect(surface.Image.Width, surface.Image.Height, true); + private void BtnResizeClick(object sender, EventArgs e) { + ResizeEffect resizeEffect = new ResizeEffect(_surface.Image.Width, _surface.Image.Height, true); // TODO: Use the Resize SettingsForm to make it possible to change the default values DialogResult result = new ResizeSettingsForm(resizeEffect).ShowDialog(this); if (result == DialogResult.OK) { - surface.ApplyBitmapEffect(resizeEffect); - updateUndoRedoSurfaceDependencies(); + _surface.ApplyBitmapEffect(resizeEffect); + UpdateUndoRedoSurfaceDependencies(); } } @@ -1305,39 +1329,39 @@ namespace Greenshot { /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void TornEdgesToolStripMenuItemClick(object sender, EventArgs e) { - TornEdgeEffect tornEdgeEffect = editorConfiguration.TornEdgeEffectSettings; + private void TornEdgesToolStripMenuItemClick(object sender, EventArgs e) { + TornEdgeEffect tornEdgeEffect = EditorConfiguration.TornEdgeEffectSettings; // TODO: Use the dropshadow settings form to make it possible to change the default values DialogResult result = new TornEdgeSettingsForm(tornEdgeEffect).ShowDialog(this); if (result == DialogResult.OK) { - surface.ApplyBitmapEffect(tornEdgeEffect); - updateUndoRedoSurfaceDependencies(); + _surface.ApplyBitmapEffect(tornEdgeEffect); + UpdateUndoRedoSurfaceDependencies(); } } - void GrayscaleToolStripMenuItemClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(new GrayscaleEffect()); - updateUndoRedoSurfaceDependencies(); + private void GrayscaleToolStripMenuItemClick(object sender, EventArgs e) { + _surface.ApplyBitmapEffect(new GrayscaleEffect()); + UpdateUndoRedoSurfaceDependencies(); } - void ClearToolStripMenuItemClick(object sender, EventArgs e) { - surface.Clear(Color.Transparent); - updateUndoRedoSurfaceDependencies(); + private void ClearToolStripMenuItemClick(object sender, EventArgs e) { + _surface.Clear(Color.Transparent); + UpdateUndoRedoSurfaceDependencies(); } - void RotateCwToolstripButtonClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(new RotateEffect(90)); - updateUndoRedoSurfaceDependencies(); + private void RotateCwToolstripButtonClick(object sender, EventArgs e) { + _surface.ApplyBitmapEffect(new RotateEffect(90)); + UpdateUndoRedoSurfaceDependencies(); } - - void RotateCcwToolstripButtonClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(new RotateEffect(270)); - updateUndoRedoSurfaceDependencies(); + + private void RotateCcwToolstripButtonClick(object sender, EventArgs e) { + _surface.ApplyBitmapEffect(new RotateEffect(270)); + UpdateUndoRedoSurfaceDependencies(); } - - void InvertToolStripMenuItemClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(new InvertEffect()); - updateUndoRedoSurfaceDependencies(); + + private void InvertToolStripMenuItemClick(object sender, EventArgs e) { + _surface.ApplyBitmapEffect(new InvertEffect()); + UpdateUndoRedoSurfaceDependencies(); } private void ImageEditorFormResize(object sender, EventArgs e) { @@ -1347,25 +1371,25 @@ namespace Greenshot { Size imageSize = Surface.Image.Size; Size currentClientSize = panel1.ClientSize; var canvas = Surface as Control; + if (canvas == null) + { + return; + } Panel panel = (Panel)canvas.Parent; if (panel == null) { return; } int offsetX = -panel.HorizontalScroll.Value; int offsetY = -panel.VerticalScroll.Value; - if (canvas != null) { - if (currentClientSize.Width > imageSize.Width) { - canvas.Left = offsetX + ((currentClientSize.Width - imageSize.Width) / 2); - } else { - canvas.Left = offsetX + 0; - } + if (currentClientSize.Width > imageSize.Width) { + canvas.Left = offsetX + (currentClientSize.Width - imageSize.Width) / 2; + } else { + canvas.Left = offsetX + 0; } - if (canvas != null) { - if (currentClientSize.Height > imageSize.Height) { - canvas.Top = offsetY + ((currentClientSize.Height - imageSize.Height) / 2); - } else { - canvas.Top = offsetY + 0; - } + if (currentClientSize.Height > imageSize.Height) { + canvas.Top = offsetY + (currentClientSize.Height - imageSize.Height) / 2; + } else { + canvas.Top = offsetY + 0; } } } diff --git a/Greenshot/Forms/LanguageDialog.cs b/Greenshot/Forms/LanguageDialog.cs index ee0fb7549..4de13156a 100644 --- a/Greenshot/Forms/LanguageDialog.cs +++ b/Greenshot/Forms/LanguageDialog.cs @@ -29,9 +29,9 @@ namespace Greenshot.Forms { /// Description of LanguageDialog. /// </summary> public partial class LanguageDialog : Form { - private static ILog LOG = LogManager.GetLogger(typeof(LanguageDialog)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(LanguageDialog)); private static LanguageDialog uniqueInstance; - private bool properOkPressed = false; + private bool properOkPressed; private LanguageDialog() { // diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index e58af6640..686f507d4 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -54,7 +54,7 @@ namespace Greenshot { private static ILog LOG; private static Mutex _applicationMutex; private static CoreConfiguration _conf; - public static string LogFileLocation = null; + public static string LogFileLocation; public static void Start(string[] args) { bool isAlreadyRunning = false; @@ -258,7 +258,7 @@ namespace Greenshot { using (Form dummyForm = new Form()) { dummyForm.Icon = GreenshotResources.getGreenshotIcon(); dummyForm.ShowInTaskbar = true; - dummyForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + dummyForm.FormBorderStyle = FormBorderStyle.None; dummyForm.Location = new Point(int.MinValue, int.MinValue); dummyForm.Load += delegate { dummyForm.Size = Size.Empty; }; dummyForm.Show(); @@ -581,7 +581,7 @@ namespace Greenshot { contextMenu.ImageScalingSize = coreConfiguration.IconSize; string ieExePath = PluginUtils.GetExePath("iexplore.exe"); if (!string.IsNullOrEmpty(ieExePath)) { - this.contextmenu_captureie.Image = PluginUtils.GetCachedExeIcon(ieExePath, 0); + contextmenu_captureie.Image = PluginUtils.GetCachedExeIcon(ieExePath, 0); } } } diff --git a/Greenshot/Forms/MovableShowColorForm.cs b/Greenshot/Forms/MovableShowColorForm.cs index 6173a4b4e..3b378894a 100644 --- a/Greenshot/Forms/MovableShowColorForm.cs +++ b/Greenshot/Forms/MovableShowColorForm.cs @@ -85,8 +85,8 @@ namespace Greenshot.Forms { /// </summary> /// <param name="screenCoordinates">Point with the coordinates</param> /// <returns>Color at the specified screenCoordinates</returns> - static private Color GetPixelColor(Point screenCoordinates) { - using (SafeWindowDCHandle screenDC = SafeWindowDCHandle.fromDesktop()) { + private static Color GetPixelColor(Point screenCoordinates) { + using (SafeWindowDCHandle screenDC = SafeWindowDCHandle.FromDesktop()) { try { uint pixel = GDI32.GetPixel(screenDC, screenCoordinates.X, screenCoordinates.Y); Color color = Color.FromArgb(255, (int)(pixel & 0xFF), (int)(pixel & 0xFF00) >> 8, (int)(pixel & 0xFF0000) >> 16); diff --git a/Greenshot/Forms/ResizeSettingsForm.cs b/Greenshot/Forms/ResizeSettingsForm.cs index db8cac328..84c8bd31f 100644 --- a/Greenshot/Forms/ResizeSettingsForm.cs +++ b/Greenshot/Forms/ResizeSettingsForm.cs @@ -29,9 +29,9 @@ namespace Greenshot.Forms { /// A form to set the resize settings /// </summary> public partial class ResizeSettingsForm : BaseForm { - private ResizeEffect effect; - private string value_pixel; - private string value_percent; + private readonly ResizeEffect effect; + private readonly string value_pixel; + private readonly string value_percent; private double newWidth, newHeight; public ResizeSettingsForm(ResizeEffect effect) { @@ -50,8 +50,8 @@ namespace Greenshot.Forms { textbox_height.Text = effect.Height.ToString(); newWidth = effect.Width; newHeight = effect.Height; - combobox_width.SelectedIndexChanged += new System.EventHandler(this.combobox_SelectedIndexChanged); - combobox_height.SelectedIndexChanged += new System.EventHandler(this.combobox_SelectedIndexChanged); + combobox_width.SelectedIndexChanged += new EventHandler(combobox_SelectedIndexChanged); + combobox_height.SelectedIndexChanged += new EventHandler(combobox_SelectedIndexChanged); checkbox_aspectratio.Checked = effect.MaintainAspectRatio; } @@ -82,7 +82,7 @@ namespace Greenshot.Forms { private void displayWidth() { double displayValue; if (value_percent.Equals(combobox_width.SelectedItem)) { - displayValue = ((double)newWidth / (double)effect.Width) * 100d; + displayValue = (double)newWidth / (double)effect.Width * 100d; } else { displayValue = newWidth; } @@ -92,7 +92,7 @@ namespace Greenshot.Forms { private void displayHeight() { double displayValue; if (value_percent.Equals(combobox_height.SelectedItem)) { - displayValue = ((double)newHeight / (double)effect.Height) * 100d; + displayValue = (double)newHeight / (double)effect.Height * 100d; } else { displayValue = newHeight; } @@ -126,25 +126,25 @@ namespace Greenshot.Forms { if (isWidth) { if (isPercent) { percent = double.Parse(textbox_width.Text); - newWidth = ((double)effect.Width / 100d) * percent; + newWidth = (double)effect.Width / 100d * percent; } else { newWidth = double.Parse(textbox_width.Text); - percent = ((double)double.Parse(textbox_width.Text) / (double)effect.Width) * 100d; + percent = (double)double.Parse(textbox_width.Text) / (double)effect.Width * 100d; } if (checkbox_aspectratio.Checked) { - newHeight = ((double)effect.Height / 100d) * percent; + newHeight = (double)effect.Height / 100d * percent; displayHeight(); } } else { if (isPercent) { percent = double.Parse(textbox_height.Text); - newHeight = ((double)effect.Height / 100d) * percent; + newHeight = (double)effect.Height / 100d * percent; } else { newHeight = double.Parse(textbox_height.Text); - percent = ((double)double.Parse(textbox_height.Text) / (double)effect.Height) * 100d; + percent = (double)double.Parse(textbox_height.Text) / (double)effect.Height * 100d; } if (checkbox_aspectratio.Checked) { - newWidth = ((double)effect.Width / 100d) * percent; + newWidth = (double)effect.Width / 100d * percent; displayWidth(); } } diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index b64fdfaf0..10b8cec7a 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -43,7 +43,7 @@ namespace Greenshot { /// Description of SettingsForm. /// </summary> public partial class SettingsForm : BaseForm { - private static ILog LOG = LogManager.GetLogger(typeof(SettingsForm)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(SettingsForm)); private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); private readonly ToolTip _toolTip = new ToolTip(); private bool _inHotkey; @@ -237,7 +237,7 @@ namespace Greenshot { string filenamePart = pathParts[pathParts.Length-1]; settingsOk = FilenameHelper.IsFilenameValid(filenamePart); - for (int i = 0; (settingsOk && i<pathParts.Length-1); i++) { + for (int i = 0; settingsOk && i<pathParts.Length-1; i++) { settingsOk = FilenameHelper.IsDirectoryNameValid(pathParts[i]); } @@ -399,7 +399,7 @@ namespace Greenshot { numericUpDown_daysbetweencheck.Value = coreConfiguration.UpdateCheckInterval; numericUpDown_daysbetweencheck.Enabled = !coreConfiguration.Values["UpdateCheckInterval"].IsFixed; - numericUpdownIconSize.Value = (coreConfiguration.IconSize.Width /16) * 16; + numericUpdownIconSize.Value = coreConfiguration.IconSize.Width /16 * 16; CheckDestinationSettings(); } @@ -444,7 +444,6 @@ namespace Greenshot { coreConfiguration.DWMBackgroundColor = colorButton_window_background.SelectedColor; coreConfiguration.UpdateCheckInterval = (int)numericUpDown_daysbetweencheck.Value; - Size previousValue = coreConfiguration.IconSize; coreConfiguration.IconSize = new Size((int)numericUpdownIconSize.Value, (int)numericUpdownIconSize.Value); try { diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index ce26dc1d5..0d02d39b9 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -32,9 +32,9 @@ namespace Greenshot.Forms { /// the ToolStripMenuSelectList makes it possible to have a single or multi-check menu /// </summary> public class ToolStripMenuSelectList : ToolStripMenuItem { - private static CoreConfiguration coreConfiguration = IniConfig.GetIniSection<CoreConfiguration>(); - private bool multiCheckAllowed = false; - private bool updateInProgress = false; + private static readonly CoreConfiguration coreConfiguration = IniConfig.GetIniSection<CoreConfiguration>(); + private readonly bool multiCheckAllowed; + private bool updateInProgress; private static Image defaultImage; /// <summary> diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index 63bae471a..707ea5c32 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -26,7 +26,7 @@ using GreenshotPlugin.Core; namespace Greenshot.Forms { public partial class TornEdgeSettingsForm : BaseForm { - private TornEdgeEffect effect; + private readonly TornEdgeEffect effect; public TornEdgeSettingsForm(TornEdgeEffect effect) { this.effect = effect; InitializeComponent(); @@ -60,11 +60,6 @@ namespace Greenshot.Forms { DialogResult = DialogResult.OK; } - private void ButtonReset_Click(object sender, EventArgs e) { - effect.Reset(); - ShowSettings(); - } - private void ShadowCheckbox_CheckedChanged(object sender, EventArgs e) { thickness.Enabled = shadowCheckbox.Checked; offsetX.Enabled = shadowCheckbox.Checked; diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 301b97c14..5d3868194 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -42,7 +42,7 @@ namespace Greenshot.Helpers { /// </summary> public class CaptureHelper : IDisposable { private static readonly ILog LOG = LogManager.GetLogger(typeof(CaptureHelper)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); // TODO: when we get the screen capture code working correctly, this needs to be enabled //private static ScreenCaptureHelper screenCapture = null; private List<WindowDetails> _windows = new List<WindowDetails>(); @@ -404,7 +404,7 @@ namespace Greenshot.Helpers { // Set capture title, fixing bug #3569703 foreach (WindowDetails window in WindowDetails.GetVisibleWindows()) { - Point estimatedLocation = new Point(conf.LastCapturedRegion.X + (conf.LastCapturedRegion.Width / 2), conf.LastCapturedRegion.Y + (conf.LastCapturedRegion.Height / 2)); + Point estimatedLocation = new Point(conf.LastCapturedRegion.X + conf.LastCapturedRegion.Width / 2, conf.LastCapturedRegion.Y + conf.LastCapturedRegion.Height / 2); if (window.Contains(estimatedLocation)) { _selectedCaptureWindow = window; _capture.CaptureDetails.Title = _selectedCaptureWindow.Text; @@ -850,14 +850,14 @@ namespace Greenshot.Helpers { // check if GDI capture any good, by comparing it with the screen content int blackCountGDI = ImageHelper.CountColor(tmpCapture.Image, Color.Black, false); int GDIPixels = tmpCapture.Image.Width * tmpCapture.Image.Height; - int blackPercentageGDI = (blackCountGDI * 100) / GDIPixels; + int blackPercentageGDI = blackCountGDI * 100 / GDIPixels; if (blackPercentageGDI >= 1) { int screenPixels = windowRectangle.Width * windowRectangle.Height; using (ICapture screenCapture = new Capture()) { screenCapture.CaptureDetails = captureForWindow.CaptureDetails; if (WindowCapture.CaptureRectangleFromDesktopScreen(screenCapture, windowRectangle) != null) { int blackCountScreen = ImageHelper.CountColor(screenCapture.Image, Color.Black, false); - int blackPercentageScreen = (blackCountScreen * 100) / screenPixels; + int blackPercentageScreen = blackCountScreen * 100 / screenPixels; if (screenPixels == GDIPixels) { // "easy compare", both have the same size // If GDI has more black, use the screen capture. diff --git a/Greenshot/Helpers/CopyData.cs b/Greenshot/Helpers/CopyData.cs index ab695822d..776de7a99 100644 --- a/Greenshot/Helpers/CopyData.cs +++ b/Greenshot/Helpers/CopyData.cs @@ -18,6 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + using System; using System.Collections; using System.Collections.Generic; @@ -28,21 +29,21 @@ using System.Windows.Forms; using GreenshotPlugin.Core; -/// <summary> -/// Code from vbAccelerator, location: -/// http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows_Messages/Simple_Interprocess_Communication/WM_COPYDATA_Demo_zip_SimpleInterprocessCommunicationsCS_CopyData_cs.asp -/// </summary> namespace Greenshot.Helpers { public enum CommandEnum { OpenFile, Exit, FirstLaunch, ReloadConfig }; + /// <summary> + /// Code from vbAccelerator, location: + /// http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows_Messages/Simple_Interprocess_Communication/WM_COPYDATA_Demo_zip_SimpleInterprocessCommunicationsCS_CopyData_cs.asp + /// </summary> [Serializable()] public class CopyDataTransport { - List<KeyValuePair<CommandEnum, string>> commands; + private readonly List<KeyValuePair<CommandEnum, string>> _commands; public List<KeyValuePair<CommandEnum, string>> Commands { - get {return commands;} + get {return _commands;} } public CopyDataTransport() { - commands = new List<KeyValuePair<CommandEnum, string>>(); + _commands = new List<KeyValuePair<CommandEnum, string>>(); } public CopyDataTransport(CommandEnum command) : this() { @@ -53,10 +54,10 @@ namespace Greenshot.Helpers { AddCommand(command, commandData); } public void AddCommand(CommandEnum command) { - commands.Add(new KeyValuePair<CommandEnum, string>(command, null)); + _commands.Add(new KeyValuePair<CommandEnum, string>(command, null)); } public void AddCommand(CommandEnum command, string commandData) { - commands.Add(new KeyValuePair<CommandEnum, string>(command, commandData)); + _commands.Add(new KeyValuePair<CommandEnum, string>(command, commandData)); } } @@ -81,16 +82,16 @@ namespace Greenshot.Helpers { [StructLayout(LayoutKind.Sequential)] private struct COPYDATASTRUCT { - public IntPtr dwData; - public int cbData; - public IntPtr lpData; + public readonly IntPtr dwData; + public readonly int cbData; + public readonly IntPtr lpData; } private const int WM_COPYDATA = 0x4A; private const int WM_DESTROY = 0x2; #region Member Variables - private CopyDataChannels channels = null; + private CopyDataChannels _channels; #endregion /// <summary> @@ -109,7 +110,7 @@ namespace Greenshot.Helpers { BinaryFormatter b = new BinaryFormatter(); CopyDataObjectData cdo = (CopyDataObjectData) b.Deserialize(stream); - if (channels != null && channels.Contains(cdo.Channel)) { + if (_channels != null && _channels.Contains(cdo.Channel)) { CopyDataReceivedEventArgs d = new CopyDataReceivedEventArgs(cdo.Channel, cdo.Data, cdo.Sent); OnCopyDataReceived(d); m.Result = (IntPtr) 1; @@ -119,8 +120,8 @@ namespace Greenshot.Helpers { // WM_DESTROY fires before OnHandleChanged and is // a better place to ensure that we've cleared // everything up. - if (channels != null) { - channels.OnHandleChange(); + if (_channels != null) { + _channels.OnHandleChange(); } base.OnHandleChange(); } @@ -131,8 +132,12 @@ namespace Greenshot.Helpers { /// Raises the DataReceived event from this class. /// </summary> /// <param name="e">The data which has been received.</param> - protected void OnCopyDataReceived(CopyDataReceivedEventArgs e) { - CopyDataReceived(this, e); + protected void OnCopyDataReceived(CopyDataReceivedEventArgs e) + { + if (CopyDataReceived != null) + { + CopyDataReceived(this, e); + } } /// <summary> @@ -144,8 +149,8 @@ namespace Greenshot.Helpers { /// </summary> protected override void OnHandleChange () { // need to clear up everything we had set. - if (channels != null) { - channels.OnHandleChange(); + if (_channels != null) { + _channels.OnHandleChange(); } base.OnHandleChange(); } @@ -155,7 +160,7 @@ namespace Greenshot.Helpers { /// </summary> public CopyDataChannels Channels { get { - return channels; + return _channels; } } @@ -168,9 +173,9 @@ namespace Greenshot.Helpers { /// Clears up any resources associated with this object. /// </summary> protected virtual void Dispose(bool disposing) { - if (disposing && channels != null) { - channels.Clear(); - channels = null; + if (disposing && _channels != null) { + _channels.Clear(); + _channels = null; } } @@ -178,7 +183,7 @@ namespace Greenshot.Helpers { /// Constructs a new instance of the CopyData class /// </summary> public CopyData() { - channels = new CopyDataChannels(this); + _channels = new CopyDataChannels(this); } /// <summary> @@ -196,45 +201,28 @@ namespace Greenshot.Helpers { /// which has been sent from another application. /// </summary> public class CopyDataReceivedEventArgs : EventArgs { - private string channelName = ""; - private object data = null; - private DateTime sent; - private DateTime received; - /// <summary> /// Gets the channel name that this data was sent on. /// </summary> - public string ChannelName { - get { - return channelName; - } - } + public string ChannelName { get; } = ""; + /// <summary> /// Gets the data object which was sent. /// </summary> - public Object Data { - get { - return data; - } - } + public object Data { get; } + /// <summary> /// Gets the date and time which at the data was sent /// by the sending application. /// </summary> - public DateTime Sent { - get { - return sent; - } - } + public DateTime Sent { get; } + /// <summary> /// Gets the date and time which this data item as /// received. /// </summary> - public DateTime Received { - get { - return received; - } - } + public DateTime Received { get; } + /// <summary> /// Constructs an instance of this class. /// </summary> @@ -242,10 +230,10 @@ namespace Greenshot.Helpers { /// <param name="data">The data which was sent</param> /// <param name="sent">The date and time the data was sent</param> internal CopyDataReceivedEventArgs(string channelName, object data, DateTime sent) { - this.channelName = channelName; - this.data = data; - this.sent = sent; - received = DateTime.Now; + ChannelName = channelName; + Data = data; + Sent = sent; + Received = DateTime.Now; } } @@ -254,7 +242,7 @@ namespace Greenshot.Helpers { /// class. /// </summary> public class CopyDataChannels : DictionaryBase { - private NativeWindow owner = null; + private readonly NativeWindow _owner; /// <summary> /// Returns an enumerator for each of the CopyDataChannel objects @@ -296,7 +284,7 @@ namespace Greenshot.Helpers { /// receive messages. /// </summary> public void Add(string channelName) { - CopyDataChannel cdc = new CopyDataChannel(owner, channelName); + CopyDataChannel cdc = new CopyDataChannel(_owner, channelName); Dictionary.Add(channelName , cdc); } /// <summary> @@ -334,7 +322,7 @@ namespace Greenshot.Helpers { /// just been removed</param> protected override void OnRemoveComplete ( Object key , Object data ) { ( (CopyDataChannel) data).Dispose(); - base.OnRemove(key, data); + OnRemove(key, data); } /// <summary> @@ -357,7 +345,7 @@ namespace Greenshot.Helpers { /// <param name="owner">The NativeWindow this collection /// will be associated with</param> internal CopyDataChannels(NativeWindow owner) { - this.owner = owner; + _owner = owner; } } @@ -367,14 +355,14 @@ namespace Greenshot.Helpers { public class CopyDataChannel : IDisposable { #region Unmanaged Code [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - private extern static IntPtr GetProp(IntPtr hwnd, string lpString); + private static extern IntPtr GetProp(IntPtr hwnd, string lpString); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - private extern static bool SetProp(IntPtr hwnd, string lpString, IntPtr hData); + private static extern bool SetProp(IntPtr hwnd, string lpString, IntPtr hData); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - private extern static IntPtr RemoveProp(IntPtr hwnd, string lpString); + private static extern IntPtr RemoveProp(IntPtr hwnd, string lpString); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - private extern static IntPtr SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref COPYDATASTRUCT lParam); + private static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref COPYDATASTRUCT lParam); [StructLayout(LayoutKind.Sequential)] private struct COPYDATASTRUCT { @@ -387,19 +375,15 @@ namespace Greenshot.Helpers { #endregion #region Member Variables - private string channelName = ""; - private NativeWindow owner = null; - private bool recreateChannel = false; + + private readonly NativeWindow _owner; + private bool _recreateChannel; #endregion /// <summary> /// Gets the name associated with this channel. /// </summary> - public string ChannelName { - get { - return channelName; - } - } + public string ChannelName { get; private set; } /// <summary> /// Sends the specified object on this channel to any other @@ -411,12 +395,12 @@ namespace Greenshot.Helpers { public int Send(object obj) { int recipients = 0; - if (recreateChannel) { + if (_recreateChannel) { // handle has changed - addChannel(); + AddChannel(); } - CopyDataObjectData cdo = new CopyDataObjectData(obj, channelName); + CopyDataObjectData cdo = new CopyDataObjectData(obj, ChannelName); // Try to do a binary serialization on obj. @@ -446,14 +430,16 @@ namespace Greenshot.Helpers { // Send the data to each window identified on // the channel: foreach(WindowDetails window in WindowDetails.GetAllWindows()) { - if (!window.Handle.Equals(owner.Handle)) { - if (GetProp(window.Handle, channelName) != IntPtr.Zero) { - COPYDATASTRUCT cds = new COPYDATASTRUCT(); - cds.cbData = dataSize; - cds.dwData = IntPtr.Zero; - cds.lpData = ptrData; - SendMessage(window.Handle, WM_COPYDATA, owner.Handle, ref cds); - recipients += (Marshal.GetLastWin32Error() == 0 ? 1 : 0); + if (!window.Handle.Equals(_owner.Handle)) { + if (GetProp(window.Handle, ChannelName) != IntPtr.Zero) { + COPYDATASTRUCT cds = new COPYDATASTRUCT + { + cbData = dataSize, + dwData = IntPtr.Zero, + lpData = ptrData + }; + SendMessage(window.Handle, WM_COPYDATA, _owner.Handle, ref cds); + recipients += Marshal.GetLastWin32Error() == 0 ? 1 : 0; } } } @@ -466,14 +452,14 @@ namespace Greenshot.Helpers { return recipients; } - private void addChannel() { + private void AddChannel() { // Tag this window with property "channelName" - SetProp(owner.Handle, channelName, owner.Handle); + SetProp(_owner.Handle, ChannelName, _owner.Handle); } - private void removeChannel() { + private void RemoveChannel() { // Remove the "channelName" property from this window - RemoveProp(owner.Handle, channelName); + RemoveProp(_owner.Handle, ChannelName); } /// <summary> @@ -484,8 +470,8 @@ namespace Greenshot.Helpers { /// the new handle has been assigned. /// </summary> public void OnHandleChange() { - removeChannel(); - recreateChannel = true; + RemoveChannel(); + _recreateChannel = true; } public void Dispose() { @@ -498,10 +484,10 @@ namespace Greenshot.Helpers { /// </summary> protected virtual void Dispose(bool disposing) { if (disposing) { - if (channelName.Length > 0) { - removeChannel(); + if (ChannelName.Length > 0) { + RemoveChannel(); } - channelName = ""; + ChannelName = ""; } } @@ -513,9 +499,9 @@ namespace Greenshot.Helpers { /// <param name="channelName">The name of the channel to /// send messages on</param> internal CopyDataChannel(NativeWindow owner, string channelName) { - this.owner = owner; - this.channelName = channelName; - addChannel(); + _owner = owner; + ChannelName = channelName; + AddChannel(); } ~CopyDataChannel() { @@ -552,7 +538,7 @@ namespace Greenshot.Helpers { Data = data; if (!data.GetType().IsSerializable) { throw new ArgumentException("Data object must be serializable.", - "data"); + nameof(data)); } Channel = channel; Sent = DateTime.Now; diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index 5d69c99d3..fd5f35095 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -31,9 +31,9 @@ namespace Greenshot.Helpers { /// Description of DestinationHelper. /// </summary> public static class DestinationHelper { - private static ILog LOG = LogManager.GetLogger(typeof(DestinationHelper)); - private static Dictionary<string, IDestination> RegisteredDestinations = new Dictionary<string, IDestination>(); - private static CoreConfiguration coreConfig = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(DestinationHelper)); + private static readonly Dictionary<string, IDestination> RegisteredDestinations = new Dictionary<string, IDestination>(); + private static readonly CoreConfiguration coreConfig = IniConfig.GetIniSection<CoreConfiguration>(); /// Initialize the destinations static DestinationHelper() { diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index 4aa2e9bf7..1da8b4e55 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -20,14 +20,12 @@ */ using System; -using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; using Greenshot.IniFile; using GreenshotPlugin.UnmanagedHelpers; -using log4net; namespace Greenshot.Helpers { @@ -36,19 +34,18 @@ namespace Greenshot.Helpers /// </summary> public static class EnvironmentInfo { - private static readonly ILog LOG = LogManager.GetLogger(typeof(EnvironmentInfo)); - private static bool? isWindows = null; + private static bool? _isWindows; public static bool IsWindows { get { - if (isWindows.HasValue) + if (_isWindows.HasValue) { - return isWindows.Value; + return _isWindows.Value; } - isWindows = Environment.OSVersion.Platform.ToString().StartsWith("Win"); - return isWindows.Value; + _isWindows = Environment.OSVersion.Platform.ToString().StartsWith("Win"); + return _isWindows.Value; } } @@ -101,7 +98,7 @@ namespace Greenshot.Helpers { environment.Append(", "); } - environment.Append(String.Format("OS: {0} {1} {2} (x{3}) {4}", OSInfo.Name, OSInfo.Edition, OSInfo.ServicePack, OSInfo.Bits, OSInfo.VersionString)); + environment.Append(string.Format("OS: {0} {1} {2} (x{3}) {4}", OSInfo.Name, OSInfo.Edition, OSInfo.ServicePack, OSInfo.Bits, OSInfo.VersionString)); if (newline) { environment.AppendLine(); @@ -201,11 +198,6 @@ namespace Greenshot.Helpers exceptionText.AppendLine(EnvironmentToString(true)); exceptionText.AppendLine(ExceptionToString(exception)); exceptionText.AppendLine("Configuration dump:"); - using (TextWriter writer = new StringWriter(exceptionText)) - { - // TODO: Create summary of properties - //var iniConfig = IniConfig.Current.WriteToStreamAsync(); - } return exceptionText.ToString(); } @@ -215,13 +207,13 @@ namespace Greenshot.Helpers /// Provides detailed information about the host operating system. /// Code is available at: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ /// </summary> - static public class OSInfo + public static class OSInfo { #region BITS /// <summary> /// Determines if the current application is 32 or 64-bit. /// </summary> - static public int Bits + public static int Bits { get { @@ -231,24 +223,26 @@ namespace Greenshot.Helpers #endregion BITS #region EDITION - static private string s_Edition; + private static string _sEdition; /// <summary> /// Gets the edition of the operating system running on this computer. /// </summary> - static public string Edition + public static string Edition { get { - if (s_Edition != null) + if (_sEdition != null) { - return s_Edition; //***** RETURN *****// + return _sEdition; //***** RETURN *****// } - string edition = String.Empty; + string edition = string.Empty; OperatingSystem osVersion = Environment.OSVersion; - OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX(); - osVersionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)); + OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX + { + dwOSVersionInfoSize = Marshal.SizeOf(typeof (OSVERSIONINFOEX)) + }; if (GetVersionEx(ref osVersionInfo)) { @@ -469,18 +463,18 @@ namespace Greenshot.Helpers #endregion VERSION 6 } - s_Edition = edition; + _sEdition = edition; return edition; } } #endregion EDITION #region NAME - static private string s_Name; + private static string s_Name; /// <summary> /// Gets the name of the operating system running on this computer. /// </summary> - static public string Name + public static string Name { get { @@ -666,17 +660,17 @@ namespace Greenshot.Helpers private struct OSVERSIONINFOEX { public int dwOSVersionInfoSize; - public int dwMajorVersion; - public int dwMinorVersion; - public int dwBuildNumber; - public int dwPlatformId; + public readonly int dwMajorVersion; + public readonly int dwMinorVersion; + public readonly int dwBuildNumber; + public readonly int dwPlatformId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] - public string szCSDVersion; - public short wServicePackMajor; - public short wServicePackMinor; - public short wSuiteMask; - public byte wProductType; - public byte wReserved; + public readonly string szCSDVersion; + public readonly short wServicePackMajor; + public readonly short wServicePackMinor; + public readonly short wSuiteMask; + public readonly byte wProductType; + public readonly byte wReserved; } #endregion OSVERSIONINFOEX @@ -724,13 +718,9 @@ namespace Greenshot.Helpers #region VERSIONS private const int VER_NT_WORKSTATION = 1; - private const int VER_NT_DOMAIN_CONTROLLER = 2; private const int VER_NT_SERVER = 3; - private const int VER_SUITE_SMALLBUSINESS = 1; private const int VER_SUITE_ENTERPRISE = 2; - private const int VER_SUITE_TERMINAL = 16; private const int VER_SUITE_DATACENTER = 128; - private const int VER_SUITE_SINGLEUSERTS = 256; private const int VER_SUITE_PERSONAL = 512; private const int VER_SUITE_BLADE = 1024; #endregion VERSIONS @@ -740,11 +730,11 @@ namespace Greenshot.Helpers /// <summary> /// Gets the service pack information of the operating system running on this computer. /// </summary> - static public string ServicePack + public static string ServicePack { get { - string servicePack = String.Empty; + string servicePack = string.Empty; OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX(); osVersionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)); @@ -778,7 +768,7 @@ namespace Greenshot.Helpers /// <summary> /// Gets the full version string of the operating system running on this computer. /// </summary> - static public string VersionString + public static string VersionString { get { @@ -791,7 +781,7 @@ namespace Greenshot.Helpers /// <summary> /// Gets the full version of the operating system running on this computer. /// </summary> - static public Version Version + public static Version Version { get { @@ -805,7 +795,7 @@ namespace Greenshot.Helpers /// <summary> /// Gets the major version number of the operating system running on this computer. /// </summary> - static public int MajorVersion + public static int MajorVersion { get { @@ -818,7 +808,7 @@ namespace Greenshot.Helpers /// <summary> /// Gets the minor version number of the operating system running on this computer. /// </summary> - static public int MinorVersion + public static int MinorVersion { get { @@ -831,7 +821,7 @@ namespace Greenshot.Helpers /// <summary> /// Gets the revision version number of the operating system running on this computer. /// </summary> - static public int RevisionVersion + public static int RevisionVersion { get { diff --git a/Greenshot/Helpers/GeometryHelper.cs b/Greenshot/Helpers/GeometryHelper.cs index 98534a2df..ff6ec0191 100644 --- a/Greenshot/Helpers/GeometryHelper.cs +++ b/Greenshot/Helpers/GeometryHelper.cs @@ -37,9 +37,9 @@ namespace Greenshot.Helpers { //Our end result int result = 0; //Take x2-x1, then square it - double part1 = Math.Pow((x2 - x1), 2); + double part1 = Math.Pow(x2 - x1, 2); //Take y2-y1, then square it - double part2 = Math.Pow((y2 - y1), 2); + double part2 = Math.Pow(y2 - y1, 2); //Add both of the parts together double underRadical = part1 + part2; //Get the square root of the parts diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index 1786106c9..78ceb3913 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -42,7 +42,7 @@ namespace Greenshot.Helpers { /// Many thanks to all the people who contributed here! /// </summary> public static class IECaptureHelper { - private static ILog LOG = LogManager.GetLogger(typeof(IECaptureHelper)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(IECaptureHelper)); private static readonly CoreConfiguration configuration = IniConfig.GetIniSection<CoreConfiguration>(); // Helper method to activate a certain IE Tab @@ -69,7 +69,7 @@ namespace Greenshot.Helpers { if (ieWindow != null) { Rectangle wholeClient = someWindow.ClientRectangle; Rectangle partClient = ieWindow.ClientRectangle; - int percentage = (int)(100*((float)(partClient.Width * partClient.Height)) / ((float)(wholeClient.Width * wholeClient.Height))); + int percentage = (int)(100*(float)(partClient.Width * partClient.Height) / (float)(wholeClient.Width * wholeClient.Height)); LOG.InfoFormat("Window {0}, ie part {1}, percentage {2}", wholeClient, partClient, percentage); if (percentage > minimumPercentage) { return true; @@ -143,7 +143,7 @@ namespace Greenshot.Helpers { } else if (configuration.WindowClassesToCheckForIE != null && configuration.WindowClassesToCheckForIE.Contains(ieWindow.ClassName)) { List<string> singleWindowText = new List<string>(); try { - IHTMLDocument2 document2 = getHTMLDocument(ieWindow); + IHTMLDocument2 document2 = GetHtmlDocument(ieWindow); string title = document2.title; Marshal.ReleaseComObject(document2); if (string.IsNullOrEmpty(title)) { @@ -177,7 +177,7 @@ namespace Greenshot.Helpers { /// </summary> /// <param name="mainWindow"></param> /// <returns></returns> - private static IHTMLDocument2 getHTMLDocument(WindowDetails mainWindow) { + private static IHTMLDocument2 GetHtmlDocument(WindowDetails mainWindow) { WindowDetails ieServer; if ("Internet Explorer_Server".Equals(mainWindow.ClassName)) { ieServer = mainWindow; @@ -249,7 +249,7 @@ namespace Greenshot.Helpers { try { // Get the Document - IHTMLDocument2 document2 = getHTMLDocument(ieWindow); + IHTMLDocument2 document2 = GetHtmlDocument(ieWindow); if (document2 == null) { continue; } @@ -371,7 +371,7 @@ namespace Greenshot.Helpers { Bitmap returnBitmap = null; try { Size pageSize = PrepareCapture(documentContainer, capture); - returnBitmap = capturePage(documentContainer, capture, pageSize); + returnBitmap = CapturePage(documentContainer, pageSize); } catch (Exception captureException) { LOG.Error("Exception found, ignoring and returning nothing! Error was: ", captureException); } @@ -554,8 +554,9 @@ namespace Greenshot.Helpers { /// Capture the actual page (document) /// </summary> /// <param name="documentContainer">The document wrapped in a container</param> + /// <param name="pageSize"></param> /// <returns>Bitmap with the page content as an image</returns> - private static Bitmap capturePage(DocumentContainer documentContainer, ICapture capture, Size pageSize) { + private static Bitmap CapturePage(DocumentContainer documentContainer, Size pageSize) { WindowDetails contentWindowDetails = documentContainer.ContentWindow; //Create a target bitmap to draw into with the calculated page size @@ -567,7 +568,7 @@ namespace Greenshot.Helpers { graphicsTarget.Clear(clearColor); // Get the base document & draw it - drawDocument(documentContainer, contentWindowDetails, graphicsTarget); + DrawDocument(documentContainer, contentWindowDetails, graphicsTarget); // Loop over the frames and clear their source area so we don't see any artefacts foreach(DocumentContainer frameDocument in documentContainer.Frames) { @@ -577,7 +578,7 @@ namespace Greenshot.Helpers { } // Loop over the frames and capture their content foreach(DocumentContainer frameDocument in documentContainer.Frames) { - drawDocument(frameDocument, contentWindowDetails, graphicsTarget); + DrawDocument(frameDocument, contentWindowDetails, graphicsTarget); } } return returnBitmap; @@ -586,11 +587,11 @@ namespace Greenshot.Helpers { /// <summary> /// This method takes the actual capture of the document (frame) /// </summary> - /// <param name="frameDocument"></param> + /// <param name="documentContainer"></param> /// <param name="contentWindowDetails">Needed for referencing the location of the frame</param> /// <returns>Bitmap with the capture</returns> - private static void drawDocument(DocumentContainer documentContainer, WindowDetails contentWindowDetails, Graphics graphicsTarget) { - documentContainer.setAttribute("scroll", 1); + private static void DrawDocument(DocumentContainer documentContainer, WindowDetails contentWindowDetails, Graphics graphicsTarget) { + documentContainer.SetAttribute("scroll", 1); //Get Browser Window Width & Height int pageWidth = documentContainer.ScrollWidth; @@ -621,14 +622,14 @@ namespace Greenshot.Helpers { Point targetOffset = new Point(); // Loop of the pages and make a copy of the visible viewport - while ((horizontalPage * viewportWidth) < pageWidth) { + while (horizontalPage * viewportWidth < pageWidth) { // Scroll to location documentContainer.ScrollLeft = viewportWidth * horizontalPage; targetOffset.X = documentContainer.ScrollLeft; // Variable used for looping vertically int verticalPage = 0; - while ((verticalPage * viewportHeight) < pageHeight) { + while (verticalPage * viewportHeight < pageHeight) { // Scroll to location documentContainer.ScrollTop = viewportHeight * verticalPage; //Shoot visible window diff --git a/Greenshot/Helpers/IEInterop/IEContainer.cs b/Greenshot/Helpers/IEInterop/IEContainer.cs index 0b5b740bc..899ebae46 100644 --- a/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -26,33 +26,31 @@ using System.Runtime.InteropServices; using GreenshotPlugin.Core; using Greenshot.Interop.IE; -using Greenshot.IniFile; using log4net; using IServiceProvider = Greenshot.Interop.IServiceProvider; namespace Greenshot.Helpers.IEInterop { public class DocumentContainer { - private static ILog LOG = LogManager.GetLogger(typeof(DocumentContainer)); - private static CoreConfiguration configuration = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(DocumentContainer)); private const int E_ACCESSDENIED = unchecked((int)0x80070005L); private static readonly Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); private static readonly Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"); - private static int counter = 0; - private int id = counter++; - private IHTMLDocument2 document2; - private IHTMLDocument3 document3; - private Point sourceLocation; - private Point destinationLocation; - private Point startLocation = Point.Empty; - private Rectangle viewportRectangle = Rectangle.Empty; - private string name = null; - private string url; - private bool isDTD; - private DocumentContainer parent; - private WindowDetails contentWindow; - private double zoomLevelX = 1; - private double zoomLevelY = 1; - private List<DocumentContainer> frames = new List<DocumentContainer>(); + private static int _counter; + private readonly int _id = _counter++; + private IHTMLDocument2 _document2; + private IHTMLDocument3 _document3; + private Point _sourceLocation; + private Point _destinationLocation; + private Point _startLocation = Point.Empty; + private Rectangle _viewportRectangle = Rectangle.Empty; + private string _name; + private string _url; + private bool _isDtd; + private DocumentContainer _parent; + private WindowDetails _contentWindow; + private double _zoomLevelX = 1; + private double _zoomLevelY = 1; + private readonly IList<DocumentContainer> _frames = new List<DocumentContainer>(); private DocumentContainer(IHTMLWindow2 frameWindow, WindowDetails contentWindow, DocumentContainer parent) { //IWebBrowser2 webBrowser2 = frame as IWebBrowser2; @@ -60,22 +58,22 @@ namespace Greenshot.Helpers.IEInterop { IHTMLDocument2 document2 = GetDocumentFromWindow(frameWindow); try { LOG.DebugFormat("frameWindow.name {0}", frameWindow.name); - name = frameWindow.name; + _name = frameWindow.name; } catch { - + // Ignore } try { LOG.DebugFormat("document2.url {0}",document2.url); } catch { - + // Ignore } try { LOG.DebugFormat("document2.title {0}", document2.title); } catch { - + // Ignore } - this.parent = parent; + _parent = parent; // Calculate startLocation for the frames IHTMLWindow2 window2 = document2.parentWindow; IHTMLWindow3 window3 = (IHTMLWindow3)window2; @@ -87,13 +85,13 @@ namespace Greenshot.Helpers.IEInterop { releaseCom(window2); releaseCom(window3); - startLocation = new Point(x, y); + _startLocation = new Point(x, y); Init(document2, contentWindow); } public DocumentContainer(IHTMLDocument2 document2, WindowDetails contentWindow) { Init(document2, contentWindow); - LOG.DebugFormat("Creating DocumentContainer for Document {0} found in window with rectangle {1}", name, SourceRectangle); + LOG.DebugFormat("Creating DocumentContainer for Document {0} found in window with rectangle {1}", _name, SourceRectangle); } /// <summary> @@ -112,17 +110,17 @@ namespace Greenshot.Helpers.IEInterop { /// <param name="document2">IHTMLDocument2</param> /// <param name="contentWindow">WindowDetails</param> private void Init(IHTMLDocument2 document2, WindowDetails contentWindow) { - this.document2 = document2; - this.contentWindow = contentWindow; - document3 = document2 as IHTMLDocument3; + _document2 = document2; + _contentWindow = contentWindow; + _document3 = document2 as IHTMLDocument3; // Check what access method is needed for the document IHTMLDocument5 document5 = (IHTMLDocument5)document2; //compatibility mode affects how height is computed - isDTD = false; + _isDtd = false; try { - if ((document3.documentElement != null) && (!document5.compatMode.Equals("BackCompat"))) { - isDTD = true; + if (_document3 != null && (_document3.documentElement != null) && !document5.compatMode.Equals("BackCompat")) { + _isDtd = true; } } catch (Exception ex) { LOG.Error("Error checking the compatibility mode:"); @@ -133,21 +131,21 @@ namespace Greenshot.Helpers.IEInterop { Rectangle clientRectangle = contentWindow.WindowRectangle; try { - IHTMLWindow2 window2 = (IHTMLWindow2)document2.parentWindow; + IHTMLWindow2 window2 = document2.parentWindow; //IHTMLWindow3 window3 = (IHTMLWindow3)document2.parentWindow; IHTMLScreen screen = window2.screen; IHTMLScreen2 screen2 = (IHTMLScreen2)screen; - if (parent != null) { + if (_parent != null) { // Copy parent values - zoomLevelX = parent.zoomLevelX; - zoomLevelY = parent.zoomLevelY; - viewportRectangle = parent.viewportRectangle; + _zoomLevelX = _parent._zoomLevelX; + _zoomLevelY = _parent._zoomLevelY; + _viewportRectangle = _parent._viewportRectangle; } else { //DisableScrollbars(document2); // Calculate zoom level - zoomLevelX = (double)screen2.deviceXDPI/(double)screen2.logicalXDPI; - zoomLevelY = (double)screen2.deviceYDPI/(double)screen2.logicalYDPI; + _zoomLevelX = screen2.deviceXDPI/(double)screen2.logicalXDPI; + _zoomLevelY = screen2.deviceYDPI/(double)screen2.logicalYDPI; // Calculate the viewport rectangle, needed if there is a frame around the html window @@ -162,11 +160,11 @@ namespace Greenshot.Helpers.IEInterop { if ((diffX == 4 || diffX >= 20) && (diffY == 4 || diffY >= 20)) { Point viewportOffset = new Point(2, 2); Size viewportSize = new Size(ClientWidth, ClientHeight); - viewportRectangle = new Rectangle(viewportOffset, viewportSize); - LOG.DebugFormat("viewportRect {0}", viewportRectangle); + _viewportRectangle = new Rectangle(viewportOffset, viewportSize); + LOG.DebugFormat("viewportRect {0}", _viewportRectangle); } } - LOG.DebugFormat("Zoomlevel {0}, {1}", zoomLevelX, zoomLevelY); + LOG.DebugFormat("Zoomlevel {0}, {1}", _zoomLevelX, _zoomLevelY); // Release com objects releaseCom(window2); releaseCom(screen); @@ -177,23 +175,23 @@ namespace Greenshot.Helpers.IEInterop { try { - LOG.DebugFormat("Calculated location {0} for {1}", startLocation, document2.title); - if (name == null) { - name = document2.title; + LOG.DebugFormat("Calculated location {0} for {1}", _startLocation, document2.title); + if (_name == null) { + _name = document2.title; } } catch (Exception e) { LOG.Warn("Problem while trying to get document title!", e); } try { - url = document2.url; + _url = document2.url; } catch (Exception e) { LOG.Warn("Problem while trying to get document url!", e); } - sourceLocation = new Point(ScaleX((int)startLocation.X), ScaleY((int)startLocation.Y)); - destinationLocation = new Point(ScaleX((int)startLocation.X), ScaleY((int)startLocation.Y)); + _sourceLocation = new Point(ScaleX(_startLocation.X), ScaleY(_startLocation.Y)); + _destinationLocation = new Point(ScaleX(_startLocation.X), ScaleY(_startLocation.Y)); - if (parent != null) { + if (_parent != null) { return; } try { @@ -203,9 +201,9 @@ namespace Greenshot.Helpers.IEInterop { IHTMLWindow2 frameWindow = frameCollection.item(frame); DocumentContainer frameData = new DocumentContainer(frameWindow, contentWindow, this); // check if frame is hidden - if (!frameData.isHidden) { - LOG.DebugFormat("Creating DocumentContainer for Frame {0} found in window with rectangle {1}", frameData.name, frameData.SourceRectangle); - frames.Add(frameData); + if (!frameData.IsHidden) { + LOG.DebugFormat("Creating DocumentContainer for Frame {0} found in window with rectangle {1}", frameData._name, frameData.SourceRectangle); + _frames.Add(frameData); } else { LOG.DebugFormat("Skipping frame {0}", frameData.Name); } @@ -223,7 +221,7 @@ namespace Greenshot.Helpers.IEInterop { try { // Correct iframe locations - foreach (IHTMLElement frameElement in document3.getElementsByTagName("IFRAME")) { + foreach (IHTMLElement frameElement in _document3.getElementsByTagName("IFRAME")) { try { CorrectFrameLocations(frameElement); // Clean up frameElement @@ -264,7 +262,7 @@ namespace Greenshot.Helpers.IEInterop { // Release IHTMLRect releaseCom(rec); LOG.DebugFormat("Looking for iframe to correct at {0}", elementBoundingLocation); - foreach(DocumentContainer foundFrame in frames) { + foreach(DocumentContainer foundFrame in _frames) { Point frameLocation = foundFrame.SourceLocation; if (frameLocation.Equals(elementBoundingLocation)) { // Match found, correcting location @@ -313,13 +311,13 @@ namespace Greenshot.Helpers.IEInterop { IServiceProvider sp = (IServiceProvider)htmlWindow; // Use IServiceProvider.QueryService to get IWebBrowser2 object. - Object brws = null; + object brws; Guid webBrowserApp = IID_IWebBrowserApp; Guid webBrowser2 = IID_IWebBrowser2; sp.QueryService(ref webBrowserApp, ref webBrowser2, out brws); // Get the document from IWebBrowser2. - IWebBrowser2 browser = (IWebBrowser2)(brws); + IWebBrowser2 browser = (IWebBrowser2)brws; return (IHTMLDocument2)browser.Document; } catch (Exception ex2) { @@ -331,9 +329,9 @@ namespace Greenshot.Helpers.IEInterop { public Color BackgroundColor { get { try { - string bgColor = (string)document2.bgColor; + string bgColor = (string)_document2.bgColor; if (bgColor != null) { - int rgbInt = Int32.Parse(bgColor.Substring(1), NumberStyles.HexNumber); + int rgbInt = int.Parse(bgColor.Substring(1), NumberStyles.HexNumber); return Color.FromArgb(rgbInt >> 16, (rgbInt >> 8) & 255, rgbInt & 255); } } catch (Exception ex) { @@ -345,46 +343,46 @@ namespace Greenshot.Helpers.IEInterop { public Rectangle ViewportRectangle { get { - return viewportRectangle; + return _viewportRectangle; } } public WindowDetails ContentWindow { get { - return contentWindow; + return _contentWindow; } } public DocumentContainer Parent { get { - return parent; + return _parent; } set { - parent = value; + _parent = value; } } private int ScaleX(int physicalValue) { - return (int)Math.Round(physicalValue * zoomLevelX, MidpointRounding.AwayFromZero); + return (int)Math.Round(physicalValue * _zoomLevelX, MidpointRounding.AwayFromZero); } private int ScaleY(int physicalValue) { - return (int)Math.Round(physicalValue * zoomLevelY, MidpointRounding.AwayFromZero); + return (int)Math.Round(physicalValue * _zoomLevelY, MidpointRounding.AwayFromZero); } private int UnscaleX(int physicalValue) { - return (int)Math.Round(physicalValue / zoomLevelX, MidpointRounding.AwayFromZero); + return (int)Math.Round(physicalValue / _zoomLevelX, MidpointRounding.AwayFromZero); } private int UnscaleY(int physicalValue) { - return (int)Math.Round(physicalValue / zoomLevelY, MidpointRounding.AwayFromZero); + return (int)Math.Round(physicalValue / _zoomLevelY, MidpointRounding.AwayFromZero); } /// <summary> /// Set/change an int attribute on a document /// </summary> - public void setAttribute(string attribute, int value) { - setAttribute(attribute, value.ToString()); + public void SetAttribute(string attribute, int value) { + SetAttribute(attribute, value.ToString()); } /// <summary> @@ -392,14 +390,12 @@ namespace Greenshot.Helpers.IEInterop { /// </summary> /// <param name="attribute">Attribute to set</param> /// <param name="value">Value to set</param> - /// <param name="document2">The IHTMLDocument2</param> - /// <param name="document3">The IHTMLDocument3</param> - public void setAttribute(string attribute, string value) { + public void SetAttribute(string attribute, string value) { IHTMLElement element = null; - if (!isDTD) { - element = document2.body; + if (!_isDtd) { + element = _document2.body; } else { - element = document3.documentElement; + element = _document3.documentElement; } element.setAttribute(attribute, value, 1); // Release IHTMLElement com object @@ -410,18 +406,15 @@ namespace Greenshot.Helpers.IEInterop { /// Get the attribute from a document /// </summary> /// <param name="attribute">Attribute to get</param> - /// <param name="document2">The IHTMLDocument2</param> - /// <param name="document3">The IHTMLDocument3</param> /// <returns>object with the attribute value</returns> - public object getAttribute(string attribute) { - IHTMLElement element = null; - object retVal = 0; - if (!isDTD) { - element = document2.body; + public object GetAttribute(string attribute) { + IHTMLElement element; + if (!_isDtd) { + element = _document2.body; } else { - element = document3.documentElement; + element = _document3.documentElement; } - retVal = element.getAttribute(attribute, 1); + var retVal = element.getAttribute(attribute, 1); // Release IHTMLElement com object releaseCom(element); return retVal; @@ -430,30 +423,30 @@ namespace Greenshot.Helpers.IEInterop { /// <summary> /// Get the attribute as int from a document /// </summary> - public int getAttributeAsInt(string attribute) { - int retVal = (int)getAttribute(attribute); + public int GetAttributeAsInt(string attribute) { + int retVal = (int)GetAttribute(attribute); return retVal; } public int ID { get { - return id; + return _id; } } public string Name { get { - return name; + return _name; } } public string Url { get { - return url; + return _url; } } - public bool isHidden { + public bool IsHidden { get { return ClientWidth == 0 || ClientHeight == 0; } @@ -461,34 +454,34 @@ namespace Greenshot.Helpers.IEInterop { public int ClientWidth { get { - return ScaleX(getAttributeAsInt("clientWidth")); + return ScaleX(GetAttributeAsInt("clientWidth")); } } public int ClientHeight { get { - return ScaleY(getAttributeAsInt("clientHeight")); + return ScaleY(GetAttributeAsInt("clientHeight")); } } public int ScrollWidth { get { - return ScaleX(getAttributeAsInt("scrollWidth")); + return ScaleX(GetAttributeAsInt("scrollWidth")); } } public int ScrollHeight { get { - return ScaleY(getAttributeAsInt("scrollHeight")); + return ScaleY(GetAttributeAsInt("scrollHeight")); } } public Point SourceLocation { get { - return sourceLocation; + return _sourceLocation; } set { - sourceLocation = value; + _sourceLocation = value; } } @@ -506,34 +499,34 @@ namespace Greenshot.Helpers.IEInterop { public int SourceLeft { get { - return sourceLocation.X; + return _sourceLocation.X; } } public int SourceTop { get { - return sourceLocation.Y; + return _sourceLocation.Y; } } public int SourceRight { get { - return sourceLocation.X + ClientWidth; + return _sourceLocation.X + ClientWidth; } } public int SourceBottom { get { - return sourceLocation.Y + ClientHeight; + return _sourceLocation.Y + ClientHeight; } } public Point DestinationLocation { get { - return destinationLocation; + return _destinationLocation; } set { - destinationLocation = value; + _destinationLocation = value; } } @@ -552,55 +545,55 @@ namespace Greenshot.Helpers.IEInterop { public int DestinationLeft { get { - return destinationLocation.X; + return _destinationLocation.X; } set { - destinationLocation.X = value; + _destinationLocation.X = value; } } public int DestinationTop { get { - return destinationLocation.Y; + return _destinationLocation.Y; } set { - destinationLocation.Y = value; + _destinationLocation.Y = value; } } public int DestinationRight { get { - return destinationLocation.X + ScrollWidth; + return _destinationLocation.X + ScrollWidth; } } public int DestinationBottom { get { - return destinationLocation.Y + ScrollHeight; + return _destinationLocation.Y + ScrollHeight; } } public int ScrollLeft { get{ - return ScaleX(getAttributeAsInt("scrollLeft")); + return ScaleX(GetAttributeAsInt("scrollLeft")); } set { - setAttribute("scrollLeft", UnscaleX(value)); + SetAttribute("scrollLeft", UnscaleX(value)); } } public int ScrollTop { get{ - return ScaleY(getAttributeAsInt("scrollTop")); + return ScaleY(GetAttributeAsInt("scrollTop")); } set { - setAttribute("scrollTop", UnscaleY(value)); + SetAttribute("scrollTop", UnscaleY(value)); } } - public List<DocumentContainer> Frames { + public IList<DocumentContainer> Frames { get { - return frames; + return _frames; } } } diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index 4bb549603..b7024ae0d 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -97,9 +97,9 @@ namespace Greenshot.Helpers { private class MapiFileDescriptor { public int reserved = 0; public int flags = 0; - public int position = 0; - public string path = null; - public string name = null; + public int position; + public string path; + public string name; public IntPtr type = IntPtr.Zero; } @@ -110,7 +110,8 @@ namespace Greenshot.Helpers { /// <summary> /// Specifies the valid RecipientTypes for a Recipient. /// </summary> - public enum RecipientType : int { + public enum RecipientType + { /// <summary> /// Recipient will be in the TO list. /// </summary> @@ -497,25 +498,25 @@ namespace Greenshot.Helpers { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public class MapiMessage { public int Reserved = 0; - public string Subject = null; - public string NoteText = null; + public string Subject; + public string NoteText; public string MessageType = null; public string DateReceived = null; public string ConversationID = null; public int Flags = 0; public IntPtr Originator = IntPtr.Zero; - public int RecipientCount = 0; + public int RecipientCount; public IntPtr Recipients = IntPtr.Zero; - public int FileCount = 0; + public int FileCount; public IntPtr Files = IntPtr.Zero; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public class MapiRecipDesc { public int Reserved = 0; - public int RecipientClass = 0; - public string Name = null; - public string Address = null; + public int RecipientClass; + public string Name; + public string Address; public int eIDSize = 0; public IntPtr EntryID = IntPtr.Zero; } @@ -542,12 +543,12 @@ namespace Greenshot.Helpers { /// <summary> /// The email address of this recipient. /// </summary> - public string Address = null; + public string Address; /// <summary> /// The display name of this recipient. /// </summary> - public string DisplayName = null; + public string DisplayName; /// <summary> /// How the recipient will receive this message (To, CC, BCC). diff --git a/Greenshot/Helpers/PluginHelper.cs b/Greenshot/Helpers/PluginHelper.cs index 9062490e3..c757cef68 100644 --- a/Greenshot/Helpers/PluginHelper.cs +++ b/Greenshot/Helpers/PluginHelper.cs @@ -36,12 +36,12 @@ namespace Greenshot.Helpers { [Serializable] public class PluginHelper : IGreenshotHost { private static readonly ILog LOG = LogManager.GetLogger(typeof(PluginHelper)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - private static string pluginPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),Application.ProductName); - private static string applicationPath = Path.GetDirectoryName(Application.ExecutablePath); - private static string pafPath = Path.Combine(Application.StartupPath, @"App\Greenshot"); - private static IDictionary<PluginAttribute, IGreenshotPlugin> plugins = new SortedDictionary<PluginAttribute, IGreenshotPlugin>(); + private static readonly string pluginPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),Application.ProductName); + private static readonly string applicationPath = Path.GetDirectoryName(Application.ExecutablePath); + private static readonly string pafPath = Path.Combine(Application.StartupPath, @"App\Greenshot"); + private static readonly IDictionary<PluginAttribute, IGreenshotPlugin> plugins = new SortedDictionary<PluginAttribute, IGreenshotPlugin>(); private static readonly PluginHelper instance = new PluginHelper(); public static PluginHelper Instance { get { @@ -66,7 +66,7 @@ namespace Greenshot.Helpers { } public bool HasPlugins() { - return (plugins != null && plugins.Count > 0); + return plugins != null && plugins.Count > 0; } public void Shutdown() { diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index ddb42b5b9..c9016569f 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -37,10 +37,10 @@ namespace Greenshot.Helpers { /// </summary> public class PrintHelper : IDisposable { private static readonly ILog LOG = LogManager.GetLogger(typeof(PrintHelper)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private ISurface surface; - private ICaptureDetails captureDetails; + private readonly ICaptureDetails captureDetails; private PrintDocument printDocument = new PrintDocument(); private PrintDialog printDialog = new PrintDialog(); @@ -218,7 +218,7 @@ namespace Greenshot.Helpers { if (conf.OutputPrintFooter) { //printRect = new RectangleF(0, 0, printRect.Width, printRect.Height - (dateStringHeight * 2)); using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { - e.Graphics.DrawString(footerString, f, Brushes.Black, pageRect.Width / 2 - (footerStringWidth / 2), pageRect.Height); + e.Graphics.DrawString(footerString, f, Brushes.Black, pageRect.Width / 2 - footerStringWidth / 2, pageRect.Height); } } e.Graphics.DrawImage(image, printRect, imageRect, GraphicsUnit.Pixel); diff --git a/Greenshot/Helpers/ProcessorHelper.cs b/Greenshot/Helpers/ProcessorHelper.cs index ea5c4bef9..5da3736ac 100644 --- a/Greenshot/Helpers/ProcessorHelper.cs +++ b/Greenshot/Helpers/ProcessorHelper.cs @@ -30,8 +30,8 @@ namespace Greenshot.Helpers { /// Description of ProcessorHelper. /// </summary> public static class ProcessorHelper { - private static ILog LOG = LogManager.GetLogger(typeof(ProcessorHelper)); - private static Dictionary<string, IProcessor> RegisteredProcessors = new Dictionary<string, IProcessor>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(ProcessorHelper)); + private static readonly Dictionary<string, IProcessor> RegisteredProcessors = new Dictionary<string, IProcessor>(); /// Initialize the Processors static ProcessorHelper() { diff --git a/Greenshot/Helpers/ScaleHelper.cs b/Greenshot/Helpers/ScaleHelper.cs index 77557fc73..7f348b932 100644 --- a/Greenshot/Helpers/ScaleHelper.cs +++ b/Greenshot/Helpers/ScaleHelper.cs @@ -22,7 +22,6 @@ using System; using System.Drawing; using System.Windows.Forms; using Greenshot.Drawing; -using log4net; namespace Greenshot.Helpers { /// <summary> @@ -45,9 +44,7 @@ namespace Greenshot.Helpers { /// </summary> Rational = 0x02 } - - private static readonly ILog LOG = LogManager.GetLogger(typeof(ScaleHelper)); - + /// <summary> /// calculates the Size an element must be resized to, in order to fit another element, keeping aspect ratio /// </summary> @@ -77,7 +74,7 @@ namespace Greenshot.Helpers { newRect.X = (targetRect.Width - currentRect.Width) / 2; break; case ContentAlignment.TopRight: - newRect.X = (targetRect.Width - currentRect.Width); + newRect.X = targetRect.Width - currentRect.Width; break; case ContentAlignment.MiddleLeft: newRect.Y = (targetRect.Height - currentRect.Height) / 2; @@ -88,18 +85,18 @@ namespace Greenshot.Helpers { break; case ContentAlignment.MiddleRight: newRect.Y = (targetRect.Height - currentRect.Height) / 2; - newRect.X = (targetRect.Width - currentRect.Width); + newRect.X = targetRect.Width - currentRect.Width; break; case ContentAlignment.BottomLeft: - newRect.Y = (targetRect.Height - currentRect.Height); + newRect.Y = targetRect.Height - currentRect.Height; break; case ContentAlignment.BottomCenter: - newRect.Y = (targetRect.Height - currentRect.Height); + newRect.Y = targetRect.Height - currentRect.Height; newRect.X = (targetRect.Width - currentRect.Width) / 2; break; case ContentAlignment.BottomRight: - newRect.Y = (targetRect.Height - currentRect.Height); - newRect.X = (targetRect.Width - currentRect.Width); + newRect.Y = targetRect.Height - currentRect.Height; + newRect.X = targetRect.Width - currentRect.Width; break; } return newRect; @@ -323,7 +320,7 @@ namespace Greenshot.Helpers { /// <returns>the current ScaleOptions depending on modifier keys held down</returns> public static ScaleOptions GetScaleOptions() { bool anchorAtCenter = (Control.ModifierKeys & Keys.Control) != 0; - bool maintainAspectRatio = ((Control.ModifierKeys & Keys.Shift) != 0); + bool maintainAspectRatio = (Control.ModifierKeys & Keys.Shift) != 0; ScaleOptions opts = ScaleOptions.Default; if(anchorAtCenter) opts |= ScaleOptions.Centered; if(maintainAspectRatio) opts |= ScaleOptions.Rational; @@ -349,7 +346,7 @@ namespace Greenshot.Helpers { } } public class FixedAngleRoundBehavior : IDoubleProcessor { - private double fixedAngle; + private readonly double fixedAngle; public FixedAngleRoundBehavior(double fixedAngle) { this.fixedAngle = fixedAngle; } diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index 1b84b1907..d362d8d2b 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -39,27 +39,27 @@ namespace Greenshot.Helpers { /// </summary> public static class SoundHelper { private static readonly ILog LOG = LogManager.GetLogger(typeof(SoundHelper)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - private static GCHandle? gcHandle = null; - private static byte[] soundBuffer = null; + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static GCHandle? _gcHandle; + private static byte[] _soundBuffer; public static void Initialize() { - if (gcHandle == null) { + if (_gcHandle == null) { try { ResourceManager resources = new ResourceManager("Greenshot.Sounds", Assembly.GetExecutingAssembly()); - soundBuffer = (byte[])resources.GetObject("camera"); + _soundBuffer = (byte[])resources.GetObject("camera"); if (conf.NotificationSound != null && conf.NotificationSound.EndsWith(".wav")) { try { if (File.Exists(conf.NotificationSound)) { - soundBuffer = File.ReadAllBytes(conf.NotificationSound); + _soundBuffer = File.ReadAllBytes(conf.NotificationSound); } } catch (Exception ex) { LOG.WarnFormat("couldn't load {0}: {1}", conf.NotificationSound, ex.Message); } } // Pin sound so it can't be moved by the Garbage Collector, this was the cause for the bad sound - gcHandle = GCHandle.Alloc(soundBuffer, GCHandleType.Pinned); + _gcHandle = GCHandle.Alloc(_soundBuffer, GCHandleType.Pinned); } catch (Exception e) { LOG.Error("Error initializing.", e); } @@ -67,11 +67,11 @@ namespace Greenshot.Helpers { } public static void Play() { - if (soundBuffer != null) { + if (_soundBuffer != null) { //Thread playSoundThread = new Thread(delegate() { SoundFlags flags = SoundFlags.SND_ASYNC | SoundFlags.SND_MEMORY | SoundFlags.SND_NOWAIT | SoundFlags.SND_NOSTOP; try { - WinMM.PlaySound(gcHandle.Value.AddrOfPinnedObject(), (UIntPtr)0, (uint)flags); + WinMM.PlaySound(_gcHandle.Value.AddrOfPinnedObject(), (UIntPtr)0, (uint)flags); } catch (Exception e) { LOG.Error("Error in play.", e); } @@ -84,10 +84,10 @@ namespace Greenshot.Helpers { public static void Deinitialize() { try { - if (gcHandle != null) { + if (_gcHandle != null) { WinMM.PlaySound((byte[])null, (UIntPtr)0, (uint)0); - gcHandle.Value.Free(); - gcHandle = null; + _gcHandle.Value.Free(); + _gcHandle = null; } } catch (Exception e) { LOG.Error("Error in deinitialize.", e); diff --git a/Greenshot/Helpers/UpdateHelper.cs b/Greenshot/Helpers/UpdateHelper.cs index 723331d25..cf7437835 100644 --- a/Greenshot/Helpers/UpdateHelper.cs +++ b/Greenshot/Helpers/UpdateHelper.cs @@ -35,7 +35,7 @@ namespace Greenshot.Experimental { /// </summary> public static class UpdateHelper { private static readonly ILog LOG = LogManager.GetLogger(typeof(UpdateHelper)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private const string STABLE_DOWNLOAD_LINK = "http://getgreenshot.org/downloads/"; private const string VERSION_HISTORY_LINK = "http://getgreenshot.org/version-history/"; private static readonly object LockObject = new object(); diff --git a/Greenshot/Helpers/WindowWrapper.cs b/Greenshot/Helpers/WindowWrapper.cs index c23614482..4de8a60c1 100644 --- a/Greenshot/Helpers/WindowWrapper.cs +++ b/Greenshot/Helpers/WindowWrapper.cs @@ -31,6 +31,6 @@ namespace Greenshot.Helpers { get { return _hwnd; } } - private IntPtr _hwnd; + private readonly IntPtr _hwnd; } } diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 91f3fcd3b..98a70214e 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -28,12 +28,12 @@ namespace Greenshot.Memento { /// The AddElementMemento makes it possible to undo adding an element /// </summary> public class AddElementMemento : IMemento { - private IDrawableContainer drawableContainer; - private Surface surface; + private IDrawableContainer _drawableContainer; + private Surface _surface; public AddElementMemento(Surface surface, IDrawableContainer drawableContainer) { - this.surface = surface; - this.drawableContainer = drawableContainer; + _surface = surface; + _drawableContainer = drawableContainer; } public void Dispose() { @@ -43,8 +43,8 @@ namespace Greenshot.Memento { protected virtual void Dispose(bool disposing) { //if (disposing) { } - drawableContainer = null; - surface = null; + _drawableContainer = null; + _surface = null; } public LangKey ActionLanguageKey { @@ -59,16 +59,15 @@ namespace Greenshot.Memento { public IMemento Restore() { // Before - drawableContainer.Invalidate(); + _drawableContainer.Invalidate(); // Store the selected state, as it's overwritten by the RemoveElement - bool selected = drawableContainer.Selected; - DeleteElementMemento oldState = new DeleteElementMemento(surface, drawableContainer); - surface.RemoveElement(drawableContainer, false); - drawableContainer.Selected = true; + DeleteElementMemento oldState = new DeleteElementMemento(_surface, _drawableContainer); + _surface.RemoveElement(_drawableContainer, false); + _drawableContainer.Selected = true; // After - drawableContainer.Invalidate(); + _drawableContainer.Invalidate(); return oldState; } } diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index 0c4911ae1..03a04ab5d 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -29,8 +29,8 @@ namespace Greenshot.Memento { /// </summary> public class ChangeFieldHolderMemento : IMemento { private IDrawableContainer drawableContainer; - private Field fieldToBeChanged; - private object oldValue; + private readonly Field fieldToBeChanged; + private readonly object oldValue; public ChangeFieldHolderMemento(IDrawableContainer drawableContainer, Field fieldToBeChanged) { this.drawableContainer = drawableContainer; diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index ba532b11c..b715e26a8 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -29,7 +29,7 @@ namespace Greenshot.Memento { /// </summary> public class DeleteElementMemento : IMemento { private IDrawableContainer drawableContainer; - private Surface surface; + private readonly Surface surface; public DeleteElementMemento(Surface surface, IDrawableContainer drawableContainer) { this.surface = surface; diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index e4aded8c6..940fbd4ee 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -31,8 +31,8 @@ namespace Greenshot.Memento { /// The DrawableContainerBoundsChangeMemento makes it possible to undo-redo an IDrawableContainer resize & move /// </summary> public class DrawableContainerBoundsChangeMemento : IMemento { - List<Point> points = new List<Point>(); - List<Size> sizes = new List<Size>(); + readonly List<Point> points = new List<Point>(); + readonly List<Size> sizes = new List<Size>(); List<IDrawableContainer> listOfdrawableContainer; private void StoreBounds() { diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index 541b4c06e..716b9e171 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -28,7 +28,7 @@ namespace Greenshot.Memento { /// </summary> public class TextChangeMemento : IMemento { private TextContainer textContainer; - private string oldText; + private readonly string oldText; public TextChangeMemento(TextContainer textContainer) { this.textContainer = textContainer; diff --git a/Greenshot/Processors/TitleFixProcessor.cs b/Greenshot/Processors/TitleFixProcessor.cs index d20798db2..a7b278d59 100644 --- a/Greenshot/Processors/TitleFixProcessor.cs +++ b/Greenshot/Processors/TitleFixProcessor.cs @@ -32,8 +32,8 @@ namespace Greenshot.Processors { /// Description of TitleFixProcessor. /// </summary> public class TitleFixProcessor : AbstractProcessor { - private static ILog LOG = LogManager.GetLogger(typeof(TitleFixProcessor)); - private static CoreConfiguration config = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(TitleFixProcessor)); + private static readonly CoreConfiguration config = IniConfig.GetIniSection<CoreConfiguration>(); public TitleFixProcessor() { List<string> corruptKeys = new List<string>(); diff --git a/GreenshotBoxPlugin/BoxCredentials.cs b/GreenshotBoxPlugin/BoxCredentials.cs index 5d70729ed..b725ff72d 100644 --- a/GreenshotBoxPlugin/BoxCredentials.cs +++ b/GreenshotBoxPlugin/BoxCredentials.cs @@ -18,7 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; namespace GreenshotBoxPlugin { /// <summary> diff --git a/GreenshotBoxPlugin/BoxDestination.cs b/GreenshotBoxPlugin/BoxDestination.cs index 6e2606fbd..6f5a3976e 100644 --- a/GreenshotBoxPlugin/BoxDestination.cs +++ b/GreenshotBoxPlugin/BoxDestination.cs @@ -22,12 +22,9 @@ using System.ComponentModel; using System.Drawing; using Greenshot.Plugin; using GreenshotPlugin.Core; -using log4net; namespace GreenshotBoxPlugin { public class BoxDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(BoxDestination)); - private readonly BoxPlugin _plugin; public BoxDestination(BoxPlugin plugin) { _plugin = plugin; diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.cs b/GreenshotBoxPlugin/Forms/SettingsForm.cs index 07b32373d..0c643692c 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.cs @@ -18,20 +18,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Drawing; -using System.Windows.Forms; using GreenshotBoxPlugin.Forms; -using GreenshotPlugin.Core; namespace GreenshotBoxPlugin { /// <summary> /// Description of PasswordRequestForm. /// </summary> public partial class SettingsForm : BoxForm { - string boxTicket = string.Empty; - public SettingsForm(BoxConfiguration config) { // // The InitializeComponent() call is required for Windows Forms designer support. diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index 17f8baa38..3a64af991 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -21,9 +21,7 @@ using System; using System.Windows.Forms; -using GreenshotPlugin.Core; using GreenshotPlugin.UnmanagedHelpers; -using Greenshot.IniFile; using log4net; namespace GreenshotPlugin.Controls { @@ -33,8 +31,8 @@ namespace GreenshotPlugin.Controls { public class AnimatingForm : GreenshotForm { private static readonly ILog LOG = LogManager.GetLogger(typeof(AnimatingForm)); private const int DEFAULT_VREFRESH = 60; - private int vRefresh = 0; - private Timer timer = null; + private int _vRefresh; + private Timer _timer; /// <summary> /// This flag specifies if any animation is used @@ -49,27 +47,27 @@ namespace GreenshotPlugin.Controls { /// </summary> protected int VRefresh { get { - if (vRefresh == 0) { + if (_vRefresh == 0) { // get te hDC of the desktop to get the VREFRESH - using (SafeWindowDCHandle desktopHandle = SafeWindowDCHandle.fromDesktop()) { - vRefresh = GDI32.GetDeviceCaps(desktopHandle, DeviceCaps.VREFRESH); + using (SafeWindowDCHandle desktopHandle = SafeWindowDCHandle.FromDesktop()) { + _vRefresh = GDI32.GetDeviceCaps(desktopHandle, DeviceCaps.VREFRESH); } } // A vertical refresh rate value of 0 or 1 represents the display hardware's default refresh rate. // As there is currently no know way to get the default, we guess it. - if (vRefresh <= 1) { - vRefresh = DEFAULT_VREFRESH; + if (_vRefresh <= 1) { + _vRefresh = DEFAULT_VREFRESH; } - return vRefresh; + return _vRefresh; } } /// <summary> /// Check if we are in a Terminal Server session OR need to optimize for RDP / remote desktop connections /// </summary> - protected bool isTerminalServerSession { + protected bool IsTerminalServerSession { get { - return coreConfiguration.OptimizeForRDP || SystemInformation.TerminalServerSession; + return !coreConfiguration.DisableRDPOptimizing && (coreConfiguration.OptimizeForRDP || SystemInformation.TerminalServerSession); } } @@ -80,7 +78,7 @@ namespace GreenshotPlugin.Controls { /// <returns>Number of frames, 1 if in Terminal Server Session</returns> protected int FramesForMillis(int milliseconds) { // If we are in a Terminal Server Session we return 1 - if (isTerminalServerSession) { + if (IsTerminalServerSession) { return 1; } return milliseconds / VRefresh; @@ -92,17 +90,17 @@ namespace GreenshotPlugin.Controls { protected AnimatingForm() { Load += delegate { if (EnableAnimation) { - timer = new Timer(); - timer.Interval = 1000 / VRefresh; - timer.Tick += new EventHandler(timer_Tick); - timer.Start(); + _timer = new Timer(); + _timer.Interval = 1000 / VRefresh; + _timer.Tick += timer_Tick; + _timer.Start(); } }; // Unregister at close FormClosing += delegate { - if (timer != null) { - timer.Stop(); + if (_timer != null) { + _timer.Stop(); } }; } diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index e3d73ac4d..888a7a275 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -29,7 +29,7 @@ namespace GreenshotPlugin.Controls { /// Description of PleaseWaitForm. /// </summary> public partial class BackgroundForm : Form { - private volatile bool shouldClose = false; + private volatile bool _shouldClose; private void BackgroundShowDialog() { ShowDialog(); @@ -38,7 +38,7 @@ namespace GreenshotPlugin.Controls { public static BackgroundForm ShowAndWait(string title, string text) { BackgroundForm backgroundForm = new BackgroundForm(title, text); // Show form in background thread - Thread backgroundTask = new Thread (new ThreadStart(backgroundForm.BackgroundShowDialog)); + Thread backgroundTask = new Thread (backgroundForm.BackgroundShowDialog); backgroundForm.Name = "Background form"; backgroundTask.IsBackground = true; backgroundTask.SetApartmentState(ApartmentState.STA); @@ -52,7 +52,7 @@ namespace GreenshotPlugin.Controls { // InitializeComponent(); Icon = GreenshotResources.getGreenshotIcon(); - shouldClose = false; + _shouldClose = false; Text = title; label_pleasewait.Text = text; FormClosing += PreventFormClose; @@ -76,20 +76,20 @@ namespace GreenshotPlugin.Controls { } private void PreventFormClose(object sender, FormClosingEventArgs e) { - if(!shouldClose) { + if(!_shouldClose) { e.Cancel = true; } } private void Timer_checkforcloseTick(object sender, EventArgs e) { - if (shouldClose) { + if (_shouldClose) { timer_checkforclose.Stop(); BeginInvoke(new EventHandler( delegate {Close();})); } } public void CloseDialog() { - shouldClose = true; + _shouldClose = true; Application.DoEvents(); } diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index 785fb37ee..98d93ba87 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -19,8 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Collections.Generic; -using System.Text; using System.Windows.Forms; using GreenshotInterop.Interop; @@ -30,7 +28,7 @@ namespace GreenshotPlugin.Controls { const int OLECMDID_SHOWSCRIPTERROR = 40; const int OLECMDID_SHOWMESSAGE = 41; - static Guid CGID_DocHostCommandHandler = new Guid("F38BC242-B950-11D1-8918-00C04FC2C836"); + static readonly Guid CGID_DocHostCommandHandler = new Guid("F38BC242-B950-11D1-8918-00C04FC2C836"); const int S_OK = 0; const int OLECMDERR_E_NOTSUPPORTED = (-2147221248); diff --git a/GreenshotPlugin/Controls/FormWithoutActivation.cs b/GreenshotPlugin/Controls/FormWithoutActivation.cs index 2b92989a5..8ab4ada3d 100644 --- a/GreenshotPlugin/Controls/FormWithoutActivation.cs +++ b/GreenshotPlugin/Controls/FormWithoutActivation.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Windows.Forms; namespace GreenshotPlugin.Controls { diff --git a/GreenshotPlugin/Controls/GreenshotButton.cs b/GreenshotPlugin/Controls/GreenshotButton.cs index 530c34a89..e4e6d72b7 100644 --- a/GreenshotPlugin/Controls/GreenshotButton.cs +++ b/GreenshotPlugin/Controls/GreenshotButton.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; diff --git a/GreenshotPlugin/Controls/GreenshotCheckBox.cs b/GreenshotPlugin/Controls/GreenshotCheckBox.cs index 30aa74712..4872ba28d 100644 --- a/GreenshotPlugin/Controls/GreenshotCheckBox.cs +++ b/GreenshotPlugin/Controls/GreenshotCheckBox.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; @@ -33,16 +33,8 @@ namespace GreenshotPlugin.Controls { set; } - private string sectionName = "Core"; [Category("Greenshot"), DefaultValue("Core"), Description("Specifies the Ini-Section to map this control with.")] - public string SectionName { - get { - return sectionName; - } - set { - sectionName = value; - } - } + public string SectionName { get; set; } = "Core"; [Category("Greenshot"), DefaultValue(null), Description("Specifies the property name to map the configuration.")] public string PropertyName { diff --git a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs index a64a4aabb..24c5f561d 100644 --- a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs +++ b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs @@ -29,28 +29,28 @@ namespace GreenshotPlugin.Controls { /// <summary> /// Specifies the column to be sorted /// </summary> - private int ColumnToSort; + private int _columnToSort; /// <summary> /// Specifies the order in which to sort (i.e. 'Ascending'). /// </summary> - private SortOrder OrderOfSort; + private SortOrder _orderOfSort; /// <summary> /// Case insensitive comparer object /// </summary> - private CaseInsensitiveComparer ObjectCompare; + private readonly CaseInsensitiveComparer _objectCompare; /// <summary> /// Class constructor. Initializes various elements /// </summary> public GreenshotColumnSorter() { // Initialize the column to '0' - ColumnToSort = 0; + _columnToSort = 0; // Initialize the sort order to 'none' - OrderOfSort = SortOrder.None; + _orderOfSort = SortOrder.None; // Initialize the CaseInsensitiveComparer object - ObjectCompare = new CaseInsensitiveComparer(); + _objectCompare = new CaseInsensitiveComparer(); } /// <summary> @@ -60,34 +60,33 @@ namespace GreenshotPlugin.Controls { /// <param name="y">Second object to be compared</param> /// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns> public int Compare(object x, object y) { - int compareResult; - ListViewItem listviewX, listviewY; - if (x == null && y == null) { return 0; - } else if (x == null && y != null) { - return -1; - } else if (x != null && y == null) { - return 1; + } + if (x == null) { + return -1; + } + if (y == null) { + return 1; } // Cast the objects to be compared to ListViewItem objects - listviewX = (ListViewItem)x; - listviewY = (ListViewItem)y; + var listviewX = (ListViewItem)x; + var listviewY = (ListViewItem)y; // Compare the two items - compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); + var compareResult = _objectCompare.Compare(listviewX.SubItems[_columnToSort].Text, listviewY.SubItems[_columnToSort].Text); // Calculate correct return value based on object comparison - if (OrderOfSort == SortOrder.Ascending) { + if (_orderOfSort == SortOrder.Ascending) { // Ascending sort is selected, return normal result of compare operation return compareResult; - } else if (OrderOfSort == SortOrder.Descending) { - // Descending sort is selected, return negative result of compare operation - return (-compareResult); - } else { - // Return '0' to indicate they are equal - return 0; } + if (_orderOfSort == SortOrder.Descending) { + // Descending sort is selected, return negative result of compare operation + return -compareResult; + } + // Return '0' to indicate they are equal + return 0; } /// <summary> @@ -95,10 +94,10 @@ namespace GreenshotPlugin.Controls { /// </summary> public int SortColumn { set { - ColumnToSort = value; + _columnToSort = value; } get { - return ColumnToSort; + return _columnToSort; } } @@ -107,10 +106,10 @@ namespace GreenshotPlugin.Controls { /// </summary> public SortOrder Order { set { - OrderOfSort = value; + _orderOfSort = value; } get { - return OrderOfSort; + return _orderOfSort; } } } diff --git a/GreenshotPlugin/Controls/GreenshotComboBox.cs b/GreenshotPlugin/Controls/GreenshotComboBox.cs index 0fe165061..8adf83fc6 100644 --- a/GreenshotPlugin/Controls/GreenshotComboBox.cs +++ b/GreenshotPlugin/Controls/GreenshotComboBox.cs @@ -25,18 +25,11 @@ using GreenshotPlugin.Core; namespace GreenshotPlugin.Controls { public class GreenshotComboBox : ComboBox, IGreenshotConfigBindable { - private Type enumType = null; - private Enum selectedEnum = null; - private string sectionName = "Core"; + private Type _enumType; + private Enum _selectedEnum; + [Category("Greenshot"), DefaultValue("Core"), Description("Specifies the Ini-Section to map this control with.")] - public string SectionName { - get { - return sectionName; - } - set { - sectionName = value; - } - } + public string SectionName { get; set; } = "Core"; [Category("Greenshot"), DefaultValue(null), Description("Specifies the property name to map the configuration.")] public string PropertyName { @@ -52,7 +45,7 @@ namespace GreenshotPlugin.Controls { public void SetValue(Enum currentValue) { if (currentValue != null) { - selectedEnum = currentValue; + _selectedEnum = currentValue; SelectedItem = Language.Translate(currentValue); } } @@ -64,11 +57,10 @@ namespace GreenshotPlugin.Controls { /// <param name="enumType">TEnum to populate with</param> public void Populate(Type enumType) { // Store the enum-type, so we can work with it - this.enumType = enumType; + _enumType = enumType; var availableValues = Enum.GetValues(enumType); Items.Clear(); - string enumTypeName = enumType.Name; foreach (var enumValue in availableValues) { Items.Add(Language.Translate((Enum)enumValue)); } @@ -78,26 +70,27 @@ namespace GreenshotPlugin.Controls { /// Store the selected value internally /// </summary> private void StoreSelectedEnum() { - string enumTypeName = enumType.Name; + string enumTypeName = _enumType.Name; string selectedValue = SelectedItem as string; - var availableValues = Enum.GetValues(enumType); + var availableValues = Enum.GetValues(_enumType); object returnValue = null; try { - returnValue = Enum.Parse(enumType, selectedValue); + returnValue = Enum.Parse(_enumType, selectedValue); } catch (Exception) { + // Ignore } foreach (Enum enumValue in availableValues) { - string enumKey = enumTypeName + "." + enumValue.ToString(); + string enumKey = enumTypeName + "." + enumValue; if (Language.hasKey(enumKey)) { - string translation = Language.GetString(enumTypeName + "." + enumValue.ToString()); + string translation = Language.GetString(enumTypeName + "." + enumValue); if (translation.Equals(selectedValue)) { returnValue = enumValue; } } } - selectedEnum = (Enum)returnValue; + _selectedEnum = (Enum)returnValue; } /// <summary> @@ -105,7 +98,7 @@ namespace GreenshotPlugin.Controls { /// </summary> /// <returns>The enum value of the combobox</returns> public Enum GetSelectedEnum() { - return selectedEnum; + return _selectedEnum; } } } diff --git a/GreenshotPlugin/Controls/GreenshotForm.cs b/GreenshotPlugin/Controls/GreenshotForm.cs index ab151675a..b44003b58 100644 --- a/GreenshotPlugin/Controls/GreenshotForm.cs +++ b/GreenshotPlugin/Controls/GreenshotForm.cs @@ -34,13 +34,13 @@ namespace GreenshotPlugin.Controls { /// This form is used for automatically binding the elements of the form to the language /// </summary> public class GreenshotForm : Form, IGreenshotLanguageBindable { - private static ILog LOG = LogManager.GetLogger(typeof(GreenshotForm)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(GreenshotForm)); protected static CoreConfiguration coreConfiguration; - private static IDictionary<Type, FieldInfo[]> reflectionCache = new Dictionary<Type, FieldInfo[]>(); + private static readonly IDictionary<Type, FieldInfo[]> reflectionCache = new Dictionary<Type, FieldInfo[]>(); private IComponentChangeService m_changeService; - private bool _isDesignModeLanguageSet = false; - private bool _applyLanguageManually = false; - private bool _storeFieldsManually = false; + private bool _isDesignModeLanguageSet; + private bool _applyLanguageManually; + private bool _storeFieldsManually; private IDictionary<string, Control> _designTimeControls; private IDictionary<string, ToolStripItem> _designTimeToolStripItems; @@ -210,16 +210,16 @@ namespace GreenshotPlugin.Controls { // Clear our the component change events to prepare for re-siting. if (m_changeService != null) { - m_changeService.ComponentChanged -= new ComponentChangedEventHandler(OnComponentChanged); - m_changeService.ComponentAdded -= new ComponentEventHandler(OnComponentAdded); + m_changeService.ComponentChanged -= OnComponentChanged; + m_changeService.ComponentAdded -= OnComponentAdded; } } private void RegisterChangeNotifications() { // Register the event handlers for the IComponentChangeService events if (m_changeService != null) { - m_changeService.ComponentChanged += new ComponentChangedEventHandler(OnComponentChanged); - m_changeService.ComponentAdded += new ComponentEventHandler(OnComponentAdded); + m_changeService.ComponentChanged += OnComponentChanged; + m_changeService.ComponentAdded += OnComponentAdded; } } @@ -277,7 +277,7 @@ namespace GreenshotPlugin.Controls { } protected void ApplyLanguage(ToolStripItem applyTo, string languageKey) { - string langString = null; + string langString; if (!string.IsNullOrEmpty(languageKey)) { if (!Language.TryGetString(languageKey, out langString)) { LOG.WarnFormat("Unknown language key '{0}' configured for control '{1}', this might be okay.", languageKey, applyTo.Name); @@ -473,7 +473,6 @@ namespace GreenshotPlugin.Controls { comboxBox.Populate(iniValue.ValueType); comboxBox.SetValue((Enum)iniValue.Value); comboxBox.Enabled = !iniValue.IsFixed; - continue; } } } diff --git a/GreenshotPlugin/Controls/GreenshotGroupBox.cs b/GreenshotPlugin/Controls/GreenshotGroupBox.cs index b83ce53c9..5dfcae4a5 100644 --- a/GreenshotPlugin/Controls/GreenshotGroupBox.cs +++ b/GreenshotPlugin/Controls/GreenshotGroupBox.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Windows.Forms; using System.ComponentModel; diff --git a/GreenshotPlugin/Controls/GreenshotLabel.cs b/GreenshotPlugin/Controls/GreenshotLabel.cs index 813eb7aa5..13afbb633 100644 --- a/GreenshotPlugin/Controls/GreenshotLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotLabel.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Windows.Forms; using System.ComponentModel; diff --git a/GreenshotPlugin/Controls/GreenshotRadioButton.cs b/GreenshotPlugin/Controls/GreenshotRadioButton.cs index 9de1d2147..e87e95818 100644 --- a/GreenshotPlugin/Controls/GreenshotRadioButton.cs +++ b/GreenshotPlugin/Controls/GreenshotRadioButton.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; diff --git a/GreenshotPlugin/Controls/GreenshotTabPage.cs b/GreenshotPlugin/Controls/GreenshotTabPage.cs index 9e95517b1..c3f1e42cf 100644 --- a/GreenshotPlugin/Controls/GreenshotTabPage.cs +++ b/GreenshotPlugin/Controls/GreenshotTabPage.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Windows.Forms; using System.ComponentModel; diff --git a/GreenshotPlugin/Controls/GreenshotTextBox.cs b/GreenshotPlugin/Controls/GreenshotTextBox.cs index 772520bcd..ecaaa117f 100644 --- a/GreenshotPlugin/Controls/GreenshotTextBox.cs +++ b/GreenshotPlugin/Controls/GreenshotTextBox.cs @@ -18,22 +18,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; namespace GreenshotPlugin.Controls { public class GreenshotTextBox : TextBox, IGreenshotConfigBindable { - private string sectionName = "Core"; [Category("Greenshot"), DefaultValue("Core"), Description("Specifies the Ini-Section to map this control with.")] - public string SectionName { - get { - return sectionName; - } - set { - sectionName = value; - } - } + public string SectionName { get; set; } = "Core"; [Category("Greenshot"), DefaultValue(null), Description("Specifies the property name to map the configuration.")] public string PropertyName { diff --git a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs index 48301b72d..d4ffdff47 100644 --- a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; diff --git a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs index 3678081f0..5205f5434 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; diff --git a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs index 615b9206e..19378027b 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Windows.Forms; using System.ComponentModel; diff --git a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs index 2ef417fd9..6c3e1572c 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.ComponentModel; using System.Windows.Forms; diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 706e5316f..372e67633 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -22,6 +22,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; @@ -37,13 +38,13 @@ namespace GreenshotPlugin.Controls { /// But is modified to fit in Greenshot, and have localized support /// </summary> public class HotkeyControl : GreenshotTextBox { - private static ILog LOG = LogManager.GetLogger(typeof(HotkeyControl)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(HotkeyControl)); - private static EventDelay eventDelay = new EventDelay(TimeSpan.FromMilliseconds(600).Ticks); - private static bool isWindows7OrOlder = Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 1; + private static readonly EventDelay eventDelay = new EventDelay(TimeSpan.FromMilliseconds(600).Ticks); + private static readonly bool isWindows7OrOlder = Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 1; // Holds the list of hotkeys - private static Dictionary<int, HotKeyHandler> keyHandlers = new Dictionary<int, HotKeyHandler>(); + private static readonly IDictionary<int, HotKeyHandler> keyHandlers = new Dictionary<int, HotKeyHandler>(); private static int hotKeyCounter = 1; private const uint WM_HOTKEY = 0x312; private static IntPtr hotkeyHWND; @@ -57,6 +58,7 @@ namespace GreenshotPlugin.Controls { // } // } + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum Modifiers : uint { NONE = 0, ALT = 1, @@ -66,6 +68,7 @@ namespace GreenshotPlugin.Controls { NO_REPEAT = 0x4000 } + [SuppressMessage("ReSharper", "InconsistentNaming")] private enum MapType : uint { MAPVK_VK_TO_VSC = 0, //The uCode parameter is a virtual-key code and is translated into a scan code. If it is a virtual-key code that does not distinguish between left- and right-hand keys, the left-hand scan code is returned. If there is no translation, the function returns 0. MAPVK_VSC_TO_VK = 1, //The uCode parameter is a scan code and is translated into a virtual-key code that does not distinguish between left- and right-hand keys. If there is no translation, the function returns 0. @@ -93,10 +96,10 @@ namespace GreenshotPlugin.Controls { // ArrayLists used to enforce the use of proper modifiers. // Shift+A isn't a valid hotkey, for instance, as it would screw up when the user is typing. - private ArrayList needNonShiftModifier = null; - private ArrayList needNonAltGrModifier = null; + private readonly ArrayList needNonShiftModifier; + private readonly ArrayList needNonAltGrModifier; - private ContextMenu dummy = new ContextMenu(); + private readonly ContextMenu dummy = new ContextMenu(); /// <summary> /// Used to make sure that there is no right-click menu available @@ -131,9 +134,9 @@ namespace GreenshotPlugin.Controls { Text = "None"; // Handle events that occurs when keys are pressed - KeyPress += new KeyPressEventHandler(HotkeyControl_KeyPress); - KeyUp += new KeyEventHandler(HotkeyControl_KeyUp); - KeyDown += new KeyEventHandler(HotkeyControl_KeyDown); + KeyPress += HotkeyControl_KeyPress; + KeyUp += HotkeyControl_KeyUp; + KeyDown += HotkeyControl_KeyDown; // Fill the ArrayLists that contain all invalid hotkey combinations needNonShiftModifier = new ArrayList(); diff --git a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs index e17e9f112..67ab07c40 100644 --- a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs @@ -18,7 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; namespace GreenshotPlugin.Controls { public interface IGreenshotConfigBindable { diff --git a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs index 899f78134..8a84786b1 100644 --- a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs @@ -18,7 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; namespace GreenshotPlugin.Controls { /// <summary> diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index e562b1185..d0a9e017d 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -20,12 +20,8 @@ */ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Drawing; -using System.Text; using System.Windows.Forms; -using System.Web; -using System.Collections.Specialized; using GreenshotPlugin.Core; using log4net; @@ -35,8 +31,8 @@ namespace GreenshotPlugin.Controls { /// </summary> public partial class OAuthLoginForm : Form { private static readonly ILog LOG = LogManager.GetLogger(typeof(OAuthLoginForm)); - private string _callbackUrl = null; - private IDictionary<string, string> _callbackParameters = null; + private readonly string _callbackUrl; + private IDictionary<string, string> _callbackParameters; public IDictionary<string, string> CallbackParameters { get { diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index 63a0c783b..53cb527f9 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -19,7 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Drawing; using System.Windows.Forms; using System.Threading; using GreenshotPlugin.Core; @@ -30,8 +29,8 @@ namespace GreenshotPlugin.Controls { /// Description of PleaseWaitForm. /// </summary> public partial class PleaseWaitForm : Form { - private static ILog LOG = LogManager.GetLogger(typeof(PleaseWaitForm)); - private Thread waitFor = null; + private static readonly ILog LOG = LogManager.GetLogger(typeof(PleaseWaitForm)); + private Thread waitFor; private string title; public PleaseWaitForm() { // diff --git a/GreenshotPlugin/Controls/QualityDialog.cs b/GreenshotPlugin/Controls/QualityDialog.cs index c601c8e88..000564bf1 100644 --- a/GreenshotPlugin/Controls/QualityDialog.cs +++ b/GreenshotPlugin/Controls/QualityDialog.cs @@ -19,7 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Windows.Forms; using GreenshotPlugin.Core; using Greenshot.IniFile; using Greenshot.Plugin; @@ -29,7 +28,7 @@ namespace GreenshotPlugin.Controls { /// Description of JpegQualityDialog. /// </summary> public partial class QualityDialog : GreenshotForm { - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); public SurfaceOutputSettings Settings { get; set; diff --git a/GreenshotPlugin/Controls/SaveImageFileDialog.cs b/GreenshotPlugin/Controls/SaveImageFileDialog.cs index bf14f2be0..9e94d595f 100644 --- a/GreenshotPlugin/Controls/SaveImageFileDialog.cs +++ b/GreenshotPlugin/Controls/SaveImageFileDialog.cs @@ -33,12 +33,12 @@ namespace GreenshotPlugin.Controls { /// For some reason SFD is sealed :( /// </summary> public class SaveImageFileDialog : IDisposable { - private static ILog LOG = LogManager.GetLogger(typeof(SaveImageFileDialog)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - protected SaveFileDialog saveFileDialog; - private FilterOption[] filterOptions; - private DirectoryInfo eagerlyCreatedDirectory; - private ICaptureDetails captureDetails = null; + private static readonly ILog LOG = LogManager.GetLogger(typeof(SaveImageFileDialog)); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + protected SaveFileDialog SaveFileDialog; + private FilterOption[] _filterOptions; + private DirectoryInfo _eagerlyCreatedDirectory; + private readonly ICaptureDetails _captureDetails; public void Dispose() { Dispose(true); @@ -47,25 +47,25 @@ namespace GreenshotPlugin.Controls { protected virtual void Dispose(bool disposing) { if (disposing) { - if (saveFileDialog != null) { - saveFileDialog.Dispose(); - saveFileDialog = null; + if (SaveFileDialog != null) { + SaveFileDialog.Dispose(); + SaveFileDialog = null; } } } public SaveImageFileDialog() { - init(); + Init(); } public SaveImageFileDialog(ICaptureDetails captureDetails) { - this.captureDetails = captureDetails; - init(); + _captureDetails = captureDetails; + Init(); } - private void init() { - saveFileDialog = new SaveFileDialog(); - applyFilterOptions(); + private void Init() { + SaveFileDialog = new SaveFileDialog(); + ApplyFilterOptions(); string initialDirectory = null; try { initialDirectory = Path.GetDirectoryName(conf.OutputFileAsFullpath); @@ -74,44 +74,46 @@ namespace GreenshotPlugin.Controls { } if (!string.IsNullOrEmpty(initialDirectory) && Directory.Exists(initialDirectory)) { - saveFileDialog.InitialDirectory = initialDirectory; + SaveFileDialog.InitialDirectory = initialDirectory; } else if (Directory.Exists(conf.OutputFilePath)) { - saveFileDialog.InitialDirectory = conf.OutputFilePath; + SaveFileDialog.InitialDirectory = conf.OutputFilePath; } // The following property fixes a problem that the directory where we save is locked (bug #2899790) - saveFileDialog.RestoreDirectory = true; - saveFileDialog.OverwritePrompt = true; - saveFileDialog.CheckPathExists = false; - saveFileDialog.AddExtension = true; + SaveFileDialog.RestoreDirectory = true; + SaveFileDialog.OverwritePrompt = true; + SaveFileDialog.CheckPathExists = false; + SaveFileDialog.AddExtension = true; ApplySuggestedValues(); } - private void applyFilterOptions() { - prepareFilterOptions(); + private void ApplyFilterOptions() { + PrepareFilterOptions(); string fdf = ""; int preselect = 0; var outputFileFormatAsString = Enum.GetName(typeof(OutputFormat), conf.OutputFileFormat); - for(int i=0; i<filterOptions.Length; i++){ - FilterOption fo = filterOptions[i]; + for(int i=0; i<_filterOptions.Length; i++){ + FilterOption fo = _filterOptions[i]; fdf += fo.Label + "|*." + fo.Extension + "|"; if(outputFileFormatAsString == fo.Extension) preselect = i; } fdf = fdf.Substring(0, fdf.Length-1); - saveFileDialog.Filter = fdf; - saveFileDialog.FilterIndex = preselect + 1; + SaveFileDialog.Filter = fdf; + SaveFileDialog.FilterIndex = preselect + 1; } - private void prepareFilterOptions() { + private void PrepareFilterOptions() { OutputFormat[] supportedImageFormats = (OutputFormat[])Enum.GetValues(typeof(OutputFormat)); - filterOptions = new FilterOption[supportedImageFormats.Length]; - for(int i=0; i<filterOptions.Length; i++){ + _filterOptions = new FilterOption[supportedImageFormats.Length]; + for(int i=0; i<_filterOptions.Length; i++){ string ifo = supportedImageFormats[i].ToString(); if (ifo.ToLower().Equals("jpeg")) ifo = "Jpg"; // we dont want no jpeg files, so let the dialog check for jpg - FilterOption fo = new FilterOption(); - fo.Label = ifo.ToUpper(); - fo.Extension = ifo.ToLower(); - filterOptions.SetValue(fo, i); + FilterOption fo = new FilterOption + { + Label = ifo.ToUpper(), + Extension = ifo.ToLower() + }; + _filterOptions.SetValue(fo, i); } } @@ -119,16 +121,16 @@ namespace GreenshotPlugin.Controls { /// filename exactly as typed in the filename field /// </summary> public string FileName { - get {return saveFileDialog.FileName;} - set {saveFileDialog.FileName = value;} + get {return SaveFileDialog.FileName;} + set {SaveFileDialog.FileName = value;} } /// <summary> /// initial directory of the dialog /// </summary> public string InitialDirectory { - get {return saveFileDialog.InitialDirectory;} - set {saveFileDialog.InitialDirectory = value;} + get {return SaveFileDialog.InitialDirectory;} + set {SaveFileDialog.InitialDirectory = value;} } /// <summary> @@ -138,7 +140,7 @@ namespace GreenshotPlugin.Controls { /// </summary> public string FileNameWithExtension { get { - string fn = saveFileDialog.FileName; + string fn = SaveFileDialog.FileName; // if the filename contains a valid extension, which is the same like the selected filter item's extension, the filename is okay if(fn.EndsWith(Extension,StringComparison.CurrentCultureIgnoreCase)) return fn; // otherwise we just add the selected filter item's extension @@ -155,19 +157,19 @@ namespace GreenshotPlugin.Controls { /// </summary> public string Extension { get { - return filterOptions[saveFileDialog.FilterIndex-1].Extension; + return _filterOptions[SaveFileDialog.FilterIndex-1].Extension; } set { - for(int i=0; i<filterOptions.Length; i++) { - if(value.Equals(filterOptions[i].Extension, StringComparison.CurrentCultureIgnoreCase)) { - saveFileDialog.FilterIndex = i + 1; + for(int i=0; i<_filterOptions.Length; i++) { + if(value.Equals(_filterOptions[i].Extension, StringComparison.CurrentCultureIgnoreCase)) { + SaveFileDialog.FilterIndex = i + 1; } } } } public DialogResult ShowDialog() { - DialogResult ret = saveFileDialog.ShowDialog(); + DialogResult ret = SaveFileDialog.ShowDialog(); CleanUp(); return ret; } @@ -175,18 +177,11 @@ namespace GreenshotPlugin.Controls { /// <summary> /// sets InitialDirectory and FileName property of a SaveFileDialog smartly, considering default pattern and last used path /// </summary> - /// <param name="sfd">a SaveFileDialog instance</param> private void ApplySuggestedValues() { // build the full path and set dialog properties - FileName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(conf.OutputFileFilenamePattern, captureDetails); + FileName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(conf.OutputFileFilenamePattern, _captureDetails); } - - private string GetRootDirFromConfig() { - string rootDir = conf.OutputFilePath; - rootDir = FilenameHelper.FillVariables(rootDir, false); - return rootDir; - } - + private class FilterOption { public string Label; public string Extension; @@ -195,29 +190,14 @@ namespace GreenshotPlugin.Controls { private void CleanUp() { // fix for bug #3379053 try { - if(eagerlyCreatedDirectory != null && eagerlyCreatedDirectory.GetFiles().Length == 0 && eagerlyCreatedDirectory.GetDirectories().Length == 0) { - eagerlyCreatedDirectory.Delete(); - eagerlyCreatedDirectory = null; + if(_eagerlyCreatedDirectory != null && _eagerlyCreatedDirectory.GetFiles().Length == 0 && _eagerlyCreatedDirectory.GetDirectories().Length == 0) { + _eagerlyCreatedDirectory.Delete(); + _eagerlyCreatedDirectory = null; } } catch (Exception e) { LOG.WarnFormat("Couldn't cleanup directory due to: {0}", e.Message); - eagerlyCreatedDirectory = null; + _eagerlyCreatedDirectory = null; } } - - private string CreateDirectoryIfNotExists(string fullPath) { - string dirName = null; - try { - dirName = Path.GetDirectoryName(fullPath); - DirectoryInfo di = new DirectoryInfo(dirName); - if(!di.Exists) { - di = Directory.CreateDirectory(dirName); - eagerlyCreatedDirectory = di; - } - } catch (Exception e) { - LOG.Error("Error in CreateDirectoryIfNotExists",e); - } - return dirName; - } } } diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index 7f5053399..121798e00 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -31,10 +31,9 @@ namespace GreenshotPlugin.Controls { /// Didn't make it completely "generic" yet, but at least most logic is in here so we don't have it in the mainform. /// </summary> public class ThumbnailForm : FormWithoutActivation { - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - private IntPtr thumbnailHandle = IntPtr.Zero; - private Rectangle parentMenuBounds = Rectangle.Empty; + private IntPtr _thumbnailHandle = IntPtr.Zero; public ThumbnailForm() { ShowInTaskbar = false; @@ -59,9 +58,9 @@ namespace GreenshotPlugin.Controls { } private void UnregisterThumbnail() { - if (thumbnailHandle != IntPtr.Zero) { - DWM.DwmUnregisterThumbnail(thumbnailHandle); - thumbnailHandle = IntPtr.Zero; + if (_thumbnailHandle != IntPtr.Zero) { + DWM.DwmUnregisterThumbnail(_thumbnailHandle); + _thumbnailHandle = IntPtr.Zero; } } @@ -73,10 +72,10 @@ namespace GreenshotPlugin.Controls { public void ShowThumbnail(WindowDetails window, Control parentControl) { UnregisterThumbnail(); - DWM.DwmRegisterThumbnail(Handle, window.Handle, out thumbnailHandle); - if (thumbnailHandle != IntPtr.Zero) { + DWM.DwmRegisterThumbnail(Handle, window.Handle, out _thumbnailHandle); + if (_thumbnailHandle != IntPtr.Zero) { SIZE sourceSize; - DWM.DwmQueryThumbnailSourceSize(thumbnailHandle, out sourceSize); + DWM.DwmQueryThumbnailSourceSize(_thumbnailHandle, out sourceSize); int thumbnailHeight = 200; int thumbnailWidth = (int)(thumbnailHeight * ((float)sourceSize.width / (float)sourceSize.height)); if (parentControl != null && thumbnailWidth > parentControl.Width) { @@ -86,12 +85,14 @@ namespace GreenshotPlugin.Controls { Width = thumbnailWidth; Height = thumbnailHeight; // Prepare the displaying of the Thumbnail - DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES(); - props.Opacity = (byte)255; - props.Visible = true; - props.SourceClientAreaOnly = false; - props.Destination = new RECT(0, 0, thumbnailWidth, thumbnailHeight); - DWM.DwmUpdateThumbnailProperties(thumbnailHandle, ref props); + DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES + { + Opacity = 255, + Visible = true, + SourceClientAreaOnly = false, + Destination = new RECT(0, 0, thumbnailWidth, thumbnailHeight) + }; + DWM.DwmUpdateThumbnailProperties(_thumbnailHandle, ref props); if (parentControl != null) { AlignToControl(parentControl); } diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index af74efb41..8fa0938b0 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -34,7 +34,7 @@ namespace GreenshotPlugin.Core { /// </summary> public abstract class AbstractDestination : IDestination { private static readonly ILog LOG = LogManager.GetLogger(typeof(AbstractDestination)); - private static CoreConfiguration configuration = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration configuration = IniConfig.GetIniSection<CoreConfiguration>(); public virtual int CompareTo(object obj) { IDestination other = obj as IDestination; @@ -312,7 +312,8 @@ namespace GreenshotPlugin.Core { basisMenuItem.Click += destinationClickHandler; if (isDynamic && addDynamics) { - basisMenuItem.DropDownOpening += delegate(object source, EventArgs eventArgs) { + basisMenuItem.DropDownOpening += delegate + { if (basisMenuItem.DropDownItems.Count == 0) { List<IDestination> subDestinations = new List<IDestination>(); // Fixing Bug #3536968 by catching the COMException (every exception) and not displaying the "subDestinations" diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index 914b27733..c54a2a51b 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -59,7 +59,7 @@ namespace GreenshotPlugin.Core { private const int IE_ACTIVE_TAB = 2097154; private const int CHILDID_SELF = 0; - private IAccessible accessible; + private readonly IAccessible accessible; private Accessible[] Children { get { int num = 0; diff --git a/GreenshotPlugin/Core/AnimationHelpers.cs b/GreenshotPlugin/Core/AnimationHelpers.cs index fe70fff73..3da6a5115 100644 --- a/GreenshotPlugin/Core/AnimationHelpers.cs +++ b/GreenshotPlugin/Core/AnimationHelpers.cs @@ -20,9 +20,7 @@ */ using System; using System.Drawing; -using System.Drawing.Drawing2D; using System.Collections.Generic; -using log4net; namespace GreenshotPlugin.Core { @@ -33,7 +31,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Is there a next frame? /// </summary> - bool hasNext { + bool HasNext { get; } /// <summary> @@ -81,12 +79,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <typeparam name="T">Type for the animation, like Point/Rectangle/Size</typeparam> public abstract class AnimatorBase<T> : IAnimator { - protected T first; - protected T last; - protected T current; - private Queue<AnimationLeg<T>> queue = new Queue<AnimationLeg<T>>(); - protected int frames; - protected int currentFrameNr = 0; + private readonly Queue<AnimationLeg<T>> _queue = new Queue<AnimationLeg<T>>(); /// <summary> /// Constructor @@ -97,10 +90,10 @@ namespace GreenshotPlugin.Core { /// <param name="easingType"></param> /// <param name="easingMode"></param> public AnimatorBase(T first, T last, int frames, EasingType easingType, EasingMode easingMode) { - this.first = first; - this.last = last; - this.frames = frames; - current = first; + First = first; + Last = last; + Frames = frames; + Current = first; EasingType = easingType; EasingMode = easingMode; } @@ -109,39 +102,34 @@ namespace GreenshotPlugin.Core { /// The amount of frames /// </summary> public int Frames { - get { return frames; } + get; + private set; } /// <summary> /// Current frame number /// </summary> - public int CurrentFrameNr { - get { return currentFrameNr; } - } + public int CurrentFrameNr { get; private set; } /// <summary> /// First animation value /// </summary> - public T First { - get { return first; } - } + public T First { get; private set; } /// <summary> /// Last animation value, of this "leg" /// </summary> - public T Last { - get { return last; } - } + public T Last { get; private set; } /// <summary> /// Final animation value, this is including the legs /// </summary> public T Final { get { - if (queue.Count == 0) { - return last; + if (_queue.Count == 0) { + return Last; } - return queue.ToArray()[queue.Count - 1].Destination; + return _queue.ToArray()[_queue.Count - 1].Destination; } } @@ -150,7 +138,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="newDestination"></param> public void ChangeDestination(T newDestination) { - ChangeDestination(newDestination, frames); + ChangeDestination(newDestination, Frames); } /// <summary> @@ -159,11 +147,11 @@ namespace GreenshotPlugin.Core { /// <param name="newDestination"></param> /// <param name="frames"></param> public void ChangeDestination(T newDestination, int frames) { - queue.Clear(); - first = current; - currentFrameNr = 0; - this.frames = frames; - last = newDestination; + _queue.Clear(); + First = Current; + CurrentFrameNr = 0; + Frames = frames; + Last = newDestination; } /// <summary> @@ -202,12 +190,14 @@ namespace GreenshotPlugin.Core { /// <param name="easingType"></param> /// <param name="easingMode"></param> public void QueueDestinationLeg(T queuedDestination, int frames, EasingType easingType, EasingMode easingMode) { - AnimationLeg<T> leg = new AnimationLeg<T>(); - leg.Destination = queuedDestination; - leg.Frames = frames; - leg.EasingType = easingType; - leg.EasingMode = easingMode; - queue.Enqueue(leg); + AnimationLeg<T> leg = new AnimationLeg<T> + { + Destination = queuedDestination, + Frames = frames, + EasingType = easingType, + EasingMode = easingMode + }; + _queue.Enqueue(leg); } /// <summary> @@ -233,12 +223,12 @@ namespace GreenshotPlugin.Core { get { switch (EasingMode) { case EasingMode.EaseOut: - return Easing.EaseOut((double)currentFrameNr / (double)frames, EasingType); + return Easing.EaseOut(CurrentFrameNr / (double)Frames, EasingType); case EasingMode.EaseInOut: - return Easing.EaseInOut((double)currentFrameNr / (double)frames, EasingType); + return Easing.EaseInOut(CurrentFrameNr / (double)Frames, EasingType); case EasingMode.EaseIn: default: - return Easing.EaseIn((double)currentFrameNr / (double)frames, EasingType); + return Easing.EaseIn(CurrentFrameNr / (double)Frames, EasingType); } } } @@ -246,27 +236,23 @@ namespace GreenshotPlugin.Core { /// <summary> /// Get the current (previous) frame object /// </summary> - public virtual T Current { - get { - return current; - } - } + public virtual T Current { get; set; } /// <summary> /// Returns if there are any frame left, and if this is the case than the frame is increased. /// </summary> public virtual bool NextFrame { get { - if (currentFrameNr < frames) { - currentFrameNr++; + if (CurrentFrameNr < Frames) { + CurrentFrameNr++; return true; } - if (queue.Count > 0) { - first = current; - currentFrameNr = 0; - AnimationLeg<T> nextLeg = queue.Dequeue(); - last = nextLeg.Destination; - frames = nextLeg.Frames; + if (_queue.Count > 0) { + First = Current; + CurrentFrameNr = 0; + AnimationLeg<T> nextLeg = _queue.Dequeue(); + Last = nextLeg.Destination; + Frames = nextLeg.Frames; EasingType = nextLeg.EasingType; EasingMode = nextLeg.EasingMode; return true; @@ -278,12 +264,12 @@ namespace GreenshotPlugin.Core { /// <summary> /// Are there more frames to animate? /// </summary> - public virtual bool hasNext { + public virtual bool HasNext { get { - if (currentFrameNr < frames) { + if (CurrentFrameNr < Frames) { return true; } - return queue.Count > 0; + return _queue.Count > 0; } } @@ -298,8 +284,6 @@ namespace GreenshotPlugin.Core { /// Implementation of the RectangleAnimator /// </summary> public class RectangleAnimator : AnimatorBase<Rectangle> { - private static readonly ILog LOG = LogManager.GetLogger(typeof(RectangleAnimator)); - public RectangleAnimator(Rectangle first, Rectangle last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } @@ -318,18 +302,18 @@ namespace GreenshotPlugin.Core { public override Rectangle Next() { if (NextFrame) { double easingValue = EasingValue; - double dx = last.X - first.X; - double dy = last.Y - first.Y; + double dx = Last.X - First.X; + double dy = Last.Y - First.Y; - int x = first.X + (int)(easingValue * dx); - int y = first.Y + (int)(easingValue * dy); - double dw = last.Width - first.Width; - double dh = last.Height - first.Height; - int width = first.Width + (int)(easingValue * dw); - int height = first.Height + (int)(easingValue * dh); - current = new Rectangle(x, y, width, height); + int x = First.X + (int)(easingValue * dx); + int y = First.Y + (int)(easingValue * dy); + double dw = Last.Width - First.Width; + double dh = Last.Height - First.Height; + int width = First.Width + (int)(easingValue * dw); + int height = First.Height + (int)(easingValue * dh); + Current = new Rectangle(x, y, width, height); } - return current; + return Current; } } @@ -337,7 +321,6 @@ namespace GreenshotPlugin.Core { /// Implementation of the PointAnimator /// </summary> public class PointAnimator : AnimatorBase<Point> { - private static readonly ILog LOG = LogManager.GetLogger(typeof(PointAnimator)); public PointAnimator(Point first, Point last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } @@ -355,14 +338,14 @@ namespace GreenshotPlugin.Core { public override Point Next() { if (NextFrame) { double easingValue = EasingValue; - double dx = last.X - first.X; - double dy = last.Y - first.Y; + double dx = Last.X - First.X; + double dy = Last.Y - First.Y; - int x = first.X + (int)(easingValue * dx); - int y = first.Y + (int)(easingValue * dy); - current = new Point(x, y); + int x = First.X + (int)(easingValue * dx); + int y = First.Y + (int)(easingValue * dy); + Current = new Point(x, y); } - return current; + return Current; } } @@ -370,7 +353,6 @@ namespace GreenshotPlugin.Core { /// Implementation of the SizeAnimator /// </summary> public class SizeAnimator : AnimatorBase<Size> { - private static readonly ILog LOG = LogManager.GetLogger(typeof(SizeAnimator)); public SizeAnimator(Size first, Size last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } @@ -388,13 +370,13 @@ namespace GreenshotPlugin.Core { public override Size Next() { if (NextFrame) { double easingValue = EasingValue; - double dw = last.Width - first.Width; - double dh = last.Height - first.Height; - int width = first.Width + (int)(easingValue * dw); - int height = first.Height + (int)(easingValue * dh); - current = new Size(width, height); + double dw = Last.Width - First.Width; + double dh = Last.Height - First.Height; + int width = First.Width + (int)(easingValue * dw); + int height = First.Height + (int)(easingValue * dh); + Current = new Size(width, height); } - return current; + return Current; } } @@ -402,7 +384,6 @@ namespace GreenshotPlugin.Core { /// Implementation of the ColorAnimator /// </summary> public class ColorAnimator : AnimatorBase<Color> { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ColorAnimator)); public ColorAnimator(Color first, Color last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } @@ -420,17 +401,17 @@ namespace GreenshotPlugin.Core { public override Color Next() { if (NextFrame) { double easingValue = EasingValue; - double da = last.A - first.A; - double dr = last.R - first.R; - double dg = last.G - first.G; - double db = last.B - first.B; - int a = first.A + (int)(easingValue * da); - int r = first.R + (int)(easingValue * dr); - int g = first.G + (int)(easingValue * dg); - int b = first.B + (int)(easingValue * db); - current = Color.FromArgb(a,r,g,b); + double da = Last.A - First.A; + double dr = Last.R - First.R; + double dg = Last.G - First.G; + double db = Last.B - First.B; + int a = First.A + (int)(easingValue * da); + int r = First.R + (int)(easingValue * dr); + int g = First.G + (int)(easingValue * dg); + int b = First.B + (int)(easingValue * db); + Current = Color.FromArgb(a,r,g,b); } - return current; + return Current; } } @@ -438,7 +419,6 @@ namespace GreenshotPlugin.Core { /// Implementation of the IntAnimator /// </summary> public class IntAnimator : AnimatorBase<int> { - private static readonly ILog LOG = LogManager.GetLogger(typeof(IntAnimator)); public IntAnimator(int first, int last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } @@ -456,10 +436,10 @@ namespace GreenshotPlugin.Core { public override int Next() { if (NextFrame) { double easingValue = EasingValue; - double delta = last - first; - current = first + (int)(easingValue * delta); + double delta = Last - First; + Current = First + (int)(easingValue * delta); } - return current; + return Current; } } @@ -470,7 +450,7 @@ namespace GreenshotPlugin.Core { // Adapted from http://www.robertpenner.com/easing/penner_chapter7_tweening.pdf public static double Ease(double linearStep, double acceleration, EasingType type) { - double easedStep = acceleration > 0 ? EaseIn(linearStep, type) : acceleration < 0 ? EaseOut(linearStep, type) : (double)linearStep; + double easedStep = acceleration > 0 ? EaseIn(linearStep, type) : acceleration < 0 ? EaseOut(linearStep, type) : linearStep; // Lerp: return ((easedStep - linearStep) * Math.Abs(acceleration) + linearStep); } diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index 894e389cc..06b98899f 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -31,10 +31,10 @@ namespace GreenshotPlugin.Core { /// <typeparam name="TV">Type of value</typeparam> public class Cache<TK, TV> { private static readonly ILog LOG = LogManager.GetLogger(typeof(Cache<TK, TV>)); - private IDictionary<TK, TV> internalCache = new Dictionary<TK, TV>(); - private object lockObject = new object(); - private int secondsToExpire = 10; - private CacheObjectExpired expiredCallback = null; + private readonly IDictionary<TK, TV> internalCache = new Dictionary<TK, TV>(); + private readonly object lockObject = new object(); + private readonly int secondsToExpire = 10; + private readonly CacheObjectExpired expiredCallback; public delegate void CacheObjectExpired(TK key, TV cacheValue); /// <summary> @@ -168,7 +168,7 @@ namespace GreenshotPlugin.Core { /// </summary> private class CachedItem { public event CacheObjectExpired Expired; - private int secondsToExpire; + private readonly int secondsToExpire; private readonly Timer _timerEvent; public CachedItem(TK key, TV item, int secondsToExpire) { diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7bb88cd61..9e7a545ea 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -327,9 +327,9 @@ EndSelection:<<<<<<<4 if (formats != null && formats.Contains(FORMAT_PNG_OFFICEART) && formats.Contains(DataFormats.Dib)) { // Outlook ?? LOG.Info("Most likely the current clipboard contents come from Outlook, as this has a problem with PNG and others we place the DIB format to the front..."); - retrieveFormats = new string[] { DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, FORMAT_GIF }; + retrieveFormats = new[] { DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, FORMAT_GIF }; } else { - retrieveFormats = new string[] { FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_GIF }; + retrieveFormats = new[] { FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_GIF }; } foreach (string currentFormat in retrieveFormats) { if (formats.Contains(currentFormat)) { @@ -717,7 +717,7 @@ EndSelection:<<<<<<<4 /// <param name="format">string with format</param> /// <returns>true if one the format is found</returns> public static bool ContainsFormat(string format) { - return ContainsFormat(GetDataObject(), new string[]{format}); + return ContainsFormat(GetDataObject(), new[]{format}); } /// <summary> @@ -726,7 +726,7 @@ EndSelection:<<<<<<<4 /// <param name="format">string with format</param> /// <returns>true if one the format is found</returns> public static bool ContainsFormat(IDataObject dataObject, string format) { - return ContainsFormat(dataObject, new string[] { format }); + return ContainsFormat(dataObject, new[] { format }); } /// <summary> diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index b5bff9abb..6aa92b757 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -198,6 +198,9 @@ namespace GreenshotPlugin.Core { [IniProperty("OptimizeForRDP", Description="Make some optimizations for usage with remote desktop", DefaultValue="False")] public bool OptimizeForRDP; + [IniProperty("DisableRDPOptimizing", Description = "Disable all optimizations for usage with remote desktop", DefaultValue = "False")] + public bool DisableRDPOptimizing; + [IniProperty("MinimizeWorkingSetSize", Description="Optimize memory footprint, but with a performance penalty!", DefaultValue="False")] public bool MinimizeWorkingSetSize; diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 5c9474b55..45280b538 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -102,7 +102,7 @@ namespace GreenshotPlugin.Core { Banner = banner; } - private bool _alwaysDisplay = false; + private bool _alwaysDisplay; /// <summary> /// Gets or sets if the dialog will be shown even if the credentials /// can be returned from an existing credential in the credential manager. @@ -138,7 +138,7 @@ namespace GreenshotPlugin.Core { } } - private bool _incorrectPassword = false; + private bool _incorrectPassword; /// <summary>Gets or sets if the incorrect password balloontip needs to be shown. Introduced AFTER Windows XP</summary>Gets></summary> public bool IncorrectPassword { get { @@ -149,7 +149,7 @@ namespace GreenshotPlugin.Core { } } - private bool _keepName = false; + private bool _keepName; /// <summary>Gets or sets if the name is read-only.</summary> public bool KeepName { get { @@ -200,7 +200,7 @@ namespace GreenshotPlugin.Core { } } - private bool _saveChecked = false; + private bool _saveChecked; /// <summary>Gets or sets if the save checkbox status.</summary> public bool SaveChecked { get { @@ -285,7 +285,7 @@ namespace GreenshotPlugin.Core { } } - private Image _banner = null; + private Image _banner; /// <summary>Gets or sets the image to display on the dialog.</summary> /// <remarks>A null value will cause a system default image to be used.</remarks> public Image Banner { diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs index 70c45bfb9..d86e591fc 100644 --- a/GreenshotPlugin/Core/Effects.cs +++ b/GreenshotPlugin/Core/Effects.cs @@ -86,7 +86,8 @@ namespace Greenshot.Core { /// </summary> [TypeConverter(typeof(EffectConverter))] public class TornEdgeEffect : DropShadowEffect { - public TornEdgeEffect() : base() { + public TornEdgeEffect() + { Reset(); } public int ToothHeight { @@ -116,7 +117,7 @@ namespace Greenshot.Core { ToothHeight = 12; HorizontalToothRange = 20; VerticalToothRange = 20; - Edges = new bool[] { true, true, true, true }; + Edges = new[] { true, true, true, true }; GenerateShadow = true; } public override Image Apply(Image sourceImage, Matrix matrix) { @@ -146,16 +147,16 @@ namespace Greenshot.Core { /// MonochromeEffect /// </summary> public class MonochromeEffect : IEffect { - private byte threshold; + private readonly byte _threshold; /// <param name="threshold">Threshold for monochrome filter (0 - 255), lower value means less black</param> public MonochromeEffect(byte threshold) { - this.threshold = threshold; + _threshold = threshold; } public void Reset() { // TODO: Modify the threshold to have a default, which is reset here } public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.CreateMonochrome(sourceImage, threshold); + return ImageHelper.CreateMonochrome(sourceImage, _threshold); } } @@ -163,7 +164,8 @@ namespace Greenshot.Core { /// AdjustEffect /// </summary> public class AdjustEffect : IEffect { - public AdjustEffect() : base() { + public AdjustEffect() + { Reset(); } public float Contrast { @@ -192,8 +194,9 @@ namespace Greenshot.Core { /// ReduceColorsEffect /// </summary> public class ReduceColorsEffect : IEffect { - private static ILog LOG = LogManager.GetLogger(typeof(ReduceColorsEffect)); - public ReduceColorsEffect() : base() { + private static readonly ILog LOG = LogManager.GetLogger(typeof(ReduceColorsEffect)); + public ReduceColorsEffect() + { Reset(); } public int Colors { @@ -355,9 +358,10 @@ namespace Greenshot.Core { public class EffectConverter : TypeConverter { // Fix to prevent BUG-1753 - private NumberFormatInfo numberFormatInfo = new NumberFormatInfo(); + private readonly NumberFormatInfo numberFormatInfo = new NumberFormatInfo(); - public EffectConverter() : base() { + public EffectConverter() + { numberFormatInfo.NumberDecimalSeparator = "."; numberFormatInfo.NumberGroupSeparator = ","; } @@ -382,7 +386,7 @@ namespace Greenshot.Core { return base.CanConvertTo(context, destinationType); } - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { // to string if (destinationType == typeof(string)) { StringBuilder sb = new StringBuilder(); @@ -400,7 +404,7 @@ namespace Greenshot.Core { } } // from string - if (value.GetType() == typeof(string)) { + if (value is string) { string settings = value as string; if (destinationType == typeof(DropShadowEffect)) { DropShadowEffect effect = new DropShadowEffect(); @@ -417,14 +421,13 @@ namespace Greenshot.Core { return base.ConvertTo(context, culture, value, destinationType); } - public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { - if (value != null && value.GetType() == typeof(string)) { + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { + if (value != null && value is string) { string settings = value as string; if (settings.Contains("ToothHeight")) { return ConvertTo(context, culture, value, typeof(TornEdgeEffect)); - } else { - return ConvertTo(context, culture, value, typeof(DropShadowEffect)); } + return ConvertTo(context, culture, value, typeof(DropShadowEffect)); } return base.ConvertFrom(context, culture, value); } diff --git a/GreenshotPlugin/Core/EventDelay.cs b/GreenshotPlugin/Core/EventDelay.cs index 848d19dd9..1dbd3d7c7 100644 --- a/GreenshotPlugin/Core/EventDelay.cs +++ b/GreenshotPlugin/Core/EventDelay.cs @@ -23,8 +23,8 @@ using System; namespace GreenshotPlugin.Core { public class EventDelay { - private long lastCheck = 0; - private long waitTime; + private long lastCheck; + private readonly long waitTime; public EventDelay(long ticks) { this.waitTime = ticks; } diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index 228e1e4bf..8090a7b29 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -322,7 +322,7 @@ namespace GreenshotPlugin.Core { protected BitmapData bmData; protected int stride; /* bytes per pixel row */ - protected bool bitsLocked = false; + protected bool bitsLocked; protected byte* pointer; public static IFastBitmap Create(Bitmap source) { @@ -726,8 +726,8 @@ namespace GreenshotPlugin.Core { /// </summary> public unsafe class FastChunkyBitmap : FastBitmap { // Used for indexed images - private Color[] colorEntries; - private Dictionary<Color, byte> colorCache = new Dictionary<Color, byte>(); + private readonly Color[] colorEntries; + private readonly Dictionary<Color, byte> colorCache = new Dictionary<Color, byte>(); public FastChunkyBitmap(Bitmap source, Rectangle area) : base(source, area) { colorEntries = bitmap.Palette.Entries; diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 30c7b3f59..236f4f2d9 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -41,7 +41,7 @@ namespace GreenshotPlugin.Core { private static readonly Regex SPLIT_REGEXP = new Regex(";(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", RegexOptions.Compiled); private const int MAX_TITLE_LENGTH = 80; - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private const string UNSAFE_REPLACEMENT = "_"; /// <summary> @@ -159,7 +159,7 @@ namespace GreenshotPlugin.Core { switch (parameter.Substring(0, 1)) { // Padding p<width>[,pad-character] case "p": - string[] padParams = parameter.Substring(1).Split(new char[] { ',' }); + string[] padParams = parameter.Substring(1).Split(new[] { ',' }); try { padWidth = int.Parse(padParams[0]); } catch { @@ -171,7 +171,7 @@ namespace GreenshotPlugin.Core { // replace // r<old string>,<new string> case "r": - string[] replaceParameters = parameter.Substring(1).Split(new char[] { ',' }); + string[] replaceParameters = parameter.Substring(1).Split(new[] { ',' }); if (replaceParameters != null && replaceParameters.Length == 2) { replacements.Add(replaceParameters[0], replaceParameters[1]); } @@ -191,7 +191,7 @@ namespace GreenshotPlugin.Core { // s<start>[,length] case "s": string range = parameter.Substring(1); - string[] rangelist = range.Split(new char[] { ',' }); + string[] rangelist = range.Split(new[] { ',' }); if (rangelist.Length > 0) { try { startIndex = int.Parse(rangelist[0]); @@ -418,9 +418,9 @@ namespace GreenshotPlugin.Core { } return VAR_REGEXP.Replace(pattern, - new MatchEvaluator(delegate(Match m) { - return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); - }) + delegate(Match m) { + return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); + } ); } @@ -455,9 +455,9 @@ namespace GreenshotPlugin.Core { try { return VAR_REGEXP.Replace(pattern, - new MatchEvaluator(delegate(Match m) { - return MatchVarEvaluator(m, captureDetails, processVars, userVars, machineVars, filenameSafeMode); - }) + delegate(Match m) { + return MatchVarEvaluator(m, captureDetails, processVars, userVars, machineVars, filenameSafeMode); + } ); } catch (Exception e) { // adding additional data for bug tracking diff --git a/GreenshotPlugin/Core/GreenshotResources.cs b/GreenshotPlugin/Core/GreenshotResources.cs index 701786e80..216c82179 100644 --- a/GreenshotPlugin/Core/GreenshotResources.cs +++ b/GreenshotPlugin/Core/GreenshotResources.cs @@ -26,7 +26,7 @@ namespace GreenshotPlugin.Core { /// Centralized storage of the icons & bitmaps /// </summary> public static class GreenshotResources { - private static ComponentResourceManager greenshotResources = new ComponentResourceManager(typeof(GreenshotResources)); + private static readonly ComponentResourceManager greenshotResources = new ComponentResourceManager(typeof(GreenshotResources)); public static Image getImage(string imageName) { return (Image)greenshotResources.GetObject(imageName); diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 86abd0dab..bad73adb5 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -24,10 +24,8 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; -using System.Runtime.InteropServices; using Greenshot.IniFile; using GreenshotPlugin.UnmanagedHelpers; -using Greenshot.Plugin; using Greenshot.Core; using log4net; @@ -48,8 +46,8 @@ namespace GreenshotPlugin.Core { /// Description of ImageHelper. /// </summary> public static class ImageHelper { - private static ILog LOG = LogManager.GetLogger(typeof(ImageHelper)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageHelper)); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private const int EXIF_ORIENTATION_ID = 0x0112; /// <summary> @@ -827,7 +825,7 @@ namespace GreenshotPlugin.Core { if ((shadowSize & 1) == 0) { shadowSize++; } - bool useGDIBlur = GDIplus.isBlurPossible(shadowSize); + bool useGDIBlur = GDIplus.IsBlurPossible(shadowSize); // Create "mask" for the shadow ColorMatrix maskMatrix = new ColorMatrix(); maskMatrix.Matrix00 = 0; @@ -1021,12 +1019,13 @@ namespace GreenshotPlugin.Core { public static ImageAttributes CreateAdjustAttributes(float brightness, float contrast, float gamma) { float adjustedBrightness = brightness - 1.0f; ColorMatrix applyColorMatrix = new ColorMatrix( - new float[][] { - new float[] {contrast, 0, 0, 0, 0}, // scale red - new float[] {0, contrast, 0, 0, 0}, // scale green - new float[] {0, 0, contrast, 0, 0}, // scale blue - new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha - new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1} + new[] + { + new[] {contrast, 0, 0, 0, 0}, // scale red + new[] {0, contrast, 0, 0, 0}, // scale green + new[] {0, 0, contrast, 0, 0}, // scale blue + new[] {0, 0, 0, 1.0f, 0}, // don't scale alpha + new[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1} }); //create some image attributes @@ -1063,10 +1062,11 @@ namespace GreenshotPlugin.Core { /// <returns>Bitmap with grayscale</returns> public static Image CreateGrayscale(Image sourceImage) { Bitmap clone = (Bitmap)Clone(sourceImage); - ColorMatrix grayscaleMatrix = new ColorMatrix( new float[][] { - new float[] {.3f, .3f, .3f, 0, 0}, - new float[] {.59f, .59f, .59f, 0, 0}, - new float[] {.11f, .11f, .11f, 0, 0}, + ColorMatrix grayscaleMatrix = new ColorMatrix( new[] + { + new[] {.3f, .3f, .3f, 0, 0}, + new[] {.59f, .59f, .59f, 0, 0}, + new[] {.11f, .11f, .11f, 0, 0}, new float[] {0, 0, 0, 1, 0}, new float[] {0, 0, 0, 0, 1} }); diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 9b961b0f3..cc7a16af5 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -44,7 +44,7 @@ namespace GreenshotPlugin.Core { private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageOutput)); private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private static readonly int PROPERTY_TAG_SOFTWARE_USED = 0x0131; - private static Cache<string, string> tmpFileCache = new Cache<string, string>(10 * 60 * 60, RemoveExpiredTmpFile); + private static readonly Cache<string, string> tmpFileCache = new Cache<string, string>(10 * 60 * 60, RemoveExpiredTmpFile); /// <summary> /// Creates a PropertyItem (Metadata) to store with the image. diff --git a/GreenshotPlugin/Core/InterfaceUtils.cs b/GreenshotPlugin/Core/InterfaceUtils.cs index 0b02a9103..4b8710924 100644 --- a/GreenshotPlugin/Core/InterfaceUtils.cs +++ b/GreenshotPlugin/Core/InterfaceUtils.cs @@ -30,7 +30,7 @@ namespace GreenshotPlugin.Core { /// Description of InterfaceUtils. /// </summary> public static class InterfaceUtils { - private static ILog LOG = LogManager.GetLogger(typeof(InterfaceUtils)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(InterfaceUtils)); public static List<Type> GetSubclassesOf(Type type, bool excludeSystemTypes) { List<Type> list = new List<Type>(); diff --git a/GreenshotPlugin/Core/JSONHelper.cs b/GreenshotPlugin/Core/JSONHelper.cs index 8bb4e3625..1770e5657 100644 --- a/GreenshotPlugin/Core/JSONHelper.cs +++ b/GreenshotPlugin/Core/JSONHelper.cs @@ -8,7 +8,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ using System; -using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Text; diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index e897c6a66..67899f1ed 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -35,21 +35,21 @@ namespace GreenshotPlugin.Core { /// The language resources are loaded from the language files found on fixed or supplied paths /// </summary> public class Language { - private static ILog LOG = LogManager.GetLogger(typeof(Language)); - private static List<string> languagePaths = new List<string>(); - private static IDictionary<string, List<LanguageFile>> languageFiles = new Dictionary<string, List<LanguageFile>>(); - private static IDictionary<string, string> helpFiles = new Dictionary<string, string>(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(Language)); + private static readonly List<string> languagePaths = new List<string>(); + private static readonly IDictionary<string, List<LanguageFile>> languageFiles = new Dictionary<string, List<LanguageFile>>(); + private static readonly IDictionary<string, string> helpFiles = new Dictionary<string, string>(); private const string DEFAULT_LANGUAGE = "en-US"; private const string HELP_FILENAME_PATTERN = @"help-*.html"; private const string LANGUAGE_FILENAME_PATTERN = @"language*.xml"; - private static Regex PREFIX_REGEXP = new Regex(@"language_([a-zA-Z0-9]+).*"); - private static Regex IETF_CLEAN_REGEXP = new Regex(@"[^a-zA-Z]+"); - private static Regex IETF_REGEXP = new Regex(@"^.*([a-zA-Z]{2}-[a-zA-Z]{2})\.xml$"); + private static readonly Regex PREFIX_REGEXP = new Regex(@"language_([a-zA-Z0-9]+).*"); + private static readonly Regex IETF_CLEAN_REGEXP = new Regex(@"[^a-zA-Z]+"); + private static readonly Regex IETF_REGEXP = new Regex(@"^.*([a-zA-Z]{2}-[a-zA-Z]{2})\.xml$"); private const string LANGUAGE_GROUPS_KEY = @"SYSTEM\CurrentControlSet\Control\Nls\Language Groups"; - private static List<string> unsupportedLanguageGroups = new List<string>(); - private static IDictionary<string, string> resources = new Dictionary<string, string>(); - private static string currentLanguage = null; - private static CoreConfiguration coreConfig = null; + private static readonly List<string> unsupportedLanguageGroups = new List<string>(); + private static readonly IDictionary<string, string> resources = new Dictionary<string, string>(); + private static string currentLanguage; + private static readonly CoreConfiguration coreConfig; public static event LanguageChangedHandler LanguageChanged; diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 253493f58..27b2b6211 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -37,7 +37,7 @@ namespace GreenshotPlugin.Core { public class LogHelper { private const string LOG4NET_FILE = "log4net.xml"; private const string LOG4NET_PORTABLE_FILE = "log4net-portable.xml"; - private static bool isLog4NetConfigured = false; + private static bool isLog4NetConfigured; private const string INIT_MESSAGE = "Greenshot initialization of log system failed"; public static bool isInitialized { get { diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index dc816eab7..5a9ec8877 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -552,10 +552,10 @@ namespace GreenshotPlugin.Core { /// A container to supply files to a Multi-part form data upload /// </summary> public class ByteContainer : IBinaryContainer { - private byte[] file; - private string fileName; - private string contentType; - private int fileSize; + private readonly byte[] file; + private readonly string fileName; + private readonly string contentType; + private readonly int fileSize; public ByteContainer(byte[] file) : this(file, null) { } public ByteContainer(byte[] file, string filename) : this(file, filename, null) { @@ -635,9 +635,9 @@ namespace GreenshotPlugin.Core { /// A container to supply images to a Multi-part form data upload /// </summary> public class BitmapContainer : IBinaryContainer { - private Bitmap bitmap; - private SurfaceOutputSettings outputSettings; - private string fileName; + private readonly Bitmap bitmap; + private readonly SurfaceOutputSettings outputSettings; + private readonly string fileName; public BitmapContainer(Bitmap bitmap, SurfaceOutputSettings outputSettings, string filename) { this.bitmap = bitmap; @@ -712,9 +712,9 @@ namespace GreenshotPlugin.Core { /// A container to supply surfaces to a Multi-part form data upload /// </summary> public class SurfaceContainer : IBinaryContainer { - private ISurface surface; - private SurfaceOutputSettings outputSettings; - private string fileName; + private readonly ISurface surface; + private readonly SurfaceOutputSettings outputSettings; + private readonly string fileName; public SurfaceContainer(ISurface surface, SurfaceOutputSettings outputSettings, string filename) { this.surface = surface; diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index 110736f5e..add088da2 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -27,7 +27,6 @@ using System.Collections.Specialized; using System.Diagnostics; using System.Drawing; using System.Globalization; -using System.IO; using System.Net; using System.Net.Sockets; using System.Security.Cryptography; @@ -968,7 +967,7 @@ Greenshot received information from CloudServiceName. You can close this browser private string _cloudServiceName; - private IDictionary<string, string> _returnValues = new Dictionary<string, string>(); + private readonly IDictionary<string, string> _returnValues = new Dictionary<string, string>(); /// <summary> @@ -991,7 +990,7 @@ Greenshot received information from CloudServiceName. You can close this browser Process.Start(authorizationUrl); // Wait to get the authorization code response. - var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); + var context = listener.BeginGetContext(ListenerCallback, listener); _ready.Reset(); while (!context.AsyncWaitHandle.WaitOne(1000, true)) { diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 122fbc150..a3d910e61 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -37,9 +37,9 @@ namespace GreenshotPlugin.Core { /// </summary> public static class PluginUtils { private static readonly ILog LOG = LogManager.GetLogger(typeof(PluginUtils)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private const string PATH_KEY = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\"; - private static IDictionary<string, Image> exeIconCache = new Dictionary<string, Image>(); + private static readonly IDictionary<string, Image> exeIconCache = new Dictionary<string, Image>(); static PluginUtils() { conf.PropertyChanged += OnIconSizeChanged; diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index d9bfa1713..d2feec81e 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -71,7 +71,7 @@ namespace GreenshotPlugin.Core { } public class WuQuantizer : IDisposable { - private static ILog LOG = LogManager.GetLogger(typeof(WuQuantizer)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(WuQuantizer)); private const Int32 MAXCOLOR = 512; private const Int32 RED = 2; @@ -82,23 +82,23 @@ namespace GreenshotPlugin.Core { private const Int32 MAXVOLUME = SIDESIZE * SIDESIZE * SIDESIZE; // To count the colors - private int colorCount = 0; + private readonly int colorCount; private Int32[] reds; private Int32[] greens; private Int32[] blues; private Int32[] sums; - private Int64[, ,] weights; - private Int64[, ,] momentsRed; - private Int64[, ,] momentsGreen; - private Int64[, ,] momentsBlue; - private Single[, ,] moments; + private readonly Int64[, ,] weights; + private readonly Int64[, ,] momentsRed; + private readonly Int64[, ,] momentsGreen; + private readonly Int64[, ,] momentsBlue; + private readonly Single[, ,] moments; private byte[] tag; - private WuColorCube[] cubes; - private Bitmap sourceBitmap; + private readonly WuColorCube[] cubes; + private readonly Bitmap sourceBitmap; private Bitmap resultBitmap; public void Dispose() { diff --git a/GreenshotPlugin/Core/SourceForgeHelper.cs b/GreenshotPlugin/Core/SourceForgeHelper.cs index 3a027cbbb..6ead257d0 100644 --- a/GreenshotPlugin/Core/SourceForgeHelper.cs +++ b/GreenshotPlugin/Core/SourceForgeHelper.cs @@ -21,7 +21,6 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Net; using System.Text.RegularExpressions; using System.Xml; @@ -96,7 +95,7 @@ namespace GreenshotPlugin.Core { /// Description of SourceForgeHelper. /// </summary> public class SourceForgeHelper { - private static ILog LOG = LogManager.GetLogger(typeof(SourceForgeHelper)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(SourceForgeHelper)); private const string RSSFEED = "http://getgreenshot.org/project-feed/"; /// <summary> diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index 9cbec97b4..6f457d212 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -26,7 +26,6 @@ using System.Text; using log4net; using System.Text.RegularExpressions; using System.Collections.Generic; -using System.Reflection; namespace GreenshotPlugin.Core { public static class StringExtensions { diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index a85792162..ebda0a660 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -62,7 +62,7 @@ namespace GreenshotPlugin.Core { set; } - private Dictionary<string, string> metaData = new Dictionary<string, string>(); + private readonly Dictionary<string, string> metaData = new Dictionary<string, string>(); public Dictionary<string, string> MetaData { get {return metaData;} } @@ -644,7 +644,7 @@ namespace GreenshotPlugin.Core { // capture.Image = capturedBitmap; // capture.Location = captureBounds.Location; - using (SafeWindowDCHandle desktopDCHandle = SafeWindowDCHandle.fromDesktop()) { + using (SafeWindowDCHandle desktopDCHandle = SafeWindowDCHandle.FromDesktop()) { if (desktopDCHandle.IsInvalid) { // Get Exception before the error is lost Exception exceptionToThrow = CreateCaptureException("desktopDCHandle", captureBounds); diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 4b69f88ad..412e018bc 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -47,7 +47,7 @@ namespace GreenshotPlugin.Core { /// </summary> public class WindowsEnumerator { #region Member Variables - private List<WindowDetails> items = null; + private List<WindowDetails> items; #endregion /// <summary> @@ -89,7 +89,7 @@ namespace GreenshotPlugin.Core { public WindowsEnumerator GetWindows(IntPtr hWndParent, string classname) { items = new List<WindowDetails>(); List<WindowDetails> windows = new List<WindowDetails>(); - User32.EnumChildWindows(hWndParent, new EnumWindowsProc(WindowEnum), IntPtr.Zero); + User32.EnumChildWindows(hWndParent, WindowEnum, IntPtr.Zero); bool hasParent = !IntPtr.Zero.Equals(hWndParent); string parentText = null; @@ -164,11 +164,11 @@ namespace GreenshotPlugin.Core { private const string METRO_APPLAUNCHER_CLASS = "ImmersiveLauncher"; private const string METRO_GUTTER_CLASS = "ImmersiveGutter"; - private static ILog LOG = LogManager.GetLogger(typeof(WindowDetails)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - private static List<IntPtr> ignoreHandles = new List<IntPtr>(); - private static List<string> excludeProcessesFromFreeze = new List<string>(); - private static IAppVisibility appVisibility = null; + private static readonly ILog LOG = LogManager.GetLogger(typeof(WindowDetails)); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly List<IntPtr> ignoreHandles = new List<IntPtr>(); + private static readonly List<string> excludeProcessesFromFreeze = new List<string>(); + private static readonly IAppVisibility appVisibility; static WindowDetails() { try { @@ -189,10 +189,10 @@ namespace GreenshotPlugin.Core { return ignoreHandles.Contains(handle); } - private List<WindowDetails> childWindows = null; + private List<WindowDetails> childWindows; private IntPtr parentHandle = IntPtr.Zero; - private WindowDetails parent = null; - private bool frozen = false; + private WindowDetails parent; + private bool frozen; public bool isApp { get { @@ -224,7 +224,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// The window handle. /// </summary> - private IntPtr hWnd = IntPtr.Zero; + private readonly IntPtr hWnd = IntPtr.Zero; /// <summary> /// To allow items to be compared, the hash code @@ -588,7 +588,7 @@ namespace GreenshotPlugin.Core { } } - private string text = null; + private string text; /// <summary> /// Gets the window's title (caption) /// </summary> @@ -606,7 +606,7 @@ namespace GreenshotPlugin.Core { } } - private string className = null; + private string className; /// <summary> /// Gets the window's class name. /// </summary> @@ -755,7 +755,7 @@ namespace GreenshotPlugin.Core { } private Rectangle previousWindowRectangle = Rectangle.Empty; - private long lastWindowRectangleRetrieveTime = 0; + private long lastWindowRectangleRetrieveTime; private const long CACHE_TIME = TimeSpan.TicksPerSecond * 2; /// <summary> /// Gets the bounding rectangle of the window @@ -1515,7 +1515,7 @@ namespace GreenshotPlugin.Core { continue; } // Ignore some classes - List<string> ignoreClasses = new List<string>(new string[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" + List<string> ignoreClasses = new List<string>(new[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" if (ignoreClasses.Contains(window.ClassName)) { continue; } @@ -1585,7 +1585,7 @@ namespace GreenshotPlugin.Core { continue; } // Ignore some classes - List<string> ignoreClasses = new List<string>(new string[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" + List<string> ignoreClasses = new List<string>(new[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" if (ignoreClasses.Contains(window.ClassName)) { continue; } diff --git a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs index eb5b399e2..dd9e8a2b8 100644 --- a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs index 0bab7edf0..40d511c56 100644 --- a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument.cs b/GreenshotPlugin/IEInterop/IHTMLDocument.cs index 176b66fea..d89a81159 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs index a7a2e26e4..79de005d0 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs index 8d4825044..6d9f2c8ba 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs index 2ee041264..b78943ced 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs index 10c603d7d..124f595b5 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLElement.cs b/GreenshotPlugin/IEInterop/IHTMLElement.cs index 5bdf3bf6f..e87c73efb 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLElement2.cs b/GreenshotPlugin/IEInterop/IHTMLElement2.cs index 44a278179..0aa0092b6 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement2.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs index 3a393c69c..4a82b7e99 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Collections; using System.Runtime.InteropServices; diff --git a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs index a41922c14..015ce20af 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs index 07c2fab8a..65a541060 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLRect.cs b/GreenshotPlugin/IEInterop/IHTMLRect.cs index 943081b03..0045087a5 100644 --- a/GreenshotPlugin/IEInterop/IHTMLRect.cs +++ b/GreenshotPlugin/IEInterop/IHTMLRect.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen.cs b/GreenshotPlugin/IEInterop/IHTMLScreen.cs index f51807b0d..f2f50b8b8 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs index 459aeb741..d354175e4 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs index 43fb5434c..17bcd982c 100644 --- a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs +++ b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLStyle.cs b/GreenshotPlugin/IEInterop/IHTMLStyle.cs index 31433a84c..5c3928bb4 100644 --- a/GreenshotPlugin/IEInterop/IHTMLStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLStyle.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs index 21e2997b8..78206f573 100644 --- a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs +++ b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs index 16e1fd9cc..7eb6dfc53 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs index 0fb76e227..0ddf5bbc4 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs index 276f2bc73..bde9d27d5 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IEInterop/IWebBrowser2.cs b/GreenshotPlugin/IEInterop/IWebBrowser2.cs index 00abda678..d53d8df5b 100644 --- a/GreenshotPlugin/IEInterop/IWebBrowser2.cs +++ b/GreenshotPlugin/IEInterop/IWebBrowser2.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Runtime.InteropServices; namespace Greenshot.Interop.IE { diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index a6bbfca12..0f9d7401d 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -28,7 +28,7 @@ using log4net; namespace Greenshot.IniFile { public class IniConfig { - private static ILog LOG = LogManager.GetLogger(typeof(IniConfig)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(IniConfig)); private const string INI_EXTENSION = ".ini"; private const string DEFAULTS_POSTFIX = "-defaults"; private const string FIXED_POSTFIX = "-fixed"; @@ -36,22 +36,22 @@ namespace Greenshot.IniFile { /// <summary> /// A lock object for the ini file saving /// </summary> - private static object iniLock = new object(); + private static readonly object iniLock = new object(); /// <summary> /// As the ini implementation is kept someone generic, for reusing, this holds the name of the application /// </summary> - private static string applicationName = null; + private static string applicationName; /// <summary> /// As the ini implementation is kept someone generic, for reusing, this holds the name of the configuration /// </summary> - private static string configName = null; + private static string configName; /// <summary> /// A Dictionary with all the sections stored by section name /// </summary> - private static Dictionary<string, IniSection> sectionMap = new Dictionary<string, IniSection>(); + private static readonly Dictionary<string, IniSection> sectionMap = new Dictionary<string, IniSection>(); /// <summary> /// A Dictionary with the properties for a section stored by section name @@ -61,17 +61,17 @@ namespace Greenshot.IniFile { /// <summary> /// A Dictionary with the fixed-properties for a section stored by section name /// </summary> - private static Dictionary<string, Dictionary<string, string>> fixedProperties = null; + private static Dictionary<string, Dictionary<string, string>> fixedProperties; /// <summary> /// Stores if we checked for portable /// </summary> - private static bool portableCheckMade = false; + private static bool portableCheckMade; /// <summary> /// Is the configuration portable (meaning we don't store it in the AppData directory) /// </summary> - private static bool portable = false; + private static bool portable; public static bool IsPortable { get { return portable; diff --git a/GreenshotPlugin/IniFile/IniReader.cs b/GreenshotPlugin/IniFile/IniReader.cs index 3447bf9db..205efc616 100644 --- a/GreenshotPlugin/IniFile/IniReader.cs +++ b/GreenshotPlugin/IniFile/IniReader.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Collections.Generic; using System.IO; using System.Text; @@ -28,7 +28,7 @@ namespace Greenshot.IniFile { private const string SECTION_START = "["; private const string SECTION_END = "]"; private const string COMMENT = ";"; - private static char[] ASSIGNMENT = new char[] { '=' }; + private static readonly char[] ASSIGNMENT = new[] { '=' }; /** * Read an ini file to a Dictionary, each key is a section and the value is a Dictionary with name and values. diff --git a/GreenshotPlugin/IniFile/IniSection.cs b/GreenshotPlugin/IniFile/IniSection.cs index 40aba49f9..4587ae8fb 100644 --- a/GreenshotPlugin/IniFile/IniSection.cs +++ b/GreenshotPlugin/IniFile/IniSection.cs @@ -34,9 +34,9 @@ namespace Greenshot.IniFile { protected static ILog LOG = LogManager.GetLogger(typeof(IniSection)); [NonSerialized] - private IDictionary<string, IniValue> values = new Dictionary<string, IniValue>(); + private readonly IDictionary<string, IniValue> values = new Dictionary<string, IniValue>(); [NonSerialized] - private IniSectionAttribute iniSectionAttribute = null; + private IniSectionAttribute iniSectionAttribute; public IniSectionAttribute IniSectionAttribute { get { if (iniSectionAttribute == null) { diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index c7fe99d01..9c2cee792 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -31,11 +31,11 @@ namespace Greenshot.IniFile { /// A container to be able to pass the value from a IniSection around. /// </summary> public class IniValue { - private static ILog LOG = LogManager.GetLogger(typeof(IniValue)); - private PropertyInfo propertyInfo; - private FieldInfo fieldInfo; - private IniSection containingIniSection; - private IniPropertyAttribute attributes; + private static readonly ILog LOG = LogManager.GetLogger(typeof(IniValue)); + private readonly PropertyInfo propertyInfo; + private readonly FieldInfo fieldInfo; + private readonly IniSection containingIniSection; + private readonly IniPropertyAttribute attributes; public IniValue(IniSection containingIniSection, PropertyInfo propertyInfo, IniPropertyAttribute iniPropertyAttribute) { this.containingIniSection = containingIniSection; @@ -216,7 +216,7 @@ namespace Greenshot.IniFile { // Get all the values. while ((bool)moveNext.Invoke(enumerator, null)) { var key = current.Invoke(enumerator, null); - var valueObject = item.GetValue(myValue, new object[] { key }); + var valueObject = item.GetValue(myValue, new[] { key }); // Write to ini file! writer.WriteLine("{0}.{1}={2}", attributes.Name, ConvertValueToString(valueType1, key, attributes.Separator), ConvertValueToString(valueType2, valueObject, attributes.Separator)); } @@ -293,7 +293,7 @@ namespace Greenshot.IniFile { LOG.Warn(ex); //LOG.Error("Problem converting " + stringValue + " to type " + type2.FullName, e); } - addMethodInfo.Invoke(dictionary, new object[] { newValue1, newValue2 }); + addMethodInfo.Invoke(dictionary, new[] { newValue1, newValue2 }); addedElements = true; } } @@ -370,7 +370,7 @@ namespace Greenshot.IniFile { string arraySeparator = separator; object list = Activator.CreateInstance(valueType); // Logic for List<> - string[] arrayValues = valueString.Split(new string[] { arraySeparator }, StringSplitOptions.None); + string[] arrayValues = valueString.Split(new[] { arraySeparator }, StringSplitOptions.None); if (arrayValues == null || arrayValues.Length == 0) { return list; } @@ -385,7 +385,7 @@ namespace Greenshot.IniFile { LOG.Warn("Problem converting " + arrayValue + " to type " + valueType.FullName, ex); } if (newValue != null) { - addMethodInfo.Invoke(list, new object[] { newValue }); + addMethodInfo.Invoke(list, new[] { newValue }); } } } @@ -394,7 +394,7 @@ namespace Greenshot.IniFile { //LOG.Debug("No convertor for " + fieldType.ToString()); if (valueType == typeof(object) && valueString.Length > 0) { //LOG.Debug("Parsing: " + valueString); - string[] values = valueString.Split(new Char[] { ':' }); + string[] values = valueString.Split(new[] { ':' }); //LOG.Debug("Type: " + values[0]); //LOG.Debug("Value: " + values[1]); Type fieldTypeForValue = Type.GetType(values[0], true); diff --git a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs index 8c49e4e2d..0cebfc6b7 100644 --- a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs +++ b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs @@ -18,12 +18,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using GreenshotPlugin.Core; +using System.Drawing; +using System.Windows.Forms; namespace Greenshot.Plugin { /// <summary> diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 73e6c2cf6..96283027a 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -20,7 +20,6 @@ */ using System; using System.Drawing; -using System.Drawing.Imaging; using System.Windows.Forms; using Greenshot.Plugin.Drawing; diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index e7da7eb9a..0377f5783 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -25,14 +25,14 @@ using System.Windows.Forms; namespace Greenshot.Plugin { public class ExportInformation { - private string uri = null; - private string filepath = null; + private string uri; + private string filepath; - private bool exportMade = false; - private string destinationDesignation = null; - private string destinationDescription = null; + private bool exportMade; + private readonly string destinationDesignation; + private string destinationDescription; - private string errorMessage = null; + private string errorMessage; public ExportInformation(string destinationDesignation, string destinationDescription) { this.destinationDesignation = destinationDesignation; diff --git a/GreenshotPlugin/Interfaces/IProcessor.cs b/GreenshotPlugin/Interfaces/IProcessor.cs index 40737888f..d69d4d378 100644 --- a/GreenshotPlugin/Interfaces/IProcessor.cs +++ b/GreenshotPlugin/Interfaces/IProcessor.cs @@ -19,9 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; namespace Greenshot.Plugin { /// <summary> diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index b21963bf2..f075adc73 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -21,7 +21,6 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.IO; using System.Windows.Forms; using GreenshotPlugin.Core; @@ -76,10 +75,10 @@ namespace Greenshot.Plugin { public delegate void HotKeyHandler(); public class SurfaceOutputSettings { - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private bool reduceColors; private bool disableReduceColors; - private List<IEffect> effects = new List<IEffect>(); + private readonly List<IEffect> effects = new List<IEffect>(); public SurfaceOutputSettings() { disableReduceColors = false; diff --git a/GreenshotPlugin/Interop/Base.cs b/GreenshotPlugin/Interop/Base.cs index af344c6c2..16c4799fe 100644 --- a/GreenshotPlugin/Interop/Base.cs +++ b/GreenshotPlugin/Interop/Base.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; namespace Greenshot.Interop { /// <summary> diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 49c3e1d8d..e06aea399 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -55,12 +55,12 @@ namespace Greenshot.Interop { /// <summary> /// The type of which method calls are intercepted and executed on the COM object. /// </summary> - private readonly Type _InterceptType; + private readonly Type _interceptType; /// <summary> /// The humanly readable target name /// </summary> - private readonly string _TargetName; + private readonly string _targetName; #endregion [DllImport("ole32.dll")] @@ -341,8 +341,8 @@ namespace Greenshot.Interop { private COMWrapper(object comObject, Type type, string targetName) : base(type) { _COMObject = comObject; _COMType = comObject.GetType(); - _InterceptType = type; - _TargetName = targetName; + _interceptType = type; + _targetName = targetName; } #endregion @@ -354,7 +354,7 @@ namespace Greenshot.Interop { /// sure that the COM object is still cleaned up. /// </summary> ~COMWrapper() { - LOG.DebugFormat("Finalize {0}", _InterceptType.ToString()); + LOG.DebugFormat("Finalize {0}", _interceptType); Dispose(false); } @@ -375,13 +375,13 @@ namespace Greenshot.Interop { /// </param> private void Dispose(bool disposing) { if (null != _COMObject) { - LOG.DebugFormat("Disposing {0}", _InterceptType.ToString()); + LOG.DebugFormat("Disposing {0}", _interceptType); if (Marshal.IsComObject(_COMObject)) { try { int count; do { count = Marshal.ReleaseComObject(_COMObject); - LOG.DebugFormat("RCW count for {0} now is {1}", _InterceptType.ToString(), count); + LOG.DebugFormat("RCW count for {0} now is {1}", _interceptType, count); } while (count > 0); } catch (Exception ex) { LOG.WarnFormat("Problem releasing COM object {0}", _COMType); @@ -406,7 +406,7 @@ namespace Greenshot.Interop { /// The full name of the intercepted type. /// </returns> public override string ToString() { - return _InterceptType.FullName; + return _interceptType.FullName; } /// <summary> @@ -485,11 +485,11 @@ namespace Greenshot.Interop { if (oldWrapper == null) { throw new ArgumentException("wrapper proxy was no COMWrapper"); } - if (oldWrapper._InterceptType.IsAssignableFrom(newType)) { - COMWrapper newWrapper = new COMWrapper(oldWrapper._COMObject, newType, oldWrapper._TargetName); + if (oldWrapper._interceptType.IsAssignableFrom(newType)) { + COMWrapper newWrapper = new COMWrapper(oldWrapper._COMObject, newType, oldWrapper._targetName); return (T)newWrapper.GetTransparentProxy(); } - throw new InvalidCastException(string.Format("{0} is not assignable from {1}", oldWrapper._InterceptType, newType)); + throw new InvalidCastException(string.Format("{0} is not assignable from {1}", oldWrapper._interceptType, newType)); } /// <summary> @@ -536,21 +536,21 @@ namespace Greenshot.Interop { LOG.InfoFormat("Type information for Type with name: {0}", type.Name); try { foreach (MemberInfo memberInfo in type.GetMembers()) { - LOG.InfoFormat("Member: {0};", memberInfo.ToString()); + LOG.InfoFormat("Member: {0};", memberInfo); } } catch (Exception memberException) { LOG.Error(memberException); } try { foreach (PropertyInfo propertyInfo in type.GetProperties()) { - LOG.InfoFormat("Property: {0};", propertyInfo.ToString()); + LOG.InfoFormat("Property: {0};", propertyInfo); } } catch (Exception propertyException) { LOG.Error(propertyException); } try { foreach (FieldInfo fieldInfo in type.GetFields()) { - LOG.InfoFormat("Field: {0};", fieldInfo.ToString()); + LOG.InfoFormat("Field: {0};", fieldInfo); } } catch (Exception fieldException) { LOG.Error(fieldException); @@ -570,13 +570,13 @@ namespace Greenshot.Interop { public override IMessage Invoke(IMessage myMessage) { IMethodCallMessage callMessage = myMessage as IMethodCallMessage; if (null == callMessage) { - LOG.DebugFormat("Message type not implemented: {0}", myMessage.GetType().ToString()); + LOG.DebugFormat("Message type not implemented: {0}", myMessage.GetType()); return null; } MethodInfo method = callMessage.MethodBase as MethodInfo; if (null == method) { - LOG.DebugFormat("Unrecognized Invoke call: {0}", callMessage.MethodBase.ToString()); + LOG.DebugFormat("Unrecognized Invoke call: {0}", callMessage.MethodBase); return null; } @@ -589,25 +589,15 @@ namespace Greenshot.Interop { BindingFlags flags = BindingFlags.InvokeMethod; int argCount = callMessage.ArgCount; - object invokeObject; - Type invokeType; - Type byValType; - - object[] args; - object arg; - COMWrapper[] originalArgs; - COMWrapper wrapper; - ParameterModifier[] argModifiers = null; ParameterInfo[] parameters = null; - ParameterInfo parameter; if ("Dispose" == methodName && 0 == argCount && typeof(void) == returnType) { Dispose(); } else if ("ToString" == methodName && 0 == argCount && typeof(string) == returnType) { returnValue = ToString(); } else if ("GetType" == methodName && 0 == argCount && typeof(Type) == returnType) { - returnValue = _InterceptType; + returnValue = _interceptType; } else if ("GetHashCode" == methodName && 0 == argCount && typeof(int) == returnType) { returnValue = GetHashCode(); } else if ("Equals" == methodName && 1 == argCount && typeof(bool) == returnType) { @@ -621,9 +611,11 @@ namespace Greenshot.Interop { return new ReturnMessage(new ArgumentNullException("handler"), callMessage); } } else { - invokeObject = _COMObject; - invokeType = _COMType; + var invokeObject = _COMObject; + var invokeType = _COMType; + object[] args; + ParameterInfo parameter; if (methodName.StartsWith("get_")) { // Property Get methodName = methodName.Substring(4); @@ -657,6 +649,9 @@ namespace Greenshot.Interop { } // Un-wrap wrapped COM objects before passing to the method + Type byValType; + COMWrapper wrapper; + COMWrapper[] originalArgs; if (null == args || 0 == args.Length) { originalArgs = null; } else { @@ -677,7 +672,7 @@ namespace Greenshot.Interop { if (null == args[i]) { args[i] = new DispatchWrapper(null); } - } else if (typeof(Decimal) == byValType) { + } else if (typeof(decimal) == byValType) { // If we're passing a decimal value by reference, // we need to pass a CurrencyWrapper to avoid a // type mismatch exception. @@ -694,7 +689,7 @@ namespace Greenshot.Interop { break; } catch (InvalidComObjectException icoEx) { // Should assist BUG-1616 and others - LOG.WarnFormat("COM object {0} has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.", _InterceptType.FullName); + LOG.WarnFormat("COM object {0} has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.", _interceptType.FullName); return new ReturnMessage(icoEx, callMessage); } catch (Exception ex) { // Test for rejected @@ -703,13 +698,13 @@ namespace Greenshot.Interop { comEx = ex.InnerException as COMException; } if (comEx != null && (comEx.ErrorCode == RPC_E_CALL_REJECTED || comEx.ErrorCode == RPC_E_FAIL)) { - string destinationName = _TargetName; + string destinationName = _targetName; // Try to find a "catchy" name for the rejecting application if (destinationName != null && destinationName.Contains(".")) { - destinationName = destinationName.Substring(0, destinationName.IndexOf(".")); + destinationName = destinationName.Substring(0, destinationName.IndexOf(".", StringComparison.Ordinal)); } if (destinationName == null) { - destinationName = _InterceptType.FullName; + destinationName = _interceptType.FullName; } DialogResult result = MessageBox.Show(PluginUtils.Host.GreenshotForm, Language.GetFormattedString("com_rejected", destinationName), Language.GetString("com_rejected_title"), MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); if (result == DialogResult.OK) { @@ -726,7 +721,7 @@ namespace Greenshot.Interop { if (returnType.IsInterface) { // Wrap the returned value in an intercepting COM wrapper if (Marshal.IsComObject(returnValue)) { - returnValue = Wrap(returnValue, returnType, _TargetName); + returnValue = Wrap(returnValue, returnType, _targetName); } } else if (returnType.IsEnum) { // Convert to proper Enum type @@ -742,7 +737,7 @@ namespace Greenshot.Interop { continue; } - arg = args[i]; + var arg = args[i]; if (null == arg) { continue; } @@ -751,7 +746,7 @@ namespace Greenshot.Interop { wrapper = null; byValType = GetByValType(parameter.ParameterType); - if (typeof(Decimal) == byValType) { + if (typeof(decimal) == byValType) { if (arg is CurrencyWrapper) { arg = ((CurrencyWrapper)arg).WrappedObject; } @@ -766,7 +761,7 @@ namespace Greenshot.Interop { } if (null == wrapper) { - wrapper = new COMWrapper(arg, byValType, _TargetName); + wrapper = new COMWrapper(arg, byValType, _targetName); } arg = wrapper.GetTransparentProxy(); } @@ -787,7 +782,7 @@ namespace Greenshot.Interop { /// <param name="o">object to cast</param> /// <returns></returns> public bool CanCastTo(Type toType, object o) { - bool returnValue = _InterceptType.IsAssignableFrom(toType); + bool returnValue = _interceptType.IsAssignableFrom(toType); return returnValue; } diff --git a/GreenshotPlugin/Interop/ComProgIdAttribute.cs b/GreenshotPlugin/Interop/ComProgIdAttribute.cs index c2d9e1434..7a64b4814 100644 --- a/GreenshotPlugin/Interop/ComProgIdAttribute.cs +++ b/GreenshotPlugin/Interop/ComProgIdAttribute.cs @@ -26,7 +26,7 @@ namespace Greenshot.Interop { /// </summary> [AttributeUsage(AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] public sealed class ComProgIdAttribute : Attribute { - private string _value; + private readonly string _value; /// <summary> /// Extracts the attribute from the specified type. diff --git a/GreenshotPlugin/Interop/IAppVisibility.cs b/GreenshotPlugin/Interop/IAppVisibility.cs index edcfcf915..8eb267376 100644 --- a/GreenshotPlugin/Interop/IAppVisibility.cs +++ b/GreenshotPlugin/Interop/IAppVisibility.cs @@ -20,7 +20,6 @@ */ using System; using System.Runtime.InteropServices; -using Greenshot.Interop; namespace Greenshot.Interop { // This is used for Windows 8 to see if the App Launcher is active diff --git a/GreenshotPlugin/Properties/AssemblyInfo.cs b/GreenshotPlugin/Properties/AssemblyInfo.cs index f4e66e2f6..b28bc45ab 100644 --- a/GreenshotPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPlugin/Properties/AssemblyInfo.cs @@ -21,7 +21,6 @@ using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index 9a3fbbaf4..481c979e7 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -19,13 +19,15 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; +using System.Diagnostics.CodeAnalysis; namespace GreenshotPlugin.UnmanagedHelpers { /// <summary> /// Window Style Flags /// </summary> [Flags] - public enum WindowStyleFlags : long { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum WindowStyleFlags : long { //WS_OVERLAPPED = 0x00000000, WS_POPUP = 0x80000000, WS_CHILD = 0x40000000, @@ -76,7 +78,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { } [Flags] - public enum ExtendedWindowStyleFlags : uint { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum ExtendedWindowStyleFlags : uint { WS_EX_DLGMODALFRAME = 0x00000001, WS_EX_NOPARENTNOTIFY = 0x00000004, WS_EX_TOPMOST = 0x00000008, @@ -112,6 +115,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { } [Flags] + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum WindowPlacementFlags : uint { // The coordinates of the minimized window may be specified. // This flag must be specified if the coordinates are set in the ptMinPosition member. @@ -123,6 +127,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { WPF_RESTORETOMAXIMIZED = 0x0002 } + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum ShowWindowCommand : uint { /// <summary> /// Hides the window and activates another window. @@ -149,7 +154,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { ShowMaximized = 3, /// <summary> /// Displays a window in its most recent size and position. This value - /// is similar to <see cref="Win32.ShowWindowCommand.Normal"/>, except + /// is similar to <see cref="ShowWindowCommand.Normal"/>, except /// the window is not actived. /// </summary> ShowNoActivate = 4, @@ -164,13 +169,13 @@ namespace GreenshotPlugin.UnmanagedHelpers { Minimize = 6, /// <summary> /// Displays the window as a minimized window. This value is similar to - /// <see cref="Win32.ShowWindowCommand.ShowMinimized"/>, except the + /// <see cref="ShowWindowCommand.ShowMinimized"/>, except the /// window is not activated. /// </summary> ShowMinNoActive = 7, /// <summary> /// Displays the window in its current size and position. This value is - /// similar to <see cref="Win32.ShowWindowCommand.Show"/>, except the + /// similar to <see cref="ShowWindowCommand.Show"/>, except the /// window is not activated. /// </summary> ShowNA = 8, @@ -194,7 +199,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { ForceMinimize = 11 } - public enum SYSCOLOR : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum SYSCOLOR + { SCROLLBAR = 0, BACKGROUND = 1, DESKTOP = 1, @@ -234,7 +241,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// ai_productions@verizon.net or osirisgothra@hotmail.com /// Obtained on pinvoke.net, please contribute your code to support the wiki! /// </summary> - public enum SystemMetric : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum SystemMetric + { /// <summary> /// Width of the screen of the primary display monitor, in pixels. This is the same values obtained by calling GetDeviceCaps as follows: GetDeviceCaps( hdcPrimaryMonitor, HORZRES). /// </summary> @@ -612,7 +621,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// </summary> SM_REMOTECONTROL=0x2001 } - + + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum RegionResult { REGION_ERROR = 0, REGION_NULLREGION = 1, @@ -621,6 +631,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { } // See http://msdn.microsoft.com/en-us/library/aa969530(v=vs.85).aspx + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DWMWINDOWATTRIBUTE { DWMWA_NCRENDERING_ENABLED = 1, DWMWA_NCRENDERING_POLICY, @@ -639,7 +650,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { DWMWA_FREEZE_REPRESENTATION, // Since Windows 8 DWMWA_LAST } - + + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum GetWindowCommand : uint { GW_HWNDFIRST = 0, GW_HWNDLAST = 1, @@ -651,13 +663,16 @@ namespace GreenshotPlugin.UnmanagedHelpers { } [Flags] + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DWM_BB { Enable = 1, BlurRegion = 2, TransitionMaximized = 4 } - public enum ClassLongIndex : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum ClassLongIndex + { GCL_CBCLSEXTRA = -20, // the size, in bytes, of the extra memory associated with the class. Setting this value does not change the number of extra bytes already allocated. GCL_CBWNDEXTRA = -18, // the size, in bytes, of the extra window memory associated with each window in the class. Setting this value does not change the number of extra bytes already allocated. For information on how to access this memory, see SetWindowLong. GCL_HBRBACKGROUND = -10, // a handle to the background brush associated with the class. @@ -670,7 +685,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { GCL_WNDPROC = -24, // the address of the window procedure, or a handle representing the address of the window procedure. You must use the CallWindowProc function to call the window procedure. } - public enum WindowsMessages : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum WindowsMessages + { WM_NULL = 0x0000, WM_CREATE = 0x0001, WM_DESTROY = 0x0002, @@ -877,7 +894,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { } // Get/Set WindowLong Enum See: http://msdn.microsoft.com/en-us/library/ms633591.aspx - public enum WindowLongIndex : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum WindowLongIndex + { GWL_EXSTYLE = -20, // Sets a new extended window style. GWL_HINSTANCE = -6, // Sets a new application instance handle. GWL_ID = -12, // Sets a new identifier of the child window. The window cannot be a top-level window. @@ -888,7 +907,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { // See: http://msdn.microsoft.com/en-us/library/ms633545.aspx [Flags] - public enum WindowPos : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum WindowPos + { SWP_ASYNCWINDOWPOS = 0x4000, // If the calling thread and the thread that owns the window are attached to different input queues, the system posts the request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads process the request. SWP_DEFERERASE = 0x2000, // Prevents generation of the WM_SYNCPAINT message. SWP_DRAWFRAME = 0x0020, // Draws a frame (defined in the window's class description) around the window. @@ -906,13 +927,18 @@ namespace GreenshotPlugin.UnmanagedHelpers { SWP_SHOWWINDOW = 0x0040 //Displays the window. } - public enum ScrollBarDirection : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum ScrollBarDirection + { SB_HORZ = 0, SB_VERT = 1, SB_CTL = 2, SB_BOTH = 3 } - public enum ScrollbarCommand : int { + + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum ScrollbarCommand + { SB_LINEUP = 0, // Scrolls one line up. SB_LINEDOWN = 1, // Scrolls one line down. SB_PAGEUP = 2, // Scrolls one page up. @@ -924,6 +950,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { SB_ENDSCROLL = 8 // Ends scroll. } + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum ScrollInfoMask { SIF_RANGE = 0x1, SIF_PAGE = 0x2, @@ -937,6 +964,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// See: http://www.pinvoke.net/default.aspx/Enums/SendMessageTimeoutFlags.html /// </summary> [Flags] + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum SendMessageTimeoutFlags : uint { SMTO_NORMAL = 0x0, SMTO_BLOCK = 0x1, @@ -945,6 +973,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { } [Flags] + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum ProcessAccessFlags : uint { All = 0x001F0FFF, Terminate = 0x00000001, @@ -962,7 +991,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// See: http://msdn.microsoft.com/en-us/library/aa909766.aspx /// </summary> [Flags] - public enum SoundFlags : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum SoundFlags + { SND_SYNC = 0x0000, // play synchronously (default) SND_ASYNC = 0x0001, // play asynchronously SND_NODEFAULT = 0x0002, // silence (!default) if sound not found @@ -979,6 +1010,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// Used by GDI32.GetDeviceCaps /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877%28v=vs.85%29.aspx /// </summary> + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DeviceCaps { /// <summary> /// Device driver version @@ -1147,7 +1179,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// Used for User32.SetWinEventHook /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dd373640%28v=vs.85%29.aspx /// </summary> - public enum WinEventHookFlags : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum WinEventHookFlags + { WINEVENT_SKIPOWNTHREAD = 1, WINEVENT_SKIPOWNPROCESS = 2, WINEVENT_OUTOFCONTEXT = 0, @@ -1158,6 +1192,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// Used for User32.SetWinEventHook /// See MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd318066%28v=vs.85%29.aspx /// </summary> + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum WinEvent : uint { EVENT_OBJECT_ACCELERATORCHANGE = 32786, EVENT_OBJECT_CREATE = 32768, @@ -1207,7 +1242,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// Used for User32.SetWinEventHook /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dd373606%28v=vs.85%29.aspx#OBJID_WINDOW /// </summary> - public enum EventObjects : int { + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum EventObjects + { OBJID_ALERT = -10, OBJID_CARET = -8, OBJID_CLIENT = -4, @@ -1223,6 +1260,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { } [Flags] + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DesktopAccessRight : uint { DESKTOP_READOBJECTS = 0x00000001, DESKTOP_CREATEWINDOW = 0x00000002, diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index f3e2aff3e..dd4c9d604 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -53,7 +53,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// <param name="graphics"></param> /// <returns>SafeDeviceContextHandle</returns> public static SafeDeviceContextHandle GetSafeDeviceContext(this Graphics graphics) { - return SafeDeviceContextHandle.fromGraphics(graphics); + return SafeDeviceContextHandle.FromGraphics(graphics); } } @@ -77,10 +77,6 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A hbitmap SafeHandle implementation /// </summary> public class SafeHBitmapHandle : SafeObjectHandle { - [SecurityCritical] - private SafeHBitmapHandle() : base(true) { - } - [SecurityCritical] public SafeHBitmapHandle(IntPtr preexistingHandle) : base(true) { SetHandle(preexistingHandle); @@ -105,10 +101,6 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A dibsection SafeHandle implementation /// </summary> public class SafeDibSectionHandle : SafeObjectHandle { - [SecurityCritical] - private SafeDibSectionHandle() : base(true) { - } - [SecurityCritical] public SafeDibSectionHandle(IntPtr preexistingHandle) : base(true) { SetHandle(preexistingHandle); @@ -123,20 +115,16 @@ namespace GreenshotPlugin.UnmanagedHelpers { [DllImport("gdi32", SetLastError = true)] private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); - private SafeHandle hdc; - - [SecurityCritical] - private SafeSelectObjectHandle() : base(true) { - } + private readonly SafeHandle _hdc; [SecurityCritical] public SafeSelectObjectHandle(SafeDCHandle hdc, SafeHandle newHandle) : base(true) { - this.hdc = hdc; + _hdc = hdc; SetHandle(SelectObject(hdc.DangerousGetHandle(), newHandle.DangerousGetHandle())); } protected override bool ReleaseHandle() { - SelectObject(hdc.DangerousGetHandle(), handle); + SelectObject(_hdc.DangerousGetHandle(), handle); return true; } } @@ -153,10 +141,6 @@ namespace GreenshotPlugin.UnmanagedHelpers { [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DeleteDC(IntPtr hDC); - [SecurityCritical] - private SafeCompatibleDCHandle() : base(true) { - } - [SecurityCritical] public SafeCompatibleDCHandle(IntPtr preexistingHandle) : base(true) { SetHandle(preexistingHandle); @@ -175,20 +159,16 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A DeviceContext SafeHandle implementation /// </summary> public class SafeDeviceContextHandle : SafeDCHandle { - private Graphics graphics = null; - - [SecurityCritical] - private SafeDeviceContextHandle() : base(true) { - } + private readonly Graphics _graphics; [SecurityCritical] public SafeDeviceContextHandle(Graphics graphics, IntPtr preexistingHandle) : base(true) { - this.graphics = graphics; + _graphics = graphics; SetHandle(preexistingHandle); } protected override bool ReleaseHandle() { - graphics.ReleaseHdc(handle); + _graphics.ReleaseHdc(handle); return true; } @@ -196,7 +176,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { return new SafeSelectObjectHandle(this, newHandle); } - public static SafeDeviceContextHandle fromGraphics(Graphics graphics) { + public static SafeDeviceContextHandle FromGraphics(Graphics graphics) { return new SafeDeviceContextHandle(graphics, graphics.GetHdc()); } } @@ -221,41 +201,6 @@ namespace GreenshotPlugin.UnmanagedHelpers { public static extern uint GetPixel(SafeHandle hdc, int nXPos, int nYPos); [DllImport("gdi32", SetLastError=true)] public static extern int GetDeviceCaps(SafeHandle hdc, DeviceCaps nIndex); - - /// <summary> - /// StretchBlt extension for the graphics object - /// Doesn't work? - /// </summary> - /// <param name="target"></param> - /// <param name="source"></param> - public static void StretchBlt(this Graphics target, Bitmap sourceBitmap, Rectangle source, Rectangle destination) { - using (SafeDeviceContextHandle targetDC = target.GetSafeDeviceContext()) { - using (SafeCompatibleDCHandle safeCompatibleDCHandle = CreateCompatibleDC(targetDC)) { - using (SafeHBitmapHandle hBitmapHandle = new SafeHBitmapHandle(sourceBitmap.GetHbitmap())) { - using (safeCompatibleDCHandle.SelectObject(hBitmapHandle)) { - StretchBlt(targetDC, destination.X, destination.Y, destination.Width, destination.Height, safeCompatibleDCHandle, source.Left, source.Top, source.Width, source.Height, CopyPixelOperation.SourceCopy); - } - } - } - } - } - - /// <summary> - /// Bitblt extension for the graphics object - /// </summary> - /// <param name="target"></param> - /// <param name="source"></param> - public static void BitBlt(this Graphics target, Bitmap sourceBitmap, Rectangle source, Point destination, CopyPixelOperation rop) { - using (SafeDeviceContextHandle targetDC = target.GetSafeDeviceContext()) { - using (SafeCompatibleDCHandle safeCompatibleDCHandle = CreateCompatibleDC(targetDC)) { - using (SafeHBitmapHandle hBitmapHandle = new SafeHBitmapHandle(sourceBitmap.GetHbitmap())) { - using (safeCompatibleDCHandle.SelectObject(hBitmapHandle)) { - BitBlt(targetDC, destination.X, destination.Y, source.Width, source.Height, safeCompatibleDCHandle, source.Left, source.Top, rop); - } - } - } - } - } } [StructLayout(LayoutKind.Sequential, Pack = 2)] @@ -380,10 +325,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { bV5BlueMask = (uint)255; bV5AlphaMask = (uint)255 << 24; bV5CSType = 1934772034; // sRGB - bV5Endpoints = new CIEXYZTRIPLE(); - bV5Endpoints.ciexyzBlue = new CIEXYZ(0); - bV5Endpoints.ciexyzGreen = new CIEXYZ(0); - bV5Endpoints.ciexyzRed = new CIEXYZ(0); + bV5Endpoints = new CIEXYZTRIPLE + { + ciexyzBlue = new CIEXYZ(0), + ciexyzGreen = new CIEXYZ(0), + ciexyzRed = new CIEXYZ(0) + }; bV5GammaRed = 0; bV5GammaGreen = 0; bV5GammaBlue = 0; diff --git a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs index dd446b425..ba0c86156 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs @@ -21,9 +21,7 @@ using System; using System.Drawing; using System.Runtime.InteropServices; -using System.Security; using log4net; -using Microsoft.Win32.SafeHandles; using System.Reflection; using System.Drawing.Drawing2D; using System.Drawing.Imaging; @@ -94,7 +92,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// GDIplus Helpers /// </summary> public static class GDIplus { - private static ILog LOG = LogManager.GetLogger(typeof(GDIplus)); + private static readonly ILog LOG = LogManager.GetLogger(typeof(GDIplus)); [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] private static extern int GdipBitmapApplyEffect(IntPtr bitmap, IntPtr effect, ref RECT rectOfInterest, bool useAuxData, IntPtr auxData, int auxDataSize); @@ -107,7 +105,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { private static extern int GdipCreateEffect(Guid guid, out IntPtr effect); [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] private static extern int GdipDeleteEffect(IntPtr effect); - private static Guid BlurEffectGuid = new Guid("{633C80A4-1843-482B-9EF2-BE2834C5FDD4}"); + private static readonly Guid BlurEffectGuid = new Guid("{633C80A4-1843-482B-9EF2-BE2834C5FDD4}"); // Constant "FieldInfo" for getting the nativeImage from the Bitmap private static readonly FieldInfo FIELD_INFO_NATIVE_IMAGE = typeof(Bitmap).GetField("nativeImage", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); @@ -118,7 +116,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { // Constant "FieldInfo" for getting the nativeImageAttributes from the ImageAttributes private static readonly FieldInfo FIELD_INFO_NATIVE_IMAGEATTRIBUTES = typeof(ImageAttributes).GetField("nativeImageAttributes", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); - private static bool isBlurEnabled = Environment.OSVersion.Version.Major >= 6; + private static bool _isBlurEnabled = Environment.OSVersion.Version.Major >= 6; /// <summary> /// Get the nativeImage field from the bitmap /// </summary> @@ -173,10 +171,11 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// </summary> /// <param name="radius"></param> /// <returns></returns> - public static bool isBlurPossible(int radius) { - if (!isBlurEnabled) { + public static bool IsBlurPossible(int radius) { + if (!_isBlurEnabled) { return false; - } else if (Environment.OSVersion.Version.Minor >= 2 && radius < 20) { + } + if (Environment.OSVersion.Version.Minor >= 2 && radius < 20) { return false; } return true; @@ -191,7 +190,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// <param name="expandEdges">bool true if the edges are expanded with the radius</param> /// <returns>false if there is no GDI+ available or an exception occured</returns> public static bool ApplyBlur(Bitmap destinationBitmap, Rectangle area, int radius, bool expandEdges) { - if (!isBlurPossible(radius)) { + if (!IsBlurPossible(radius)) { return false; } IntPtr hBlurParams = IntPtr.Zero; @@ -226,7 +225,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { // Everything worked, return true return true; } catch (Exception ex) { - isBlurEnabled = false; + _isBlurEnabled = false; LOG.Error("Problem using GdipBitmapApplyEffect: ", ex); return false; } finally { @@ -240,7 +239,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { Marshal.FreeHGlobal(hBlurParams); } } catch (Exception ex) { - isBlurEnabled = false; + _isBlurEnabled = false; LOG.Error("Problem cleaning up ApplyBlur: ", ex); } } @@ -251,7 +250,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// </summary> /// <returns>false if there is no GDI+ available or an exception occured</returns> public static bool DrawWithBlur(Graphics graphics, Bitmap image, Rectangle source, Matrix transform, ImageAttributes imageAttributes, int radius, bool expandEdges) { - if (!isBlurPossible(radius)) { + if (!IsBlurPossible(radius)) { return false; } @@ -291,7 +290,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { // Everything worked, return true return true; } catch (Exception ex) { - isBlurEnabled = false; + _isBlurEnabled = false; LOG.Error("Problem using GdipDrawImageFX: ", ex); return false; } finally { @@ -305,7 +304,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { Marshal.FreeHGlobal(hBlurParams); } } catch (Exception ex) { - isBlurEnabled = false; + _isBlurEnabled = false; LOG.Error("Problem cleaning up DrawWithBlur: ", ex); } } diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index e74d38310..4da73b482 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -37,39 +37,16 @@ namespace GreenshotPlugin.UnmanagedHelpers { private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); #region Structs - [StructLayout(LayoutKind.Sequential)] - private struct SHITEMID { - public ushort cb; - [MarshalAs(UnmanagedType.LPArray)] - public byte[] abID; - } - [StructLayout(LayoutKind.Sequential)] - private struct ITEMIDLIST { - public SHITEMID mkid; - } - - [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] - private struct BROWSEINFO { - public IntPtr hwndOwner; - public IntPtr pidlRoot; - public IntPtr pszDisplayName; - [MarshalAs(UnmanagedType.LPWStr)] - public string lpszTitle; - public uint ulFlags; - public IntPtr lpfn; - public int lParam; - public IntPtr iImage; - } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] private struct SHFILEINFO { - public IntPtr hIcon; - public int iIcon; - public uint dwAttributes; + public readonly IntPtr hIcon; + public readonly int iIcon; + public readonly uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] - public string szDisplayName; + public readonly string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] - public string szTypeName; + public readonly string szTypeName; }; #endregion @@ -146,27 +123,27 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// Returns an icon for a given file extension - indicated by the name parameter. /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179(v=vs.85).aspx /// </summary> - /// <param name="name">Filename</param> + /// <param name="filename">Filename</param> /// <param name="size">Large or small</param> /// <param name="linkOverlay">Whether to include the link icon</param> /// <returns>System.Drawing.Icon</returns> public static Icon GetFileIcon(string filename, IconSize size, bool linkOverlay) { SHFILEINFO shfi = new SHFILEINFO(); // SHGFI_USEFILEATTRIBUTES makes it simulate, just gets the icon for the extension - uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES; + uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES; - if (true == linkOverlay) { - flags += Shell32.SHGFI_LINKOVERLAY; + if (linkOverlay) { + flags += SHGFI_LINKOVERLAY; } // Check the size specified for return. if (IconSize.Small == size) { - flags += Shell32.SHGFI_SMALLICON; + flags += SHGFI_SMALLICON; } else { - flags += Shell32.SHGFI_LARGEICON; + flags += SHGFI_LARGEICON; } - SHGetFileInfo(Path.GetFileName(filename), Shell32.FILE_ATTRIBUTE_NORMAL, ref shfi, (uint)Marshal.SizeOf(shfi), flags); + SHGetFileInfo(Path.GetFileName(filename), FILE_ATTRIBUTE_NORMAL, ref shfi, (uint)Marshal.SizeOf(shfi), flags); // Only return an icon if we really got one if (shfi.hIcon != IntPtr.Zero) { diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index b3335a204..ef85d5994 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -63,7 +63,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { #region DllImports [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - public extern static bool IsWindowVisible(IntPtr hWnd); + public static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32", SetLastError = true)] public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId); [DllImport("user32", SetLastError = true)] @@ -75,9 +75,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { [DllImport("user32", SetLastError = true)] public static extern int ShowWindow(IntPtr hWnd, ShowWindowCommand nCmdShow); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public extern static int GetWindowText(IntPtr hWnd, StringBuilder lpString, int cch); + public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int cch); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public extern static int GetWindowTextLength(IntPtr hWnd); + public static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("user32", SetLastError = true)] public static extern uint GetSysColor(int nIndex); [DllImport("user32", SetLastError = true)] @@ -98,13 +98,13 @@ namespace GreenshotPlugin.UnmanagedHelpers { public static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref WindowPlacement lpwndpl); [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - public extern static bool IsIconic(IntPtr hWnd); + public static extern bool IsIconic(IntPtr hWnd); [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - public extern static bool IsZoomed(IntPtr hwnd); - [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public extern static int GetClassName (IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + public static extern bool IsZoomed(IntPtr hwnd); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern int GetClassName (IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + [DllImport("user32", SetLastError = true)] public static extern uint GetClassLong(IntPtr hWnd, int nIndex); [DllImport("user32", SetLastError = true, EntryPoint = "GetClassLongPtr")] public static extern IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex); @@ -112,13 +112,13 @@ namespace GreenshotPlugin.UnmanagedHelpers { [return: MarshalAs(UnmanagedType.Bool)] public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags); [DllImport("user32", CharSet=CharSet.Unicode, SetLastError=true)] - public extern static IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); + public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); [DllImport("user32", SetLastError = true)] - public extern static IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); + public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); [DllImport("user32", SetLastError = true, EntryPoint = "GetWindowLong")] - public extern static int GetWindowLong(IntPtr hwnd, int index); + public static extern int GetWindowLong(IntPtr hwnd, int index); [DllImport("user32", SetLastError = true, EntryPoint = "GetWindowLongPtr")] - public extern static IntPtr GetWindowLongPtr(IntPtr hwnd, int nIndex); + public static extern IntPtr GetWindowLongPtr(IntPtr hwnd, int nIndex); [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int SetWindowLong(IntPtr hWnd, int index, int styleFlags); [DllImport("user32", SetLastError = true, EntryPoint = "SetWindowLongPtr")] @@ -131,9 +131,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowInfo(IntPtr hwnd, ref WindowInfo pwi); [DllImport("user32", SetLastError = true)] - public extern static int EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); + public static extern int EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32", SetLastError = true)] - public extern static int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); + public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi); @@ -187,7 +187,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)] public static extern uint RegisterWindowMessage(string lpString); [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags fuFlags, uint uTimeout, out UIntPtr lpdwResult); + public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags fuFlags, uint uTimeout, out UIntPtr lpdwResult); [DllImport("user32", SetLastError = true)] private static extern bool GetPhysicalCursorPos(out POINT cursorLocation); [DllImport("user32", SetLastError=true)] @@ -359,9 +359,6 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A SafeHandle class implementation for the hIcon /// </summary> public class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid { - private SafeIconHandle() : base(true) { - } - public SafeIconHandle(IntPtr hIcon) : base(true) { SetHandle(hIcon); } @@ -381,24 +378,21 @@ namespace GreenshotPlugin.UnmanagedHelpers { [DllImport("user32", SetLastError = true)] private static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC); - private IntPtr hWnd; - [SecurityCritical] - private SafeWindowDCHandle() : base(true) { - } + private readonly IntPtr _hWnd; [SecurityCritical] public SafeWindowDCHandle(IntPtr hWnd, IntPtr preexistingHandle) : base(true) { - this.hWnd = hWnd; + _hWnd = hWnd; SetHandle(preexistingHandle); } [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode=true)] protected override bool ReleaseHandle() { - bool returnValue = ReleaseDC(hWnd, handle); + bool returnValue = ReleaseDC(_hWnd, handle); return returnValue; } - public static SafeWindowDCHandle fromDesktop() { + public static SafeWindowDCHandle FromDesktop() { IntPtr hWndDesktop = User32.GetDesktopWindow(); IntPtr hDCDesktop = GetWindowDC(hWndDesktop); return new SafeWindowDCHandle(hWndDesktop, hDCDesktop); From 0fa6224ea6325e05280d866c156deb2227abb21e Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 26 Apr 2016 20:44:47 +0200 Subject: [PATCH 024/170] BUG-1941: Fixed a NullReferenceException, which is the issue itself. Don't know if it was caused by a different problem. --- Greenshot/Drawing/TextContainer.cs | 38 ++++++++++++++++++------------ 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index f02ecbf39..6c58e2683 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -22,7 +22,6 @@ using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Memento; -using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using System; using System.ComponentModel; @@ -72,7 +71,7 @@ namespace Greenshot.Drawing { } internal void ChangeText(string newText, bool allowUndoable) { - if ((text == null && newText != null) || !text.Equals(newText)) { + if ((text == null && newText != null) || !string.Equals(text, newText)) { if (makeUndoable && allowUndoable) { makeUndoable = false; _parent.MakeUndoable(new TextChangeMemento(this), false); @@ -123,8 +122,10 @@ namespace Greenshot.Drawing { } private void Init() { - _stringFormat = new StringFormat(); - _stringFormat.Trimming = StringTrimming.EllipsisWord; + _stringFormat = new StringFormat + { + Trimming = StringTrimming.EllipsisWord + }; CreateTextBox(); @@ -178,15 +179,18 @@ namespace Greenshot.Drawing { } // Only dispose the font, and re-create it, when a font field has changed. if (e.Field.FieldType.Name.StartsWith("FONT")) { - _font.Dispose(); - _font = null; + if (_font != null) + { + _font.Dispose(); + _font = null; + } UpdateFormat(); } else { UpdateAlignment(); } UpdateTextBoxFormat(); - if (_textBox.Visible) { + if (_textBox != null && _textBox.Visible) { _textBox.Invalidate(); } } @@ -196,17 +200,19 @@ namespace Greenshot.Drawing { } private void CreateTextBox() { - _textBox = new TextBox(); + _textBox = new TextBox + { + ImeMode = ImeMode.On, + Multiline = true, + AcceptsTab = true, + AcceptsReturn = true, + BorderStyle = BorderStyle.None, + Visible = false + }; - _textBox.ImeMode = ImeMode.On; - _textBox.Multiline = true; - _textBox.AcceptsTab = true; - _textBox.AcceptsReturn = true; _textBox.DataBindings.Add("Text", this, "Text", false, DataSourceUpdateMode.OnPropertyChanged); _textBox.LostFocus += textBox_LostFocus; _textBox.KeyDown += textBox_KeyDown; - _textBox.BorderStyle = BorderStyle.None; - _textBox.Visible = false; } private void ShowTextBox() { @@ -294,6 +300,7 @@ namespace Greenshot.Drawing { } } } + _font?.Dispose(); _font = new Font(fam, fontSize, fs, GraphicsUnit.Pixel); _textBox.Font = _font; } @@ -390,7 +397,7 @@ namespace Greenshot.Drawing { DrawSelectionBorder(graphics, rect); } - if (text == null || text.Length == 0 ) { + if (string.IsNullOrEmpty(text) ) { return; } @@ -411,6 +418,7 @@ namespace Greenshot.Drawing { /// <param name="drawingRectange"></param> /// <param name="lineThickness"></param> /// <param name="fontColor"></param> + /// <param name="drawShadow"></param> /// <param name="stringFormat"></param> /// <param name="text"></param> /// <param name="font"></param> From 066ea19568e25696298e34d1d60cc251e95f1c53 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 26 Apr 2016 21:21:00 +0200 Subject: [PATCH 025/170] BUG-1945: Fixed a problem during startup, where Greenshot can't specify the ServerCertificateValidationCallback which is needed to ignore SSL errors. --- GreenshotPlugin/Core/NetworkHelper.cs | 133 +++++++++++++------------- 1 file changed, 69 insertions(+), 64 deletions(-) diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 5a9ec8877..de8ff9204 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -52,11 +52,17 @@ namespace GreenshotPlugin.Core { private static readonly CoreConfiguration Config = IniConfig.GetIniSection<CoreConfiguration>(); static NetworkHelper() { - // Disable certificate checking - ServicePointManager.ServerCertificateValidationCallback += - delegate { - return true; - }; + try + { + // Disable certificate checking + ServicePointManager.ServerCertificateValidationCallback += delegate { + return true; + }; + } + catch (Exception ex) + { + LOG.Warn("An error has occured while allowing self-signed certificates:", ex); + } } /// <summary> @@ -137,12 +143,18 @@ namespace GreenshotPlugin.Core { using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8, true)) { content = streamReader.ReadLine(); } - Regex imageUrlRegex = new Regex(@"(http|https)://.*(\.png|\.gif|\.jpg|\.tiff|\.jpeg|\.bmp)"); - Match match = imageUrlRegex.Match(content); - if (match.Success) { - using (MemoryStream memoryStream2 = GetAsMemoryStream(match.Value)) { - using (Image image = Image.FromStream(memoryStream2)) { - return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + if (!string.IsNullOrEmpty(content)) + { + Regex imageUrlRegex = new Regex(@"(http|https)://.*(\.png|\.gif|\.jpg|\.tiff|\.jpeg|\.bmp)"); + Match match = imageUrlRegex.Match(content); + if (match.Success) + { + using (MemoryStream memoryStream2 = GetAsMemoryStream(match.Value)) + { + using (Image image = Image.FromStream(memoryStream2)) + { + return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + } } } } @@ -193,12 +205,7 @@ namespace GreenshotPlugin.Core { /// <returns>WebRequest</returns> public static HttpWebRequest CreateWebRequest(Uri uri) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri); - if (Config.UseProxy) { - webRequest.Proxy = CreateProxy(uri); - } else { - // BUG-1655: Fix that Greenshot always uses the default proxy even if the "use default proxy" checkbox is unset - webRequest.Proxy = null; - } + webRequest.Proxy = Config.UseProxy ? CreateProxy(uri) : null; // Make sure the default credentials are available webRequest.Credentials = CredentialCache.DefaultCredentials; @@ -396,9 +403,10 @@ namespace GreenshotPlugin.Core { /// Post the parameters "x-www-form-urlencoded" /// </summary> /// <param name="webRequest"></param> + /// <param name="parameters"></param> public static void UploadFormUrlEncoded(HttpWebRequest webRequest, IDictionary<string, object> parameters) { webRequest.ContentType = "application/x-www-form-urlencoded"; - string urlEncoded = NetworkHelper.GenerateQueryParameters(parameters); + string urlEncoded = GenerateQueryParameters(parameters); byte[] data = Encoding.UTF8.GetBytes(urlEncoded); using (var requestStream = webRequest.GetRequestStream()) { @@ -460,6 +468,7 @@ namespace GreenshotPlugin.Core { /// /// </summary> /// <param name="webRequest"></param> + /// <param name="alsoReturnContentOnError"></param> /// <returns></returns> public static string GetResponseAsString(HttpWebRequest webRequest, bool alsoReturnContentOnError) { string responseData = null; @@ -552,10 +561,10 @@ namespace GreenshotPlugin.Core { /// A container to supply files to a Multi-part form data upload /// </summary> public class ByteContainer : IBinaryContainer { - private readonly byte[] file; - private readonly string fileName; - private readonly string contentType; - private readonly int fileSize; + private readonly byte[] _file; + private readonly string _fileName; + private readonly string _contentType; + private readonly int _fileSize; public ByteContainer(byte[] file) : this(file, null) { } public ByteContainer(byte[] file, string filename) : this(file, filename, null) { @@ -563,14 +572,10 @@ namespace GreenshotPlugin.Core { public ByteContainer(byte[] file, string filename, string contenttype) : this(file, filename, contenttype, 0) { } public ByteContainer(byte[] file, string filename, string contenttype, int filesize) { - this.file = file; - fileName = filename; - contentType = contenttype; - if (filesize == 0) { - fileSize = file.Length; - } else { - fileSize = filesize; - } + _file = file; + _fileName = filename; + _contentType = contenttype; + _fileSize = filesize == 0 ? file.Length : filesize; } /// <summary> @@ -578,7 +583,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <returns>string</returns> public string ToBase64String(Base64FormattingOptions formattingOptions) { - return Convert.ToBase64String(file, 0, fileSize, formattingOptions); + return Convert.ToBase64String(_file, 0, _fileSize, formattingOptions); } /// <summary> @@ -586,7 +591,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <returns>byte[]</returns> public byte[] ToByteArray() { - return file; + return _file; } /// <summary> @@ -600,13 +605,13 @@ namespace GreenshotPlugin.Core { string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", boundary, name, - fileName ?? name, - contentType ?? "application/octet-stream"); + _fileName ?? name, + _contentType ?? "application/octet-stream"); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); // Write the file data directly to the Stream, rather than serializing it to a string. - formDataStream.Write(file, 0, fileSize); + formDataStream.Write(_file, 0, _fileSize); } /// <summary> @@ -615,7 +620,7 @@ namespace GreenshotPlugin.Core { /// <param name="dataStream">Stream to write to</param> public void WriteToStream(Stream dataStream) { // Write the file data directly to the Stream, rather than serializing it to a string. - dataStream.Write(file, 0, fileSize); + dataStream.Write(_file, 0, _fileSize); } /// <summary> @@ -623,8 +628,8 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="webRequest"></param> public void Upload(HttpWebRequest webRequest) { - webRequest.ContentType = contentType; - webRequest.ContentLength = fileSize; + webRequest.ContentType = _contentType; + webRequest.ContentLength = _fileSize; using (var requestStream = webRequest.GetRequestStream()) { WriteToStream(requestStream); } @@ -635,14 +640,14 @@ namespace GreenshotPlugin.Core { /// A container to supply images to a Multi-part form data upload /// </summary> public class BitmapContainer : IBinaryContainer { - private readonly Bitmap bitmap; - private readonly SurfaceOutputSettings outputSettings; - private readonly string fileName; + private readonly Bitmap _bitmap; + private readonly SurfaceOutputSettings _outputSettings; + private readonly string _fileName; public BitmapContainer(Bitmap bitmap, SurfaceOutputSettings outputSettings, string filename) { - this.bitmap = bitmap; - this.outputSettings = outputSettings; - fileName = filename; + _bitmap = bitmap; + _outputSettings = outputSettings; + _fileName = filename; } /// <summary> @@ -652,7 +657,7 @@ namespace GreenshotPlugin.Core { /// <returns>string</returns> public string ToBase64String(Base64FormattingOptions formattingOptions) { using (MemoryStream stream = new MemoryStream()) { - ImageOutput.SaveToStream(bitmap, null, stream, outputSettings); + ImageOutput.SaveToStream(_bitmap, null, stream, _outputSettings); return Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length, formattingOptions); } } @@ -664,7 +669,7 @@ namespace GreenshotPlugin.Core { /// <returns>byte[]</returns> public byte[] ToByteArray() { using (MemoryStream stream = new MemoryStream()) { - ImageOutput.SaveToStream(bitmap, null, stream, outputSettings); + ImageOutput.SaveToStream(_bitmap, null, stream, _outputSettings); return stream.ToArray(); } } @@ -680,11 +685,11 @@ namespace GreenshotPlugin.Core { string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", boundary, name, - fileName ?? name, - "image/" + outputSettings.Format.ToString()); + _fileName ?? name, + "image/" + _outputSettings.Format); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); - ImageOutput.SaveToStream(bitmap, null, formDataStream, outputSettings); + ImageOutput.SaveToStream(_bitmap, null, formDataStream, _outputSettings); } /// <summary> @@ -693,7 +698,7 @@ namespace GreenshotPlugin.Core { /// <param name="dataStream"></param> public void WriteToStream(Stream dataStream) { // Write the file data directly to the Stream, rather than serializing it to a string. - ImageOutput.SaveToStream(bitmap, null, dataStream, outputSettings); + ImageOutput.SaveToStream(_bitmap, null, dataStream, _outputSettings); } /// <summary> @@ -701,7 +706,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="webRequest"></param> public void Upload(HttpWebRequest webRequest) { - webRequest.ContentType = "image/" + outputSettings.Format.ToString(); + webRequest.ContentType = "image/" + _outputSettings.Format; using (var requestStream = webRequest.GetRequestStream()) { WriteToStream(requestStream); } @@ -712,14 +717,14 @@ namespace GreenshotPlugin.Core { /// A container to supply surfaces to a Multi-part form data upload /// </summary> public class SurfaceContainer : IBinaryContainer { - private readonly ISurface surface; - private readonly SurfaceOutputSettings outputSettings; - private readonly string fileName; + private readonly ISurface _surface; + private readonly SurfaceOutputSettings _outputSettings; + private readonly string _fileName; public SurfaceContainer(ISurface surface, SurfaceOutputSettings outputSettings, string filename) { - this.surface = surface; - this.outputSettings = outputSettings; - fileName = filename; + _surface = surface; + _outputSettings = outputSettings; + _fileName = filename; } /// <summary> @@ -729,7 +734,7 @@ namespace GreenshotPlugin.Core { /// <returns>string</returns> public string ToBase64String(Base64FormattingOptions formattingOptions) { using (MemoryStream stream = new MemoryStream()) { - ImageOutput.SaveToStream(surface, stream, outputSettings); + ImageOutput.SaveToStream(_surface, stream, _outputSettings); return Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length, formattingOptions); } } @@ -741,7 +746,7 @@ namespace GreenshotPlugin.Core { /// <returns>byte[]</returns> public byte[] ToByteArray() { using (MemoryStream stream = new MemoryStream()) { - ImageOutput.SaveToStream(surface, stream, outputSettings); + ImageOutput.SaveToStream(_surface, stream, _outputSettings); return stream.ToArray(); } } @@ -757,11 +762,11 @@ namespace GreenshotPlugin.Core { string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", boundary, name, - fileName ?? name, - "image/" + outputSettings.Format); + _fileName ?? name, + "image/" + _outputSettings.Format); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); - ImageOutput.SaveToStream(surface, formDataStream, outputSettings); + ImageOutput.SaveToStream(_surface, formDataStream, _outputSettings); } /// <summary> @@ -770,7 +775,7 @@ namespace GreenshotPlugin.Core { /// <param name="dataStream"></param> public void WriteToStream(Stream dataStream) { // Write the file data directly to the Stream, rather than serializing it to a string. - ImageOutput.SaveToStream(surface, dataStream, outputSettings); + ImageOutput.SaveToStream(_surface, dataStream, _outputSettings); } /// <summary> @@ -778,7 +783,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="webRequest"></param> public void Upload(HttpWebRequest webRequest) { - webRequest.ContentType = "image/" + outputSettings.Format.ToString(); + webRequest.ContentType = "image/" + _outputSettings.Format.ToString(); using (var requestStream = webRequest.GetRequestStream()) { WriteToStream(requestStream); } From e781bdcd5c90946087ba0b3d580419ba0674a6d0 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 26 Apr 2016 23:12:45 +0200 Subject: [PATCH 026/170] BUG-1949: Fixed imgur issues, especially the delete. --- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 - GreenshotImgurPlugin/ImgurInfo.cs | 70 ++++++++++++++-------- GreenshotImgurPlugin/ImgurUtils.cs | 55 ++++++++++------- 3 files changed, 79 insertions(+), 48 deletions(-) diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 104839352..5392ec265 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -32,8 +32,6 @@ namespace GreenshotImgurPlugin { /// </summary> [IniSection("Imgur", Description="Greenshot Imgur Plugin configuration")] public class ImgurConfiguration : IniSection { - [IniProperty("ImgurApiUrl", Description="Url to Imgur system.", DefaultValue= "http://api.imgur.com/2")] - public string ImgurApiUrl; [IniProperty("ImgurApi3Url", Description = "Url to Imgur system.", DefaultValue = "https://api.imgur.com/3")] public string ImgurApi3Url; diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index 37e5a3ce8..c43903c04 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -27,7 +27,8 @@ namespace GreenshotImgurPlugin /// <summary> /// Description of ImgurInfo. /// </summary> - public class ImgurInfo : IDisposable { + public class ImgurInfo : IDisposable + { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurInfo)); public string Hash @@ -37,9 +38,11 @@ namespace GreenshotImgurPlugin } private string deleteHash; - public string DeleteHash { - get {return deleteHash;} - set { + public string DeleteHash + { + get { return deleteHash; } + set + { deleteHash = value; DeletePage = "https://imgur.com/delete/" + value; } @@ -94,24 +97,29 @@ namespace GreenshotImgurPlugin } private Image image; - public Image Image { - get {return image;} - set { - if (image != null) { + public Image Image + { + get { return image; } + set + { + if (image != null) + { image.Dispose(); } image = value; } } - public ImgurInfo() { + public ImgurInfo() + { } /// <summary> /// The public accessible Dispose /// Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice /// </summary> - public void Dispose() { + public void Dispose() + { Dispose(true); GC.SuppressFinalize(this); } @@ -121,15 +129,19 @@ namespace GreenshotImgurPlugin /// When disposing==true all non-managed resources should be freed too! /// </summary> /// <param name="disposing"></param> - protected virtual void Dispose(bool disposing) { - if (disposing) { - if (image != null) { + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (image != null) + { image.Dispose(); } } image = null; } - public static ImgurInfo ParseResponse(string response) { + public static ImgurInfo ParseResponse(string response) + { LOG.Debug(response); // This is actually a hack for BUG-1695 // The problem is the (C) sign, we send it HTML encoded "®" to Imgur and get it HTML encoded in the XML back @@ -142,11 +154,13 @@ namespace GreenshotImgurPlugin response = response.Replace("®", "®"); ImgurInfo imgurInfo = new ImgurInfo(); - try { + try + { XmlDocument doc = new XmlDocument(); doc.LoadXml(response); XmlNodeList nodes = doc.GetElementsByTagName("id"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.Hash = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("hash"); @@ -155,19 +169,23 @@ namespace GreenshotImgurPlugin imgurInfo.Hash = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("deletehash"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.DeleteHash = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("type"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.ImageType = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("title"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.Title = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("datetime"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { // Version 3 has seconds since Epoch double secondsSince; if (double.TryParse(nodes.Item(0).InnerText, out secondsSince)) @@ -198,15 +216,17 @@ namespace GreenshotImgurPlugin imgurInfo.Page = string.Format("https://imgur.com/{0}", imgurInfo.Hash); } nodes = doc.GetElementsByTagName("small_square"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.SmallSquare = nodes.Item(0).InnerText; } - nodes = doc.GetElementsByTagName("large_thumbnail"); - if(nodes.Count > 0) + else { - imgurInfo.LargeThumbnail = nodes.Item(0).InnerText.Replace("http:", "https:"); + imgurInfo.SmallSquare = string.Format("http://i.imgur.com/{0}s.png",imgurInfo.Hash); } - } catch(Exception e) { + } + catch (Exception e) + { LOG.ErrorFormat("Could not parse Imgur response due to error {0}, response was: {1}", e.Message, response); } return imgurInfo; diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index 3bb80e0f8..0e426157d 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -119,7 +119,7 @@ namespace GreenshotImgurPlugin { if (filename != null && Config.AddFilename) { otherParameters.Add("name", filename); } - string responseString; + string responseString = null; if (Config.AnonymousAccess) { // add key, we only use the other parameters for the AnonymousAccess //otherParameters.Add("key", IMGUR_ANONYMOUS_API_KEY); @@ -133,11 +133,17 @@ namespace GreenshotImgurPlugin { ImageOutput.SaveToStream(surfaceToUpload, requestStream, outputSettings); } - using (WebResponse response = webRequest.GetResponse()) { - using (StreamReader reader = new StreamReader(response.GetResponseStream(), true)) { - responseString = reader.ReadToEnd(); - } + using (WebResponse response = webRequest.GetResponse()) + { LogRateLimitInfo(response); + var responseStream = response.GetResponseStream(); + if (responseStream != null) + { + using (StreamReader reader = new StreamReader(responseStream, true)) + { + responseString = reader.ReadToEnd(); + } + } } } catch (Exception ex) { LOG.Error("Upload to imgur gave an exeption: ", ex); @@ -145,20 +151,22 @@ namespace GreenshotImgurPlugin { } } else { - var oauth2Settings = new OAuth2Settings(); - oauth2Settings.AuthUrlPattern = AuthUrlPattern; - oauth2Settings.TokenUrl = TokenUrl; - oauth2Settings.RedirectUrl = "https://imgur.com"; - oauth2Settings.CloudServiceName = "Imgur"; - oauth2Settings.ClientId = ImgurCredentials.CONSUMER_KEY; - oauth2Settings.ClientSecret = ImgurCredentials.CONSUMER_SECRET; - oauth2Settings.AuthorizeMode = OAuth2AuthorizeMode.EmbeddedBrowser; - oauth2Settings.BrowserSize = new Size(680, 880); + var oauth2Settings = new OAuth2Settings + { + AuthUrlPattern = AuthUrlPattern, + TokenUrl = TokenUrl, + RedirectUrl = "https://imgur.com", + CloudServiceName = "Imgur", + ClientId = ImgurCredentials.CONSUMER_KEY, + ClientSecret = ImgurCredentials.CONSUMER_SECRET, + AuthorizeMode = OAuth2AuthorizeMode.EmbeddedBrowser, + BrowserSize = new Size(680, 880), + RefreshToken = Config.RefreshToken, + AccessToken = Config.AccessToken, + AccessTokenExpires = Config.AccessTokenExpires + }; // Copy the settings from the config, which is kept in memory and on the disk - oauth2Settings.RefreshToken = Config.RefreshToken; - oauth2Settings.AccessToken = Config.AccessToken; - oauth2Settings.AccessTokenExpires = Config.AccessTokenExpires; try { @@ -179,6 +187,10 @@ namespace GreenshotImgurPlugin { IniConfig.Save(); } } + if (string.IsNullOrEmpty(responseString)) + { + return null; + } return ImgurInfo.ParseResponse(responseString); } @@ -194,7 +206,8 @@ namespace GreenshotImgurPlugin { LOG.InfoFormat("Retrieving Imgur image for {0} with url {1}", imgurInfo.Hash, imgurInfo.SmallSquare); HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(string.Format(SmallUrlPattern, imgurInfo.Hash), HTTPMethod.GET); webRequest.ServicePoint.Expect100Continue = false; - SetClientId(webRequest); + // Not for getting the thumbnail, in anonymous modus + //SetClientId(webRequest); using (WebResponse response = webRequest.GetResponse()) { LogRateLimitInfo(response); Stream responseStream = response.GetResponseStream(); @@ -212,7 +225,7 @@ namespace GreenshotImgurPlugin { /// <param name="deleteHash"></param> /// <returns>ImgurInfo</returns> public static ImgurInfo RetrieveImgurInfo(string hash, string deleteHash) { - string url = Config.ImgurApiUrl + "/image/" + hash; + string url = Config.ImgurApi3Url + "/image/" + hash + ".xml"; LOG.InfoFormat("Retrieving Imgur info for {0} with url {1}", hash, url); HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.GET); webRequest.ServicePoint.Expect100Continue = false; @@ -247,8 +260,8 @@ namespace GreenshotImgurPlugin { LOG.InfoFormat("Deleting Imgur image for {0}", imgurInfo.DeleteHash); try { - string url = Config.ImgurApiUrl + "/delete/" + imgurInfo.DeleteHash; - HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.GET); + string url = Config.ImgurApi3Url + "/image/" + imgurInfo.DeleteHash + ".xml"; + HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.DELETE); webRequest.ServicePoint.Expect100Continue = false; SetClientId(webRequest); string responseString; From 5c04af1684acc1957be3d7604d89e76daca84c9a Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 26 Apr 2016 23:13:37 +0200 Subject: [PATCH 027/170] Undo of some cleanup which causes issues, --- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 47 +++++++++++++++++++++- GreenshotPlugin/UnmanagedHelpers/User32.cs | 17 ++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index dd4c9d604..95462a63b 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -77,6 +77,16 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A hbitmap SafeHandle implementation /// </summary> public class SafeHBitmapHandle : SafeObjectHandle { + + /// <summary> + /// Needed for marshalling return values + /// </summary> + [SecurityCritical] + public SafeHBitmapHandle() : base(true) + { + + } + [SecurityCritical] public SafeHBitmapHandle(IntPtr preexistingHandle) : base(true) { SetHandle(preexistingHandle); @@ -87,8 +97,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A hRegion SafeHandle implementation /// </summary> public class SafeRegionHandle : SafeObjectHandle { + /// <summary> + /// Needed for marshalling return values + /// </summary> [SecurityCritical] - private SafeRegionHandle() : base(true) { + public SafeRegionHandle() : base(true) + { } [SecurityCritical] @@ -101,6 +115,14 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A dibsection SafeHandle implementation /// </summary> public class SafeDibSectionHandle : SafeObjectHandle { + /// <summary> + /// Needed for marshalling return values + /// </summary> + [SecurityCritical] + public SafeDibSectionHandle() : base(true) + { + } + [SecurityCritical] public SafeDibSectionHandle(IntPtr preexistingHandle) : base(true) { SetHandle(preexistingHandle); @@ -116,6 +138,13 @@ namespace GreenshotPlugin.UnmanagedHelpers { private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); private readonly SafeHandle _hdc; + /// <summary> + /// Needed for marshalling return values + /// </summary> + [SecurityCritical] + public SafeSelectObjectHandle() : base(true) + { + } [SecurityCritical] public SafeSelectObjectHandle(SafeDCHandle hdc, SafeHandle newHandle) : base(true) { @@ -141,6 +170,14 @@ namespace GreenshotPlugin.UnmanagedHelpers { [return: MarshalAs(UnmanagedType.Bool)] private static extern bool DeleteDC(IntPtr hDC); + /// <summary> + /// Needed for marshalling return values + /// </summary> + [SecurityCritical] + public SafeCompatibleDCHandle() : base(true) + { + } + [SecurityCritical] public SafeCompatibleDCHandle(IntPtr preexistingHandle) : base(true) { SetHandle(preexistingHandle); @@ -161,6 +198,14 @@ namespace GreenshotPlugin.UnmanagedHelpers { public class SafeDeviceContextHandle : SafeDCHandle { private readonly Graphics _graphics; + /// <summary> + /// Needed for marshalling return values + /// </summary> + [SecurityCritical] + public SafeDeviceContextHandle() : base(true) + { + } + [SecurityCritical] public SafeDeviceContextHandle(Graphics graphics, IntPtr preexistingHandle) : base(true) { _graphics = graphics; diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index ef85d5994..76b7c5056 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -359,6 +359,16 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// A SafeHandle class implementation for the hIcon /// </summary> public class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid { + + /// <summary> + /// Needed for marshalling return values + /// </summary> + [SecurityCritical] + public SafeIconHandle() : base(true) + { + } + + public SafeIconHandle(IntPtr hIcon) : base(true) { SetHandle(hIcon); } @@ -380,6 +390,13 @@ namespace GreenshotPlugin.UnmanagedHelpers { private readonly IntPtr _hWnd; + /// <summary> + /// Needed for marshalling return values + /// </summary> + public SafeWindowDCHandle() : base(true) + { + } + [SecurityCritical] public SafeWindowDCHandle(IntPtr hWnd, IntPtr preexistingHandle) : base(true) { _hWnd = hWnd; From 728f49944fd3473aab300ba5d7934e3a13de0e82 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 26 Apr 2016 23:33:17 +0200 Subject: [PATCH 028/170] BUG-1890: Fixed wrong cropping when window is maximized on Windows 10 --- .../Core/OperatingSystemExtensions.cs | 92 +++++++++++++++++++ GreenshotPlugin/Core/WindowsHelper.cs | 24 +++-- GreenshotPlugin/GreenshotPlugin.csproj | 1 + 3 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 GreenshotPlugin/Core/OperatingSystemExtensions.cs diff --git a/GreenshotPlugin/Core/OperatingSystemExtensions.cs b/GreenshotPlugin/Core/OperatingSystemExtensions.cs new file mode 100644 index 000000000..769547e03 --- /dev/null +++ b/GreenshotPlugin/Core/OperatingSystemExtensions.cs @@ -0,0 +1,92 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub: https://github.com/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 <http://www.gnu.org/licenses/>. + */ + +using System; + +namespace GreenshotPlugin.Core +{ + /// <summary> + /// Extensions to help with querying the Operating System + /// </summary> + public static class OperatingSystemExtensions + { + /// <summary> + /// Test if the current OS is Windows 10 + /// </summary> + /// <param name="operatingSystem">OperatingSystem from Environment.OSVersion</param> + /// <returns>true if we are running on Windows 10</returns> + public static bool IsWindows10(this OperatingSystem operatingSystem) + { + return operatingSystem.Version.Major == 10; + } + + /// <summary> + /// Test if the current OS is Windows 8(.1) + /// </summary> + /// <param name="operatingSystem">OperatingSystem from Environment.OSVersion</param> + /// <returns>true if we are running on Windows 8(.1)</returns> + public static bool IsWindows8(this OperatingSystem operatingSystem) + { + return operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 2; + } + + /// <summary> + /// Test if the current OS is Windows 8 or later + /// </summary> + /// <param name="operatingSystem">OperatingSystem from Environment.OSVersion</param> + /// <returns>true if we are running on Windows 8 or later</returns> + public static bool IsWindows8OrLater(this OperatingSystem operatingSystem) + { + return (operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 2) || operatingSystem.Version.Major >= 6; + } + + /// <summary> + /// Test if the current OS is Windows 7 or later + /// </summary> + /// <param name="operatingSystem">OperatingSystem from Environment.OSVersion</param> + /// <returns>true if we are running on Windows 7 or later</returns> + public static bool IsWindows7OrLater(this OperatingSystem operatingSystem) + { + return (operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 1) || operatingSystem.Version.Major >= 6; + } + + /// <summary> + /// Test if the current OS is Windows Vista or later + /// </summary> + /// <param name="operatingSystem">OperatingSystem from Environment.OSVersion</param> + /// <returns>true if we are running on Windows Vista or later</returns> + public static bool IsWindowsVistaOrLater(this OperatingSystem operatingSystem) + { + return operatingSystem.Version.Major >= 6; + } + + /// <summary> + /// Test if the current OS is Windows XP or later + /// </summary> + /// <param name="operatingSystem">OperatingSystem from Environment.OSVersion</param> + /// <returns>true if we are running on Windows XP or later</returns> + public static bool IsWindowsXpOrLater(this OperatingSystem operatingSystem) + { + // Windows 2000 is Major 5 minor 0 + return Environment.OSVersion.Version.Major > 5 || (Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1); + } + } +} diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 412e018bc..0fa642128 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -768,7 +768,13 @@ namespace GreenshotPlugin.Core { if (previousWindowRectangle.IsEmpty || now - lastWindowRectangleRetrieveTime > CACHE_TIME) { Rectangle windowRect = Rectangle.Empty; if (DWM.isDWMEnabled()) { - GetExtendedFrameBounds(out windowRect); + if (GetExtendedFrameBounds(out windowRect) && Environment.OSVersion.IsWindows10()) + { + lastWindowRectangleRetrieveTime = now; + previousWindowRectangle = windowRect; + // DWM does it corectly, just return the window rectangle we just gotten. + return windowRect; + } } if (windowRect.IsEmpty) { @@ -915,10 +921,12 @@ namespace GreenshotPlugin.Core { Form tempForm = null; bool tempFormShown = false; try { - tempForm = new Form(); - tempForm.ShowInTaskbar = false; - tempForm.FormBorderStyle = FormBorderStyle.None; - tempForm.TopMost = true; + tempForm = new Form + { + ShowInTaskbar = false, + FormBorderStyle = FormBorderStyle.None, + TopMost = true + }; // Register the Thumbnail DWM.DwmRegisterThumbnail(tempForm.Handle, Handle, out thumbnailHandle); @@ -932,8 +940,8 @@ namespace GreenshotPlugin.Core { } // Calculate the location of the temp form - Point formLocation; Rectangle windowRectangle = WindowRectangle; + Point formLocation = formLocation = windowRectangle.Location; Size borderSize = new Size(); bool doesCaptureFit = false; if (!Maximised) { @@ -962,7 +970,7 @@ namespace GreenshotPlugin.Core { doesCaptureFit = true; } } - } else { + } else if (!Environment.OSVersion.IsWindows8OrLater()) { //GetClientRect(out windowRectangle); GetBorderSize(out borderSize); formLocation = new Point(windowRectangle.X - borderSize.Width, windowRectangle.Y - borderSize.Height); @@ -1067,7 +1075,7 @@ namespace GreenshotPlugin.Core { } if (capturedBitmap != null) { // Not needed for Windows 8 - if (!(Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 2)) { + if (!Environment.OSVersion.IsWindows8OrLater()) { // Only if the Inivalue is set, not maximized and it's not a tool window. if (conf.WindowCaptureRemoveCorners && !Maximised && (ExtendedWindowStyle & ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW) == 0) { // Remove corners diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 917a12654..f29b3b79b 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -42,6 +42,7 @@ <Compile Include="Core\CaptureHandler.cs" /> <Compile Include="Core\EventDelay.cs" /> <Compile Include="Core\FastBitmap.cs" /> + <Compile Include="Core\OperatingSystemExtensions.cs" /> <Compile Include="Core\WmInputLangChangeRequestFilter.cs" /> <Compile Include="GlobalSuppressions.cs" /> <Compile Include="IEInterop\IHTMLBodyElement.cs" /> From db5a92dea4d62dc2ec7b35d083a0b13b91aaa651 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 26 Apr 2016 23:42:25 +0200 Subject: [PATCH 029/170] Fixed build, and updated readme. --- .../additional_files/readme.txt.template | 20 +++++++++++++++++++ appveyor12.yml | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 0881700f2..4fd81e5dc 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -21,6 +21,26 @@ In this version we fix the bug in the update check, and we are also working on a Here is the list of chances: +This is a pre-release for the comming bug-fix release of Greenshot. + +This version has changes, compared to 1.2.8.12, for the following reported tickets: + +* BUG-1884: OCR has trailing blank spaces| +* BUG-1890: Slight cropping around window on Windows 10| +* BUG-1892: Greenshot saves blank JPG file with reduce colors| +* BUG-1898: Specify GPLv3 in the license text| +* BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on and transparency is used| +* BUG-1933: Greenshot Installer sets bad registry key permission| +* BUG-1935: Delay when pasting and ShapeShifter from FlameFusion is running| +* BUG-1941: Error when creating speech bubble| +* BUG-1945: Failure starting Greenshot at system startup| +* BUG-1949: Can't delete Imgur upload| + +Testing is not finished, use at your own risk... + + +1.2.8.12 Release + Bugs Resolved: BUG-1527 / BUG-1848 / BUG-1850 / BUG-1851 / BUG-1859 : Greenshot stops responding, hangs or crashes diff --git a/appveyor12.yml b/appveyor12.yml index 19f38fd44..05ac9b5b6 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -42,12 +42,12 @@ environment: rsakey: secure: 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 before_build: -- ps: iex (new-object Net.WebClient).DownloadString("https://bitbucket.org/greenshot/greenshot/raw/1.2/prebuild.ps1") +- ps: .\prebuild.ps1 build: project: greenshot\greenshot.sln verbosity: normal after_build: -- ps: iex (new-object Net.WebClient).DownloadString("https://bitbucket.org/greenshot/greenshot/raw/1.2/build.ps1") +- ps: .\build.ps1 test: off artifacts: - path: Greenshot\releases\Greenshot*INSTALLER*.exe From 4f326c9c0ed9bfc79d3eccbe74b129a701145021 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Fri, 29 Apr 2016 16:44:16 +0200 Subject: [PATCH 030/170] [skip ci] Added horizontal scrolling with the mousewheel when keeping shift pressed. --- Greenshot/Controls/NonJumpingPanel.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Greenshot/Controls/NonJumpingPanel.cs b/Greenshot/Controls/NonJumpingPanel.cs index 93f2f713c..6677c0da1 100644 --- a/Greenshot/Controls/NonJumpingPanel.cs +++ b/Greenshot/Controls/NonJumpingPanel.cs @@ -32,5 +32,23 @@ namespace GreenshotPlugin.Controls { // scrolling to the active control when the panel loses and regains focus return DisplayRectangle.Location; } + + /// <summary> + /// Add horizontal scrolling to the panel, when using the wheel and the shift key is pressed + /// </summary> + /// <param name="e">MouseEventArgs</param> + protected override void OnMouseWheel(MouseEventArgs e) + { + if (VScroll && (ModifierKeys & Keys.Shift) == Keys.Shift) + { + VScroll = false; + base.OnMouseWheel(e); + VScroll = true; + } + else + { + base.OnMouseWheel(e); + } + } } } From d25021631e75d732fa75c358baa903108a9f15d6 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Fri, 20 May 2016 23:43:31 +0200 Subject: [PATCH 031/170] FEATURE-945: Added environment variables to the external command (also removed unused imports and made some variables readonly) --- Greenshot/AssemblyInfo.cs | 1 - ...ontextMenuToolStripProfessionalRenderer.cs | 1 - Greenshot/Destinations/EmailDestination.cs | 4 - Greenshot/Drawing/HighlightContainer.cs | 1 - Greenshot/Drawing/SpeechbubbleContainer.cs | 3 - Greenshot/Forms/DropShadowSettingsForm.cs | 1 - Greenshot/Forms/PrintOptionsDialog.cs | 1 - Greenshot/Forms/TornEdgeSettingsForm.cs | 1 - .../additional_files/readme.txt.template | 3 +- GreenshotBoxPlugin/Properties/AssemblyInfo.cs | 1 - GreenshotConfluencePlugin/Confluence.cs | 16 ++-- .../ConfluenceDestination.cs | 14 ++-- GreenshotConfluencePlugin/ConfluenceUtils.cs | 1 - GreenshotConfluencePlugin/EnumDisplayer.cs | 8 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 6 +- .../Forms/ConfluencePagePicker.xaml.cs | 6 +- .../Forms/ConfluenceSearch.xaml.cs | 19 ++--- .../Forms/ConfluenceTreePicker.xaml.cs | 7 +- .../Forms/ConfluenceUpload.xaml.cs | 4 +- .../Support/ITranslationProvider.cs | 6 +- .../Support/LanguageXMLTranslationProvider.cs | 7 +- .../Support/TranslationData.cs | 2 +- .../Support/TranslationManager.cs | 4 - GreenshotDropboxPlugin/DropboxDestination.cs | 6 +- GreenshotDropboxPlugin/DropboxPlugin.cs | 4 +- GreenshotDropboxPlugin/DropboxUtils.cs | 2 +- GreenshotDropboxPlugin/Forms/DropboxForm.cs | 2 +- GreenshotDropboxPlugin/Forms/SettingsForm.cs | 3 - .../Properties/AssemblyInfo.cs | 1 - .../ExternalCommandConfiguration.cs | 8 +- .../ExternalCommandDestination.cs | 74 +++++++++-------- .../ExternalCommandPlugin.cs | 44 +++++----- GreenshotExternalCommandPlugin/IconCache.cs | 28 ++++++- .../Properties/AssemblyInfo.cs | 1 - .../SettingsForm.cs | 2 +- .../SettingsFormDetail.cs | 81 ++++++++++++------- GreenshotFlickrPlugin/FlickrDestination.cs | 2 +- GreenshotFlickrPlugin/FlickrUtils.cs | 2 +- GreenshotFlickrPlugin/Forms/FlickrForm.cs | 1 - GreenshotFlickrPlugin/Forms/SettingsForm.cs | 4 - .../Properties/AssemblyInfo.cs | 1 - GreenshotImgurPlugin/Forms/ImgurForm.cs | 1 - GreenshotImgurPlugin/Forms/ImgurHistory.cs | 14 ++-- GreenshotImgurPlugin/Forms/SettingsForm.cs | 3 - GreenshotImgurPlugin/ImgurDestination.cs | 4 +- GreenshotImgurPlugin/ImgurPlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 1 - GreenshotJiraPlugin/Forms/JiraForm.cs | 20 ++--- GreenshotJiraPlugin/Forms/JiraFormBase.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.cs | 3 - GreenshotJiraPlugin/Jira.cs | 48 +++++------ GreenshotJiraPlugin/JiraDestination.cs | 10 +-- GreenshotJiraPlugin/JiraPlugin.cs | 2 +- GreenshotJiraPlugin/JiraUtils.cs | 2 +- .../Properties/AssemblyInfo.cs | 1 - GreenshotOCRCommand/COMWrapper.cs | 46 +++++------ GreenshotOCRCommand/ComProgIdAttribute.cs | 2 +- .../Properties/AssemblyInfo.cs | 1 - GreenshotOCRPlugin/OCRDestination.cs | 4 +- GreenshotOCRPlugin/OCRPlugin.cs | 3 +- GreenshotOCRPlugin/Properties/AssemblyInfo.cs | 1 - GreenshotOCRPlugin/SettingsForm.cs | 4 +- .../Destinations/ExcelDestination.cs | 11 +-- .../Destinations/OneNoteDestination.cs | 8 +- .../Destinations/OutlookDestination.cs | 18 ++--- .../Destinations/PowerpointDestination.cs | 11 +-- .../Destinations/WordDestination.cs | 10 +-- .../OfficeExport/ExcelExporter.cs | 3 - .../OfficeExport/OneNoteExporter.cs | 1 - .../OfficeExport/OutlookEmailExporter.cs | 6 -- .../OfficeExport/WordExporter.cs | 5 +- .../OfficeInterop/OutlookUtils.cs | 6 +- .../Properties/AssemblyInfo.cs | 1 - .../Forms/SettingsForm.cs | 4 - .../PhotobucketDestination.cs | 6 +- .../PhotobucketPlugin.cs | 2 +- .../Properties/AssemblyInfo.cs | 1 - GreenshotPicasaPlugin/Forms/SettingsForm.cs | 7 -- GreenshotPicasaPlugin/PicasaDestination.cs | 4 +- GreenshotPicasaPlugin/PicasaPlugin.cs | 6 +- GreenshotPicasaPlugin/PicasaUtils.cs | 1 - .../Properties/AssemblyInfo.cs | 1 - GreenshotPlugin/Controls/HotkeyControl.cs | 2 +- GreenshotPlugin/Core/Cache.cs | 15 +++- GreenshotPlugin/Core/EventDelay.cs | 2 +- GreenshotPlugin/Core/FilenameHelper.cs | 50 +++++++++++- GreenshotPlugin/Core/LogHelper.cs | 2 +- GreenshotPlugin/Core/OAuthHelper.cs | 2 +- GreenshotPlugin/Core/PluginUtils.cs | 15 ++-- GreenshotPlugin/Core/SourceForgeHelper.cs | 6 +- 90 files changed, 390 insertions(+), 373 deletions(-) diff --git a/Greenshot/AssemblyInfo.cs b/Greenshot/AssemblyInfo.cs index 71277cb02..6694dedb4 100644 --- a/Greenshot/AssemblyInfo.cs +++ b/Greenshot/AssemblyInfo.cs @@ -21,7 +21,6 @@ using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index d8c8ef68c..161f566bd 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -22,7 +22,6 @@ using Greenshot.IniFile; using GreenshotPlugin.Core; using System.Drawing; -using System.Drawing.Drawing2D; using System.Windows.Forms; namespace Greenshot.Controls { diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index 16dcf0866..c8ff8ad24 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -26,16 +26,12 @@ using Greenshot.Configuration; using Greenshot.Helpers; using Greenshot.Plugin; using GreenshotPlugin.Core; -using Greenshot.IniFile; -using log4net; namespace Greenshot.Destinations { /// <summary> /// Description of EmailDestination. /// </summary> public class EmailDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(EmailDestination)); - private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); private static readonly Image mailIcon = GreenshotResources.getImage("Email.Image"); private static bool isActiveFlag; private static string mapiClient; diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index aec48208f..701592539 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -19,7 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Drawing; using System.Runtime.Serialization; using Greenshot.Drawing.Fields; diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index eef5e8ef6..4bbc91c29 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -21,15 +21,12 @@ using Greenshot.Drawing.Fields; using Greenshot.Helpers; -using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.Serialization; -using System.Windows.Forms; -using log4net; namespace Greenshot.Drawing { /// <summary> diff --git a/Greenshot/Forms/DropShadowSettingsForm.cs b/Greenshot/Forms/DropShadowSettingsForm.cs index 358b98970..06e170117 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.cs @@ -22,7 +22,6 @@ using System; using System.Drawing; using System.Windows.Forms; using Greenshot.Core; -using GreenshotPlugin.Core; namespace Greenshot.Forms { public partial class DropShadowSettingsForm : BaseForm { diff --git a/Greenshot/Forms/PrintOptionsDialog.cs b/Greenshot/Forms/PrintOptionsDialog.cs index 1175bf1dc..fb728a590 100644 --- a/Greenshot/Forms/PrintOptionsDialog.cs +++ b/Greenshot/Forms/PrintOptionsDialog.cs @@ -21,7 +21,6 @@ using System; using System.Windows.Forms; using Greenshot.IniFile; -using GreenshotPlugin.Core; namespace Greenshot.Forms { /// <summary> diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index 707ea5c32..1bf429ea6 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -22,7 +22,6 @@ using System; using System.Drawing; using System.Windows.Forms; using Greenshot.Core; -using GreenshotPlugin.Core; namespace Greenshot.Forms { public partial class TornEdgeSettingsForm : BaseForm { diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 4fd81e5dc..3668769d5 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -34,7 +34,8 @@ This version has changes, compared to 1.2.8.12, for the following reported ticke * BUG-1935: Delay when pasting and ShapeShifter from FlameFusion is running| * BUG-1941: Error when creating speech bubble| * BUG-1945: Failure starting Greenshot at system startup| -* BUG-1949: Can't delete Imgur upload| +* BUG-1949: Can't delete Imgur upload +* FEATURE-945: Added environment variables to the external command Testing is not finished, use at your own risk... diff --git a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs index 4dbee7804..d8104cf29 100644 --- a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 05651949d..b875052ba 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -95,14 +95,14 @@ namespace Confluence { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceConnector)); private const string AUTH_FAILED_EXCEPTION_NAME = "com.atlassian.confluence.rpc.AuthenticationFailedException"; private const string V2_FAILED = "AXIS"; - private static ConfluenceConfiguration config = IniConfig.GetIniSection<ConfluenceConfiguration>(); + private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection<ConfluenceConfiguration>(); private string credentials = null; private DateTime loggedInTime = DateTime.Now; private bool loggedIn = false; private ConfluenceSoapServiceService confluence; - private int timeout; + private readonly int timeout; private string url; - private Cache<string, RemotePage> pageCache = new Cache<string, RemotePage>(60 * config.Timeout); + private readonly Cache<string, RemotePage> pageCache = new Cache<string, RemotePage>(60 * config.Timeout); public void Dispose() { Dispose(true); @@ -143,9 +143,9 @@ namespace Confluence { /// <returns>true if login was done sucessfully</returns> private bool doLogin(string user, string password) { try { - this.credentials = confluence.login(user, password); - this.loggedInTime = DateTime.Now; - this.loggedIn = true; + credentials = confluence.login(user, password); + loggedInTime = DateTime.Now; + loggedIn = true; } catch (Exception e) { // Check if confluence-v2 caused an error, use v1 instead if (e.Message.Contains(V2_FAILED) && url.Contains("v2")) { @@ -157,8 +157,8 @@ namespace Confluence { return false; } // Not an authentication issue - this.loggedIn = false; - this.credentials = null; + loggedIn = false; + credentials = null; e.Data.Add("user", user); e.Data.Add("url", url); throw; diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 10e212d5e..8161908ac 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -36,11 +36,11 @@ namespace GreenshotConfluencePlugin { /// Description of ConfluenceDestination. /// </summary> public class ConfluenceDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceDestination)); + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceDestination)); private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection<ConfluenceConfiguration>(); private static readonly CoreConfiguration coreConfig = IniConfig.GetIniSection<CoreConfiguration>(); - private static Image confluenceIcon = null; - private Confluence.Page page; + private static readonly Image confluenceIcon = null; + private readonly Page page; public static bool IsInitialized { get; private set; @@ -63,7 +63,7 @@ namespace GreenshotConfluencePlugin { public ConfluenceDestination() { } - public ConfluenceDestination(Confluence.Page page) { + public ConfluenceDestination(Page page) { this.page = page; } @@ -105,17 +105,17 @@ namespace GreenshotConfluencePlugin { if (ConfluencePlugin.ConfluenceConnectorNoLogin == null || !ConfluencePlugin.ConfluenceConnectorNoLogin.isLoggedIn) { yield break; } - List<Confluence.Page> currentPages = ConfluenceUtils.GetCurrentPages(); + List<Page> currentPages = ConfluenceUtils.GetCurrentPages(); if (currentPages == null || currentPages.Count == 0) { yield break; } - foreach(Confluence.Page currentPage in currentPages) { + foreach(Page currentPage in currentPages) { yield return new ConfluenceDestination(currentPage); } } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); // force password check to take place before the pages load if (!ConfluencePlugin.ConfluenceConnector.isLoggedIn) { return exportInformation; diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index 3ffafbfd6..72f62c3e4 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -20,7 +20,6 @@ */ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Text.RegularExpressions; using System.Windows.Automation; diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index 102bf6732..e601c2a30 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -40,7 +40,7 @@ namespace GreenshotConfluencePlugin { } public EnumDisplayer(Type type) { - this.Type = type; + Type = type; } public Type Type { @@ -49,15 +49,15 @@ namespace GreenshotConfluencePlugin { if (!value.IsEnum) { throw new ArgumentException("parameter is not an Enumerated type", "value"); } - this.type = value; + type = value; } } public ReadOnlyCollection<string> DisplayNames { get { - this.reverseValues = (IDictionary) Activator.CreateInstance(typeof(Dictionary<,>).GetGenericTypeDefinition().MakeGenericType(typeof(string),type)); + reverseValues = (IDictionary) Activator.CreateInstance(typeof(Dictionary<,>).GetGenericTypeDefinition().MakeGenericType(typeof(string),type)); - this.displayValues = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).GetGenericTypeDefinition().MakeGenericType(type, typeof(string))); + displayValues = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).GetGenericTypeDefinition().MakeGenericType(type, typeof(string))); var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static); foreach (var field in fields) { diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index 63b72292d..507f1ee8f 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Windows; namespace GreenshotConfluencePlugin { @@ -26,7 +26,7 @@ namespace GreenshotConfluencePlugin { /// Interaction logic for ConfluenceConfigurationForm.xaml /// </summary> public partial class ConfluenceConfigurationForm : Window { - private ConfluenceConfiguration config; + private readonly ConfluenceConfiguration config; public ConfluenceConfiguration Config { get { return config; @@ -34,7 +34,7 @@ namespace GreenshotConfluencePlugin { } public ConfluenceConfigurationForm(ConfluenceConfiguration config) { - this.DataContext = config; + DataContext = config; this.config = config; InitializeComponent(); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index a8ddec0dd..381eb4139 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using Confluence; using System.Collections.Generic; @@ -28,11 +28,11 @@ namespace GreenshotConfluencePlugin { /// </summary> public partial class ConfluencePagePicker : System.Windows.Controls.Page { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluencePagePicker)); - private ConfluenceUpload confluenceUpload = null; + private readonly ConfluenceUpload confluenceUpload = null; public ConfluencePagePicker(ConfluenceUpload confluenceUpload, List<Page> pagesToPick) { this.confluenceUpload = confluenceUpload; - this.DataContext = pagesToPick; + DataContext = pagesToPick; InitializeComponent(); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index 3c816a2f9..042a68427 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -18,20 +18,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows; - -using Confluence; -using GreenshotPlugin.Core; using Greenshot.IniFile; namespace GreenshotConfluencePlugin { public partial class ConfluenceSearch : System.Windows.Controls.Page { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceSearch)); - private static ConfluenceConfiguration config = IniConfig.GetIniSection<ConfluenceConfiguration>(); - private ConfluenceUpload confluenceUpload; + private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection<ConfluenceConfiguration>(); + private readonly ConfluenceUpload confluenceUpload; public List<Confluence.Space> Spaces { get { @@ -39,7 +36,7 @@ namespace GreenshotConfluencePlugin { } } - private ObservableCollection<Confluence.Page> pages = new ObservableCollection<Confluence.Page>(); + private readonly ObservableCollection<Confluence.Page> pages = new ObservableCollection<Confluence.Page>(); public ObservableCollection<Confluence.Page> Pages { get { return pages; @@ -48,14 +45,14 @@ namespace GreenshotConfluencePlugin { public ConfluenceSearch(ConfluenceUpload confluenceUpload) { this.confluenceUpload = confluenceUpload; - this.DataContext = this; + DataContext = this; InitializeComponent(); if (config.SearchSpaceKey == null) { - this.SpaceComboBox.SelectedItem = Spaces[0]; + SpaceComboBox.SelectedItem = Spaces[0]; } else { foreach(Confluence.Space space in Spaces) { if (space.Key.Equals(config.SearchSpaceKey)) { - this.SpaceComboBox.SelectedItem = space; + SpaceComboBox.SelectedItem = space; } } } @@ -94,7 +91,7 @@ namespace GreenshotConfluencePlugin { } } - void Page_Loaded(object sender, System.Windows.RoutedEventArgs e) { + void Page_Loaded(object sender, RoutedEventArgs e) { SelectionChanged(); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index b639a5f98..716262030 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -27,7 +27,6 @@ using System.Windows.Input; using System.Windows.Threading; using Confluence; -using GreenshotPlugin.Core; namespace GreenshotConfluencePlugin { /// <summary> @@ -35,12 +34,12 @@ namespace GreenshotConfluencePlugin { /// </summary> public partial class ConfluenceTreePicker : System.Windows.Controls.Page { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceTreePicker)); - private ConfluenceConnector confluenceConnector; - private ConfluenceUpload confluenceUpload; + private readonly ConfluenceConnector confluenceConnector; + private readonly ConfluenceUpload confluenceUpload; private bool isInitDone = false; public ConfluenceTreePicker(ConfluenceUpload confluenceUpload) { - this.confluenceConnector = ConfluencePlugin.ConfluenceConnector; + confluenceConnector = ConfluencePlugin.ConfluenceConnector; this.confluenceUpload = confluenceUpload; InitializeComponent(); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index 3c3d9442e..fe1b81a8a 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -100,12 +100,12 @@ namespace GreenshotConfluencePlugin { } public ConfluenceUpload(string filename) { - this.Filename = filename; + Filename = filename; InitializeComponent(); this.DataContext = this; updateSpaces(); if (PickerPage == null) { - PickerTab.Visibility = System.Windows.Visibility.Collapsed; + PickerTab.Visibility = Visibility.Collapsed; SearchTab.IsSelected = true; } } diff --git a/GreenshotConfluencePlugin/Support/ITranslationProvider.cs b/GreenshotConfluencePlugin/Support/ITranslationProvider.cs index 6bd4bf402..a19c27fd8 100644 --- a/GreenshotConfluencePlugin/Support/ITranslationProvider.cs +++ b/GreenshotConfluencePlugin/Support/ITranslationProvider.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Globalization; - -namespace TranslationByMarkupExtension { +namespace TranslationByMarkupExtension { public interface ITranslationProvider { /// <summary> /// Translates the specified key. diff --git a/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs b/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs index 75d952e76..f3ebcaca0 100644 --- a/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs +++ b/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Globalization; - -using GreenshotConfluencePlugin; -using GreenshotPlugin.Core; +using GreenshotPlugin.Core; namespace TranslationByMarkupExtension { /// <summary> diff --git a/GreenshotConfluencePlugin/Support/TranslationData.cs b/GreenshotConfluencePlugin/Support/TranslationData.cs index b47fe4a65..e9be13aff 100644 --- a/GreenshotConfluencePlugin/Support/TranslationData.cs +++ b/GreenshotConfluencePlugin/Support/TranslationData.cs @@ -6,7 +6,7 @@ namespace TranslationByMarkupExtension { public class TranslationData : IWeakEventListener, INotifyPropertyChanged { #region Private Members - private string _key; + private readonly string _key; #endregion diff --git a/GreenshotConfluencePlugin/Support/TranslationManager.cs b/GreenshotConfluencePlugin/Support/TranslationManager.cs index fa801d3d2..7e9516271 100644 --- a/GreenshotConfluencePlugin/Support/TranslationManager.cs +++ b/GreenshotConfluencePlugin/Support/TranslationManager.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading; namespace TranslationByMarkupExtension { public class TranslationManager { diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index c4f79732f..d9ef2cd33 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -26,9 +26,9 @@ using GreenshotPlugin.Core; namespace GreenshotDropboxPlugin { class DropboxDestination : AbstractDestination { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DropboxDestination)); - private static DropboxPluginConfiguration config = IniConfig.GetIniSection<DropboxPluginConfiguration>(); + private static readonly DropboxPluginConfiguration config = IniConfig.GetIniSection<DropboxPluginConfiguration>(); - private DropboxPlugin plugin = null; + private readonly DropboxPlugin plugin = null; public DropboxDestination(DropboxPlugin plugin) { this.plugin = plugin; } @@ -53,7 +53,7 @@ namespace GreenshotDropboxPlugin { } public override ExportInformation ExportCapture(bool manually, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadURL = null; bool uploaded = plugin.Upload(captureDetails, surface, out uploadURL); if (uploaded) { diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index 772545395..7fd82cd60 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -73,7 +73,7 @@ namespace GreenshotDropboxPlugin { /// <param name="host">Use the IGreenshotPluginHost interface to register events</param> /// <param name="pluginAttribute">My own attributes</param> public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - this.host = (IGreenshotHost)pluginHost; + host = (IGreenshotHost)pluginHost; Attributes = myAttributes; // Register configuration (don't need the configuration itself) @@ -83,7 +83,7 @@ namespace GreenshotDropboxPlugin { itemPlugInConfig = new ToolStripMenuItem(); itemPlugInConfig.Text = Language.GetString("dropbox", LangKey.Configure); itemPlugInConfig.Tag = host; - itemPlugInConfig.Click += new System.EventHandler(ConfigMenuClick); + itemPlugInConfig.Click += new EventHandler(ConfigMenuClick); itemPlugInConfig.Image = (Image)resources.GetObject("Dropbox"); PluginUtils.AddToContextMenu(host, itemPlugInConfig); diff --git a/GreenshotDropboxPlugin/DropboxUtils.cs b/GreenshotDropboxPlugin/DropboxUtils.cs index 126a41cd3..f7775d106 100644 --- a/GreenshotDropboxPlugin/DropboxUtils.cs +++ b/GreenshotDropboxPlugin/DropboxUtils.cs @@ -31,7 +31,7 @@ namespace GreenshotDropboxPlugin { /// </summary> public class DropboxUtils { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DropboxUtils)); - private static DropboxPluginConfiguration config = IniConfig.GetIniSection<DropboxPluginConfiguration>(); + private static readonly DropboxPluginConfiguration config = IniConfig.GetIniSection<DropboxPluginConfiguration>(); private DropboxUtils() { } diff --git a/GreenshotDropboxPlugin/Forms/DropboxForm.cs b/GreenshotDropboxPlugin/Forms/DropboxForm.cs index b2c87ec61..8cadb1fc3 100644 --- a/GreenshotDropboxPlugin/Forms/DropboxForm.cs +++ b/GreenshotDropboxPlugin/Forms/DropboxForm.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using GreenshotPlugin.Controls; namespace GreenshotDropboxPlugin.Forms { diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.cs index 280ded7f1..9529986cf 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.cs @@ -19,10 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Windows.Forms; using GreenshotDropboxPlugin.Forms; -using GreenshotPlugin.Core; using Greenshot.IniFile; namespace GreenshotDropboxPlugin { diff --git a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs index 67d20ede5..4d498f26f 100644 --- a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index f83bc9370..daea99116 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -61,12 +61,12 @@ namespace ExternalCommand { public Dictionary<string, bool> runInbackground; private const string MSPAINT = "MS Paint"; - private static string paintPath; - private static bool hasPaint = false; + private static readonly string paintPath; + private static readonly bool hasPaint = false; private const string PAINTDOTNET = "Paint.NET"; - private static string paintDotNetPath; - private static bool hasPaintDotNet = false; + private static readonly string paintDotNetPath; + private static readonly bool hasPaintDotNet = false; static ExternalCommandConfiguration() { try { paintPath = PluginUtils.GetExePath("pbrush.exe"); diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index ee13f6eee..bec3be704 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -34,24 +34,24 @@ namespace ExternalCommand { /// Description of OCRDestination. /// </summary> public class ExternalCommandDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExternalCommandDestination)); - private static Regex URI_REGEXP = new Regex(@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)"); - private static ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); - private string presetCommand; + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExternalCommandDestination)); + private static readonly Regex URI_REGEXP = new Regex(@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)"); + private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); + private readonly string _presetCommand; public ExternalCommandDestination(string commando) { - this.presetCommand = commando; + _presetCommand = commando; } public override string Designation { get { - return "External " + presetCommand.Replace(',','_'); + return "External " + _presetCommand.Replace(',','_'); } } public override string Description { get { - return presetCommand; + return _presetCommand; } } @@ -61,20 +61,20 @@ namespace ExternalCommand { public override Image DisplayIcon { get { - return IconCache.IconForCommand(presetCommand); + return IconCache.IconForCommand(_presetCommand); } } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(); - if (presetCommand != null) { - if (!config.runInbackground.ContainsKey(presetCommand)) { - config.runInbackground.Add(presetCommand, true); + if (_presetCommand != null) { + if (!config.runInbackground.ContainsKey(_presetCommand)) { + config.runInbackground.Add(_presetCommand, true); } - bool runInBackground = config.runInbackground[presetCommand]; + bool runInBackground = config.runInbackground[_presetCommand]; string fullPath = captureDetails.Filename; if (fullPath == null) { fullPath = ImageOutput.SaveNamedTmpFile(surface, captureDetails, outputSettings); @@ -83,17 +83,20 @@ namespace ExternalCommand { string output; string error; if (runInBackground) { - Thread commandThread = new Thread(delegate() { - CallExternalCommand(exportInformation, presetCommand, fullPath, out output, out error); + Thread commandThread = new Thread(delegate() + { + CallExternalCommand(exportInformation, fullPath, out output, out error); ProcessExport(exportInformation, surface); - }); - commandThread.Name = "Running " + presetCommand; - commandThread.IsBackground = true; + }) + { + Name = "Running " + _presetCommand, + IsBackground = true + }; commandThread.SetApartmentState(ApartmentState.STA); commandThread.Start(); exportInformation.ExportMade = true; } else { - CallExternalCommand(exportInformation, presetCommand, fullPath, out output, out error); + CallExternalCommand(exportInformation, fullPath, out output, out error); ProcessExport(exportInformation, surface); } } @@ -105,15 +108,14 @@ namespace ExternalCommand { /// Call the external command, parse for URI, place to clipboard and set the export information /// </summary> /// <param name="exportInformation"></param> - /// <param name="commando"></param> /// <param name="fullPath"></param> /// <param name="output"></param> /// <param name="error"></param> - private void CallExternalCommand(ExportInformation exportInformation, string commando, string fullPath, out string output, out string error) { + private void CallExternalCommand(ExportInformation exportInformation, string fullPath, out string output, out string error) { output = null; error = null; try { - if (CallExternalCommand(presetCommand, fullPath, out output, out error) == 0) { + if (CallExternalCommand(_presetCommand, fullPath, out output, out error) == 0) { exportInformation.ExportMade = true; if (!string.IsNullOrEmpty(output)) { MatchCollection uriMatches = URI_REGEXP.Matches(output); @@ -121,7 +123,7 @@ namespace ExternalCommand { if (config.OutputToClipboard) { ClipboardHelper.SetClipboardData(output); } - if (uriMatches != null && uriMatches.Count > 0) { + if (uriMatches.Count > 0) { exportInformation.Uri = uriMatches[0].Groups[1].Value; LOG.InfoFormat("Got URI : {0} ", exportInformation.Uri); if (config.UriToClipboard) { @@ -156,13 +158,13 @@ namespace ExternalCommand { try { return CallExternalCommand(commando, fullPath, "runas", out output, out error); } catch { - w32ex.Data.Add("commandline", config.commandlines[presetCommand]); - w32ex.Data.Add("arguments", config.arguments[presetCommand]); + w32ex.Data.Add("commandline", config.commandlines[_presetCommand]); + w32ex.Data.Add("arguments", config.arguments[_presetCommand]); throw; } } catch (Exception ex) { - ex.Data.Add("commandline", config.commandlines[presetCommand]); - ex.Data.Add("arguments", config.arguments[presetCommand]); + ex.Data.Add("commandline", config.commandlines[_presetCommand]); + ex.Data.Add("arguments", config.arguments[_presetCommand]); throw; } } @@ -182,8 +184,16 @@ namespace ExternalCommand { output = null; error = null; if (!string.IsNullOrEmpty(commandline)) { - using (Process process = new Process()) { - process.StartInfo.FileName = commandline; + using (Process process = new Process()) + { + // Fix variables + commandline = FilenameHelper.FillVariables(commandline, true); + commandline = FilenameHelper.FillCmdVariables(commandline, true); + + arguments = FilenameHelper.FillVariables(arguments, false); + arguments = FilenameHelper.FillCmdVariables(arguments, false); + + process.StartInfo.FileName = FilenameHelper.FillCmdVariables(commandline, true); process.StartInfo.Arguments = FormatArguments(arguments, fullPath); process.StartInfo.UseShellExecute = false; if (config.RedirectStandardOutput) { @@ -200,13 +210,13 @@ namespace ExternalCommand { process.WaitForExit(); if (config.RedirectStandardOutput) { output = process.StandardOutput.ReadToEnd(); - if (config.ShowStandardOutputInLog && output != null && output.Trim().Length > 0) { + if (config.ShowStandardOutputInLog && output.Trim().Length > 0) { LOG.InfoFormat("Output:\n{0}", output); } } if (config.RedirectStandardError) { error = process.StandardError.ReadToEnd(); - if (error != null && error.Trim().Length > 0) { + if (error.Trim().Length > 0) { LOG.WarnFormat("Error:\n{0}", error); } } @@ -219,7 +229,7 @@ namespace ExternalCommand { public static string FormatArguments(string arguments, string fullpath) { - return String.Format(arguments, fullpath); + return string.Format(arguments, fullpath); } } } diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index 9531b0066..7848128a7 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -34,11 +34,11 @@ namespace ExternalCommand { /// </summary> public class ExternalCommandPlugin : IGreenshotPlugin { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExternalCommandPlugin)); - private static CoreConfiguration coreConfig = IniConfig.GetIniSection<CoreConfiguration>(); - private static ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); - private IGreenshotHost host; - private PluginAttribute myAttributes; - private ToolStripMenuItem itemPlugInRoot; + private static readonly CoreConfiguration coreConfig = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); + private IGreenshotHost _host; + private PluginAttribute _myAttributes; + private ToolStripMenuItem _itemPlugInRoot; public void Dispose() { Dispose(true); @@ -47,16 +47,13 @@ namespace ExternalCommand { protected virtual void Dispose(bool disposing) { if (disposing) { - if (itemPlugInRoot != null) { - itemPlugInRoot.Dispose(); - itemPlugInRoot = null; + if (_itemPlugInRoot != null) { + _itemPlugInRoot.Dispose(); + _itemPlugInRoot = null; } } } - public ExternalCommandPlugin() { - } - public IEnumerable<IDestination> Destinations() { foreach(string command in config.commands) { yield return new ExternalCommandDestination(command); @@ -87,7 +84,10 @@ namespace ExternalCommand { LOG.WarnFormat("Found missing commandline for {0}", command); return false; } - if (!File.Exists(config.commandlines[command])) { + string commandline = FilenameHelper.FillVariables(config.commandlines[command], true); + commandline = FilenameHelper.FillCmdVariables(commandline, true); + + if (!File.Exists(commandline)) { LOG.WarnFormat("Found 'invalid' commandline {0} for command {1}", config.commandlines[command], command); return false; } @@ -118,17 +118,17 @@ namespace ExternalCommand { config.commands.Remove(command); } - this.host = pluginHost; - this.myAttributes = myAttributes; + _host = pluginHost; + _myAttributes = myAttributes; - itemPlugInRoot = new ToolStripMenuItem(); - itemPlugInRoot.Tag = host; + _itemPlugInRoot = new ToolStripMenuItem(); + _itemPlugInRoot.Tag = _host; OnIconSizeChanged(this, new PropertyChangedEventArgs("IconSize")); OnLanguageChanged(this, null); - itemPlugInRoot.Click += new System.EventHandler(ConfigMenuClick); + _itemPlugInRoot.Click += new EventHandler(ConfigMenuClick); - PluginUtils.AddToContextMenu(host, itemPlugInRoot); + PluginUtils.AddToContextMenu(_host, _itemPlugInRoot); Language.LanguageChanged += OnLanguageChanged; coreConfig.PropertyChanged += OnIconSizeChanged; return true; @@ -144,7 +144,7 @@ namespace ExternalCommand { try { string exePath = PluginUtils.GetExePath("cmd.exe"); if (exePath != null && File.Exists(exePath)) { - itemPlugInRoot.Image = PluginUtils.GetCachedExeIcon(exePath, 0); + _itemPlugInRoot.Image = PluginUtils.GetCachedExeIcon(exePath, 0); } } catch (Exception ex) { LOG.Warn("Couldn't get the cmd.exe image", ex); @@ -153,13 +153,13 @@ namespace ExternalCommand { } private void OnLanguageChanged(object sender, EventArgs e) { - if (itemPlugInRoot != null) { - itemPlugInRoot.Text = Language.GetString("externalcommand", "contextmenu_configure"); + if (_itemPlugInRoot != null) { + _itemPlugInRoot.Text = Language.GetString("externalcommand", "contextmenu_configure"); } } public virtual void Shutdown() { - LOG.Debug("Shutdown of " + myAttributes.Name); + LOG.Debug("Shutdown of " + _myAttributes.Name); } private void ConfigMenuClick(object sender, EventArgs eventArgs) { diff --git a/GreenshotExternalCommandPlugin/IconCache.cs b/GreenshotExternalCommandPlugin/IconCache.cs index c3e3f16bd..d7eac4410 100644 --- a/GreenshotExternalCommandPlugin/IconCache.cs +++ b/GreenshotExternalCommandPlugin/IconCache.cs @@ -1,5 +1,25 @@ -using System; -using System.Collections.Generic; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ + +using System; using System.Drawing; using System.IO; using Greenshot.IniFile; @@ -7,8 +27,8 @@ using GreenshotPlugin.Core; namespace ExternalCommand { public static class IconCache { - private static ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(IconCache)); + private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(IconCache)); public static Image IconForCommand(string commandName) { Image icon = null; diff --git a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs index 812fd723c..26af92de2 100644 --- a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 247e38b59..a872b6882 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -30,7 +30,7 @@ namespace ExternalCommand { /// </summary> public partial class SettingsForm : ExternalCommandForm { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SettingsForm)); - private static ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); + private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); public SettingsForm() { // diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index ae9d4b030..4890ee2a1 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -24,44 +24,45 @@ using System; using System.Drawing; using System.IO; using System.Windows.Forms; +using GreenshotPlugin.Core; namespace ExternalCommand { /// <summary> /// Description of SettingsFormDetail. /// </summary> public partial class SettingsFormDetail : ExternalCommandForm { - private string commando; - private int commandIndex; - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SettingsFormDetail)); - private static ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); + private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection<ExternalCommandConfiguration>(); + + private readonly string _commando; + private readonly int _commandIndex; public SettingsFormDetail(string commando) { InitializeComponent(); AcceptButton = buttonOk; CancelButton = buttonCancel; - this.commando = commando; + _commando = commando; if(commando != null) { textBox_name.Text = commando; textBox_commandline.Text = config.commandlines[commando]; textBox_arguments.Text = config.arguments[commando]; - commandIndex = config.commands.FindIndex(delegate(string s) { return s == commando; }); + _commandIndex = config.commands.FindIndex(delegate(string s) { return s == commando; }); } else { textBox_arguments.Text = "\"{0}\""; } - OKButtonState(); + OkButtonState(); } void ButtonOkClick(object sender, EventArgs e) { string commandName = textBox_name.Text; string commandLine = textBox_commandline.Text; string arguments = textBox_arguments.Text; - if(commando != null) { - config.commands[commandIndex] = commandName; - config.commandlines.Remove(commando); + if(_commando != null) { + config.commands[_commandIndex] = commandName; + config.commandlines.Remove(_commando); config.commandlines.Add(commandName, commandLine); - config.arguments.Remove(commando); + config.arguments.Remove(_commando); config.arguments.Add(commandName, arguments); } else { config.commands.Add(commandName); @@ -71,15 +72,23 @@ namespace ExternalCommand { } void Button3Click(object sender, EventArgs e) { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "Executables (*.exe, *.bat, *.com)|*.exe; *.bat; *.com|All files (*)|*"; - openFileDialog.FilterIndex = 1; - openFileDialog.CheckFileExists = true; - openFileDialog.Multiselect = false; + OpenFileDialog openFileDialog = new OpenFileDialog + { + Filter = "Executables (*.exe, *.bat, *.com)|*.exe; *.bat; *.com|All files (*)|*", + FilterIndex = 1, + CheckFileExists = true, + Multiselect = false + }; string initialPath = null; - try { + try + { initialPath = Path.GetDirectoryName(textBox_commandline.Text); - } catch { } + } + catch (Exception ex) + { + LOG.WarnFormat("Can't get the initial path via {0}", textBox_commandline.Text); + LOG.Warn("Exception: ", ex); + } if(initialPath != null && Directory.Exists(initialPath)) { openFileDialog.InitialDirectory = initialPath; } else { @@ -92,7 +101,7 @@ namespace ExternalCommand { } } - private void OKButtonState() { + private void OkButtonState() { // Assume OK buttonOk.Enabled = true; textBox_name.BackColor = Color.White; @@ -103,7 +112,7 @@ namespace ExternalCommand { buttonOk.Enabled = false; } // Check if commandname is unique - if(commando == null && !string.IsNullOrEmpty(textBox_name.Text) && config.commands.Contains(textBox_name.Text)) { + if(_commando == null && !string.IsNullOrEmpty(textBox_name.Text) && config.commands.Contains(textBox_name.Text)) { buttonOk.Enabled = false; textBox_name.BackColor = Color.Red; } @@ -111,15 +120,27 @@ namespace ExternalCommand { if(string.IsNullOrEmpty(textBox_commandline.Text)) { buttonOk.Enabled = false; } - // Is the command available? - if(!string.IsNullOrEmpty(textBox_commandline.Text) && !File.Exists(textBox_commandline.Text)) { - buttonOk.Enabled = false; - textBox_commandline.BackColor = Color.Red; + + if (!string.IsNullOrEmpty(textBox_commandline.Text)) + { + // Added this to be more flexible, using the Greenshot var format + string cmdPath = FilenameHelper.FillVariables(textBox_commandline.Text, true); + // And also replace the "DOS" Variables + cmdPath = FilenameHelper.FillCmdVariables(cmdPath, true); + // Is the command available? + if (!File.Exists(cmdPath)) + { + buttonOk.Enabled = false; + textBox_commandline.BackColor = Color.Red; + } } - // Are the arguments in a valid format? - try + // Are the arguments in a valid format? + try { - ExternalCommandDestination.FormatArguments(textBox_arguments.Text, string.Empty); + string arguments = FilenameHelper.FillVariables(textBox_arguments.Text, false); + arguments = FilenameHelper.FillCmdVariables(arguments, false); + + ExternalCommandDestination.FormatArguments(arguments, string.Empty); } catch { @@ -129,16 +150,16 @@ namespace ExternalCommand { } private void textBox_name_TextChanged(object sender, EventArgs e) { - OKButtonState(); + OkButtonState(); } private void textBox_commandline_TextChanged(object sender, EventArgs e) { - OKButtonState(); + OkButtonState(); } private void textBox_arguments_TextChanged(object sender, EventArgs e) { - OKButtonState(); + OkButtonState(); } } diff --git a/GreenshotFlickrPlugin/FlickrDestination.cs b/GreenshotFlickrPlugin/FlickrDestination.cs index 7155937aa..0630ae933 100644 --- a/GreenshotFlickrPlugin/FlickrDestination.cs +++ b/GreenshotFlickrPlugin/FlickrDestination.cs @@ -27,7 +27,7 @@ using log4net; namespace GreenshotFlickrPlugin { public class FlickrDestination : AbstractDestination { private static ILog LOG = LogManager.GetLogger(typeof(FlickrDestination)); - private FlickrPlugin plugin; + private readonly FlickrPlugin plugin; public FlickrDestination(FlickrPlugin plugin) { this.plugin = plugin; } diff --git a/GreenshotFlickrPlugin/FlickrUtils.cs b/GreenshotFlickrPlugin/FlickrUtils.cs index 8737f85e0..08cc9e139 100644 --- a/GreenshotFlickrPlugin/FlickrUtils.cs +++ b/GreenshotFlickrPlugin/FlickrUtils.cs @@ -34,7 +34,7 @@ namespace GreenshotFlickrPlugin { /// </summary> public class FlickrUtils { private static readonly ILog LOG = LogManager.GetLogger(typeof(FlickrUtils)); - private static FlickrConfiguration config = IniConfig.GetIniSection<FlickrConfiguration>(); + private static readonly FlickrConfiguration config = IniConfig.GetIniSection<FlickrConfiguration>(); private const string FLICKR_API_BASE_URL = "https://api.flickr.com/services/"; private const string FLICKR_UPLOAD_URL = FLICKR_API_BASE_URL + "upload/"; // OAUTH diff --git a/GreenshotFlickrPlugin/Forms/FlickrForm.cs b/GreenshotFlickrPlugin/Forms/FlickrForm.cs index 59358436e..f302308b2 100644 --- a/GreenshotFlickrPlugin/Forms/FlickrForm.cs +++ b/GreenshotFlickrPlugin/Forms/FlickrForm.cs @@ -19,7 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; using GreenshotPlugin.Controls; namespace GreenshotFlickrPlugin.Forms { diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.cs index 0835e2ea5..5622670b8 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.cs @@ -18,12 +18,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Drawing; -using System.Windows.Forms; using GreenshotFlickrPlugin.Forms; -using GreenshotPlugin.Core; namespace GreenshotFlickrPlugin { /// <summary> diff --git a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs index 810171a92..445f5e3e7 100644 --- a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotImgurPlugin/Forms/ImgurForm.cs b/GreenshotImgurPlugin/Forms/ImgurForm.cs index d476f9313..35cd2949c 100644 --- a/GreenshotImgurPlugin/Forms/ImgurForm.cs +++ b/GreenshotImgurPlugin/Forms/ImgurForm.cs @@ -19,7 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; using GreenshotPlugin.Controls; namespace GreenshotImgurPlugin { diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index 064fcc21f..b7efa5cb1 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -33,8 +33,8 @@ namespace GreenshotImgurPlugin { /// </summary> public partial class ImgurHistory : ImgurForm { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurHistory)); - private GreenshotColumnSorter columnSorter; - private static ImgurConfiguration config = IniConfig.GetIniSection<ImgurConfiguration>(); + private readonly GreenshotColumnSorter columnSorter; + private static readonly ImgurConfiguration config = IniConfig.GetIniSection<ImgurConfiguration>(); private static ImgurHistory instance; public static void ShowHistory() { @@ -48,7 +48,7 @@ namespace GreenshotImgurPlugin { } private ImgurHistory() { - this.ManualLanguageApply = true; + ManualLanguageApply = true; // // The InitializeComponent() call is required for Windows Forms designer support. // @@ -57,7 +57,7 @@ namespace GreenshotImgurPlugin { CancelButton = finishedButton; // Init sorting columnSorter = new GreenshotColumnSorter(); - this.listview_imgur_uploads.ListViewItemSorter = columnSorter; + listview_imgur_uploads.ListViewItemSorter = columnSorter; columnSorter.SortColumn = 3; columnSorter.Order = SortOrder.Descending; redraw(); @@ -66,7 +66,7 @@ namespace GreenshotImgurPlugin { } ApplyLanguage(); if (config.Credits > 0) { - this.Text = this.Text + " (" + config.Credits + " credits)"; + Text = Text + " (" + config.Credits + " credits)"; } } @@ -169,7 +169,7 @@ namespace GreenshotImgurPlugin { private void FinishedButtonClick(object sender, EventArgs e) { - this.Hide(); + Hide(); } private void OpenButtonClick(object sender, EventArgs e) { @@ -197,7 +197,7 @@ namespace GreenshotImgurPlugin { } // Perform the sort with these new sort options. - this.listview_imgur_uploads.Sort(); + listview_imgur_uploads.Sort(); } diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index 8a35fc06e..40b9d65d3 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -19,9 +19,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Windows.Forms; -using GreenshotPlugin.Core; -using GreenshotPlugin.Controls; namespace GreenshotImgurPlugin { /// <summary> diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index 9002463f3..6f931376f 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -31,7 +31,7 @@ namespace GreenshotImgurPlugin { public class ImgurDestination : AbstractDestination { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurDestination)); private static ImgurConfiguration config = IniConfig.GetIniSection<ImgurConfiguration>(); - private ImgurPlugin plugin = null; + private readonly ImgurPlugin plugin = null; public ImgurDestination(ImgurPlugin plugin) { this.plugin = plugin; @@ -57,7 +57,7 @@ namespace GreenshotImgurPlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadURL = null; exportInformation.ExportMade = plugin.Upload(captureDetails, surface, out uploadURL); exportInformation.Uri = uploadURL; diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index c5c354eec..1a69aee2e 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -80,7 +80,7 @@ namespace GreenshotImgurPlugin { /// <param name="pluginAttribute">My own attributes</param> /// <returns>true if plugin is initialized, false if not (doesn't show)</returns> public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - this.host = (IGreenshotHost)pluginHost; + host = (IGreenshotHost)pluginHost; Attributes = myAttributes; // Get configuration diff --git a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs index 06afabdf8..ba9c51983 100644 --- a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 535a039bf..e0c81c827 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -29,21 +29,21 @@ using Jira; namespace GreenshotJiraPlugin { public partial class JiraForm : Form { - private JiraConnector jiraConnector; + private readonly JiraConnector jiraConnector; private JiraIssue selectedIssue; - private GreenshotColumnSorter columnSorter; - private JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); + private readonly GreenshotColumnSorter columnSorter; + private readonly JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); public JiraForm(JiraConnector jiraConnector) { InitializeComponent(); - this.Icon = GreenshotPlugin.Core.GreenshotResources.getGreenshotIcon(); + Icon = GreenshotResources.getGreenshotIcon(); AcceptButton = uploadButton; CancelButton = cancelButton; initializeComponentText(); - this.columnSorter = new GreenshotColumnSorter(); - this.jiraListView.ListViewItemSorter = columnSorter; + columnSorter = new GreenshotColumnSorter(); + jiraListView.ListViewItemSorter = columnSorter; this.jiraConnector = jiraConnector; @@ -60,9 +60,9 @@ namespace GreenshotJiraPlugin { } private void initializeComponentText() { - this.label_jirafilter.Text = Language.GetString("jira", LangKey.label_jirafilter); - this.label_comment.Text = Language.GetString("jira", LangKey.label_comment); - this.label_filename.Text = Language.GetString("jira", LangKey.label_filename); + label_jirafilter.Text = Language.GetString("jira", LangKey.label_jirafilter); + label_comment.Text = Language.GetString("jira", LangKey.label_comment); + label_filename.Text = Language.GetString("jira", LangKey.label_filename); } private void updateForm() { @@ -188,7 +188,7 @@ namespace GreenshotJiraPlugin { } // Perform the sort with these new sort options. - this.jiraListView.Sort(); + jiraListView.Sort(); } void JiraKeyTextChanged(object sender, EventArgs e) { diff --git a/GreenshotJiraPlugin/Forms/JiraFormBase.cs b/GreenshotJiraPlugin/Forms/JiraFormBase.cs index 6cba807a3..b67d2e947 100644 --- a/GreenshotJiraPlugin/Forms/JiraFormBase.cs +++ b/GreenshotJiraPlugin/Forms/JiraFormBase.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using GreenshotPlugin.Controls; namespace GreenshotJiraPlugin { diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.cs b/GreenshotJiraPlugin/Forms/SettingsForm.cs index 1ecaecfbf..49954efea 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.cs @@ -18,9 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Windows.Forms; -using GreenshotPlugin.Core; namespace GreenshotJiraPlugin { /// <summary> diff --git a/GreenshotJiraPlugin/Jira.cs b/GreenshotJiraPlugin/Jira.cs index cdaaae97a..53fdfa37f 100644 --- a/GreenshotJiraPlugin/Jira.cs +++ b/GreenshotJiraPlugin/Jira.cs @@ -33,8 +33,8 @@ namespace Jira { #region transport classes public class JiraFilter { public JiraFilter(string name, string id) { - this.Name = name; - this.Id = id; + Name = name; + Id = id; } public string Name { get; @@ -48,15 +48,15 @@ namespace Jira { public class JiraIssue { public JiraIssue(string key, DateTime? created, string reporter, string assignee, string project, string summary, string description, string environment, string [] attachmentNames) { - this.Key = key; - this.Created = created; - this.Reporter = reporter; - this.Assignee = assignee; - this.Project = project; - this.Summary = summary; - this.Description = description; - this.Environment = environment; - this.AttachmentNames = attachmentNames; + Key = key; + Created = created; + Reporter = reporter; + Assignee = assignee; + Project = project; + Summary = summary; + Description = description; + Environment = environment; + AttachmentNames = attachmentNames; } public string Key { get; @@ -100,17 +100,17 @@ namespace Jira { public class JiraConnector : IDisposable { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(JiraConnector)); private const string AUTH_FAILED_EXCEPTION_NAME = "com.atlassian.jira.rpc.exception.RemoteAuthenticationException"; - private static JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); + private static readonly JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); public const string DEFAULT_POSTFIX = "/rpc/soap/jirasoapservice-v2?wsdl"; private string credentials; private DateTime loggedInTime = DateTime.Now; private bool loggedIn; private JiraSoapServiceService jira; - private int timeout; + private readonly int timeout; private string url; - private Cache<string, JiraIssue> jiraCache = new Cache<string, JiraIssue>(60 * config.Timeout); - private Cache<string, RemoteUser> userCache = new Cache<string, RemoteUser>(60 * config.Timeout); - private bool suppressBackgroundForm = false; + private readonly Cache<string, JiraIssue> jiraCache = new Cache<string, JiraIssue>(60 * config.Timeout); + private readonly Cache<string, RemoteUser> userCache = new Cache<string, RemoteUser>(60 * config.Timeout); + private readonly bool suppressBackgroundForm = false; public void Dispose() { Dispose(true); @@ -134,8 +134,8 @@ namespace Jira { } public JiraConnector(bool suppressBackgroundForm) { - this.url = config.Url; - this.timeout = config.Timeout; + url = config.Url; + timeout = config.Timeout; this.suppressBackgroundForm = suppressBackgroundForm; createService(); } @@ -171,13 +171,13 @@ namespace Jira { ThreadStart jiraLogin = delegate { LOG.DebugFormat("Loggin in"); try { - this.credentials = jira.login(user, password); + credentials = jira.login(user, password); } catch (Exception) { if (!url.EndsWith("wsdl")) { url = url + "/rpc/soap/jirasoapservice-v2?wsdl"; // recreate the service with the new url createService(); - this.credentials = jira.login(user, password); + credentials = jira.login(user, password); // Worked, store the url in the configuration config.Url = url; IniConfig.Save(); @@ -187,8 +187,8 @@ namespace Jira { } LOG.DebugFormat("Logged in"); - this.loggedInTime = DateTime.Now; - this.loggedIn = true; + loggedInTime = DateTime.Now; + loggedIn = true; }; // Here we do it @@ -204,8 +204,8 @@ namespace Jira { return false; } // Not an authentication issue - this.loggedIn = false; - this.credentials = null; + loggedIn = false; + credentials = null; e.Data.Add("user", user); e.Data.Add("url", url); throw; diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index bd443b37e..71bdd9d9e 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -35,10 +35,10 @@ namespace GreenshotJiraPlugin { /// Description of JiraDestination. /// </summary> public class JiraDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(JiraDestination)); - private static JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); - private JiraPlugin jiraPlugin = null; - private JiraIssue jira = null; + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(JiraDestination)); + private static readonly JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); + private readonly JiraPlugin jiraPlugin = null; + private readonly JiraIssue jira = null; public JiraDestination(JiraPlugin jiraPlugin) { this.jiraPlugin = jiraPlugin; @@ -100,7 +100,7 @@ namespace GreenshotJiraPlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surfaceToUpload, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string filename = Path.GetFileName(FilenameHelper.GetFilename(config.UploadFormat, captureDetails)); SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality, config.UploadReduceColors); if (jira != null) { diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 18e6576b9..b57a7a795 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -101,7 +101,7 @@ namespace GreenshotJiraPlugin { /// <param name="pluginAttribute">My own attributes</param> /// <returns>true if plugin is initialized, false if not (doesn't show)</returns> public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - this.host = (IGreenshotHost)pluginHost; + host = (IGreenshotHost)pluginHost; jiraPluginAttributes = myAttributes; // Register configuration (don't need the configuration itself) diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index cd78c4bde..51e518dfd 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -30,7 +30,7 @@ namespace GreenshotJiraPlugin { /// </summary> public class JiraUtils { private static readonly Regex JIRA_KEY_REGEX = new Regex(@"/browse/([A-Z0-9]+\-[0-9]+)"); - private static JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); + private static readonly JiraConfiguration config = IniConfig.GetIniSection<JiraConfiguration>(); public static List<JiraIssue> GetCurrentJiras() { // Make sure we suppress the login diff --git a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs index 080ba5f3d..c3e1b2a63 100644 --- a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index af7ef4bb0..9c8f0da03 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -43,12 +43,12 @@ namespace Greenshot.Interop { /// <summary> /// Type of the COM object, set on constructor after getting the COM reference /// </summary> - private Type _COMType; + private readonly Type _COMType; /// <summary> /// The type of which method calls are intercepted and executed on the COM object. /// </summary> - private Type _InterceptType; + private readonly Type _InterceptType; #endregion [DllImport("ole32.dll")] @@ -214,9 +214,9 @@ namespace Greenshot.Interop { /// </param> private COMWrapper(object comObject, Type type) : base(type) { - this._COMObject = comObject; - this._COMType = comObject.GetType(); - this._InterceptType = type; + _COMObject = comObject; + _COMType = comObject.GetType(); + _InterceptType = type; } #endregion @@ -228,14 +228,14 @@ namespace Greenshot.Interop { /// sure that the COM object is still cleaned up. /// </summary> ~COMWrapper() { - this.Dispose(false); + Dispose(false); } /// <summary> /// Cleans up the COM object. /// </summary> public void Dispose() { - this.Dispose(true); + Dispose(true); GC.SuppressFinalize(this); } @@ -247,17 +247,17 @@ namespace Greenshot.Interop { /// <see cref="IDisposable"/> interface. /// </param> private void Dispose(bool disposing) { - if (disposing && null != this._COMObject) { - if (Marshal.IsComObject(this._COMObject)) { + if (disposing && null != _COMObject) { + if (Marshal.IsComObject(_COMObject)) { try { - while (Marshal.ReleaseComObject(this._COMObject) > 0); + while (Marshal.ReleaseComObject(_COMObject) > 0); } catch (Exception) { //LOG.WarnFormat("Problem releasing {0}", _COMType); //LOG.Warn("Error: ", ex); } } - this._COMObject = null; + _COMObject = null; } } @@ -272,7 +272,7 @@ namespace Greenshot.Interop { /// The full name of the intercepted type. /// </returns> public override string ToString() { - return this._InterceptType.FullName; + return _InterceptType.FullName; } /// <summary> @@ -282,7 +282,7 @@ namespace Greenshot.Interop { /// The hash code of the wrapped object. /// </returns> public override int GetHashCode() { - return this._COMObject.GetHashCode(); + return _COMObject.GetHashCode(); } /// <summary> @@ -298,7 +298,7 @@ namespace Greenshot.Interop { if (null != value && RemotingServices.IsTransparentProxy(value)) { COMWrapper wrapper = RemotingServices.GetRealProxy(value) as COMWrapper; if (null != wrapper) { - return this._COMObject == wrapper._COMObject; + return _COMObject == wrapper._COMObject; } } @@ -469,15 +469,15 @@ namespace Greenshot.Interop { ParameterInfo parameter; if ("Dispose" == methodName && 0 == argCount && typeof(void) == returnType) { - this.Dispose(); + Dispose(); } else if ("ToString" == methodName && 0 == argCount && typeof(string) == returnType) { - returnValue = this.ToString(); - } else if ("GetType" == methodName && 0 == argCount && typeof(System.Type) == returnType) { - returnValue = this._InterceptType; + returnValue = ToString(); + } else if ("GetType" == methodName && 0 == argCount && typeof(Type) == returnType) { + returnValue = _InterceptType; } else if ("GetHashCode" == methodName && 0 == argCount && typeof(int) == returnType) { - returnValue = this.GetHashCode(); + returnValue = GetHashCode(); } else if ("Equals" == methodName && 1 == argCount && typeof(bool) == returnType) { - returnValue = this.Equals(callMessage.Args[0]); + returnValue = Equals(callMessage.Args[0]); } else if (1 == argCount && typeof(void) == returnType && (methodName.StartsWith("add_") || methodName.StartsWith("remove_"))) { bool removeHandler = methodName.StartsWith("remove_"); methodName = methodName.Substring(removeHandler ? 7 : 4); @@ -487,8 +487,8 @@ namespace Greenshot.Interop { return new ReturnMessage(new ArgumentNullException("handler"), callMessage); } } else { - invokeObject = this._COMObject; - invokeType = this._COMType; + invokeObject = _COMObject; + invokeType = _COMType; if (methodName.StartsWith("get_")) { // Property Get @@ -565,7 +565,7 @@ namespace Greenshot.Interop { if (returnType.IsInterface) { // Wrap the returned value in an intercepting COM wrapper if (Marshal.IsComObject(returnValue)) { - returnValue = COMWrapper.Wrap(returnValue, returnType); + returnValue = Wrap(returnValue, returnType); } } else if (returnType.IsEnum) { // Convert to proper Enum type diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 231786e12..b8ef6a98e 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -26,7 +26,7 @@ namespace Greenshot.Interop { /// </summary> [AttributeUsage(AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] public sealed class ComProgIdAttribute : Attribute { - private string _value; + private readonly string _value; /// <summary> /// Extracts the attribute from the specified type. diff --git a/GreenshotOCRCommand/Properties/AssemblyInfo.cs b/GreenshotOCRCommand/Properties/AssemblyInfo.cs index 419eb53b6..2daec6629 100644 --- a/GreenshotOCRCommand/Properties/AssemblyInfo.cs +++ b/GreenshotOCRCommand/Properties/AssemblyInfo.cs @@ -21,7 +21,6 @@ using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // Allgemeine Informationen über eine Assembly werden über die folgenden // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, diff --git a/GreenshotOCRPlugin/OCRDestination.cs b/GreenshotOCRPlugin/OCRDestination.cs index ac50ad74a..cd745baab 100644 --- a/GreenshotOCRPlugin/OCRDestination.cs +++ b/GreenshotOCRPlugin/OCRDestination.cs @@ -33,7 +33,7 @@ namespace GreenshotOCR { private static OCRConfiguration config = IniConfig.GetIniSection<OCRConfiguration>(); private const int MIN_WIDTH = 130; private const int MIN_HEIGHT = 130; - private OcrPlugin plugin; + private readonly OcrPlugin plugin; public override string Designation { get { @@ -62,7 +62,7 @@ namespace GreenshotOCR { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); exportInformation.ExportMade = plugin.DoOCR(surface) != null; return exportInformation; } diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 8b4440136..c0e3137c9 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -21,7 +21,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Drawing; using System.IO; using System.Windows.Forms; using Greenshot.IniFile; @@ -61,7 +60,7 @@ namespace GreenshotOCR { /// OCR Plugin Greenshot /// </summary> public class OcrPlugin : IGreenshotPlugin { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OcrPlugin)); + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OcrPlugin)); private const string CONFIG_FILENAME = "ocr-config.properties"; private string OCR_COMMAND; private static IGreenshotHost host; diff --git a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs index c524510e1..303fbc1ea 100644 --- a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index 88b1d029a..8fcb4ea90 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -19,15 +19,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ using System; -using System.Windows.Forms; -using GreenshotPlugin.Core; namespace GreenshotOCR { /// <summary> /// Description of SettingsForm. /// </summary> public partial class SettingsForm : OCRForm { - private OCRConfiguration config; + private readonly OCRConfiguration config; public SettingsForm(string [] languages, OCRConfiguration config) { // diff --git a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs index 1b9e6febb..31771ca62 100644 --- a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs +++ b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs @@ -18,16 +18,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Collections.Generic; using System.Drawing; using System.IO; -using System.Windows.Forms; - using GreenshotPlugin.Core; using Greenshot.Plugin; using Greenshot.Interop.Office; -using Greenshot.IniFile; using System.Text.RegularExpressions; namespace GreenshotOfficePlugin { @@ -38,8 +35,8 @@ namespace GreenshotOfficePlugin { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExcelDestination)); private const int ICON_APPLICATION = 0; private const int ICON_WORKBOOK = 1; - private static string exePath = null; - private string workbookName = null; + private static readonly string exePath = null; + private readonly string workbookName = null; static ExcelDestination() { exePath = PluginUtils.GetExePath("EXCEL.EXE"); @@ -107,7 +104,7 @@ namespace GreenshotOfficePlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); bool createdFile = false; string imageFile = captureDetails.Filename; if (imageFile == null || surface.Modified || !Regex.IsMatch(imageFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { diff --git a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs index 9a72feee5..048b039ef 100644 --- a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs @@ -29,11 +29,11 @@ using System.IO; namespace GreenshotOfficePlugin { public class OneNoteDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordDestination)); + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordDestination)); private const int ICON_APPLICATION = 0; public const string DESIGNATION = "OneNote"; - private static string exePath = null; - private OneNotePage page = null; + private static readonly string exePath = null; + private readonly OneNotePage page = null; static OneNoteDestination() { exePath = PluginUtils.GetExePath("ONENOTE.EXE"); @@ -99,7 +99,7 @@ namespace GreenshotOfficePlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); if (page == null) { try { diff --git a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs index 66db19b40..6410e82d5 100644 --- a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs @@ -34,18 +34,18 @@ namespace GreenshotOfficePlugin { /// Description of OutlookDestination. /// </summary> public class OutlookDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OutlookDestination)); + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OutlookDestination)); private const int ICON_APPLICATION = 0; private const int ICON_MEETING = 2; - private static Image mailIcon = GreenshotPlugin.Core.GreenshotResources.getImage("Email.Image"); - private static OfficeConfiguration conf = IniConfig.GetIniSection<OfficeConfiguration>(); - private static string exePath = null; - private static bool isActiveFlag = false; - private static string mapiClient = "Microsoft Outlook"; + private static readonly Image mailIcon = GreenshotResources.getImage("Email.Image"); + private static readonly OfficeConfiguration conf = IniConfig.GetIniSection<OfficeConfiguration>(); + private static readonly string exePath = null; + private static readonly bool isActiveFlag = false; + private static readonly string mapiClient = "Microsoft Outlook"; public const string DESIGNATION = "Outlook"; - private string outlookInspectorCaption; - private OlObjectClass outlookInspectorType; + private readonly string outlookInspectorCaption; + private readonly OlObjectClass outlookInspectorType; static OutlookDestination() { if (EmailConfigHelper.HasOutlook()) { @@ -142,7 +142,7 @@ namespace GreenshotOfficePlugin { /// <param name="captureDetails"></param> /// <returns></returns> public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); // Outlook logic string tmpFile = captureDetails.Filename; if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { diff --git a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs index 30a5d3df5..b3b317cba 100644 --- a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs +++ b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs @@ -18,16 +18,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; + using System.Collections.Generic; using System.Drawing; using System.IO; -using System.Windows.Forms; - using GreenshotPlugin.Core; using Greenshot.Plugin; using Greenshot.Interop.Office; -using Greenshot.IniFile; using System.Text.RegularExpressions; namespace GreenshotOfficePlugin { @@ -39,8 +36,8 @@ namespace GreenshotOfficePlugin { private const int ICON_APPLICATION = 0; private const int ICON_PRESENTATION = 1; - private static string exePath = null; - private string presentationName = null; + private static readonly string exePath = null; + private readonly string presentationName = null; static PowerpointDestination() { exePath = PluginUtils.GetExePath("POWERPNT.EXE"); @@ -109,7 +106,7 @@ namespace GreenshotOfficePlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string tmpFile = captureDetails.Filename; Size imageSize = Size.Empty; if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { diff --git a/GreenshotOfficePlugin/Destinations/WordDestination.cs b/GreenshotOfficePlugin/Destinations/WordDestination.cs index 202b2ee72..b92001cea 100644 --- a/GreenshotOfficePlugin/Destinations/WordDestination.cs +++ b/GreenshotOfficePlugin/Destinations/WordDestination.cs @@ -33,11 +33,11 @@ namespace GreenshotOfficePlugin { /// Description of EmailDestination. /// </summary> public class WordDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordDestination)); + private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordDestination)); private const int ICON_APPLICATION = 0; private const int ICON_DOCUMENT = 1; - private static string exePath = null; - private string documentCaption = null; + private static readonly string exePath = null; + private readonly string documentCaption = null; static WordDestination() { exePath = PluginUtils.GetExePath("WINWORD.EXE"); @@ -51,7 +51,7 @@ namespace GreenshotOfficePlugin { } public WordDestination(string wordCaption) { - this.documentCaption = wordCaption; + documentCaption = wordCaption; } public override string Designation { @@ -104,7 +104,7 @@ namespace GreenshotOfficePlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string tmpFile = captureDetails.Filename; if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 0a5bfd161..5da5de6da 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -20,10 +20,7 @@ */ using System; using System.Collections.Generic; -using System.Text; using System.Reflection; - -using Greenshot.Interop; using System.Drawing; using GreenshotOfficePlugin; using Greenshot.IniFile; diff --git a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs index f2e419411..d152c8ec5 100644 --- a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs @@ -20,7 +20,6 @@ */ using System.Runtime.InteropServices; -using System.Windows.Forms; using Greenshot.Plugin; using GreenshotPlugin.Core; using System; diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index 39e0ea13c..6ecab8c4c 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -24,13 +24,7 @@ using System.Text; using System.IO; using Microsoft.Win32; - -using Greenshot.Interop; using Greenshot.Interop.IE; -using System.Threading; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using GreenshotPlugin.Core; using GreenshotOfficePlugin; using Greenshot.IniFile; diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index bd45749e2..22e26eb00 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -20,9 +20,6 @@ */ using System; using System.Collections.Generic; -using System.Text; - -using Greenshot.Interop; using GreenshotOfficePlugin; using Greenshot.IniFile; @@ -30,7 +27,7 @@ namespace Greenshot.Interop.Office { public class WordExporter { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordExporter)); private static Version wordVersion = null; - private static OfficeConfiguration config = IniConfig.GetIniSection<OfficeConfiguration>(); + private static readonly OfficeConfiguration config = IniConfig.GetIniSection<OfficeConfiguration>(); /// <summary> /// Check if the used version is higher than Office 2003 diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs index 3f1532cef..ad6c9f840 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs @@ -601,11 +601,11 @@ namespace Greenshot.Interop.Office { [FieldOffset(0)] public uint propTag; [FieldOffset(4)] - public uint alignPad; + public readonly uint alignPad; [FieldOffset(8)] public IntPtr Value; [FieldOffset(8)] - public long filler; + public readonly long filler; } /// <summary> @@ -770,7 +770,7 @@ namespace Greenshot.Interop.Office { Marshal.FreeHGlobal(propValue.Value); IMAPIProp mapiProp = (IMAPIProp)Marshal.GetTypedObjectForIUnknown(IUnknown, typeof(IMAPIProp)); return mapiProp.SaveChanges(4) == 0; - } catch (System.Exception ex) { + } catch (Exception ex) { LOG.Error(ex); return false; } finally { diff --git a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs index 79ad89124..a2c7f647e 100644 --- a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs index 560a29b39..dcb077820 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs @@ -18,10 +18,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Windows.Forms; -using GreenshotPlugin.Core; -using GreenshotPlugin.Controls; namespace GreenshotPhotobucketPlugin { /// <summary> diff --git a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs index 68f467c53..11642c24e 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs @@ -33,8 +33,8 @@ namespace GreenshotPhotobucketPlugin { public class PhotobucketDestination : AbstractDestination { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PhotobucketDestination)); private static PhotobucketConfiguration config = IniConfig.GetIniSection<PhotobucketConfiguration>(); - private PhotobucketPlugin plugin = null; - private string albumPath = null; + private readonly PhotobucketPlugin plugin = null; + private readonly string albumPath = null; /// <summary> /// Create a Photobucket destination, which also has the path to the album in it @@ -97,7 +97,7 @@ namespace GreenshotPhotobucketPlugin { /// <param name="captureDetails"></param> /// <returns></returns> public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadURL = null; bool uploaded = plugin.Upload(captureDetails, surface, albumPath, out uploadURL); if (uploaded) { diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index 63fd3f035..3f2a70da7 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -74,7 +74,7 @@ namespace GreenshotPhotobucketPlugin { /// <param name="pluginAttribute">My own attributes</param> /// <returns>true if plugin is initialized, false if not (doesn't show)</returns> public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - this.host = (IGreenshotHost)pluginHost; + host = (IGreenshotHost)pluginHost; Attributes = myAttributes; // Get configuration diff --git a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs index d732925da..acdab0857 100644 --- a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following diff --git a/GreenshotPicasaPlugin/Forms/SettingsForm.cs b/GreenshotPicasaPlugin/Forms/SettingsForm.cs index edb7597f0..1ee8f5594 100644 --- a/GreenshotPicasaPlugin/Forms/SettingsForm.cs +++ b/GreenshotPicasaPlugin/Forms/SettingsForm.cs @@ -17,13 +17,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using System.Drawing; -using System.Windows.Forms; - -using Greenshot.Plugin; -using GreenshotPlugin.Controls; -using GreenshotPlugin.Core; namespace GreenshotPicasaPlugin { /// <summary> diff --git a/GreenshotPicasaPlugin/PicasaDestination.cs b/GreenshotPicasaPlugin/PicasaDestination.cs index 8e489ef09..2a245716a 100644 --- a/GreenshotPicasaPlugin/PicasaDestination.cs +++ b/GreenshotPicasaPlugin/PicasaDestination.cs @@ -28,7 +28,7 @@ namespace GreenshotPicasaPlugin { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PicasaDestination)); private static PicasaConfiguration config = IniConfig.GetIniSection<PicasaConfiguration>(); - private PicasaPlugin plugin = null; + private readonly PicasaPlugin plugin = null; public PicasaDestination(PicasaPlugin plugin) { this.plugin = plugin; } @@ -53,7 +53,7 @@ namespace GreenshotPicasaPlugin { } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(this.Designation, this.Description); + ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadURL = null; bool uploaded = plugin.Upload(captureDetails, surface, out uploadURL); if (uploaded) { diff --git a/GreenshotPicasaPlugin/PicasaPlugin.cs b/GreenshotPicasaPlugin/PicasaPlugin.cs index 7de3b12c9..334cead8c 100644 --- a/GreenshotPicasaPlugin/PicasaPlugin.cs +++ b/GreenshotPicasaPlugin/PicasaPlugin.cs @@ -73,7 +73,7 @@ namespace GreenshotPicasaPlugin { /// <param name="captureHost">Use the ICaptureHost interface to register in the MainContextMenu</param> /// <param name="pluginAttribute">My own attributes</param> public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - this.host = (IGreenshotHost)pluginHost; + host = (IGreenshotHost)pluginHost; Attributes = myAttributes; // Get configuration @@ -84,7 +84,7 @@ namespace GreenshotPicasaPlugin { itemPlugInRoot.Text = Language.GetString("picasa", LangKey.Configure); itemPlugInRoot.Tag = host; itemPlugInRoot.Image = (Image)resources.GetObject("Picasa"); - itemPlugInRoot.Click += new System.EventHandler(ConfigMenuClick); + itemPlugInRoot.Click += new EventHandler(ConfigMenuClick); PluginUtils.AddToContextMenu(host, itemPlugInRoot); Language.LanguageChanged += new LanguageChangedHandler(OnLanguageChanged); return true; @@ -127,7 +127,7 @@ namespace GreenshotPicasaPlugin { SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality); try { string url = null; - new PleaseWaitForm().ShowAndWait(PicasaPlugin.Attributes.Name, Language.GetString("picasa", LangKey.communication_wait), + new PleaseWaitForm().ShowAndWait(Attributes.Name, Language.GetString("picasa", LangKey.communication_wait), delegate() { string filename = Path.GetFileName(FilenameHelper.GetFilename(config.UploadFormat, captureDetails)); string contentType = "image/" + config.UploadFormat.ToString(); diff --git a/GreenshotPicasaPlugin/PicasaUtils.cs b/GreenshotPicasaPlugin/PicasaUtils.cs index 14c8307d1..4aef53b5c 100644 --- a/GreenshotPicasaPlugin/PicasaUtils.cs +++ b/GreenshotPicasaPlugin/PicasaUtils.cs @@ -22,7 +22,6 @@ using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; using System; -using System.Net; using System.Xml; namespace GreenshotPicasaPlugin { diff --git a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs index 4e50cceda..479b13c8e 100644 --- a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs @@ -22,7 +22,6 @@ using Greenshot.Plugin; using System.Reflection; using System.Runtime.InteropServices; -using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 372e67633..1d5b9d5d0 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -441,7 +441,7 @@ namespace GreenshotPlugin.Controls { if (hotkey.LastIndexOf('+') > 0) { hotkey = hotkey.Remove(0,hotkey.LastIndexOf('+')+1).Trim(); } - key = (Keys)Keys.Parse(typeof(Keys), hotkey); + key = (Keys)Enum.Parse(typeof(Keys), hotkey); } return key; } diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index 06b98899f..faf2a75a7 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -74,8 +74,11 @@ namespace GreenshotPlugin.Core { get { List<TV> elements = new List<TV>(); - foreach (TV element in internalCache.Values) { - elements.Add(element); + lock (lockObject) + { + foreach (TV element in internalCache.Values) { + elements.Add(element); + } } foreach (TV element in elements) { yield return element; @@ -105,8 +108,12 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="key"></param> /// <returns>true if the cache contains the key</returns> - public bool Contains(TK key) { - return internalCache.ContainsKey(key); + public bool Contains(TK key) + { + lock (lockObject) + { + return internalCache.ContainsKey(key); + } } /// <summary> diff --git a/GreenshotPlugin/Core/EventDelay.cs b/GreenshotPlugin/Core/EventDelay.cs index 1dbd3d7c7..c1c686107 100644 --- a/GreenshotPlugin/Core/EventDelay.cs +++ b/GreenshotPlugin/Core/EventDelay.cs @@ -26,7 +26,7 @@ namespace GreenshotPlugin.Core { private long lastCheck; private readonly long waitTime; public EventDelay(long ticks) { - this.waitTime = ticks; + waitTime = ticks; } public bool Check() { diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 236f4f2d9..33a41a3a2 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -38,6 +38,7 @@ namespace GreenshotPlugin.Core { // The parameter format is a single alpha followed by the value belonging to the parameter, e.g. : // ${capturetime:d"yyyy-MM-dd HH_mm_ss"} private static readonly Regex VAR_REGEXP = new Regex(@"\${(?<variable>[^:}]+)[:]?(?<parameters>[^}]*)}", RegexOptions.Compiled); + private static readonly Regex CMD_VAR_REGEXP = new Regex(@"%(?<variable>[^%]+)%", RegexOptions.Compiled); private static readonly Regex SPLIT_REGEXP = new Regex(";(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", RegexOptions.Compiled); private const int MAX_TITLE_LENGTH = 80; @@ -74,7 +75,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Remove invalid characters from the path /// </summary> - /// <param name="fullpath">string with the full path to a file</param> + /// <param name="path">string with the full path to a file</param> /// <returns>string with the full path to a file, without invalid characters</returns> public static string MakePathSafe(string path) { // Make the path save! @@ -389,6 +390,51 @@ namespace GreenshotPlugin.Core { return replaceValue; } + /// <summary> + /// "Simply" fill the pattern with environment variables + /// </summary> + /// <param name="pattern">String with pattern %var%</param> + /// <param name="filenameSafeMode">true to make sure everything is filenamesafe</param> + /// <returns>Filled string</returns> + public static string FillCmdVariables(string pattern, bool filenameSafeMode) + { + IDictionary processVars = null; + IDictionary userVars = null; + IDictionary machineVars = null; + try + { + processVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process); + } + catch (Exception e) + { + LOG.Error("Error retrieving EnvironmentVariableTarget.Process", e); + } + + try + { + userVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User); + } + catch (Exception e) + { + LOG.Error("Error retrieving EnvironmentVariableTarget.User", e); + } + + try + { + machineVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); + } + catch (Exception e) + { + LOG.Error("Error retrieving EnvironmentVariableTarget.Machine", e); + } + + return CMD_VAR_REGEXP.Replace(pattern, + delegate (Match m) { + return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); + } + ); + } + /// <summary> /// "Simply" fill the pattern with environment variables /// </summary> @@ -419,7 +465,7 @@ namespace GreenshotPlugin.Core { return VAR_REGEXP.Replace(pattern, delegate(Match m) { - return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); + return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); } ); } diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 27b2b6211..bd6aae4c9 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -101,7 +101,7 @@ namespace GreenshotPlugin.Core { /// </summary> public class SpecialFolderPatternConverter : PatternConverter { override protected void Convert(TextWriter writer, object state) { - Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true); + Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), Option, true); writer.Write(Environment.GetFolderPath(specialFolder)); } } diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index add088da2..23651a7ef 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -1032,7 +1032,7 @@ Greenshot received information from CloudServiceName. You can close this browser // Get response object. using (HttpListenerResponse response = context.Response) { // Write a "close" response. - byte[] buffer = System.Text.Encoding.UTF8.GetBytes(ClosePageResponse.Replace("CloudServiceName", _cloudServiceName)); + byte[] buffer = Encoding.UTF8.GetBytes(ClosePageResponse.Replace("CloudServiceName", _cloudServiceName)); // Write to response stream. response.ContentLength64 = buffer.Length; using (var stream = response.OutputStream) { diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index a3d910e61..e50210a5c 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -110,12 +110,15 @@ namespace GreenshotPlugin.Core { public static Image GetCachedExeIcon(string path, int index) { string cacheKey = string.Format("{0}:{1}", path, index); Image returnValue; - if (!exeIconCache.TryGetValue(cacheKey, out returnValue)) { - lock (exeIconCache) { - if (!exeIconCache.TryGetValue(cacheKey, out returnValue)) { - returnValue = GetExeIcon(path, index); - if (returnValue != null) { - exeIconCache.Add(cacheKey, returnValue); + lock (exeIconCache) + { + if (!exeIconCache.TryGetValue(cacheKey, out returnValue)) { + lock (exeIconCache) { + if (!exeIconCache.TryGetValue(cacheKey, out returnValue)) { + returnValue = GetExeIcon(path, index); + if (returnValue != null) { + exeIconCache.Add(cacheKey, returnValue); + } } } } diff --git a/GreenshotPlugin/Core/SourceForgeHelper.cs b/GreenshotPlugin/Core/SourceForgeHelper.cs index 6ead257d0..c58b6fbb0 100644 --- a/GreenshotPlugin/Core/SourceForgeHelper.cs +++ b/GreenshotPlugin/Core/SourceForgeHelper.cs @@ -85,10 +85,10 @@ namespace GreenshotPlugin.Core { } public SourceforgeFile(string file, string pubdate, string link, string directLink) { - this._file = file; + _file = file; DateTime.TryParse(pubdate, out _pubdate); - this._link = link; - this._directLink = directLink; + _link = link; + _directLink = directLink; } } /// <summary> From 1469f1fa41e56986e20dd09bec2023ad9dcdb5e4 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Sun, 22 May 2016 00:16:06 +0200 Subject: [PATCH 032/170] BUG-1965: Fixed a bug where a 1 pixel wide border around an active window is visible. Probably due to the "shadow" being captured too. --- Greenshot/Forms/MainForm.cs | 2 +- Greenshot/Forms/SettingsForm.cs | 2 +- Greenshot/Helpers/CaptureHelper.cs | 36 +- .../additional_files/readme.txt.template | 1 + GreenshotPlugin/Controls/ThumbnailForm.cs | 4 +- GreenshotPlugin/Core/WindowsHelper.cs | 319 +++++++++--------- GreenshotPlugin/UnmanagedHelpers/DWM.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 10 +- appveyor12.yml | 3 + 9 files changed, 200 insertions(+), 179 deletions(-) diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 686f507d4..19643627a 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -908,7 +908,7 @@ namespace Greenshot { public void AddCaptureWindowMenuItems(ToolStripMenuItem menuItem, EventHandler eventHandler) { menuItem.DropDownItems.Clear(); // check if thumbnailPreview is enabled and DWM is enabled - bool thumbnailPreview = _conf.ThumnailPreview && DWM.isDWMEnabled(); + bool thumbnailPreview = _conf.ThumnailPreview && DWM.IsDwmEnabled(); List<WindowDetails> windows = WindowDetails.GetTopLevelWindows(); foreach(WindowDetails window in windows) { diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 10b8cec7a..59f8c85be 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -146,7 +146,7 @@ namespace Greenshot { private void SetWindowCaptureMode(WindowCaptureMode selectedWindowCaptureMode) { WindowCaptureMode[] availableModes; - if (!DWM.isDWMEnabled()) { + if (!DWM.IsDwmEnabled()) { // Remove DWM from configuration, as DWM is disabled! if (coreConfiguration.WindowCaptureMode == WindowCaptureMode.Aero || coreConfiguration.WindowCaptureMode == WindowCaptureMode.AeroTransparent) { coreConfiguration.WindowCaptureMode = WindowCaptureMode.GDI; diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 5d3868194..fa12e5e30 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -693,7 +693,10 @@ namespace Greenshot.Helpers { } else { _selectedCaptureWindow = WindowDetails.GetActiveWindow(); if (_selectedCaptureWindow != null) { - LOG.DebugFormat("Capturing window: {0} with {1}", _selectedCaptureWindow.Text, _selectedCaptureWindow.WindowRectangle); + if (LOG.IsDebugEnabled) + { + LOG.DebugFormat("Capturing window: {0} with {1}", _selectedCaptureWindow.Text, _selectedCaptureWindow.WindowRectangle); + } } } if (_selectedCaptureWindow == null || (!presupplied && _selectedCaptureWindow.Iconic)) { @@ -731,7 +734,6 @@ namespace Greenshot.Helpers { // Trying workaround, the size 0 arrises with e.g. Toad.exe, has a different Window when minimized WindowDetails linkedWindow = WindowDetails.GetLinkedWindow(windowToCapture); if (linkedWindow != null) { - windowRectangle = linkedWindow.WindowRectangle; windowToCapture = linkedWindow; } else { return null; @@ -777,7 +779,7 @@ namespace Greenshot.Helpers { Rectangle windowRectangle = windowToCapture.WindowRectangle; // When Vista & DWM (Aero) enabled - bool dwmEnabled = DWM.isDWMEnabled(); + bool dwmEnabled = DWM.IsDwmEnabled(); // get process name to be able to exclude certain processes from certain capture modes using (Process process = windowToCapture.Process) { bool isAutoMode = windowCaptureMode == WindowCaptureMode.Auto; @@ -801,7 +803,7 @@ namespace Greenshot.Helpers { windowCaptureMode = WindowCaptureMode.Screen; // Change to GDI, if allowed - if (!windowToCapture.isMetroApp && WindowCapture.IsGdiAllowed(process)) { + if (!windowToCapture.IsMetroApp && WindowCapture.IsGdiAllowed(process)) { if (!dwmEnabled && isWPF(process)) { // do not use GDI, as DWM is not enabled and the application uses PresentationFramework.dll -> isWPF LOG.InfoFormat("Not using GDI for windows of process {0}, as the process uses WPF", process.ProcessName); @@ -812,12 +814,12 @@ namespace Greenshot.Helpers { // Change to DWM, if enabled and allowed if (dwmEnabled) { - if (windowToCapture.isMetroApp || WindowCapture.IsDwmAllowed(process)) { + if (windowToCapture.IsMetroApp || WindowCapture.IsDwmAllowed(process)) { windowCaptureMode = WindowCaptureMode.Aero; } } } else if (windowCaptureMode == WindowCaptureMode.Aero || windowCaptureMode == WindowCaptureMode.AeroTransparent) { - if (!dwmEnabled || (!windowToCapture.isMetroApp && !WindowCapture.IsDwmAllowed(process))) { + if (!dwmEnabled || (!windowToCapture.IsMetroApp && !WindowCapture.IsDwmAllowed(process))) { // Take default screen windowCaptureMode = WindowCaptureMode.Screen; // Change to GDI, if allowed @@ -845,32 +847,32 @@ namespace Greenshot.Helpers { } else { windowToCapture.ToForeground(); } - tmpCapture = windowToCapture.CaptureGDIWindow(captureForWindow); + tmpCapture = windowToCapture.CaptureGdiWindow(captureForWindow); if (tmpCapture != null) { // check if GDI capture any good, by comparing it with the screen content - int blackCountGDI = ImageHelper.CountColor(tmpCapture.Image, Color.Black, false); - int GDIPixels = tmpCapture.Image.Width * tmpCapture.Image.Height; - int blackPercentageGDI = blackCountGDI * 100 / GDIPixels; - if (blackPercentageGDI >= 1) { + int blackCountGdi = ImageHelper.CountColor(tmpCapture.Image, Color.Black, false); + int gdiPixels = tmpCapture.Image.Width * tmpCapture.Image.Height; + int blackPercentageGdi = blackCountGdi * 100 / gdiPixels; + if (blackPercentageGdi >= 1) { int screenPixels = windowRectangle.Width * windowRectangle.Height; using (ICapture screenCapture = new Capture()) { screenCapture.CaptureDetails = captureForWindow.CaptureDetails; if (WindowCapture.CaptureRectangleFromDesktopScreen(screenCapture, windowRectangle) != null) { int blackCountScreen = ImageHelper.CountColor(screenCapture.Image, Color.Black, false); int blackPercentageScreen = blackCountScreen * 100 / screenPixels; - if (screenPixels == GDIPixels) { + if (screenPixels == gdiPixels) { // "easy compare", both have the same size // If GDI has more black, use the screen capture. - if (blackPercentageGDI > blackPercentageScreen) { + if (blackPercentageGdi > blackPercentageScreen) { LOG.Debug("Using screen capture, as GDI had additional black."); // changeing the image will automatically dispose the previous tmpCapture.Image = screenCapture.Image; // Make sure it's not disposed, else the picture is gone! screenCapture.NullImage(); } - } else if (screenPixels < GDIPixels) { + } else if (screenPixels < gdiPixels) { // Screen capture is cropped, window is outside of screen - if (blackPercentageGDI > 50 && blackPercentageGDI > blackPercentageScreen) { + if (blackPercentageGdi > 50 && blackPercentageGdi > blackPercentageScreen) { LOG.Debug("Using screen capture, as GDI had additional black."); // changeing the image will automatically dispose the previous tmpCapture.Image = screenCapture.Image; @@ -896,8 +898,8 @@ namespace Greenshot.Helpers { break; case WindowCaptureMode.Aero: case WindowCaptureMode.AeroTransparent: - if (windowToCapture.isMetroApp || WindowCapture.IsDwmAllowed(process)) { - tmpCapture = windowToCapture.CaptureDWMWindow(captureForWindow, windowCaptureMode, isAutoMode); + if (windowToCapture.IsMetroApp || WindowCapture.IsDwmAllowed(process)) { + tmpCapture = windowToCapture.CaptureDwmWindow(captureForWindow, windowCaptureMode, isAutoMode); } if (tmpCapture != null) { captureForWindow = tmpCapture; diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 3668769d5..f836f567f 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -35,6 +35,7 @@ This version has changes, compared to 1.2.8.12, for the following reported ticke * BUG-1941: Error when creating speech bubble| * BUG-1945: Failure starting Greenshot at system startup| * BUG-1949: Can't delete Imgur upload +* BUG-1965: Activation border around window is visible in the capture * FEATURE-945: Added environment variables to the external command Testing is not finished, use at your own risk... diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index 121798e00..4155eef9f 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -77,10 +77,10 @@ namespace GreenshotPlugin.Controls { SIZE sourceSize; DWM.DwmQueryThumbnailSourceSize(_thumbnailHandle, out sourceSize); int thumbnailHeight = 200; - int thumbnailWidth = (int)(thumbnailHeight * ((float)sourceSize.width / (float)sourceSize.height)); + int thumbnailWidth = (int)(thumbnailHeight * ((float)sourceSize.Width / (float)sourceSize.Height)); if (parentControl != null && thumbnailWidth > parentControl.Width) { thumbnailWidth = parentControl.Width; - thumbnailHeight = (int)(thumbnailWidth * ((float)sourceSize.height / (float)sourceSize.width)); + thumbnailHeight = (int)(thumbnailWidth * ((float)sourceSize.Height / (float)sourceSize.Width)); } Width = thumbnailWidth; Height = thumbnailHeight; diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 0fa642128..08259c1bd 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -26,6 +26,7 @@ using GreenshotPlugin.UnmanagedHelpers; using log4net; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; @@ -34,12 +35,6 @@ using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; -/// <summary> -/// Code for handling with "windows" -/// Main code is taken from vbAccelerator, location: -/// http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows/Enumerating_Windows/article.asp -/// but a LOT of changes/enhancements were made to adapt it for Greenshot. -/// </summary> namespace GreenshotPlugin.Core { #region EnumWindows /// <summary> @@ -139,7 +134,7 @@ namespace GreenshotPlugin.Core { /// <param name="hWnd">Window handle to add</param> /// <returns>True to continue enumeration, False to stop</returns> protected virtual bool OnWindowEnum(IntPtr hWnd) { - if (!WindowDetails.isIgnoreHandle(hWnd)) { + if (!WindowDetails.IsIgnoreHandle(hWnd)) { items.Add(new WindowDetails(hWnd)); } return true; @@ -150,12 +145,16 @@ namespace GreenshotPlugin.Core { // nothing to do } #endregion - } + } #endregion EnumWindows - /// <summary> #region WindowDetails /// <summary> + /// Code for handling with "windows" + /// Main code is taken from vbAccelerator, location: + /// http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows/Enumerating_Windows/article.asp + /// but a LOT of changes/enhancements were made to adapt it for Greenshot. + /// <summary> /// Provides details about a Window returned by the /// enumeration /// </summary> @@ -165,9 +164,9 @@ namespace GreenshotPlugin.Core { private const string METRO_GUTTER_CLASS = "ImmersiveGutter"; private static readonly ILog LOG = LogManager.GetLogger(typeof(WindowDetails)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); - private static readonly List<IntPtr> ignoreHandles = new List<IntPtr>(); - private static readonly List<string> excludeProcessesFromFreeze = new List<string>(); + private static readonly CoreConfiguration Conf = IniConfig.GetIniSection<CoreConfiguration>(); + private static readonly List<IntPtr> IgnoreHandles = new List<IntPtr>(); + private static readonly List<string> ExcludeProcessesFromFreeze = new List<string>(); private static readonly IAppVisibility appVisibility; static WindowDetails() { @@ -180,33 +179,33 @@ namespace GreenshotPlugin.Core { } public static void AddProcessToExcludeFromFreeze(string processname) { - if (!excludeProcessesFromFreeze.Contains(processname)) { - excludeProcessesFromFreeze.Add(processname); + if (!ExcludeProcessesFromFreeze.Contains(processname)) { + ExcludeProcessesFromFreeze.Add(processname); } } - internal static bool isIgnoreHandle(IntPtr handle) { - return ignoreHandles.Contains(handle); + internal static bool IsIgnoreHandle(IntPtr handle) { + return IgnoreHandles.Contains(handle); } - private List<WindowDetails> childWindows; - private IntPtr parentHandle = IntPtr.Zero; - private WindowDetails parent; - private bool frozen; + private List<WindowDetails> _childWindows; + private IntPtr _parentHandle = IntPtr.Zero; + private WindowDetails _parent; + private bool _frozen; - public bool isApp { + public bool IsApp { get { return METRO_WINDOWS_CLASS.Equals(ClassName); } } - public bool isGutter { + public bool IsGutter { get { return METRO_GUTTER_CLASS.Equals(ClassName); } } - public bool isAppLauncher { + public bool IsAppLauncher { get { return METRO_APPLAUNCHER_CLASS.Equals(ClassName); } @@ -215,16 +214,16 @@ namespace GreenshotPlugin.Core { /// <summary> /// Check if this window is the window of a metro app /// </summary> - public bool isMetroApp { + public bool IsMetroApp { get { - return isAppLauncher || isApp; + return IsAppLauncher || IsApp; } } /// <summary> /// The window handle. /// </summary> - private readonly IntPtr hWnd = IntPtr.Zero; + private readonly IntPtr _hWnd = IntPtr.Zero; /// <summary> /// To allow items to be compared, the hash code @@ -257,15 +256,15 @@ namespace GreenshotPlugin.Core { public bool HasChildren { get { - return (childWindows != null) && (childWindows.Count > 0); + return (_childWindows != null) && (_childWindows.Count > 0); } } public void FreezeDetails() { - frozen = true; + _frozen = true; } public void UnfreezeDetails() { - frozen = false; + _frozen = false; } public string ProcessPath { @@ -297,7 +296,7 @@ namespace GreenshotPlugin.Core { LOG.WarnFormat("Couldn't get icon for window {0} due to: {1}", Text, ex.Message); LOG.Warn(ex); } - if (isMetroApp) { + if (IsMetroApp) { // No method yet to get the metro icon return null; } @@ -321,8 +320,8 @@ namespace GreenshotPlugin.Core { IntPtr ICON_BIG = new IntPtr(1); IntPtr ICON_SMALL2 = new IntPtr(2); - IntPtr iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, ICON_BIG, IntPtr.Zero); - if (conf.UseLargeIcons) { + IntPtr iconHandle; + if (Conf.UseLargeIcons) { iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, ICON_BIG, IntPtr.Zero); if (iconHandle == IntPtr.Zero) { iconHandle = User32.GetClassLongWrapper(hwnd, (int)ClassLongIndex.GCL_HICON); @@ -357,7 +356,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="ignoreHandle"></param> public static void RegisterIgnoreHandle(IntPtr ignoreHandle) { - ignoreHandles.Add(ignoreHandle); + IgnoreHandles.Add(ignoreHandle); } /// <summary> @@ -365,24 +364,25 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="ignoreHandle"></param> public static void UnregisterIgnoreHandle(IntPtr ignoreHandle) { - ignoreHandles.Remove(ignoreHandle); + IgnoreHandles.Remove(ignoreHandle); } public List<WindowDetails> Children { get { - if (childWindows == null) { + if (_childWindows == null) { GetChildren(); } - return childWindows; + return _childWindows; } } /// <summary> /// Retrieve all windows with a certain title or classname /// </summary> + /// <param name="windows"></param> /// <param name="titlePattern">The regexp to look for in the title</param> /// <param name="classnamePattern">The regexp to look for in the classname</param> - /// <returns>List<WindowDetails> with all the found windows</returns> + /// <returns>List WindowDetails with all the found windows</returns> private static List<WindowDetails> FindWindow(List<WindowDetails> windows, string titlePattern, string classnamePattern) { List<WindowDetails> foundWindows = new List<WindowDetails>(); Regex titleRegexp = null; @@ -430,16 +430,16 @@ namespace GreenshotPlugin.Core { public IntPtr ParentHandle { get { - if (parentHandle == IntPtr.Zero) { - parentHandle = User32.GetParent(Handle); - parent = null; + if (_parentHandle == IntPtr.Zero) { + _parentHandle = User32.GetParent(Handle); + _parent = null; } - return parentHandle; + return _parentHandle; } set { - if (parentHandle != value) { - parentHandle = value; - parent = null; + if (_parentHandle != value) { + _parentHandle = value; + _parent = null; } } } @@ -448,15 +448,15 @@ namespace GreenshotPlugin.Core { /// </summary> /// <returns>WindowDetails of the parent, or null if none</returns> public WindowDetails GetParent() { - if (parent == null) { - if (parentHandle == IntPtr.Zero) { - parentHandle = User32.GetParent(Handle); + if (_parent == null) { + if (_parentHandle == IntPtr.Zero) { + _parentHandle = User32.GetParent(Handle); } - if (parentHandle != IntPtr.Zero) { - parent = new WindowDetails(parentHandle); + if (_parentHandle != IntPtr.Zero) { + _parent = new WindowDetails(_parentHandle); } } - return parent; + return _parent; } /// <summary> @@ -464,10 +464,10 @@ namespace GreenshotPlugin.Core { /// One should normally use the getter "Children" /// </summary> public List<WindowDetails> GetChildren() { - if (childWindows == null) { + if (_childWindows == null) { return GetChildren(0); } - return childWindows; + return _childWindows; } /// <summary> @@ -475,16 +475,16 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="levelsToGo">Specify how many levels we go in</param> public List<WindowDetails> GetChildren(int levelsToGo) { - if (childWindows == null) { - childWindows = new List<WindowDetails>(); - foreach(WindowDetails childWindow in new WindowsEnumerator().GetWindows(hWnd, null).Items) { - childWindows.Add(childWindow); + if (_childWindows == null) { + _childWindows = new List<WindowDetails>(); + foreach(WindowDetails childWindow in new WindowsEnumerator().GetWindows(_hWnd, null).Items) { + _childWindows.Add(childWindow); if (levelsToGo > 0) { childWindow.GetChildren(levelsToGo-1); } } } - return childWindows; + return _childWindows; } /// <summary> @@ -492,7 +492,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="titlePattern">The regexp to look for in the title</param> /// <param name="classnamePattern">The regexp to look for in the classname</param> - /// <returns>List<WindowDetails> with all the found windows, or an empty list</returns> + /// <returns>List WindowDetails with all the found windows, or an empty list</returns> public List<WindowDetails> FindChildren(string titlePattern, string classnamePattern) { return FindWindow(Children, titlePattern, classnamePattern); } @@ -500,7 +500,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Recursing helper method for the FindPath /// </summary> - /// <param name="classnames">List<string> with classnames</param> + /// <param name="classnames">List string with classnames</param> /// <param name="index">The index in the list to look for</param> /// <returns>WindowDetails if a match was found</returns> private WindowDetails FindPath(List<string> classnames, int index) { @@ -542,6 +542,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Deep scan for a certain classname pattern /// </summary> + /// <param name="windowDetails">Window to scan into</param> /// <param name="classnamePattern">Classname regexp pattern</param> /// <returns>The first WindowDetails found</returns> public static WindowDetails DeepScan(WindowDetails windowDetails, Regex classnamePattern) { @@ -575,7 +576,7 @@ namespace GreenshotPlugin.Core { return null; } WindowDetails windowDetails = new WindowDetails(tmphWnd); - windowDetails.parent = this; + windowDetails._parent = this; return windowDetails; } @@ -584,38 +585,38 @@ namespace GreenshotPlugin.Core { /// </summary> public IntPtr Handle { get { - return hWnd; + return _hWnd; } } - private string text; + private string _text; /// <summary> /// Gets the window's title (caption) /// </summary> public string Text { set { - text = value; + _text = value; } get { - if (text == null) { + if (_text == null) { StringBuilder title = new StringBuilder(260, 260); - User32.GetWindowText(hWnd, title, title.Capacity); - text = title.ToString(); + User32.GetWindowText(_hWnd, title, title.Capacity); + _text = title.ToString(); } - return text; + return _text; } } - private string className; + private string _className; /// <summary> /// Gets the window's class name. /// </summary> public string ClassName { get { - if (className == null) { - className = GetClassName(hWnd); + if (_className == null) { + _className = GetClassName(_hWnd); } - return className; + return _className; } } @@ -624,16 +625,16 @@ namespace GreenshotPlugin.Core { /// </summary> public bool Iconic { get { - if (isMetroApp) { + if (IsMetroApp) { return !Visible; } - return User32.IsIconic(hWnd) || Location.X <= -32000; + return User32.IsIconic(_hWnd) || Location.X <= -32000; } set { if (value) { - User32.SendMessage(hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); + User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); } else { - User32.SendMessage(hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); + User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); } } } @@ -643,7 +644,7 @@ namespace GreenshotPlugin.Core { /// </summary> public bool Maximised { get { - if (isApp) { + if (IsApp) { if (Visible) { Rectangle windowRectangle = WindowRectangle; foreach (Screen screen in Screen.AllScreens) { @@ -656,13 +657,13 @@ namespace GreenshotPlugin.Core { } return false; } - return User32.IsZoomed(hWnd); + return User32.IsZoomed(_hWnd); } set { if (value) { - User32.SendMessage(hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MAXIMIZE, IntPtr.Zero); + User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MAXIMIZE, IntPtr.Zero); } else { - User32.SendMessage(hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); + User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); } } } @@ -679,7 +680,7 @@ namespace GreenshotPlugin.Core { /// </summary> public bool Visible { get { - if (isApp) { + if (IsApp) { Rectangle windowRectangle = WindowRectangle; foreach (Screen screen in Screen.AllScreens) { if (screen.Bounds.Contains(windowRectangle)) { @@ -705,21 +706,21 @@ namespace GreenshotPlugin.Core { } return false; } - if (isGutter) { + if (IsGutter) { // gutter is only made available when it's visible return true; } - if (isAppLauncher) { + if (IsAppLauncher) { return IsAppLauncherVisible; } - return User32.IsWindowVisible(hWnd); + return User32.IsWindowVisible(_hWnd); } } public bool HasParent { get { GetParent(); - return parentHandle != IntPtr.Zero; + return _parentHandle != IntPtr.Zero; } } @@ -751,12 +752,12 @@ namespace GreenshotPlugin.Core { /// Make sure the next call of a cached value is guaranteed the real value /// </summary> public void Reset() { - previousWindowRectangle = Rectangle.Empty; + _previousWindowRectangle = Rectangle.Empty; } - private Rectangle previousWindowRectangle = Rectangle.Empty; - private long lastWindowRectangleRetrieveTime; - private const long CACHE_TIME = TimeSpan.TicksPerSecond * 2; + private Rectangle _previousWindowRectangle = Rectangle.Empty; + private long _lastWindowRectangleRetrieveTime; + private const long CacheTime = TimeSpan.TicksPerSecond * 2; /// <summary> /// Gets the bounding rectangle of the window /// </summary> @@ -764,39 +765,48 @@ namespace GreenshotPlugin.Core { get { // Try to return a cached value long now = DateTime.Now.Ticks; - if (previousWindowRectangle.IsEmpty || !frozen) { - if (previousWindowRectangle.IsEmpty || now - lastWindowRectangleRetrieveTime > CACHE_TIME) { + if (_previousWindowRectangle.IsEmpty || !_frozen) { + if (_previousWindowRectangle.IsEmpty || now - _lastWindowRectangleRetrieveTime > CacheTime) { Rectangle windowRect = Rectangle.Empty; - if (DWM.isDWMEnabled()) { + if (DWM.IsDwmEnabled() && !Maximised) { if (GetExtendedFrameBounds(out windowRect) && Environment.OSVersion.IsWindows10()) { - lastWindowRectangleRetrieveTime = now; - previousWindowRectangle = windowRect; - // DWM does it corectly, just return the window rectangle we just gotten. + _lastWindowRectangleRetrieveTime = now; + // Somehow DWM doesn't calculate it corectly, there is a 1 pixel border around the capture + // Remove this border, currently it's fixed but TODO: Make it depend on the OS? + windowRect.Inflate(-1, -1); + _previousWindowRectangle = windowRect; return windowRect; } } if (windowRect.IsEmpty) { - GetWindowRect(out windowRect); + if (GetWindowRect(out windowRect)) + { + Win32Error error = Win32.GetLastErrorCode(); + LOG.WarnFormat("Couldn't retrieve the windows rectangle: {0}", Win32.GetMessage(error)); + } } // Correction for maximized windows, only if it's not an app - if (!HasParent && !isApp && Maximised) { - Size size = Size.Empty; - GetBorderSize(out size); - windowRect = new Rectangle(windowRect.X + size.Width, windowRect.Y + size.Height, windowRect.Width - (2 * size.Width), windowRect.Height - (2 * size.Height)); + if (!HasParent && !IsApp && Maximised) { + Size size; + // Only if the border size can be retrieved + if (GetBorderSize(out size)) + { + windowRect = new Rectangle(windowRect.X + size.Width, windowRect.Y + size.Height, windowRect.Width - (2 * size.Width), windowRect.Height - (2 * size.Height)); + } } - lastWindowRectangleRetrieveTime = now; + _lastWindowRectangleRetrieveTime = now; // Try to return something valid, by getting returning the previous size if the window doesn't have a Rectangle anymore if (windowRect.IsEmpty) { - return previousWindowRectangle; + return _previousWindowRectangle; } - previousWindowRectangle = windowRect; + _previousWindowRectangle = windowRect; return windowRect; } } - return previousWindowRectangle; + return _previousWindowRectangle; } } @@ -825,8 +835,12 @@ namespace GreenshotPlugin.Core { /// </summary> public Rectangle ClientRectangle { get { - Rectangle clientRect = Rectangle.Empty; - GetClientRect(out clientRect); + Rectangle clientRect; + if (GetClientRect(out clientRect)) + { + Win32Error error = Win32.GetLastErrorCode(); + LOG.WarnFormat("Couldn't retrieve the client rectangle: {0}", Win32.GetMessage(error)); + } return clientRect; } } @@ -846,10 +860,10 @@ namespace GreenshotPlugin.Core { /// </summary> public void Restore() { if (Iconic) { - User32.SendMessage(hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); + User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); } - User32.BringWindowToTop(hWnd); - User32.SetForegroundWindow(hWnd); + User32.BringWindowToTop(_hWnd); + User32.SetForegroundWindow(_hWnd); // Make sure windows has time to perform the action while(Iconic) { Application.DoEvents(); @@ -861,10 +875,10 @@ namespace GreenshotPlugin.Core { /// </summary> public WindowStyleFlags WindowStyle { get { - return (WindowStyleFlags)User32.GetWindowLongWrapper(hWnd, (int)WindowLongIndex.GWL_STYLE); + return (WindowStyleFlags)User32.GetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_STYLE); } set { - User32.SetWindowLongWrapper(hWnd, (int)WindowLongIndex.GWL_STYLE, new IntPtr((long)value)); + User32.SetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_STYLE, new IntPtr((long)value)); } } @@ -887,10 +901,10 @@ namespace GreenshotPlugin.Core { /// </summary> public ExtendedWindowStyleFlags ExtendedWindowStyle { get { - return (ExtendedWindowStyleFlags)User32.GetWindowLongWrapper(hWnd, (int)WindowLongIndex.GWL_EXSTYLE); + return (ExtendedWindowStyleFlags)User32.GetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_EXSTYLE); } set { - User32.SetWindowLongWrapper(hWnd, (int)WindowLongIndex.GWL_EXSTYLE, new IntPtr((uint)value)); + User32.SetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_EXSTYLE, new IntPtr((uint)value)); } } @@ -899,7 +913,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="capture">The capture to fill</param> /// <returns>ICapture</returns> - public ICapture CaptureGDIWindow(ICapture capture) { + public ICapture CaptureGdiWindow(ICapture capture) { Image capturedImage = PrintWindow(); if (capturedImage != null) { capture.Image = capturedImage; @@ -916,7 +930,7 @@ namespace GreenshotPlugin.Core { /// <param name="windowCaptureMode">Wanted WindowCaptureMode</param> /// <param name="autoMode">True if auto modus is used</param> /// <returns>ICapture with the capture</returns> - public ICapture CaptureDWMWindow(ICapture capture, WindowCaptureMode windowCaptureMode, bool autoMode) { + public ICapture CaptureDwmWindow(ICapture capture, WindowCaptureMode windowCaptureMode, bool autoMode) { IntPtr thumbnailHandle = IntPtr.Zero; Form tempForm = null; bool tempFormShown = false; @@ -935,13 +949,13 @@ namespace GreenshotPlugin.Core { SIZE sourceSize; DWM.DwmQueryThumbnailSourceSize(thumbnailHandle, out sourceSize); - if (sourceSize.width <= 0 || sourceSize.height <= 0) { + if (sourceSize.Width <= 0 || sourceSize.Height <= 0) { return null; } // Calculate the location of the temp form Rectangle windowRectangle = WindowRectangle; - Point formLocation = formLocation = windowRectangle.Location; + Point formLocation = windowRectangle.Location; Size borderSize = new Size(); bool doesCaptureFit = false; if (!Maximised) { @@ -950,7 +964,7 @@ namespace GreenshotPlugin.Core { using (Region workingArea = new Region(Screen.PrimaryScreen.Bounds)) { // Find the screen where the window is and check if it fits foreach (Screen screen in Screen.AllScreens) { - if (screen != Screen.PrimaryScreen) { + if (!Equals(screen, Screen.PrimaryScreen)) { workingArea.Union(screen.Bounds); } } @@ -980,32 +994,34 @@ namespace GreenshotPlugin.Core { tempForm.Size = sourceSize.ToSize(); // Prepare rectangle to capture from the screen. - Rectangle captureRectangle = new Rectangle(formLocation.X, formLocation.Y, sourceSize.width, sourceSize.height); + Rectangle captureRectangle = new Rectangle(formLocation.X, formLocation.Y, sourceSize.Width, sourceSize.Height); if (Maximised) { // Correct capture size for maximized window by offsetting the X,Y with the border size - captureRectangle.X += borderSize.Width; - captureRectangle.Y += borderSize.Height; // and subtracting the border from the size (2 times, as we move right/down for the capture without resizing) - captureRectangle.Width -= 2 * borderSize.Width; - captureRectangle.Height -= 2 * borderSize.Height; - } else if (autoMode) { - // check if the capture fits - if (!doesCaptureFit) { - // if GDI is allowed.. (a screenshot won't be better than we comes if we continue) - using (Process thisWindowProcess = Process) { - if (!isMetroApp && WindowCapture.IsGdiAllowed(thisWindowProcess)) { - // we return null which causes the capturing code to try another method. - return null; + captureRectangle.Inflate(borderSize.Width, borderSize.Height); + } else { + captureRectangle.Inflate(-1, -1); + + if (autoMode) { + // check if the capture fits + if (!doesCaptureFit) { + // if GDI is allowed.. (a screenshot won't be better than we comes if we continue) + using (Process thisWindowProcess = Process) { + if (!IsMetroApp && WindowCapture.IsGdiAllowed(thisWindowProcess)) { + // we return null which causes the capturing code to try another method. + return null; + } } } } } - // Prepare the displaying of the Thumbnail - DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES(); - props.Opacity = (byte)255; - props.Visible = true; - props.Destination = new RECT(0, 0, sourceSize.width, sourceSize.height); + DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES + { + Opacity = 255, + Visible = true, + Destination = new RECT(0, 0, sourceSize.Width, sourceSize.Height) + }; DWM.DwmUpdateThumbnailProperties(thumbnailHandle, ref props); tempForm.Show(); tempFormShown = true; @@ -1032,7 +1048,7 @@ namespace GreenshotPlugin.Core { tempForm.BackColor = Color.Black; // Make sure everything is visible tempForm.Refresh(); - if (!isMetroApp) { + if (!IsMetroApp) { // Make sure the application window is active, so the colors & buttons are right ToForeground(); } @@ -1055,7 +1071,7 @@ namespace GreenshotPlugin.Core { if (capturedBitmap == null) { // Remove transparency, this will break the capturing if (!autoMode) { - tempForm.BackColor = Color.FromArgb(255, conf.DWMBackgroundColor.R, conf.DWMBackgroundColor.G, conf.DWMBackgroundColor.B); + tempForm.BackColor = Color.FromArgb(255, Conf.DWMBackgroundColor.R, Conf.DWMBackgroundColor.G, Conf.DWMBackgroundColor.B); } else { Color colorizationColor = DWM.ColorizationColor; // Modify by losing the transparency and increasing the intensity (as if the background color is white) @@ -1064,7 +1080,7 @@ namespace GreenshotPlugin.Core { } // Make sure everything is visible tempForm.Refresh(); - if (!isMetroApp) { + if (!IsMetroApp) { // Make sure the application window is active, so the colors & buttons are right ToForeground(); } @@ -1077,7 +1093,7 @@ namespace GreenshotPlugin.Core { // Not needed for Windows 8 if (!Environment.OSVersion.IsWindows8OrLater()) { // Only if the Inivalue is set, not maximized and it's not a tool window. - if (conf.WindowCaptureRemoveCorners && !Maximised && (ExtendedWindowStyle & ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW) == 0) { + if (Conf.WindowCaptureRemoveCorners && !Maximised && (ExtendedWindowStyle & ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW) == 0) { // Remove corners if (!Image.IsAlphaPixelFormat(capturedBitmap.PixelFormat)) { LOG.Debug("Changing pixelformat to Alpha for the RemoveCorners"); @@ -1122,8 +1138,8 @@ namespace GreenshotPlugin.Core { /// <param name="image">The bitmap to remove the corners from.</param> private void RemoveCorners(Bitmap image) { using (IFastBitmap fastBitmap = FastBitmap.Create(image)) { - for (int y = 0; y < conf.WindowCornerCutShape.Count; y++) { - for (int x = 0; x < conf.WindowCornerCutShape[y]; x++) { + for (int y = 0; y < Conf.WindowCornerCutShape.Count; y++) { + for (int x = 0; x < Conf.WindowCornerCutShape[y]; x++) { fastBitmap.SetColorAt(x, y, Color.Transparent); fastBitmap.SetColorAt(image.Width-1-x, y, Color.Transparent); fastBitmap.SetColorAt(image.Width-1-x, image.Height-1-y, Color.Transparent); @@ -1230,7 +1246,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Helper method to get the Border size for GDI Windows /// </summary> - /// <param name="rectangle">out Rectangle</param> + /// <param name="size">out Size</param> /// <returns>bool true if it worked</returns> private bool GetBorderSize(out Size size) { WindowInfo windowInfo = new WindowInfo(); @@ -1281,7 +1297,7 @@ namespace GreenshotPlugin.Core { return false; } - foreach (string excludeProcess in excludeProcessesFromFreeze) { + foreach (string excludeProcess in ExcludeProcessesFromFreeze) { if (titleOrProcessname.ToLower().Contains(excludeProcess)) { return false; } @@ -1409,7 +1425,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="hWnd">The Window Handle</param> public WindowDetails(IntPtr hWnd) { - this.hWnd = hWnd; + this._hWnd = hWnd; } /// <summary> @@ -1419,7 +1435,7 @@ namespace GreenshotPlugin.Core { public static WindowDetails GetActiveWindow() { IntPtr hWnd = User32.GetForegroundWindow(); if (hWnd != null && hWnd != IntPtr.Zero) { - if (ignoreHandles.Contains(hWnd)) { + if (IgnoreHandles.Contains(hWnd)) { return GetDesktopWindow(); } @@ -1439,7 +1455,7 @@ namespace GreenshotPlugin.Core { public bool IsGreenshot { get { try { - if (!isMetroApp) { + if (!IsMetroApp) { using (Process thisWindowProcess = Process) { return "Greenshot".Equals(thisWindowProcess.MainModule.FileVersionInfo.ProductName); } @@ -1470,7 +1486,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Get all the top level windows, with matching classname /// </summary> - /// <returns>List<WindowDetails> with all the top level windows</returns> + /// <returns>List WindowDetails with all the top level windows</returns> public static List<WindowDetails> GetAllWindows(string classname) { return new WindowsEnumerator().GetWindows(IntPtr.Zero, classname).Items; } @@ -1478,7 +1494,6 @@ namespace GreenshotPlugin.Core { /// <summary> /// Recursive "find children which" /// </summary> - /// <param name="window">Window to look into</param> /// <param name="point">point to check for</param> /// <returns></returns> public WindowDetails FindChildUnderPoint(Point point) { @@ -1507,7 +1522,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Get all the visible top level windows /// </summary> - /// <returns>List<WindowDetails> with all the visible top level windows</returns> + /// <returns>List WindowDetails with all the visible top level windows</returns> public static List<WindowDetails> GetVisibleWindows() { List<WindowDetails> windows = new List<WindowDetails>(); Rectangle screenBounds = WindowCapture.GetScreenBounds(); @@ -1542,7 +1557,7 @@ namespace GreenshotPlugin.Core { /// Get the WindowDetails for all Metro Apps /// These are all Windows with Classname "Windows.UI.Core.CoreWindow" /// </summary> - /// <returns>List<WindowDetails> with visible metro apps</returns> + /// <returns>List WindowDetails with visible metro apps</returns> public static List<WindowDetails> GetMetroApps() { List<WindowDetails> metroApps = new List<WindowDetails>(); // if the appVisibility != null we have Windows 8. @@ -1582,7 +1597,7 @@ namespace GreenshotPlugin.Core { /// <summary> /// Get all the top level windows /// </summary> - /// <returns>List<WindowDetails> with all the top level windows</returns> + /// <returns>List WindowDetails with all the top level windows</returns> public static List<WindowDetails> GetTopLevelWindows() { List<WindowDetails> windows = new List<WindowDetails>(); var possibleTopLevelWindows = GetMetroApps(); @@ -1660,7 +1675,7 @@ namespace GreenshotPlugin.Core { /// Helper method to "active" all windows that are not in the supplied list. /// One should preferably call "GetVisibleWindows" for the oldWindows. /// </summary> - /// <param name="oldWindows">List<WindowDetails> with old windows</param> + /// <param name="oldWindows">List WindowDetails with old windows</param> public static void ActiveNewerWindows(List<WindowDetails> oldWindows) { List<WindowDetails> windowsAfter = GetVisibleWindows(); foreach(WindowDetails window in windowsAfter) { diff --git a/GreenshotPlugin/UnmanagedHelpers/DWM.cs b/GreenshotPlugin/UnmanagedHelpers/DWM.cs index 7a5c77b72..36950eca4 100644 --- a/GreenshotPlugin/UnmanagedHelpers/DWM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/DWM.cs @@ -130,7 +130,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// Helper method for an easy DWM check /// </summary> /// <returns>bool true if DWM is available AND active</returns> - public static bool isDWMEnabled() { + public static bool IsDwmEnabled() { // According to: http://technet.microsoft.com/en-us/subscriptions/aa969538%28v=vs.85%29.aspx // And: http://msdn.microsoft.com/en-us/library/windows/desktop/aa969510%28v=vs.85%29.aspx // DMW is always enabled on Windows 8! So return true and save a check! ;-) diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index e0e3cadcb..b3a8919a5 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -25,17 +25,17 @@ using System.Runtime.InteropServices; namespace GreenshotPlugin.UnmanagedHelpers { [StructLayout(LayoutKind.Sequential), Serializable()] public struct SIZE { - public int width; - public int height; + public int Width; + public int Height; public SIZE(Size size) : this(size.Width, size.Height) { } public SIZE(int width, int height) { - this.width = width; - this.height = height; + Width = width; + Height = height; } public Size ToSize() { - return new Size(width, height); + return new Size(Width, Height); } } [StructLayout(LayoutKind.Sequential), Serializable()] diff --git a/appveyor12.yml b/appveyor12.yml index 05ac9b5b6..5c63431bf 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -67,12 +67,15 @@ deploy: auth_token: secure: 4sYcNGg7byBFtR7EkJHS8d3H3qP0u0LodlJWCV7g/4jEyv3vvVxqzh19zZ6Zgrf1 prerelease: true + draft: true on: build_type: UNSTABLE - provider: GitHub tag: Greenshot-$(build_type)-$(APPVEYOR_BUILD_VERSION) auth_token: secure: 4sYcNGg7byBFtR7EkJHS8d3H3qP0u0LodlJWCV7g/4jEyv3vvVxqzh19zZ6Zgrf1 + prerelease: false + draft: true on: build_type: RELEASE notifications: From bd71f47e95a46642fe6a83bdd76cc4d2a7eed7c2 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Sun, 22 May 2016 13:13:07 +0200 Subject: [PATCH 033/170] Fixed a stacktrace overflow due recursive loop when processing Metro-Apps (Windows 8, which also run on 10) --- GreenshotPlugin/Core/WindowsHelper.cs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 08259c1bd..1cd77fb91 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -159,7 +159,7 @@ namespace GreenshotPlugin.Core { /// enumeration /// </summary> public class WindowDetails : IEquatable<WindowDetails>{ - private const string METRO_WINDOWS_CLASS = "Windows.UI.Core.CoreWindow"; + private const string METRO_WINDOWS_CLASS = "Windows.UI.Core.CoreWindow"; // Windows 10 uses ApplicationFrameWindow private const string METRO_APPLAUNCHER_CLASS = "ImmersiveLauncher"; private const string METRO_GUTTER_CLASS = "ImmersiveGutter"; @@ -193,6 +193,10 @@ namespace GreenshotPlugin.Core { private WindowDetails _parent; private bool _frozen; + /// <summary> + /// This checks if the window is a Windows 8 App + /// For Windows 10 most normal code works, as it's hosted inside "ApplicationFrameWindow" + /// </summary> public bool IsApp { get { return METRO_WINDOWS_CLASS.Equals(ClassName); @@ -644,7 +648,8 @@ namespace GreenshotPlugin.Core { /// </summary> public bool Maximised { get { - if (IsApp) { + if (IsApp) + { if (Visible) { Rectangle windowRectangle = WindowRectangle; foreach (Screen screen in Screen.AllScreens) { @@ -758,6 +763,7 @@ namespace GreenshotPlugin.Core { private Rectangle _previousWindowRectangle = Rectangle.Empty; private long _lastWindowRectangleRetrieveTime; private const long CacheTime = TimeSpan.TicksPerSecond * 2; + /// <summary> /// Gets the bounding rectangle of the window /// </summary> @@ -768,14 +774,25 @@ namespace GreenshotPlugin.Core { if (_previousWindowRectangle.IsEmpty || !_frozen) { if (_previousWindowRectangle.IsEmpty || now - _lastWindowRectangleRetrieveTime > CacheTime) { Rectangle windowRect = Rectangle.Empty; - if (DWM.IsDwmEnabled() && !Maximised) { - if (GetExtendedFrameBounds(out windowRect) && Environment.OSVersion.IsWindows10()) + if (DWM.IsDwmEnabled()) + { + bool gotFrameBounds = GetExtendedFrameBounds(out windowRect); + if (IsApp) + { + // Pre-Cache for Maximised call, this is only on Windows 8 apps (full screen) + if (gotFrameBounds) + { + _previousWindowRectangle = windowRect; + _lastWindowRectangleRetrieveTime = now; + } + } + if (gotFrameBounds && Environment.OSVersion.IsWindows10() && !Maximised) { - _lastWindowRectangleRetrieveTime = now; // Somehow DWM doesn't calculate it corectly, there is a 1 pixel border around the capture // Remove this border, currently it's fixed but TODO: Make it depend on the OS? windowRect.Inflate(-1, -1); _previousWindowRectangle = windowRect; + _lastWindowRectangleRetrieveTime = now; return windowRect; } } From c02bd6ce6253644f1ab32eb922f2173c08a989bd Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Sun, 22 May 2016 13:16:28 +0200 Subject: [PATCH 034/170] Enhanced log statement [skip ci] --- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 1cd77fb91..855dd79be 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -856,7 +856,7 @@ namespace GreenshotPlugin.Core { if (GetClientRect(out clientRect)) { Win32Error error = Win32.GetLastErrorCode(); - LOG.WarnFormat("Couldn't retrieve the client rectangle: {0}", Win32.GetMessage(error)); + LOG.WarnFormat("Couldn't retrieve the client rectangle for {0}, error: {1}", Text, Win32.GetMessage(error)); } return clientRect; } From 31db071394ab275e2a03eeafe2e7af84beac8094 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Mon, 23 May 2016 13:32:52 +0200 Subject: [PATCH 035/170] Trying to replace the Gripper (which is a Label/Control) with adorners (custom code). This should prevent the slow cleanup, reduce resources and speedup the editor. Also we should have better "UI" feedback. This is still very experimental. --- Greenshot/Drawing/Adorners/GripperAdorner.cs | 232 ++++++++++++++++ Greenshot/Drawing/Adorners/TargetAdorner.cs | 177 ++++++++++++ Greenshot/Drawing/DrawableContainer.cs | 257 ++---------------- Greenshot/Drawing/DrawableContainerList.cs | 20 -- Greenshot/Drawing/FreehandContainer.cs | 18 +- Greenshot/Drawing/LineContainer.cs | 6 +- .../Drawing/{Gripper.cs => Positions.cs} | 44 +-- Greenshot/Drawing/SpeechbubbleContainer.cs | 6 +- Greenshot/Drawing/Surface.cs | 81 +++++- Greenshot/Greenshot.csproj | 6 +- Greenshot/Helpers/ScaleHelper.cs | 46 ++-- GreenshotPlugin/GreenshotPlugin.csproj | 1 + .../Interfaces/Drawing/Adorners/IAdorner.cs | 81 ++++++ .../Interfaces/Drawing/Container.cs | 15 +- GreenshotPlugin/Interfaces/Generic.cs | 2 + 15 files changed, 643 insertions(+), 349 deletions(-) create mode 100644 Greenshot/Drawing/Adorners/GripperAdorner.cs create mode 100644 Greenshot/Drawing/Adorners/TargetAdorner.cs rename Greenshot/Drawing/{Gripper.cs => Positions.cs} (54%) create mode 100644 GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs diff --git a/Greenshot/Drawing/Adorners/GripperAdorner.cs b/Greenshot/Drawing/Adorners/GripperAdorner.cs new file mode 100644 index 000000000..532fdcedb --- /dev/null +++ b/Greenshot/Drawing/Adorners/GripperAdorner.cs @@ -0,0 +1,232 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ + +using Greenshot.Helpers; +using Greenshot.Plugin; +using Greenshot.Plugin.Drawing; +using Greenshot.Plugin.Drawing.Adorners; +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Greenshot.Drawing.Adorners +{ + /// <summary> + /// This is the default "legacy" gripper adorner, not the one used for the tail in the speech-bubble + /// </summary> + public class GripperAdorner : IAdorner + { + private Rectangle _boundsBeforeResize = Rectangle.Empty; + private RectangleF _boundsAfterResize = RectangleF.Empty; + private EditStatus _editStatus; + + public Positions Position { get; private set; } + + public GripperAdorner(IDrawableContainer owner, Positions position) + { + Owner = owner; + Position = position; + } + + /// <summary> + /// Returns the cursor for when the mouse is over the adorner + /// </summary> + public Cursor Cursor + { + get + { + bool horizontalSwitched = Owner.Width < 0; + switch (Position) + { + case Positions.TopLeft: + case Positions.BottomRight: + return horizontalSwitched ? Cursors.SizeNWSE : Cursors.SizeNESW; + case Positions.TopRight: + case Positions.BottomLeft: + return horizontalSwitched ? Cursors.SizeNESW : Cursors.SizeNWSE; + case Positions.MiddleLeft: + case Positions.MiddleRight: + return Cursors.SizeWE; + case Positions.TopCenter: + case Positions.BottomCenter: + return Cursors.SizeNS; + default: + return Cursors.SizeAll; + } + } + } + + public IDrawableContainer Owner + { + get; + set; + } + + /// <summary> + /// Test if the point is inside the adorner + /// </summary> + /// <param name="point"></param> + /// <returns></returns> + public bool HitTest(Point point) + { + return Bounds.Contains(point); + } + + /// <summary> + /// Handle the mouse down + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public void MouseDown(object sender, MouseEventArgs mouseEventArgs) + { + _editStatus = EditStatus.RESIZING; + _boundsBeforeResize = new Rectangle(Owner.Left, Owner.Top, Owner.Width, Owner.Height); + _boundsAfterResize = _boundsBeforeResize; + } + + /// <summary> + /// Handle the mouse move + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public void MouseMove(object sender, MouseEventArgs mouseEventArgs) + { + Owner.Invalidate(); + int absX = Owner.Left + mouseEventArgs.X; + int absY = Owner.Top + mouseEventArgs.Y; + + if (_editStatus.Equals(EditStatus.RESIZING)) + { + Owner.MakeBoundsChangeUndoable(false); + + //SuspendLayout(); + + // reset "workbench" rectangle to current bounds + _boundsAfterResize.X = _boundsBeforeResize.X; + _boundsAfterResize.Y = _boundsBeforeResize.Y; + _boundsAfterResize.Width = _boundsBeforeResize.Width; + _boundsAfterResize.Height = _boundsBeforeResize.Height; + + // calculate scaled rectangle + ScaleHelper.Scale(ref _boundsAfterResize, Position, new PointF(absX, absY), ScaleHelper.GetScaleOptions()); + + // apply scaled bounds to this DrawableContainer + Owner.ApplyBounds(_boundsAfterResize); + + //ResumeLayout(); + Owner.DoLayout(); + } + Owner.Invalidate(); + } + + /// <summary> + /// Handle the mouse up + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public void MouseUp(object sender, MouseEventArgs mouseEventArgs) + { + _editStatus = EditStatus.IDLE; + Owner.Invalidate(); + } + + /// <summary> + /// Return the location of the adorner + /// </summary> + public Point Location { + get + { + int x = 0,y = 0; + switch (Position) + { + case Positions.TopLeft: + x = Owner.Left; + y = Owner.Top; + break; + case Positions.BottomLeft: + x = Owner.Left; + y = Owner.Top + Owner.Height; + break; + case Positions.MiddleLeft: + x = Owner.Left; + y = Owner.Top + (Owner.Height / 2); + break; + case Positions.TopCenter: + x = Owner.Left + (Owner.Width / 2); + y = Owner.Top; + break; + case Positions.BottomCenter: + x = Owner.Left + (Owner.Width / 2); + y = Owner.Top + Owner.Height; + break; + case Positions.TopRight: + x = Owner.Left + Owner.Width; + y = Owner.Top; + break; + case Positions.BottomRight: + x = Owner.Left + Owner.Width; + y = Owner.Top + Owner.Height; + break; + case Positions.MiddleRight: + x = Owner.Left + Owner.Width; + y = Owner.Top + (Owner.Height / 2); + break; + } + return new Point(x, y); + } + } + + /// <summary> + /// Return the bounds of the Adorner + /// </summary> + public Rectangle Bounds + { + get + { + Point location = Location; + Size size = new Size(10, 10); + return new Rectangle(location.X - (size.Width / 2), location.Y - (size.Height / 2), size.Width, size.Height); + } + } + + /// <summary> + /// Draw the adorner + /// </summary> + /// <param name="paintEventArgs">PaintEventArgs</param> + public void Paint(PaintEventArgs paintEventArgs) + { + Graphics targetGraphics = paintEventArgs.Graphics; + Rectangle clipRectangle = paintEventArgs.ClipRectangle; + + var bounds = Bounds; + targetGraphics.DrawRectangle(Pens.Black, bounds.X, bounds.Y, bounds.Width , bounds.Height); + } + + /// <summary> + /// We ignore the Transform, as the coordinates are directly bound to those of the owner + /// </summary> + /// <param name="matrix"></param> + public void Transform(Matrix matrix) + { + } + } +} diff --git a/Greenshot/Drawing/Adorners/TargetAdorner.cs b/Greenshot/Drawing/Adorners/TargetAdorner.cs new file mode 100644 index 000000000..965bed5a6 --- /dev/null +++ b/Greenshot/Drawing/Adorners/TargetAdorner.cs @@ -0,0 +1,177 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ + +using Greenshot.Plugin.Drawing; +using Greenshot.Plugin.Drawing.Adorners; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Greenshot.Drawing.Adorners +{ + /// <summary> + /// This implements the special "gripper" for the Speech-Bubble tail + /// </summary> + public class TargetAdorner : IAdorner + { + private EditStatus _editStatus; + + public TargetAdorner(IDrawableContainer owner, Point location) + { + Owner = owner; + Location = location; + } + + /// <summary> + /// Returns the cursor for when the mouse is over the adorner + /// </summary> + public Cursor Cursor + { + get + { + return Cursors.SizeAll; + } + } + + public IDrawableContainer Owner + { + get; + set; + } + + /// <summary> + /// Test if the point is inside the adorner + /// </summary> + /// <param name="point"></param> + /// <returns></returns> + public bool HitTest(Point point) + { + return Bounds.Contains(point); + } + + /// <summary> + /// Handle the mouse down + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public void MouseDown(object sender, MouseEventArgs mouseEventArgs) + { + _editStatus = EditStatus.MOVING; + } + + /// <summary> + /// Handle the mouse move + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public void MouseMove(object sender, MouseEventArgs mouseEventArgs) + { + Owner.Invalidate(); + Point newGripperLocation = new Point(mouseEventArgs.X, mouseEventArgs.Y); + Rectangle surfaceBounds = new Rectangle(0, 0, Owner.Parent.Width, Owner.Parent.Height); + // Check if gripper inside the parent (surface), if not we need to move it inside + // This was made for BUG-1682 + if (!surfaceBounds.Contains(newGripperLocation)) + { + if (newGripperLocation.X > surfaceBounds.Right) + { + newGripperLocation.X = surfaceBounds.Right - 5; + } + if (newGripperLocation.X < surfaceBounds.Left) + { + newGripperLocation.X = surfaceBounds.Left; + } + if (newGripperLocation.Y > surfaceBounds.Bottom) + { + newGripperLocation.Y = surfaceBounds.Bottom - 5; + } + if (newGripperLocation.Y < surfaceBounds.Top) + { + newGripperLocation.Y = surfaceBounds.Top; + } + } + + Location = newGripperLocation; + Owner.Invalidate(); + } + + /// <summary> + /// Handle the mouse up + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public void MouseUp(object sender, MouseEventArgs mouseEventArgs) + { + _editStatus = EditStatus.IDLE; + Owner.Invalidate(); + } + + /// <summary> + /// Return the location of the adorner + /// </summary> + public Point Location + { + get; + set; + } + + /// <summary> + /// Return the bounds of the Adorner + /// </summary> + public Rectangle Bounds + { + get + { + Point location = Location; + Size size = new Size(10, 10); + return new Rectangle(location.X - (size.Width / 2), location.Y - (size.Height / 2), size.Width, size.Height); + } + } + + /// <summary> + /// Draw the adorner + /// </summary> + /// <param name="paintEventArgs">PaintEventArgs</param> + public void Paint(PaintEventArgs paintEventArgs) + { + Graphics targetGraphics = paintEventArgs.Graphics; + Rectangle clipRectangle = paintEventArgs.ClipRectangle; + + var bounds = Bounds; + targetGraphics.DrawRectangle(Pens.Green, bounds.X, bounds.Y, bounds.Width, bounds.Height); + } + + /// <summary> + /// Made sure this adorner is transformed + /// </summary> + /// <param name="matrix">Matrix</param> + public void Transform(Matrix matrix) + { + if (matrix == null) + { + return; + } + Point[] points = new[] { Location }; + matrix.TransformPoints(points); + Location = points[0]; + } + } +} diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index aa4ffce43..cdd7125d6 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -20,6 +20,7 @@ */ using Greenshot.Configuration; +using Greenshot.Drawing.Adorners; using Greenshot.Drawing.Fields; using Greenshot.Drawing.Filters; using Greenshot.Helpers; @@ -27,6 +28,7 @@ using Greenshot.IniFile; using Greenshot.Memento; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; +using Greenshot.Plugin.Drawing.Adorners; using log4net; using System; using System.Collections.Generic; @@ -35,7 +37,8 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; -namespace Greenshot.Drawing { +namespace Greenshot.Drawing +{ /// <summary> /// represents a rectangle, ellipse, label or whatever. Can contain filters, too. /// serializable for clipboard support @@ -73,16 +76,6 @@ namespace Greenshot.Drawing { if (!disposing) { return; } - if (_grippers != null) { - for (int i = 0; i < _grippers.Length; i++) { - if (_grippers[i] == null) { - continue; - } - _grippers[i].Dispose(); - _grippers[i] = null; - } - _grippers = null; - } FieldAggregator aggProps = _parent.FieldAggregator; aggProps.UnbindElement(this); @@ -117,14 +110,13 @@ namespace Greenshot.Drawing { get { return _parent; } set { SwitchParent((Surface)value); } } - [NonSerialized] - protected Gripper[] _grippers; + private bool layoutSuspended; [NonSerialized] - private Gripper _targetGripper; + private TargetAdorner _targetGripper; - public Gripper TargetGripper { + public TargetAdorner TargetGripper { get { return _targetGripper; } @@ -220,6 +212,11 @@ namespace Greenshot.Drawing { } } + /// <summary> + /// List of available Adorners + /// </summary> + public IList<IAdorner> Adorners { get; } = new List<IAdorner>(); + [NonSerialized] // will store current bounds of this DrawableContainer before starting a resize protected Rectangle _boundsBeforeResize = Rectangle.Empty; @@ -329,73 +326,23 @@ namespace Greenshot.Drawing { DoLayout(); } - /// <summary> - /// Move the TargetGripper around, confined to the surface to solve BUG-1682 - /// </summary> - /// <param name="newX"></param> - /// <param name="newY"></param> - protected virtual void TargetGripperMove(int newX, int newY) { - Point newGripperLocation = new Point(newX, newY); - Rectangle surfaceBounds = new Rectangle(0, 0, _parent.Width, _parent.Height); - // Check if gripper inside the parent (surface), if not we need to move it inside - // This was made for BUG-1682 - if (!surfaceBounds.Contains(newGripperLocation)) { - if (newGripperLocation.X > surfaceBounds.Right) { - newGripperLocation.X = surfaceBounds.Right - 5; - } - if (newGripperLocation.X < surfaceBounds.Left) { - newGripperLocation.X = surfaceBounds.Left; - } - if (newGripperLocation.Y > surfaceBounds.Bottom) { - newGripperLocation.Y = surfaceBounds.Bottom - 5; - } - if (newGripperLocation.Y < surfaceBounds.Top) { - newGripperLocation.Y = surfaceBounds.Top; - } - } - - _targetGripper.Left = newGripperLocation.X; - _targetGripper.Top = newGripperLocation.Y; - } - /// <summary> /// Initialize a target gripper /// </summary> protected void InitTargetGripper(Color gripperColor, Point location) { - _targetGripper = new Gripper { - Cursor = Cursors.SizeAll, - BackColor = gripperColor, - Visible = false, - Parent = _parent, - Location = location - }; - _targetGripper.MouseDown += GripperMouseDown; - _targetGripper.MouseUp += GripperMouseUp; - _targetGripper.MouseMove += GripperMouseMove; - if (_parent != null) { - _parent.Controls.Add(_targetGripper); // otherwise we'll attach them in switchParent - } + _targetGripper = new TargetAdorner(this, location); } protected void InitGrippers() { - - _grippers = new Gripper[8]; - for(int i=0; i<_grippers.Length; i++) { - _grippers[i] = new Gripper(); - _grippers[i].Position = i; - _grippers[i].MouseDown += GripperMouseDown; - _grippers[i].MouseUp += GripperMouseUp; - _grippers[i].MouseMove += GripperMouseMove; - _grippers[i].Visible = false; - _grippers[i].Parent = _parent; - } - _grippers[Gripper.POSITION_TOP_CENTER].Cursor = Cursors.SizeNS; - _grippers[Gripper.POSITION_MIDDLE_RIGHT].Cursor = Cursors.SizeWE; - _grippers[Gripper.POSITION_BOTTOM_CENTER].Cursor = Cursors.SizeNS; - _grippers[Gripper.POSITION_MIDDLE_LEFT].Cursor = Cursors.SizeWE; - if (_parent != null) { - _parent.Controls.AddRange(_grippers); // otherwise we'll attach them in switchParent - } + // Create the GripperAdorners + Adorners.Add(new GripperAdorner(this, Positions.TopLeft)); + Adorners.Add(new GripperAdorner(this, Positions.TopCenter)); + Adorners.Add(new GripperAdorner(this, Positions.TopRight)); + Adorners.Add(new GripperAdorner(this, Positions.BottomLeft)); + Adorners.Add(new GripperAdorner(this, Positions.BottomCenter)); + Adorners.Add(new GripperAdorner(this, Positions.BottomRight)); + Adorners.Add(new GripperAdorner(this, Positions.MiddleLeft)); + Adorners.Add(new GripperAdorner(this, Positions.MiddleRight)); } public void SuspendLayout() { @@ -407,101 +354,8 @@ namespace Greenshot.Drawing { DoLayout(); } - protected virtual void DoLayout() { - if (_grippers == null) { - return; - } - if (!layoutSuspended) { - int[] xChoords = {Left-2,Left+Width/2-2,Left+Width-2}; - int[] yChoords = {Top-2,Top+Height/2-2,Top+Height-2}; + public virtual void DoLayout() { - _grippers[Gripper.POSITION_TOP_LEFT].Left = xChoords[0]; _grippers[Gripper.POSITION_TOP_LEFT].Top = yChoords[0]; - _grippers[Gripper.POSITION_TOP_CENTER].Left = xChoords[1]; _grippers[Gripper.POSITION_TOP_CENTER].Top = yChoords[0]; - _grippers[Gripper.POSITION_TOP_RIGHT].Left = xChoords[2]; _grippers[Gripper.POSITION_TOP_RIGHT].Top = yChoords[0]; - _grippers[Gripper.POSITION_MIDDLE_RIGHT].Left = xChoords[2]; _grippers[Gripper.POSITION_MIDDLE_RIGHT].Top = yChoords[1]; - _grippers[Gripper.POSITION_BOTTOM_RIGHT].Left = xChoords[2]; _grippers[Gripper.POSITION_BOTTOM_RIGHT].Top = yChoords[2]; - _grippers[Gripper.POSITION_BOTTOM_CENTER].Left = xChoords[1]; _grippers[Gripper.POSITION_BOTTOM_CENTER].Top = yChoords[2]; - _grippers[Gripper.POSITION_BOTTOM_LEFT].Left = xChoords[0]; _grippers[Gripper.POSITION_BOTTOM_LEFT].Top = yChoords[2]; - _grippers[Gripper.POSITION_MIDDLE_LEFT].Left = xChoords[0]; _grippers[Gripper.POSITION_MIDDLE_LEFT].Top = yChoords[1]; - - if((_grippers[Gripper.POSITION_TOP_LEFT].Left < _grippers[Gripper.POSITION_BOTTOM_RIGHT].Left && _grippers[Gripper.POSITION_TOP_LEFT].Top < _grippers[Gripper.POSITION_BOTTOM_RIGHT].Top) || - _grippers[Gripper.POSITION_TOP_LEFT].Left > _grippers[Gripper.POSITION_BOTTOM_RIGHT].Left && _grippers[Gripper.POSITION_TOP_LEFT].Top > _grippers[Gripper.POSITION_BOTTOM_RIGHT].Top) { - _grippers[Gripper.POSITION_TOP_LEFT].Cursor = Cursors.SizeNWSE; - _grippers[Gripper.POSITION_TOP_RIGHT].Cursor = Cursors.SizeNESW; - _grippers[Gripper.POSITION_BOTTOM_RIGHT].Cursor = Cursors.SizeNWSE; - _grippers[Gripper.POSITION_BOTTOM_LEFT].Cursor = Cursors.SizeNESW; - } else if((_grippers[Gripper.POSITION_TOP_LEFT].Left > _grippers[Gripper.POSITION_BOTTOM_RIGHT].Left && _grippers[Gripper.POSITION_TOP_LEFT].Top < _grippers[Gripper.POSITION_BOTTOM_RIGHT].Top) || - _grippers[Gripper.POSITION_TOP_LEFT].Left < _grippers[Gripper.POSITION_BOTTOM_RIGHT].Left && _grippers[Gripper.POSITION_TOP_LEFT].Top > _grippers[Gripper.POSITION_BOTTOM_RIGHT].Top) { - _grippers[Gripper.POSITION_TOP_LEFT].Cursor = Cursors.SizeNESW; - _grippers[Gripper.POSITION_TOP_RIGHT].Cursor = Cursors.SizeNWSE; - _grippers[Gripper.POSITION_BOTTOM_RIGHT].Cursor = Cursors.SizeNESW; - _grippers[Gripper.POSITION_BOTTOM_LEFT].Cursor = Cursors.SizeNWSE; - } else if (_grippers[Gripper.POSITION_TOP_LEFT].Left == _grippers[Gripper.POSITION_BOTTOM_RIGHT].Left) { - _grippers[Gripper.POSITION_TOP_LEFT].Cursor = Cursors.SizeNS; - _grippers[Gripper.POSITION_BOTTOM_RIGHT].Cursor = Cursors.SizeNS; - } else if (_grippers[Gripper.POSITION_TOP_LEFT].Top == _grippers[Gripper.POSITION_BOTTOM_RIGHT].Top) { - _grippers[Gripper.POSITION_TOP_LEFT].Cursor = Cursors.SizeWE; - _grippers[Gripper.POSITION_BOTTOM_RIGHT].Cursor = Cursors.SizeWE; - } - } - } - - private void GripperMouseDown(object sender, MouseEventArgs e) { - Gripper originatingGripper = (Gripper)sender; - if (originatingGripper != _targetGripper) { - Status = EditStatus.RESIZING; - _boundsBeforeResize = new Rectangle(left, top, width, height); - _boundsAfterResize = new RectangleF(_boundsBeforeResize.Left, _boundsBeforeResize.Top, _boundsBeforeResize.Width, _boundsBeforeResize.Height); - } else { - Status = EditStatus.MOVING; - } - isMadeUndoable = false; - } - - private void GripperMouseUp(object sender, MouseEventArgs e) { - Gripper originatingGripper = (Gripper)sender; - if (originatingGripper != _targetGripper) { - _boundsBeforeResize = Rectangle.Empty; - _boundsAfterResize = RectangleF.Empty; - isMadeUndoable = false; - } - Status = EditStatus.IDLE; - Invalidate(); - } - - private void GripperMouseMove(object sender, MouseEventArgs e) { - Invalidate(); - Gripper originatingGripper = (Gripper)sender; - int absX = originatingGripper.Left + e.X; - int absY = originatingGripper.Top + e.Y; - if (originatingGripper == _targetGripper && Status.Equals(EditStatus.MOVING)) { - TargetGripperMove(absX, absY); - } else if (Status.Equals(EditStatus.RESIZING)) { - // check if we already made this undoable - if (!isMadeUndoable) { - // don't allow another undo until we are finished with this move - isMadeUndoable = true; - // Make undo-able - MakeBoundsChangeUndoable(false); - } - - SuspendLayout(); - - // reset "workbench" rectangle to current bounds - _boundsAfterResize.X = _boundsBeforeResize.X; - _boundsAfterResize.Y = _boundsBeforeResize.Y; - _boundsAfterResize.Width = _boundsBeforeResize.Width; - _boundsAfterResize.Height = _boundsBeforeResize.Height; - - // calculate scaled rectangle - ScaleHelper.Scale(ref _boundsAfterResize, originatingGripper.Position, new PointF(absX, absY), ScaleHelper.GetScaleOptions()); - - // apply scaled bounds to this DrawableContainer - ApplyBounds(_boundsAfterResize); - - ResumeLayout(); - } - Invalidate(); } public bool hasFilters { @@ -558,38 +412,6 @@ namespace Greenshot.Drawing { } } - public virtual void ShowGrippers() { - if (_grippers != null) { - for (int i = 0; i < _grippers.Length; i++) { - if (_grippers[i].Enabled) { - _grippers[i].Show(); - } else { - _grippers[i].Hide(); - } - } - } - if (_targetGripper != null) { - if (_targetGripper.Enabled) { - _targetGripper.Show(); - } else { - _targetGripper.Hide(); - } - } - ResumeLayout(); - } - - public virtual void HideGrippers() { - SuspendLayout(); - if (_grippers != null) { - for (int i = 0; i < _grippers.Length; i++) { - _grippers[i].Hide(); - } - } - if (_targetGripper != null) { - _targetGripper.Hide(); - } - } - public void ResizeTo(int width, int height, int anchorPosition) { SuspendLayout(); Width = width; @@ -659,28 +481,6 @@ namespace Greenshot.Drawing { } protected virtual void SwitchParent(Surface newParent) { - // Target gripper - if (_parent != null && _targetGripper != null) { - _parent.Controls.Remove(_targetGripper); - } - // Normal grippers - if (_parent != null && _grippers != null) { - for (int i=0; i<_grippers.Length; i++) { - _parent.Controls.Remove(_grippers[i]); - } - } else if (_grippers == null) { - InitControls(); - } - _parent = newParent; - // Target gripper - if (_parent != null && _targetGripper != null) { - _parent.Controls.Add(_targetGripper); - } - // Normal grippers - if (_grippers != null) { - _parent.Controls.AddRange(_grippers); - } - foreach(IFilter filter in Filters) { filter.Parent = this; } @@ -778,22 +578,13 @@ namespace Greenshot.Drawing { SuspendLayout(); Point topLeft = new Point(Left, Top); Point bottomRight = new Point(Left + Width, Top + Height); - Point[] points; - if (TargetGripper != null) { - points = new[] {topLeft, bottomRight, TargetGripper.Location}; - - } else { - points = new[] { topLeft, bottomRight }; - } + Point[] points = new[] { topLeft, bottomRight }; matrix.TransformPoints(points); Left = points[0].X; Top = points[0].Y; Width = points[1].X - points[0].X; Height = points[1].Y - points[0].Y; - if (TargetGripper != null) { - TargetGripper.Location = points[points.Length-1]; - } ResumeLayout(); } diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 570949a40..5dd4bb79d 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -171,26 +171,6 @@ namespace Greenshot.Drawing { } } - /// <summary> - /// Hides the grippers of all elements in the list. - /// </summary> - public void HideGrippers() { - foreach(var dc in this) { - dc.HideGrippers(); - dc.Invalidate(); - } - } - - /// <summary> - /// Shows the grippers of all elements in the list. - /// </summary> - public void ShowGrippers() { - foreach(var dc in this) { - dc.ShowGrippers(); - dc.Invalidate(); - } - } - /// <summary> /// Indicates whether on of the elements is clickable at the given location /// </summary> diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index b30937c2b..553d28294 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -63,12 +63,7 @@ namespace Greenshot.Drawing { protected void Init() { - if (_grippers != null) { - for (int i = 0; i < _grippers.Length; i++) { - _grippers[i].Enabled = false; - _grippers[i].Visible = false; - } - } + // TODO: Remove grippers } public override void Transform(Matrix matrix) { @@ -258,17 +253,6 @@ namespace Greenshot.Drawing { return freehandPath.GetHashCode(); } - /// <summary> - /// This is overriden to prevent the grippers to be modified. - /// Might not be the best way... - /// </summary> - protected override void DoLayout() { - } - - public override void ShowGrippers() { - ResumeLayout(); - } - public override bool ClickableAt(int x, int y) { bool returnValue = base.ClickableAt(x, y); if (returnValue) { diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index 4189134ac..37357b4fa 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -53,11 +53,7 @@ namespace Greenshot.Drawing { } protected void Init() { - if (_grippers != null) { - foreach (int index in new[] { 1, 2, 3, 5, 6, 7 }) { - _grippers[index].Enabled = false; - } - } + // TODO: Remove the unneeded grippers (1, 2, 3, 5, 6, 7) } public override void Draw(Graphics graphics, RenderMode rm) { diff --git a/Greenshot/Drawing/Gripper.cs b/Greenshot/Drawing/Positions.cs similarity index 54% rename from Greenshot/Drawing/Gripper.cs rename to Greenshot/Drawing/Positions.cs index 7a65fc57a..63d7cb759 100644 --- a/Greenshot/Drawing/Gripper.cs +++ b/Greenshot/Drawing/Positions.cs @@ -19,38 +19,20 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System.Drawing; -using System.Windows.Forms; - -namespace Greenshot.Drawing { +namespace Greenshot.Drawing +{ /// <summary> - /// Grippers are the dragable edges of our containers + /// Position /// </summary> - public class Gripper : Label { - /// <summary> - /// Constants for anchor/gripper position: - /// 0 1 2 - /// 7 3 - /// 6 5 4 - /// </summary> - public const int POSITION_TOP_LEFT = 0; - public const int POSITION_TOP_CENTER = 1; - public const int POSITION_TOP_RIGHT = 2; - public const int POSITION_MIDDLE_RIGHT = 3; - public const int POSITION_BOTTOM_RIGHT = 4; - public const int POSITION_BOTTOM_CENTER = 5; - public const int POSITION_BOTTOM_LEFT = 6; - public const int POSITION_MIDDLE_LEFT = 7; - - public int Position { - get; - set; - } - - public Gripper() { - Width = 5; - Height = 5; - BackColor = Color.Black; - } + public enum Positions : int + { + TopLeft = 0, + TopCenter = 1, + TopRight = 2, + MiddleRight = 3, + BottomRight = 4, + BottomCenter = 5, + BottomLeft = 6, + MiddleLeft = 7 } } diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index 64ede51e8..6b2f6e7ba 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -118,7 +118,7 @@ namespace Greenshot.Drawing { if (TargetGripper.Location != newGripperLocation) { Invalidate(); - TargetGripperMove(newGripperLocation.X, newGripperLocation.Y); + TargetGripper.Location = newGripperLocation; Invalidate(); } return returnValue; @@ -180,7 +180,7 @@ namespace Greenshot.Drawing { private GraphicsPath CreateTail() { Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Left, TargetGripper.Top); + int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Location.X, TargetGripper.Location.Y); int tailWidth = (Math.Abs(rect.Width) + Math.Abs(rect.Height)) / 20; // This should fix a problem with the tail being to wide @@ -192,7 +192,7 @@ namespace Greenshot.Drawing { tail.AddLine(tailWidth, 0, 0, -tailLength); tail.CloseFigure(); - int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Left, TargetGripper.Top); + int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Location.X, TargetGripper.Location.Y); using (Matrix tailMatrix = new Matrix()) { tailMatrix.Translate(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2)); diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index b28e2a86f..2dd451493 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -21,12 +21,14 @@ using Greenshot.Configuration; using Greenshot.Core; +using Greenshot.Drawing.Adorners; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.IniFile; using Greenshot.Memento; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; +using Greenshot.Plugin.Drawing.Adorners; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; using log4net; @@ -991,12 +993,45 @@ namespace Greenshot.Drawing { Invalidate(); } + /// <summary> + /// Check if an adorner was "hit", and change the cursor if so + /// </summary> + /// <param name="mouseEventArgs">MouseEventArgs</param> + /// <returns>IAdorner</returns> + private IAdorner AdornersHitTest(MouseEventArgs mouseEventArgs) + { + foreach(IDrawableContainer drawableContainer in selectedElements) + { + foreach(IAdorner adorner in drawableContainer.Adorners) + { + if (adorner.HitTest(mouseEventArgs.Location)) + { + if (adorner.Cursor != null) + { + Cursor = adorner.Cursor; + } + return adorner; + } + } + } + return null; + } + /// <summary> /// This event handler is called when someone presses the mouse on a surface. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void SurfaceMouseDown(object sender, MouseEventArgs e) { + + // Handle Adorners + var adorner = AdornersHitTest(e); + if (adorner != null) + { + adorner.MouseDown(sender, e); + return; + } + _mouseStart = e.Location; // check contextmenu @@ -1065,6 +1100,15 @@ namespace Greenshot.Drawing { /// <param name="sender"></param> /// <param name="e"></param> void SurfaceMouseUp(object sender, MouseEventArgs e) { + + // Handle Adorners + var adorner = AdornersHitTest(e); + if (adorner != null) + { + adorner.MouseUp(sender, e); + return; + } + Point currentMouse = new Point(e.X, e.Y); _elements.Status = EditStatus.IDLE; @@ -1098,7 +1142,7 @@ namespace Greenshot.Drawing { } if (selectedElements.Count > 0) { - selectedElements.ShowGrippers(); + selectedElements.Invalidate(); selectedElements.Selected = true; } @@ -1126,6 +1170,14 @@ namespace Greenshot.Drawing { /// <param name="sender"></param> /// <param name="e"></param> void SurfaceMouseMove(object sender, MouseEventArgs e) { + // Handle Adorners + var adorner = AdornersHitTest(e); + if (adorner != null) + { + adorner.MouseMove(sender, e); + return; + } + Point currentMouse = e.Location; if (DrawingMode != DrawingModes.None) { @@ -1137,7 +1189,7 @@ namespace Greenshot.Drawing { if (_mouseDown) { if (_mouseDownElement != null) { // an element is currently dragged _mouseDownElement.Invalidate(); - selectedElements.HideGrippers(); + selectedElements.Invalidate(); // Move the element if (_mouseDownElement.Selected) { if (!_isSurfaceMoveMadeUndoable) { @@ -1203,15 +1255,15 @@ namespace Greenshot.Drawing { public Image GetImageForExport() { return GetImage(RenderMode.EXPORT); } - + /// <summary> /// This is the event handler for the Paint Event, try to draw as little as possible! /// </summary> /// <param name="sender"></param> - /// <param name="e"></param> - void SurfacePaint(object sender, PaintEventArgs e) { - Graphics targetGraphics = e.Graphics; - Rectangle clipRectangle = e.ClipRectangle; + /// <param name="paintEventArgs">PaintEventArgs</param> + void SurfacePaint(object sender, PaintEventArgs paintEventArgs) { + Graphics targetGraphics = paintEventArgs.Graphics; + Rectangle clipRectangle = paintEventArgs.ClipRectangle; if (Rectangle.Empty.Equals(clipRectangle)) { LOG.Debug("Empty cliprectangle??"); return; @@ -1246,6 +1298,15 @@ namespace Greenshot.Drawing { targetGraphics.DrawImage(Image, clipRectangle, clipRectangle, GraphicsUnit.Pixel); _elements.Draw(targetGraphics, null, RenderMode.EDIT, clipRectangle); } + + // Draw adorners last + foreach(var drawableContainer in selectedElements) + { + foreach(var adorner in drawableContainer.Adorners) + { + adorner.Paint(paintEventArgs); + } + } } private void DrawBackground(Graphics targetGraphics, Rectangle clipRectangle) { @@ -1531,9 +1592,9 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="container"></param> public void DeselectElement(IDrawableContainer container) { - container.HideGrippers(); container.Selected = false; selectedElements.Remove(container); + container.Invalidate(); FieldAggregator.UnbindElement(container); if (_movingElementChanged != null) { SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); @@ -1549,10 +1610,9 @@ namespace Greenshot.Drawing { if (HasSelectedElements) { while(selectedElements.Count > 0) { IDrawableContainer element = selectedElements[0]; - element.Invalidate(); - element.HideGrippers(); element.Selected = false; selectedElements.Remove(element); + element.Invalidate(); FieldAggregator.UnbindElement(element); } if (_movingElementChanged != null) { @@ -1570,7 +1630,6 @@ namespace Greenshot.Drawing { public void SelectElement(IDrawableContainer container) { if (!selectedElements.Contains(container)) { selectedElements.Add(container); - container.ShowGrippers(); container.Selected = true; FieldAggregator.BindElement(container); if (_movingElementChanged != null) { diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index ee50aa76a..8a1c1de40 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -75,7 +75,10 @@ <Compile Include="Destinations\FileWithDialogDestination.cs" /> <Compile Include="Destinations\PickerDestination.cs" /> <Compile Include="Destinations\PrinterDestination.cs" /> + <Compile Include="Drawing\Adorners\GripperAdorner.cs" /> + <Compile Include="Drawing\Adorners\TargetAdorner.cs" /> <Compile Include="Drawing\ArrowContainer.cs" /> + <Compile Include="Drawing\Positions.cs" /> <Compile Include="Drawing\StepLabelContainer.cs" /> <Compile Include="Drawing\ImageContainer.cs" /> <Compile Include="Drawing\CropContainer.cs" /> @@ -101,9 +104,6 @@ <Compile Include="Drawing\Filters\MagnifierFilter.cs" /> <Compile Include="Drawing\Filters\PixelizationFilter.cs" /> <Compile Include="Drawing\Filters\BlurFilter.cs" /> - <Compile Include="Drawing\Gripper.cs"> - <SubType>Component</SubType> - </Compile> <Compile Include="Drawing\HighlightContainer.cs" /> <Compile Include="Drawing\IconContainer.cs" /> <Compile Include="Drawing\LineContainer.cs" /> diff --git a/Greenshot/Helpers/ScaleHelper.cs b/Greenshot/Helpers/ScaleHelper.cs index 77557fc73..ffab1be15 100644 --- a/Greenshot/Helpers/ScaleHelper.cs +++ b/Greenshot/Helpers/ScaleHelper.cs @@ -119,15 +119,15 @@ namespace Greenshot.Helpers { return GetAlignedRectangle(newRect, targetRect, alignment); } - public static void RationalScale(ref RectangleF originalRectangle, int resizeHandlePosition, PointF resizeHandleCoords) { + public static void RationalScale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords) { Scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords, ScaleOptions.Rational); } - public static void CenteredScale(ref RectangleF originalRectangle, int resizeHandlePosition, PointF resizeHandleCoords) { + public static void CenteredScale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords) { Scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords, ScaleOptions.Centered); } - public static void Scale(ref RectangleF originalRectangle, int resizeHandlePosition, PointF resizeHandleCoords) { + public static void Scale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords) { Scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords, null); } @@ -138,7 +138,7 @@ namespace Greenshot.Helpers { /// <param name="resizeHandlePosition">position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT</param> /// <param name="resizeHandleCoords">coordinates of the used handle/gripper</param> /// <param name="options">ScaleOptions to use when scaling</param> - public static void Scale(ref RectangleF originalRectangle, int resizeHandlePosition, PointF resizeHandleCoords, ScaleOptions? options) { + public static void Scale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords, ScaleOptions? options) { if(options == null) { options = GetScaleOptions(); } @@ -157,7 +157,7 @@ namespace Greenshot.Helpers { resizeHandleCoords.X -= 2 * (resizeHandleCoords.X - rectCenterX); resizeHandleCoords.Y -= 2 * (resizeHandleCoords.Y - rectCenterY); // scale again with opposing handle and mirrored coordinates - resizeHandlePosition = (resizeHandlePosition + 4) % 8; + resizeHandlePosition = (Positions)((((int)resizeHandlePosition) + 4) % 8); scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords); } else { scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords); @@ -171,47 +171,47 @@ namespace Greenshot.Helpers { /// <param name="originalRectangle">bounds of the current rectangle, scaled values will be written to this reference</param> /// <param name="resizeHandlePosition">position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT</param> /// <param name="resizeHandleCoords">coordinates of the used handle/gripper</param> - private static void scale(ref RectangleF originalRectangle, int resizeHandlePosition, PointF resizeHandleCoords) { + private static void scale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords) { switch(resizeHandlePosition) { - case Gripper.POSITION_TOP_LEFT: + case Positions.TopLeft: originalRectangle.Width = originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X; originalRectangle.Height = originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y; originalRectangle.X = resizeHandleCoords.X; originalRectangle.Y = resizeHandleCoords.Y; break; - case Gripper.POSITION_TOP_CENTER: + case Positions.TopCenter: originalRectangle.Height = originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y; originalRectangle.Y = resizeHandleCoords.Y; break; - case Gripper.POSITION_TOP_RIGHT: + case Positions.TopRight: originalRectangle.Width = resizeHandleCoords.X - originalRectangle.Left; originalRectangle.Height = originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y; originalRectangle.Y = resizeHandleCoords.Y; break; - case Gripper.POSITION_MIDDLE_LEFT: + case Positions.MiddleLeft: originalRectangle.Width = originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X; originalRectangle.X = resizeHandleCoords.X; break; - case Gripper.POSITION_MIDDLE_RIGHT: + case Positions.MiddleRight: originalRectangle.Width = resizeHandleCoords.X - originalRectangle.Left; break; - case Gripper.POSITION_BOTTOM_LEFT: + case Positions.BottomLeft: originalRectangle.Width = originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X; originalRectangle.Height = resizeHandleCoords.Y - originalRectangle.Top; originalRectangle.X = resizeHandleCoords.X; break; - case Gripper.POSITION_BOTTOM_CENTER: + case Positions.BottomCenter: originalRectangle.Height = resizeHandleCoords.Y - originalRectangle.Top; break; - case Gripper.POSITION_BOTTOM_RIGHT: + case Positions.BottomRight: originalRectangle.Width = resizeHandleCoords.X - originalRectangle.Left; originalRectangle.Height = resizeHandleCoords.Y - originalRectangle.Top; break; @@ -221,19 +221,19 @@ namespace Greenshot.Helpers { } } - + /// <summary> /// Adjusts resizeHandleCoords so that aspect ratio is kept after resizing a given rectangle with provided arguments /// </summary> /// <param name="originalRectangle">bounds of the current rectangle</param> - /// <param name="resizeHandlePosition">position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT</param> + /// <param name="resizeHandlePosition">position of the handle/gripper being used for resized, see Position</param> /// <param name="resizeHandleCoords">coordinates of the used handle/gripper, adjusted coordinates will be written to this reference</param> - private static void adjustCoordsForRationalScale(RectangleF originalRectangle, int resizeHandlePosition, ref PointF resizeHandleCoords) { + private static void adjustCoordsForRationalScale(RectangleF originalRectangle, Positions resizeHandlePosition, ref PointF resizeHandleCoords) { float originalRatio = originalRectangle.Width / originalRectangle.Height; float newWidth, newHeight, newRatio; switch(resizeHandlePosition) { - case Gripper.POSITION_TOP_LEFT: + case Positions.TopLeft: newWidth = originalRectangle.Right - resizeHandleCoords.X; newHeight = originalRectangle.Bottom - resizeHandleCoords.Y; newRatio = newWidth / newHeight; @@ -244,7 +244,7 @@ namespace Greenshot.Helpers { } break; - case Gripper.POSITION_TOP_RIGHT: + case Positions.TopRight: newWidth = resizeHandleCoords.X - originalRectangle.Left; newHeight = originalRectangle.Bottom - resizeHandleCoords.Y; newRatio = newWidth / newHeight; @@ -255,7 +255,7 @@ namespace Greenshot.Helpers { } break; - case Gripper.POSITION_BOTTOM_LEFT: + case Positions.BottomLeft: newWidth = originalRectangle.Right - resizeHandleCoords.X; newHeight = resizeHandleCoords.Y - originalRectangle.Top; newRatio = newWidth / newHeight; @@ -266,7 +266,7 @@ namespace Greenshot.Helpers { } break; - case Gripper.POSITION_BOTTOM_RIGHT: + case Positions.BottomRight: newWidth = resizeHandleCoords.X - originalRectangle.Left; newHeight = resizeHandleCoords.Y - originalRectangle.Top; newRatio = newWidth / newHeight; @@ -285,10 +285,10 @@ namespace Greenshot.Helpers { public static void Scale(Rectangle boundsBeforeResize, int cursorX, int cursorY, ref RectangleF boundsAfterResize, IDoubleProcessor angleRoundBehavior) { - Scale(boundsBeforeResize, Gripper.POSITION_TOP_LEFT, cursorX, cursorY, ref boundsAfterResize, angleRoundBehavior); + Scale(boundsBeforeResize, Positions.TopLeft, cursorX, cursorY, ref boundsAfterResize, angleRoundBehavior); } - public static void Scale(Rectangle boundsBeforeResize, int gripperPosition, int cursorX, int cursorY, ref RectangleF boundsAfterResize, IDoubleProcessor angleRoundBehavior) { + public static void Scale(Rectangle boundsBeforeResize, Positions gripperPosition, int cursorX, int cursorY, ref RectangleF boundsAfterResize, IDoubleProcessor angleRoundBehavior) { ScaleOptions opts = GetScaleOptions(); diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 917a12654..bef018b9f 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -66,6 +66,7 @@ <Compile Include="IEInterop\IHTMLWindow3.cs" /> <Compile Include="IEInterop\IHTMLWindow4.cs" /> <Compile Include="IEInterop\IWebBrowser2.cs" /> + <Compile Include="Interfaces\Drawing\Adorners\IAdorner.cs" /> <Compile Include="Interop\Base.cs" /> <Compile Include="Interop\ComProgIdAttribute.cs" /> <Compile Include="Interop\COMWrapper.cs" /> diff --git a/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs b/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs new file mode 100644 index 000000000..cf3c3fa70 --- /dev/null +++ b/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs @@ -0,0 +1,81 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ + +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Greenshot.Plugin.Drawing.Adorners +{ + public interface IAdorner + { + /// <summary> + /// The owner of this adorner + /// </summary> + IDrawableContainer Owner { get; } + + /// <summary> + /// Is the current point "over" the Adorner? + /// If this is the case, the + /// </summary> + /// <param name="point">Point to test</param> + /// <returns>true if so</returns> + bool HitTest(Point point); + + /// <summary> + /// Handle the MouseDown event + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs">MouseEventArgs</param> + void MouseDown(object sender, MouseEventArgs mouseEventArgs); + + /// <summary> + /// Handle the MouseUp event + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs">MouseEventArgs</param> + void MouseUp(object sender, MouseEventArgs mouseEventArgs); + + /// <summary> + /// Handle the MouseMove event + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs">MouseEventArgs</param> + void MouseMove(object sender, MouseEventArgs mouseEventArgs); + + /// <summary> + /// Gets the cursor that should be displayed for this behavior. + /// </summary> + Cursor Cursor { get; } + + /// <summary> + /// Draw the adorner + /// </summary> + /// <param name="paintEventArgs">PaintEventArgs</param> + void Paint(PaintEventArgs paintEventArgs); + + /// <summary> + /// Called if the owner is transformed + /// </summary> + /// <param name="matrix">Matrix</param> + void Transform(Matrix matrix); + } +} diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index 7be49e852..cd96f774b 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -24,6 +24,8 @@ using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Windows.Forms; using System.ComponentModel; +using System.Collections.Generic; +using Greenshot.Plugin.Drawing.Adorners; namespace Greenshot.Plugin.Drawing { public enum RenderMode {EDIT, EXPORT}; @@ -73,7 +75,11 @@ namespace Greenshot.Plugin.Drawing { Rectangle DrawingBounds { get; } - + + void ApplyBounds(RectangleF newBounds); + + void DoLayout(); + bool hasFilters { get; } @@ -85,8 +91,6 @@ namespace Greenshot.Plugin.Drawing { void AlignToParent(HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment); void Invalidate(); bool ClickableAt(int x, int y); - void HideGrippers(); - void ShowGrippers(); void MoveBy(int x, int y); void Transform(Matrix matrix); bool HandleMouseDown(int x, int y); @@ -97,6 +101,11 @@ namespace Greenshot.Plugin.Drawing { EditStatus DefaultEditMode { get; } + + /// <summary> + /// Available adorners for the DrawableContainer + /// </summary> + IList<IAdorner> Adorners { get; } } public interface ITextContainer: IDrawableContainer { diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 73e6c2cf6..ed49327dd 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -198,5 +198,7 @@ namespace Greenshot.Plugin { get; set; } + int Width { get; } + int Height { get; } } } \ No newline at end of file From 5b2d5b1397957020ff08e03a30e82dc287addc79 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Mon, 23 May 2016 15:39:21 +0200 Subject: [PATCH 036/170] Fixed most adorner related drawing issues, need to test a few more (freehand) --- Greenshot/Drawing/Adorners/AbstractAdorner.cs | 147 ++++++++++++++++++ Greenshot/Drawing/Adorners/GripperAdorner.cs | 130 ++++++---------- Greenshot/Drawing/Adorners/TargetAdorner.cs | 83 ++-------- Greenshot/Drawing/DrawableContainer.cs | 1 + Greenshot/Drawing/Surface.cs | 11 +- Greenshot/Greenshot.csproj | 1 + .../Interfaces/Drawing/Adorners/IAdorner.cs | 10 ++ 7 files changed, 223 insertions(+), 160 deletions(-) create mode 100644 Greenshot/Drawing/Adorners/AbstractAdorner.cs diff --git a/Greenshot/Drawing/Adorners/AbstractAdorner.cs b/Greenshot/Drawing/Adorners/AbstractAdorner.cs new file mode 100644 index 000000000..685ec779f --- /dev/null +++ b/Greenshot/Drawing/Adorners/AbstractAdorner.cs @@ -0,0 +1,147 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ + +using Greenshot.Plugin.Drawing; +using Greenshot.Plugin.Drawing.Adorners; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using System; + +namespace Greenshot.Drawing.Adorners +{ + public class AbstractAdorner : IAdorner + { + public virtual EditStatus EditStatus { get; protected set; } = EditStatus.IDLE; + + protected Size _size = new Size(4, 4); + + public AbstractAdorner(IDrawableContainer owner) + { + Owner = owner; + } + + /// <summary> + /// Returns the cursor for when the mouse is over the adorner + /// </summary> + public virtual Cursor Cursor + { + get + { + return Cursors.SizeAll; + } + } + + public virtual IDrawableContainer Owner + { + get; + set; + } + + /// <summary> + /// Test if the point is inside the adorner + /// </summary> + /// <param name="point"></param> + /// <returns></returns> + public virtual bool HitTest(Point point) + { + Rectangle hitBounds = Bounds; + hitBounds.Inflate(3, 3); + return hitBounds.Contains(point); + } + + /// <summary> + /// Handle the mouse down + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public virtual void MouseDown(object sender, MouseEventArgs mouseEventArgs) + { + } + + /// <summary> + /// Handle the mouse move + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public virtual void MouseMove(object sender, MouseEventArgs mouseEventArgs) + { + } + + /// <summary> + /// Handle the mouse up + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public virtual void MouseUp(object sender, MouseEventArgs mouseEventArgs) + { + EditStatus = EditStatus.IDLE; + } + + /// <summary> + /// Return the location of the adorner + /// </summary> + public virtual Point Location + { + get; + set; + } + + /// <summary> + /// Return the bounds of the Adorner + /// </summary> + public virtual Rectangle Bounds + { + get + { + Point location = Location; + return new Rectangle(location.X - (_size.Width / 2), location.Y - (_size.Height / 2), _size.Width, _size.Height); + } + } + + /// <summary> + /// The adorner is active if the edit status is not idle or undrawn + /// </summary> + public virtual bool IsActive + { + get + { + return EditStatus != EditStatus.IDLE && EditStatus != EditStatus.UNDRAWN; + } + } + + /// <summary> + /// Draw the adorner + /// </summary> + /// <param name="paintEventArgs">PaintEventArgs</param> + public virtual void Paint(PaintEventArgs paintEventArgs) + { + } + + /// <summary> + /// We ignore the Transform, as the coordinates are directly bound to those of the owner + /// </summary> + /// <param name="matrix"></param> + public virtual void Transform(Matrix matrix) + { + } + } +} diff --git a/Greenshot/Drawing/Adorners/GripperAdorner.cs b/Greenshot/Drawing/Adorners/GripperAdorner.cs index 532fdcedb..a550f5195 100644 --- a/Greenshot/Drawing/Adorners/GripperAdorner.cs +++ b/Greenshot/Drawing/Adorners/GripperAdorner.cs @@ -20,49 +20,49 @@ */ using Greenshot.Helpers; -using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using Greenshot.Plugin.Drawing.Adorners; -using System; using System.Drawing; -using System.Windows.Forms; using System.Drawing.Drawing2D; +using System.Windows.Forms; namespace Greenshot.Drawing.Adorners { /// <summary> /// This is the default "legacy" gripper adorner, not the one used for the tail in the speech-bubble /// </summary> - public class GripperAdorner : IAdorner + public class GripperAdorner : AbstractAdorner { private Rectangle _boundsBeforeResize = Rectangle.Empty; private RectangleF _boundsAfterResize = RectangleF.Empty; - private EditStatus _editStatus; public Positions Position { get; private set; } - public GripperAdorner(IDrawableContainer owner, Positions position) + public GripperAdorner(IDrawableContainer owner, Positions position) : base(owner) { - Owner = owner; Position = position; } /// <summary> /// Returns the cursor for when the mouse is over the adorner /// </summary> - public Cursor Cursor + public override Cursor Cursor { get { - bool horizontalSwitched = Owner.Width < 0; + bool isNotSwitched = Owner.Width >= 0; + if (Owner.Height < 0) + { + isNotSwitched = !isNotSwitched; + } switch (Position) { case Positions.TopLeft: case Positions.BottomRight: - return horizontalSwitched ? Cursors.SizeNWSE : Cursors.SizeNESW; + return isNotSwitched ? Cursors.SizeNWSE : Cursors.SizeNESW; case Positions.TopRight: case Positions.BottomLeft: - return horizontalSwitched ? Cursors.SizeNESW : Cursors.SizeNWSE; + return isNotSwitched ? Cursors.SizeNESW : Cursors.SizeNWSE; case Positions.MiddleLeft: case Positions.MiddleRight: return Cursors.SizeWE; @@ -75,30 +75,14 @@ namespace Greenshot.Drawing.Adorners } } - public IDrawableContainer Owner - { - get; - set; - } - - /// <summary> - /// Test if the point is inside the adorner - /// </summary> - /// <param name="point"></param> - /// <returns></returns> - public bool HitTest(Point point) - { - return Bounds.Contains(point); - } - /// <summary> /// Handle the mouse down /// </summary> /// <param name="sender"></param> /// <param name="mouseEventArgs"></param> - public void MouseDown(object sender, MouseEventArgs mouseEventArgs) + public override void MouseDown(object sender, MouseEventArgs mouseEventArgs) { - _editStatus = EditStatus.RESIZING; + EditStatus = EditStatus.RESIZING; _boundsBeforeResize = new Rectangle(Owner.Left, Owner.Top, Owner.Width, Owner.Height); _boundsAfterResize = _boundsBeforeResize; } @@ -108,51 +92,39 @@ namespace Greenshot.Drawing.Adorners /// </summary> /// <param name="sender"></param> /// <param name="mouseEventArgs"></param> - public void MouseMove(object sender, MouseEventArgs mouseEventArgs) + public override void MouseMove(object sender, MouseEventArgs mouseEventArgs) { - Owner.Invalidate(); - int absX = Owner.Left + mouseEventArgs.X; - int absY = Owner.Top + mouseEventArgs.Y; - - if (_editStatus.Equals(EditStatus.RESIZING)) + if (EditStatus != EditStatus.RESIZING) { - Owner.MakeBoundsChangeUndoable(false); - - //SuspendLayout(); - - // reset "workbench" rectangle to current bounds - _boundsAfterResize.X = _boundsBeforeResize.X; - _boundsAfterResize.Y = _boundsBeforeResize.Y; - _boundsAfterResize.Width = _boundsBeforeResize.Width; - _boundsAfterResize.Height = _boundsBeforeResize.Height; - - // calculate scaled rectangle - ScaleHelper.Scale(ref _boundsAfterResize, Position, new PointF(absX, absY), ScaleHelper.GetScaleOptions()); - - // apply scaled bounds to this DrawableContainer - Owner.ApplyBounds(_boundsAfterResize); - - //ResumeLayout(); - Owner.DoLayout(); + return; } Owner.Invalidate(); - } + Owner.MakeBoundsChangeUndoable(false); + + //SuspendLayout(); + + // reset "workbench" rectangle to current bounds + _boundsAfterResize.X = _boundsBeforeResize.X; + _boundsAfterResize.Y = _boundsBeforeResize.Y; + _boundsAfterResize.Width = _boundsBeforeResize.Width; + _boundsAfterResize.Height = _boundsBeforeResize.Height; + + // calculate scaled rectangle + ScaleHelper.Scale(ref _boundsAfterResize, Position, new PointF(mouseEventArgs.X, mouseEventArgs.Y), ScaleHelper.GetScaleOptions()); + + // apply scaled bounds to this DrawableContainer + Owner.ApplyBounds(_boundsAfterResize); + + //ResumeLayout(); + Owner.DoLayout(); - /// <summary> - /// Handle the mouse up - /// </summary> - /// <param name="sender"></param> - /// <param name="mouseEventArgs"></param> - public void MouseUp(object sender, MouseEventArgs mouseEventArgs) - { - _editStatus = EditStatus.IDLE; Owner.Invalidate(); } /// <summary> /// Return the location of the adorner /// </summary> - public Point Location { + public override Point Location { get { int x = 0,y = 0; @@ -195,38 +167,26 @@ namespace Greenshot.Drawing.Adorners } } - /// <summary> - /// Return the bounds of the Adorner - /// </summary> - public Rectangle Bounds - { - get - { - Point location = Location; - Size size = new Size(10, 10); - return new Rectangle(location.X - (size.Width / 2), location.Y - (size.Height / 2), size.Width, size.Height); - } - } - /// <summary> /// Draw the adorner /// </summary> /// <param name="paintEventArgs">PaintEventArgs</param> - public void Paint(PaintEventArgs paintEventArgs) + public override void Paint(PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; Rectangle clipRectangle = paintEventArgs.ClipRectangle; var bounds = Bounds; - targetGraphics.DrawRectangle(Pens.Black, bounds.X, bounds.Y, bounds.Width , bounds.Height); - } + GraphicsState state = targetGraphics.Save(); + + targetGraphics.SmoothingMode = SmoothingMode.None; + targetGraphics.CompositingMode = CompositingMode.SourceCopy; + targetGraphics.PixelOffsetMode = PixelOffsetMode.Half; + targetGraphics.InterpolationMode = InterpolationMode.NearestNeighbor; + + targetGraphics.FillRectangle(Brushes.Black, bounds.X, bounds.Y, bounds.Width , bounds.Height); + targetGraphics.Restore(state); - /// <summary> - /// We ignore the Transform, as the coordinates are directly bound to those of the owner - /// </summary> - /// <param name="matrix"></param> - public void Transform(Matrix matrix) - { } } } diff --git a/Greenshot/Drawing/Adorners/TargetAdorner.cs b/Greenshot/Drawing/Adorners/TargetAdorner.cs index 965bed5a6..a2817421e 100644 --- a/Greenshot/Drawing/Adorners/TargetAdorner.cs +++ b/Greenshot/Drawing/Adorners/TargetAdorner.cs @@ -30,51 +30,22 @@ namespace Greenshot.Drawing.Adorners /// <summary> /// This implements the special "gripper" for the Speech-Bubble tail /// </summary> - public class TargetAdorner : IAdorner + public class TargetAdorner : AbstractAdorner { - private EditStatus _editStatus; - public TargetAdorner(IDrawableContainer owner, Point location) + public TargetAdorner(IDrawableContainer owner, Point location) : base(owner) { - Owner = owner; Location = location; } - /// <summary> - /// Returns the cursor for when the mouse is over the adorner - /// </summary> - public Cursor Cursor - { - get - { - return Cursors.SizeAll; - } - } - - public IDrawableContainer Owner - { - get; - set; - } - - /// <summary> - /// Test if the point is inside the adorner - /// </summary> - /// <param name="point"></param> - /// <returns></returns> - public bool HitTest(Point point) - { - return Bounds.Contains(point); - } - /// <summary> /// Handle the mouse down /// </summary> /// <param name="sender"></param> /// <param name="mouseEventArgs"></param> - public void MouseDown(object sender, MouseEventArgs mouseEventArgs) + public override void MouseDown(object sender, MouseEventArgs mouseEventArgs) { - _editStatus = EditStatus.MOVING; + EditStatus = EditStatus.MOVING; } /// <summary> @@ -82,8 +53,13 @@ namespace Greenshot.Drawing.Adorners /// </summary> /// <param name="sender"></param> /// <param name="mouseEventArgs"></param> - public void MouseMove(object sender, MouseEventArgs mouseEventArgs) + public override void MouseMove(object sender, MouseEventArgs mouseEventArgs) { + if (EditStatus != EditStatus.MOVING) + { + return; + } + Owner.Invalidate(); Point newGripperLocation = new Point(mouseEventArgs.X, mouseEventArgs.Y); Rectangle surfaceBounds = new Rectangle(0, 0, Owner.Parent.Width, Owner.Parent.Height); @@ -113,57 +89,24 @@ namespace Greenshot.Drawing.Adorners Owner.Invalidate(); } - /// <summary> - /// Handle the mouse up - /// </summary> - /// <param name="sender"></param> - /// <param name="mouseEventArgs"></param> - public void MouseUp(object sender, MouseEventArgs mouseEventArgs) - { - _editStatus = EditStatus.IDLE; - Owner.Invalidate(); - } - - /// <summary> - /// Return the location of the adorner - /// </summary> - public Point Location - { - get; - set; - } - - /// <summary> - /// Return the bounds of the Adorner - /// </summary> - public Rectangle Bounds - { - get - { - Point location = Location; - Size size = new Size(10, 10); - return new Rectangle(location.X - (size.Width / 2), location.Y - (size.Height / 2), size.Width, size.Height); - } - } - /// <summary> /// Draw the adorner /// </summary> /// <param name="paintEventArgs">PaintEventArgs</param> - public void Paint(PaintEventArgs paintEventArgs) + public override void Paint(PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; Rectangle clipRectangle = paintEventArgs.ClipRectangle; var bounds = Bounds; - targetGraphics.DrawRectangle(Pens.Green, bounds.X, bounds.Y, bounds.Width, bounds.Height); + targetGraphics.FillRectangle(Brushes.Green, bounds.X, bounds.Y, bounds.Width, bounds.Height); } /// <summary> /// Made sure this adorner is transformed /// </summary> /// <param name="matrix">Matrix</param> - public void Transform(Matrix matrix) + public override void Transform(Matrix matrix) { if (matrix == null) { diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index cdd7125d6..56f84c25d 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -331,6 +331,7 @@ namespace Greenshot.Drawing /// </summary> protected void InitTargetGripper(Color gripperColor, Point location) { _targetGripper = new TargetAdorner(this, location); + Adorners.Add(_targetGripper); } protected void InitGrippers() { diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 2dd451493..71ebc154a 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -998,13 +998,14 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="mouseEventArgs">MouseEventArgs</param> /// <returns>IAdorner</returns> - private IAdorner AdornersHitTest(MouseEventArgs mouseEventArgs) + private IAdorner FindActiveAdorner(MouseEventArgs mouseEventArgs) { foreach(IDrawableContainer drawableContainer in selectedElements) { foreach(IAdorner adorner in drawableContainer.Adorners) { - if (adorner.HitTest(mouseEventArgs.Location)) + + if (adorner.IsActive || adorner.HitTest(mouseEventArgs.Location)) { if (adorner.Cursor != null) { @@ -1025,7 +1026,7 @@ namespace Greenshot.Drawing { void SurfaceMouseDown(object sender, MouseEventArgs e) { // Handle Adorners - var adorner = AdornersHitTest(e); + var adorner = FindActiveAdorner(e); if (adorner != null) { adorner.MouseDown(sender, e); @@ -1102,7 +1103,7 @@ namespace Greenshot.Drawing { void SurfaceMouseUp(object sender, MouseEventArgs e) { // Handle Adorners - var adorner = AdornersHitTest(e); + var adorner = FindActiveAdorner(e); if (adorner != null) { adorner.MouseUp(sender, e); @@ -1171,7 +1172,7 @@ namespace Greenshot.Drawing { /// <param name="e"></param> void SurfaceMouseMove(object sender, MouseEventArgs e) { // Handle Adorners - var adorner = AdornersHitTest(e); + var adorner = FindActiveAdorner(e); if (adorner != null) { adorner.MouseMove(sender, e); diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index 8a1c1de40..d92465c41 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -75,6 +75,7 @@ <Compile Include="Destinations\FileWithDialogDestination.cs" /> <Compile Include="Destinations\PickerDestination.cs" /> <Compile Include="Destinations\PrinterDestination.cs" /> + <Compile Include="Drawing\Adorners\AbstractAdorner.cs" /> <Compile Include="Drawing\Adorners\GripperAdorner.cs" /> <Compile Include="Drawing\Adorners\TargetAdorner.cs" /> <Compile Include="Drawing\ArrowContainer.cs" /> diff --git a/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs b/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs index cf3c3fa70..27f825de4 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs @@ -27,6 +27,16 @@ namespace Greenshot.Plugin.Drawing.Adorners { public interface IAdorner { + /// <summary> + /// Returns if this adorner is active + /// </summary> + bool IsActive { get; } + + /// <summary> + /// The current edit status, this is needed to locate the adorner to send events to + /// </summary> + EditStatus EditStatus { get; } + /// <summary> /// The owner of this adorner /// </summary> From 9ab6bff116b7cd376161d0eff1c2b19bfeb61dd1 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Mon, 23 May 2016 16:43:10 +0200 Subject: [PATCH 037/170] Fixed serialization issues, and made sure the arrow / line have the right adorners. --- Greenshot/Drawing/Adorners/MoveAdorner.cs | 165 ++++++++++++++++++ .../{GripperAdorner.cs => ResizeAdorner.cs} | 10 +- Greenshot/Drawing/Adorners/TargetAdorner.cs | 1 - Greenshot/Drawing/CropContainer.cs | 12 ++ Greenshot/Drawing/CursorContainer.cs | 15 +- Greenshot/Drawing/DrawableContainer.cs | 86 +++++---- Greenshot/Drawing/EllipseContainer.cs | 1 + .../Drawing/Fields/AbstractFieldHolder.cs | 2 +- .../Fields/AbstractFieldHolderWithChildren.cs | 4 +- Greenshot/Drawing/FilterContainer.cs | 13 ++ Greenshot/Drawing/FreehandContainer.cs | 12 +- Greenshot/Drawing/HighlightContainer.cs | 4 +- Greenshot/Drawing/IconContainer.cs | 13 ++ Greenshot/Drawing/ImageContainer.cs | 13 ++ Greenshot/Drawing/LineContainer.cs | 14 +- Greenshot/Drawing/ObfuscateContainer.cs | 7 +- Greenshot/Drawing/RectangleContainer.cs | 17 ++ Greenshot/Drawing/SpeechbubbleContainer.cs | 10 +- Greenshot/Drawing/StepLabelContainer.cs | 11 +- Greenshot/Drawing/Surface.cs | 8 +- Greenshot/Drawing/TextContainer.cs | 10 +- Greenshot/Greenshot.csproj | 3 +- .../Interfaces/Drawing/Container.cs | 3 +- 23 files changed, 335 insertions(+), 99 deletions(-) create mode 100644 Greenshot/Drawing/Adorners/MoveAdorner.cs rename Greenshot/Drawing/Adorners/{GripperAdorner.cs => ResizeAdorner.cs} (93%) diff --git a/Greenshot/Drawing/Adorners/MoveAdorner.cs b/Greenshot/Drawing/Adorners/MoveAdorner.cs new file mode 100644 index 000000000..78e00e2dd --- /dev/null +++ b/Greenshot/Drawing/Adorners/MoveAdorner.cs @@ -0,0 +1,165 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ + +using Greenshot.Helpers; +using Greenshot.Plugin.Drawing; +using Greenshot.Plugin.Drawing.Adorners; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Greenshot.Drawing.Adorners +{ + /// <summary> + /// This is the adorner for the line based containers + /// </summary> + public class MoveAdorner : AbstractAdorner + { + private Rectangle _boundsBeforeResize = Rectangle.Empty; + private RectangleF _boundsAfterResize = RectangleF.Empty; + + public Positions Position { get; private set; } + + public MoveAdorner(IDrawableContainer owner, Positions position) : base(owner) + { + Position = position; + } + + /// <summary> + /// Returns the cursor for when the mouse is over the adorner + /// </summary> + public override Cursor Cursor + { + get + { + return Cursors.SizeAll; + } + } + + /// <summary> + /// Handle the mouse down + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public override void MouseDown(object sender, MouseEventArgs mouseEventArgs) + { + EditStatus = EditStatus.RESIZING; + _boundsBeforeResize = new Rectangle(Owner.Left, Owner.Top, Owner.Width, Owner.Height); + _boundsAfterResize = _boundsBeforeResize; + } + + /// <summary> + /// Handle the mouse move + /// </summary> + /// <param name="sender"></param> + /// <param name="mouseEventArgs"></param> + public override void MouseMove(object sender, MouseEventArgs mouseEventArgs) + { + if (EditStatus != EditStatus.RESIZING) + { + return; + } + Owner.Invalidate(); + Owner.MakeBoundsChangeUndoable(false); + + // reset "workbench" rectangle to current bounds + _boundsAfterResize.X = _boundsBeforeResize.X; + _boundsAfterResize.Y = _boundsBeforeResize.Y; + _boundsAfterResize.Width = _boundsBeforeResize.Width; + _boundsAfterResize.Height = _boundsBeforeResize.Height; + + // calculate scaled rectangle + ScaleHelper.Scale(ref _boundsAfterResize, Position, new PointF(mouseEventArgs.X, mouseEventArgs.Y), ScaleHelper.GetScaleOptions()); + + // apply scaled bounds to this DrawableContainer + Owner.ApplyBounds(_boundsAfterResize); + + Owner.Invalidate(); + } + + /// <summary> + /// Return the location of the adorner + /// </summary> + public override Point Location { + get + { + int x = 0,y = 0; + switch (Position) + { + case Positions.TopLeft: + x = Owner.Left; + y = Owner.Top; + break; + case Positions.BottomLeft: + x = Owner.Left; + y = Owner.Top + Owner.Height; + break; + case Positions.MiddleLeft: + x = Owner.Left; + y = Owner.Top + (Owner.Height / 2); + break; + case Positions.TopCenter: + x = Owner.Left + (Owner.Width / 2); + y = Owner.Top; + break; + case Positions.BottomCenter: + x = Owner.Left + (Owner.Width / 2); + y = Owner.Top + Owner.Height; + break; + case Positions.TopRight: + x = Owner.Left + Owner.Width; + y = Owner.Top; + break; + case Positions.BottomRight: + x = Owner.Left + Owner.Width; + y = Owner.Top + Owner.Height; + break; + case Positions.MiddleRight: + x = Owner.Left + Owner.Width; + y = Owner.Top + (Owner.Height / 2); + break; + } + return new Point(x, y); + } + } + + /// <summary> + /// Draw the adorner + /// </summary> + /// <param name="paintEventArgs">PaintEventArgs</param> + public override void Paint(PaintEventArgs paintEventArgs) + { + Graphics targetGraphics = paintEventArgs.Graphics; + Rectangle clipRectangle = paintEventArgs.ClipRectangle; + + var bounds = Bounds; + GraphicsState state = targetGraphics.Save(); + + targetGraphics.SmoothingMode = SmoothingMode.None; + targetGraphics.CompositingMode = CompositingMode.SourceCopy; + targetGraphics.PixelOffsetMode = PixelOffsetMode.Half; + targetGraphics.InterpolationMode = InterpolationMode.NearestNeighbor; + + targetGraphics.FillRectangle(Brushes.Black, bounds.X, bounds.Y, bounds.Width , bounds.Height); + targetGraphics.Restore(state); + } + } +} diff --git a/Greenshot/Drawing/Adorners/GripperAdorner.cs b/Greenshot/Drawing/Adorners/ResizeAdorner.cs similarity index 93% rename from Greenshot/Drawing/Adorners/GripperAdorner.cs rename to Greenshot/Drawing/Adorners/ResizeAdorner.cs index a550f5195..da536b1f5 100644 --- a/Greenshot/Drawing/Adorners/GripperAdorner.cs +++ b/Greenshot/Drawing/Adorners/ResizeAdorner.cs @@ -31,14 +31,14 @@ namespace Greenshot.Drawing.Adorners /// <summary> /// This is the default "legacy" gripper adorner, not the one used for the tail in the speech-bubble /// </summary> - public class GripperAdorner : AbstractAdorner + public class ResizeAdorner : AbstractAdorner { private Rectangle _boundsBeforeResize = Rectangle.Empty; private RectangleF _boundsAfterResize = RectangleF.Empty; public Positions Position { get; private set; } - public GripperAdorner(IDrawableContainer owner, Positions position) : base(owner) + public ResizeAdorner(IDrawableContainer owner, Positions position) : base(owner) { Position = position; } @@ -101,8 +101,6 @@ namespace Greenshot.Drawing.Adorners Owner.Invalidate(); Owner.MakeBoundsChangeUndoable(false); - //SuspendLayout(); - // reset "workbench" rectangle to current bounds _boundsAfterResize.X = _boundsBeforeResize.X; _boundsAfterResize.Y = _boundsBeforeResize.Y; @@ -115,9 +113,6 @@ namespace Greenshot.Drawing.Adorners // apply scaled bounds to this DrawableContainer Owner.ApplyBounds(_boundsAfterResize); - //ResumeLayout(); - Owner.DoLayout(); - Owner.Invalidate(); } @@ -186,7 +181,6 @@ namespace Greenshot.Drawing.Adorners targetGraphics.FillRectangle(Brushes.Black, bounds.X, bounds.Y, bounds.Width , bounds.Height); targetGraphics.Restore(state); - } } } diff --git a/Greenshot/Drawing/Adorners/TargetAdorner.cs b/Greenshot/Drawing/Adorners/TargetAdorner.cs index a2817421e..27e499bac 100644 --- a/Greenshot/Drawing/Adorners/TargetAdorner.cs +++ b/Greenshot/Drawing/Adorners/TargetAdorner.cs @@ -20,7 +20,6 @@ */ using Greenshot.Plugin.Drawing; -using Greenshot.Plugin.Drawing.Adorners; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index 676836f93..e1bf7a78a 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -20,6 +20,7 @@ */ using System.Drawing; +using System.Runtime.Serialization; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Plugin.Drawing; @@ -30,8 +31,19 @@ namespace Greenshot.Drawing { /// </summary> public class CropContainer : DrawableContainer { public CropContainer(Surface parent) : base(parent) { + Init(); } + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); + } protected override void InitializeFields() { AddField(GetType(), FieldType.FLAGS, FieldType.Flag.CONFIRMABLE); } diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs index 3911d5940..5d9d41b74 100644 --- a/Greenshot/Drawing/CursorContainer.cs +++ b/Greenshot/Drawing/CursorContainer.cs @@ -26,6 +26,7 @@ using System.Windows.Forms; using Greenshot.Plugin.Drawing; using System.Drawing.Drawing2D; using log4net; +using System.Runtime.Serialization; namespace Greenshot.Drawing { /// <summary> @@ -38,9 +39,21 @@ namespace Greenshot.Drawing { protected Cursor cursor; public CursorContainer(Surface parent) : base(parent) { + Init(); } - public CursorContainer(Surface parent, string filename) : base(parent) { + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); + } + + public CursorContainer(Surface parent, string filename) : this(parent) { Load(filename); } diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 56f84c25d..21971e5f7 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -35,6 +35,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; +using System.Runtime.Serialization; using System.Windows.Forms; namespace Greenshot.Drawing @@ -55,6 +56,20 @@ namespace Greenshot.Drawing private const int M21 = 2; private const int M22 = 3; + [OnDeserialized] + private void OnDeserializedInit(StreamingContext context) + { + _adorners = new List<IAdorner>(); + OnDeserialized(context); + } + + /// <summary> + /// Override to implement your own deserialization logic, like initializing properties which are not serialized + /// </summary> + /// <param name="streamingContext"></param> + protected virtual void OnDeserialized(StreamingContext streamingContext) + { + } protected EditStatus _defaultEditMode = EditStatus.DRAWING; public EditStatus DefaultEditMode { @@ -111,11 +126,8 @@ namespace Greenshot.Drawing set { SwitchParent((Surface)value); } } - private bool layoutSuspended; - [NonSerialized] private TargetAdorner _targetGripper; - public TargetAdorner TargetGripper { get { return _targetGripper; @@ -152,7 +164,6 @@ namespace Greenshot.Drawing return; } left = value; - DoLayout(); } } @@ -164,7 +175,6 @@ namespace Greenshot.Drawing return; } top = value; - DoLayout(); } } @@ -176,7 +186,6 @@ namespace Greenshot.Drawing return; } width = value; - DoLayout(); } } @@ -188,7 +197,6 @@ namespace Greenshot.Drawing return; } height = value; - DoLayout(); } } @@ -215,7 +223,15 @@ namespace Greenshot.Drawing /// <summary> /// List of available Adorners /// </summary> - public IList<IAdorner> Adorners { get; } = new List<IAdorner>(); + [NonSerialized] + private IList<IAdorner> _adorners = new List<IAdorner>(); + public IList<IAdorner> Adorners + { + get + { + return _adorners; + } + } [NonSerialized] // will store current bounds of this DrawableContainer before starting a resize @@ -245,7 +261,6 @@ namespace Greenshot.Drawing public DrawableContainer(Surface parent) { InitializeFields(); _parent = parent; - InitControls(); } public void Add(IFilter filter) { @@ -319,12 +334,6 @@ namespace Greenshot.Drawing public virtual bool InitContent() { return true; } public virtual void OnDoubleClick() {} - - private void InitControls() { - InitGrippers(); - - DoLayout(); - } /// <summary> /// Initialize a target gripper @@ -334,29 +343,23 @@ namespace Greenshot.Drawing Adorners.Add(_targetGripper); } - protected void InitGrippers() { + /// <summary> + /// Create the default adorners for a rectangle based container + /// </summary> + protected void CreateDefaultAdorners() { + if (Adorners.Count > 0) + { + LOG.Warn("Adorners are already defined!"); + } // Create the GripperAdorners - Adorners.Add(new GripperAdorner(this, Positions.TopLeft)); - Adorners.Add(new GripperAdorner(this, Positions.TopCenter)); - Adorners.Add(new GripperAdorner(this, Positions.TopRight)); - Adorners.Add(new GripperAdorner(this, Positions.BottomLeft)); - Adorners.Add(new GripperAdorner(this, Positions.BottomCenter)); - Adorners.Add(new GripperAdorner(this, Positions.BottomRight)); - Adorners.Add(new GripperAdorner(this, Positions.MiddleLeft)); - Adorners.Add(new GripperAdorner(this, Positions.MiddleRight)); - } - - public void SuspendLayout() { - layoutSuspended = true; - } - - public void ResumeLayout() { - layoutSuspended = false; - DoLayout(); - } - - public virtual void DoLayout() { - + Adorners.Add(new ResizeAdorner(this, Positions.TopLeft)); + Adorners.Add(new ResizeAdorner(this, Positions.TopCenter)); + Adorners.Add(new ResizeAdorner(this, Positions.TopRight)); + Adorners.Add(new ResizeAdorner(this, Positions.BottomLeft)); + Adorners.Add(new ResizeAdorner(this, Positions.BottomCenter)); + Adorners.Add(new ResizeAdorner(this, Positions.BottomRight)); + Adorners.Add(new ResizeAdorner(this, Positions.MiddleLeft)); + Adorners.Add(new ResizeAdorner(this, Positions.MiddleRight)); } public bool hasFilters { @@ -414,10 +417,8 @@ namespace Greenshot.Drawing } public void ResizeTo(int width, int height, int anchorPosition) { - SuspendLayout(); Width = width; Height = height; - ResumeLayout(); } /// <summary> @@ -429,10 +430,8 @@ namespace Greenshot.Drawing } public void MoveBy(int dx, int dy) { - SuspendLayout(); Left += dx; Top += dy; - ResumeLayout(); } /// <summary> @@ -455,7 +454,6 @@ namespace Greenshot.Drawing /// <returns>true if the event is handled, false if the surface needs to handle it</returns> public virtual bool HandleMouseMove(int x, int y) { Invalidate(); - SuspendLayout(); // reset "workrbench" rectangle to current bounds _boundsAfterResize.X = _boundsBeforeResize.Left; @@ -468,7 +466,6 @@ namespace Greenshot.Drawing // apply scaled bounds to this DrawableContainer ApplyBounds(_boundsAfterResize); - ResumeLayout(); Invalidate(); return true; } @@ -482,6 +479,7 @@ namespace Greenshot.Drawing } protected virtual void SwitchParent(Surface newParent) { + _parent = newParent; foreach(IFilter filter in Filters) { filter.Parent = this; } @@ -576,7 +574,6 @@ namespace Greenshot.Drawing if (matrix == null) { return; } - SuspendLayout(); Point topLeft = new Point(Left, Top); Point bottomRight = new Point(Left + Width, Top + Height); Point[] points = new[] { topLeft, bottomRight }; @@ -586,7 +583,6 @@ namespace Greenshot.Drawing Top = points[0].Y; Width = points[1].X - points[0].X; Height = points[1].Y - points[0].Y; - ResumeLayout(); } protected virtual ScaleHelper.IDoubleProcessor GetAngleRoundProcessor() { diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs index caf41824b..6873baf8a 100644 --- a/Greenshot/Drawing/EllipseContainer.cs +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -33,6 +33,7 @@ namespace Greenshot.Drawing { [Serializable()] public class EllipseContainer : DrawableContainer { public EllipseContainer(Surface parent) : base(parent) { + CreateDefaultAdorners(); } protected override void InitializeFields() { diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 0f8df4937..e1f91c6d4 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -55,7 +55,7 @@ namespace Greenshot.Drawing.Fields { public AbstractFieldHolder() {} [OnDeserialized] - private void OnDeserialized(StreamingContext context) { + private void OnFieldHolderDeserialized(StreamingContext context) { fieldsByType = new Dictionary<FieldType, Field>(); // listen to changing properties foreach(Field field in fields) { diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index b919edd9b..1680e7c22 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -46,8 +46,8 @@ namespace Greenshot.Drawing.Fields { fieldChangedEventHandler = OnFieldChanged; } - [OnDeserialized()] - private void OnDeserialized(StreamingContext context) { + [OnDeserialized] + private void OnFieldHolderWithChildrenDeserialized(StreamingContext context) { // listen to changing properties foreach(IFieldHolder fieldHolder in Children) { fieldHolder.FieldChanged += fieldChangedEventHandler; diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs index 630c5c35d..40bb93e95 100644 --- a/Greenshot/Drawing/FilterContainer.cs +++ b/Greenshot/Drawing/FilterContainer.cs @@ -24,6 +24,7 @@ using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Plugin.Drawing; using System.Drawing.Drawing2D; +using System.Runtime.Serialization; namespace Greenshot.Drawing { /// <summary> @@ -40,6 +41,18 @@ namespace Greenshot.Drawing { } public FilterContainer(Surface parent) : base(parent) { + Init(); + } + + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); } protected override void InitializeFields() { diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index 553d28294..b51299037 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -49,7 +49,6 @@ namespace Greenshot.Drawing { /// Constructor /// </summary> public FreehandContainer(Surface parent) : base(parent) { - Init(); Width = parent.Width; Height = parent.Height; Top = 0; @@ -61,11 +60,6 @@ namespace Greenshot.Drawing { AddField(GetType(), FieldType.LINE_COLOR, Color.Red); } - - protected void Init() { - // TODO: Remove grippers - } - public override void Transform(Matrix matrix) { Point[] points = capturePoints.ToArray(); @@ -75,11 +69,7 @@ namespace Greenshot.Drawing { RecalculatePath(); } - [OnDeserialized] - private void OnDeserialized(StreamingContext context) { - InitGrippers(); - DoLayout(); - Init(); + protected override void OnDeserialized(StreamingContext context) { RecalculatePath(); } diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index aec48208f..0cb2791a5 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -43,8 +43,8 @@ namespace Greenshot.Drawing { AddField(GetType(), FieldType.PREPARED_FILTER_HIGHLIGHT, PreparedFilter.TEXT_HIGHTLIGHT); } - [OnDeserialized] - private void OnDeserialized(StreamingContext context) { + protected override void OnDeserialized(StreamingContext context) + { Init(); } diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index 86b82a46f..623e10bfc 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -24,6 +24,7 @@ using System.IO; using Greenshot.Plugin.Drawing; using System.Drawing.Drawing2D; using log4net; +using System.Runtime.Serialization; namespace Greenshot.Drawing { /// <summary> @@ -36,6 +37,18 @@ namespace Greenshot.Drawing { protected Icon icon; public IconContainer(Surface parent) : base(parent) { + Init(); + } + + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); } public IconContainer(Surface parent, string filename) : base(parent) { diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index b9f9c6dc3..7c023bf2f 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -27,6 +27,7 @@ using GreenshotPlugin.Core; using System.Drawing.Drawing2D; using Greenshot.Core; using log4net; +using System.Runtime.Serialization; namespace Greenshot.Drawing { /// <summary> @@ -58,6 +59,18 @@ namespace Greenshot.Drawing { public ImageContainer(Surface parent) : base(parent) { FieldChanged += BitmapContainer_OnFieldChanged; + Init(); + } + + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); } protected override void InitializeFields() { diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index 37357b4fa..d42d2d5b9 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -26,6 +26,7 @@ using System.Runtime.Serialization; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Plugin.Drawing; +using Greenshot.Drawing.Adorners; namespace Greenshot.Drawing { /// <summary> @@ -45,15 +46,14 @@ namespace Greenshot.Drawing { AddField(GetType(), FieldType.SHADOW, true); } - [OnDeserialized()] - private void OnDeserialized(StreamingContext context) { - InitGrippers(); - DoLayout(); + protected override void OnDeserialized(StreamingContext context) + { Init(); } protected void Init() { - // TODO: Remove the unneeded grippers (1, 2, 3, 5, 6, 7) + Adorners.Add(new MoveAdorner(this, Positions.TopLeft)); + Adorners.Add(new MoveAdorner(this, Positions.BottomRight)); } public override void Draw(Graphics graphics, RenderMode rm) { @@ -109,8 +109,6 @@ namespace Greenshot.Drawing { protected override ScaleHelper.IDoubleProcessor GetAngleRoundProcessor() { return ScaleHelper.LineAngleRoundBehavior.Instance; - } - - + } } } diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index 80f395c31..032291527 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -37,15 +37,16 @@ namespace Greenshot.Drawing { base.InitializeFields(); AddField(GetType(), FieldType.PREPARED_FILTER_OBFUSCATE, PreparedFilter.PIXELIZE); } - - [OnDeserialized] - private void OnDeserialized(StreamingContext context) { + + protected override void OnDeserialized(StreamingContext context) + { Init(); } private void Init() { FieldChanged += ObfuscateContainer_OnFieldChanged; ConfigurePreparedFilters(); + CreateDefaultAdorners(); } protected void ObfuscateContainer_OnFieldChanged(object sender, FieldChangedEventArgs e) { diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index c235346c5..e81ec6624 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -25,6 +25,7 @@ using System.Drawing.Drawing2D; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Plugin.Drawing; +using System.Runtime.Serialization; namespace Greenshot.Drawing { /// <summary> @@ -34,6 +35,22 @@ namespace Greenshot.Drawing { public class RectangleContainer : DrawableContainer { public RectangleContainer(Surface parent) : base(parent) { + Init(); + } + + /// <summary> + /// Do some logic to make sure all field are initiated correctly + /// </summary> + /// <param name="streamingContext">StreamingContext</param> + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); } protected override void InitializeFields() { diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index 6b2f6e7ba..1f9360fc3 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -21,17 +21,15 @@ using Greenshot.Drawing.Fields; using Greenshot.Helpers; -using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.Serialization; -using System.Windows.Forms; -using log4net; -namespace Greenshot.Drawing { +namespace Greenshot.Drawing +{ /// <summary> /// Description of SpeechbubbleContainer. /// </summary> @@ -59,8 +57,8 @@ namespace Greenshot.Drawing { /// Restore the target gripper /// </summary> /// <param name="context"></param> - [OnDeserialized] - private void SetValuesOnDeserialized(StreamingContext context) { + protected override void OnDeserialized(StreamingContext context) + { InitTargetGripper(Color.Green, _storedTargetGripperLocation); } #endregion diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 79583c5ab..6dff35dcf 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -45,6 +45,12 @@ namespace Greenshot.Drawing { public StepLabelContainer(Surface parent) : base(parent) { parent.AddStepLabel(this); InitContent(); + Init(); + } + + private void Init() + { + CreateDefaultAdorners(); } #region Number serializing @@ -75,8 +81,9 @@ namespace Greenshot.Drawing { /// Restore values that don't serialize /// </summary> /// <param name="context"></param> - [OnDeserialized] - private void SetValuesOnDeserialized(StreamingContext context) { + protected override void OnDeserialized(StreamingContext context) + { + Init(); _stringFormat = new StringFormat(); _stringFormat.Alignment = StringAlignment.Center; _stringFormat.LineAlignment = StringAlignment.Center; diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 71ebc154a..99f34824e 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -21,7 +21,6 @@ using Greenshot.Configuration; using Greenshot.Core; -using Greenshot.Drawing.Adorners; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.IniFile; @@ -42,7 +41,8 @@ using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Windows.Forms; -namespace Greenshot.Drawing { +namespace Greenshot.Drawing +{ /// <summary> /// Description of Surface. @@ -1300,8 +1300,10 @@ namespace Greenshot.Drawing { _elements.Draw(targetGraphics, null, RenderMode.EDIT, clipRectangle); } + // No clipping for the adorners + targetGraphics.ResetClip(); // Draw adorners last - foreach(var drawableContainer in selectedElements) + foreach (var drawableContainer in selectedElements) { foreach(var adorner in drawableContainer.Adorners) { diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 110c40775..06ab4d5c4 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -98,9 +98,13 @@ namespace Greenshot.Drawing { AddField(GetType(), FieldType.TEXT_HORIZONTAL_ALIGNMENT, StringAlignment.Center); AddField(GetType(), FieldType.TEXT_VERTICAL_ALIGNMENT, StringAlignment.Center); } - - [OnDeserialized] - private void OnDeserialized(StreamingContext context) { + + /// <summary> + /// Do some logic to make sure all field are initiated correctly + /// </summary> + /// <param name="streamingContext">StreamingContext</param> + protected override void OnDeserialized(StreamingContext streamingContext) { + base.OnDeserialized(streamingContext); Init(); } diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index d92465c41..0fc6043a0 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -76,7 +76,8 @@ <Compile Include="Destinations\PickerDestination.cs" /> <Compile Include="Destinations\PrinterDestination.cs" /> <Compile Include="Drawing\Adorners\AbstractAdorner.cs" /> - <Compile Include="Drawing\Adorners\GripperAdorner.cs" /> + <Compile Include="Drawing\Adorners\MoveAdorner.cs" /> + <Compile Include="Drawing\Adorners\ResizeAdorner.cs" /> <Compile Include="Drawing\Adorners\TargetAdorner.cs" /> <Compile Include="Drawing\ArrowContainer.cs" /> <Compile Include="Drawing\Positions.cs" /> diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index cd96f774b..afae80489 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -26,6 +26,7 @@ using System.Windows.Forms; using System.ComponentModel; using System.Collections.Generic; using Greenshot.Plugin.Drawing.Adorners; +using System.Runtime.Serialization; namespace Greenshot.Plugin.Drawing { public enum RenderMode {EDIT, EXPORT}; @@ -77,8 +78,6 @@ namespace Greenshot.Plugin.Drawing { } void ApplyBounds(RectangleF newBounds); - - void DoLayout(); bool hasFilters { get; From 8aa4475d8ff411c4372c6beca357b63f5b70f16a Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Sun, 22 May 2016 13:16:28 +0200 Subject: [PATCH 038/170] Enhanced log statement [skip ci] --- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 1cd77fb91..855dd79be 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -856,7 +856,7 @@ namespace GreenshotPlugin.Core { if (GetClientRect(out clientRect)) { Win32Error error = Win32.GetLastErrorCode(); - LOG.WarnFormat("Couldn't retrieve the client rectangle: {0}", Win32.GetMessage(error)); + LOG.WarnFormat("Couldn't retrieve the client rectangle for {0}, error: {1}", Text, Win32.GetMessage(error)); } return clientRect; } From 9702ac730f73d07f4ac4bb038fd05b6d1ef615ca Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Mon, 23 May 2016 23:34:17 +0200 Subject: [PATCH 039/170] Fixed SpeechbubbleContainer --- Greenshot/Drawing/SpeechbubbleContainer.cs | 4 +++- Greenshot/Greenshot.sln | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index f49768329..e86c52be5 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -178,7 +178,8 @@ namespace Greenshot.Drawing private GraphicsPath CreateTail() { Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Left, TargetGripper.Top); int tailWidth = (Math.Abs(rect.Width) + Math.Abs(rect.Height)) / 20; + int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Location.X, TargetGripper.Location.Y); + int tailWidth = (Math.Abs(rect.Width) + Math.Abs(rect.Height)) / 20; // This should fix a problem with the tail being to wide tailWidth = Math.Min(Math.Abs(rect.Width) / 2, tailWidth); @@ -189,6 +190,7 @@ namespace Greenshot.Drawing tail.AddLine(tailWidth, 0, 0, -tailLength); tail.CloseFigure(); + int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2, TargetGripper.Location.X, TargetGripper.Location.Y); using (Matrix tailMatrix = new Matrix()) { tailMatrix.Translate(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2); diff --git a/Greenshot/Greenshot.sln b/Greenshot/Greenshot.sln index e49aeb8c5..38a4f572c 100644 --- a/Greenshot/Greenshot.sln +++ b/Greenshot/Greenshot.sln @@ -1,7 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -# SharpDevelop 4.2.2.8818 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Greenshot", "Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPlugin", "..\GreenshotPlugin\GreenshotPlugin.csproj", "{5B924697-4DCD-4F98-85F1-105CB84B7341}" @@ -107,6 +108,7 @@ Global {C6988EE8-2FEE-4349-9F09-F9628A0D8965}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {C6988EE8-2FEE-4349-9F09-F9628A0D8965}.Release|x86.ActiveCfg = Release|x86 {D61E6ECE-E0B6-4467-B492-F08A06BA8F02}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D61E6ECE-E0B6-4467-B492-F08A06BA8F02}.Debug|Any CPU.Build.0 = Debug|x86 {D61E6ECE-E0B6-4467-B492-F08A06BA8F02}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {D61E6ECE-E0B6-4467-B492-F08A06BA8F02}.Debug|x86.ActiveCfg = Debug|x86 {D61E6ECE-E0B6-4467-B492-F08A06BA8F02}.Debug|x86.Build.0 = Debug|x86 From 45615275cf7ed64f2d0e57814edf3bc98a05d329 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 24 May 2016 12:48:11 +0200 Subject: [PATCH 040/170] Made the re/undo code from the branch work in this, this is a manual copy as something went horribly wrong with the repository. Before building I first want to check if everything is there.[skip ci] --- .../Configuration/EditorConfiguration.cs | 13 +- Greenshot/Drawing/CropContainer.cs | 7 +- Greenshot/Drawing/DrawableContainer.cs | 54 +- Greenshot/Drawing/DrawableContainerList.cs | 137 +- .../Drawing/Fields/AbstractFieldHolder.cs | 150 ++- .../Fields/AbstractFieldHolderWithChildren.cs | 120 +- Greenshot/Drawing/Fields/Field.cs | 107 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 167 ++- Greenshot/Drawing/Fields/FieldType.cs | 105 +- Greenshot/Drawing/Filters/IFilter.cs | 6 +- Greenshot/Drawing/HighlightContainer.cs | 1 + Greenshot/Drawing/ImageContainer.cs | 1 + Greenshot/Drawing/ObfuscateContainer.cs | 1 + Greenshot/Drawing/SpeechbubbleContainer.cs | 20 +- Greenshot/Drawing/StepLabelContainer.cs | 4 + Greenshot/Drawing/Surface.cs | 1100 +++++++++++------ Greenshot/Drawing/TextContainer.cs | 1 + Greenshot/Forms/ImageEditorForm.cs | 13 +- Greenshot/Greenshot.csproj | 4 +- Greenshot/Memento/AddElementMemento.cs | 6 - Greenshot/Memento/AddElementsMemento.cs | 77 ++ Greenshot/Memento/ChangeFieldHolderMemento.cs | 76 +- Greenshot/Memento/DeleteElementMemento.cs | 7 - Greenshot/Memento/DeleteElementsMemento.cs | 72 ++ .../DrawableContainerBoundsChangeMemento.cs | 79 +- .../Memento/SurfaceBackgroundChangeMemento.cs | 8 - Greenshot/Memento/TextChangeMemento.cs | 7 - .../Core/OperatingSystemExtensions.cs | 4 +- GreenshotPlugin/Core/WindowsHelper.cs | 6 +- GreenshotPlugin/GreenshotPlugin.csproj | 3 + .../Interfaces/Drawing/Container.cs | 149 ++- GreenshotPlugin/Interfaces/Drawing/IField.cs | 84 ++ .../Interfaces/Drawing/IFieldholder.cs | 56 + .../Interfaces/Drawing/IMemento.cs | 43 + GreenshotPlugin/Interfaces/Generic.cs | 124 +- 35 files changed, 1890 insertions(+), 922 deletions(-) create mode 100644 Greenshot/Memento/AddElementsMemento.cs create mode 100644 Greenshot/Memento/DeleteElementsMemento.cs create mode 100644 GreenshotPlugin/Interfaces/Drawing/IField.cs create mode 100644 GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs create mode 100644 GreenshotPlugin/Interfaces/Drawing/IMemento.cs diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index 3d3240273..52039eac2 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -26,6 +26,7 @@ using Greenshot.Drawing.Fields; using GreenshotPlugin.UnmanagedHelpers; using Greenshot.IniFile; using Greenshot.Core; +using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Configuration { /// <summary> @@ -75,7 +76,8 @@ namespace Greenshot.Configuration { /// <param name="fieldType">FieldType of the field to construct</param> /// <param name="preferredDefaultValue"></param> /// <returns>a new Field of the given fieldType, with the scope of it's value being restricted to the Type scope</returns> - public Field CreateField(Type requestingType, FieldType fieldType, object preferredDefaultValue) { + public IField CreateField(Type requestingType, IFieldType fieldType, object preferredDefaultValue) + { string requestingTypeName = requestingType.Name; string requestedField = requestingTypeName + "." + fieldType.Name; object fieldValue = preferredDefaultValue; @@ -101,8 +103,9 @@ namespace Greenshot.Configuration { returnField.Value = fieldValue; return returnField; } - - public void UpdateLastFieldValue(Field field) { + + public void UpdateLastFieldValue(IField field) + { string requestedField = field.Scope + "." + field.FieldType.Name; // Check if the configuration exists if (LastUsedFieldValues == null) { @@ -110,9 +113,9 @@ namespace Greenshot.Configuration { } // check if settings for the requesting type exist, if not create! if (LastUsedFieldValues.ContainsKey(requestedField)) { - LastUsedFieldValues[requestedField] = field.myValue; + LastUsedFieldValues[requestedField] = field.Value; } else { - LastUsedFieldValues.Add(requestedField, field.myValue); + LastUsedFieldValues.Add(requestedField, field.Value); } } diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index e1bf7a78a..96b03d3b5 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -24,6 +24,7 @@ using System.Runtime.Serialization; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Drawing { /// <summary> @@ -45,10 +46,14 @@ namespace Greenshot.Drawing { CreateDefaultAdorners(); } protected override void InitializeFields() { - AddField(GetType(), FieldType.FLAGS, FieldType.Flag.CONFIRMABLE); + AddField(GetType(), FieldType.FLAGS, FieldFlag.CONFIRMABLE); } public override void Invalidate() { + if (_parent == null) + { + return; + } _parent.Invalidate(); } diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index f65480b2b..1c42a066d 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -29,6 +29,7 @@ using Greenshot.Memento; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using Greenshot.Plugin.Drawing.Adorners; +using GreenshotPlugin.Interfaces.Drawing; using log4net; using System; using System.Collections.Generic; @@ -104,7 +105,7 @@ namespace Greenshot.Drawing remove{ _propertyChanged -= value; } } - public List<IFilter> Filters { + public IList<IFilter> Filters { get { List<IFilter> ret = new List<IFilter>(); foreach(IFieldHolder c in Children) { @@ -124,10 +125,10 @@ namespace Greenshot.Drawing } [NonSerialized] - private TargetAdorner _targetGripper; - public TargetAdorner TargetGripper { + private TargetAdorner _targetAdorner; + public TargetAdorner TargetAdorner { get { - return _targetGripper; + return _targetAdorner; } } @@ -305,7 +306,10 @@ namespace Greenshot.Drawing } public void AlignToParent(HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment) { - + if (_parent == null) + { + return; + } int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); if (horizontalAlignment == HorizontalAlignment.Left) { Left = lineThickness/2; @@ -335,9 +339,9 @@ namespace Greenshot.Drawing /// <summary> /// Initialize a target gripper /// </summary> - protected void InitTargetGripper(Color gripperColor, Point location) { - _targetGripper = new TargetAdorner(this, location); - Adorners.Add(_targetGripper); + protected void InitAdorner(Color gripperColor, Point location) { + _targetAdorner = new TargetAdorner(this, location); + Adorners.Add(_targetAdorner); } /// <summary> @@ -478,6 +482,19 @@ namespace Greenshot.Drawing } protected virtual void SwitchParent(Surface newParent) { + if (newParent == Parent) + { + return; + } + if (_parent != null) + { + // Remove FieldAggregator + FieldAggregator fieldAggregator = _parent.FieldAggregator; + if (fieldAggregator != null) + { + fieldAggregator.UnbindElement(this); + } + } _parent = newParent; foreach(IFilter filter in Filters) { @@ -485,24 +502,6 @@ namespace Greenshot.Drawing } } - // drawablecontainers are regarded equal if they are of the same type and their bounds are equal. this should be sufficient. - public override bool Equals(object obj) { - bool ret = false; - if (obj != null && GetType() == obj.GetType()) { - DrawableContainer other = obj as DrawableContainer; - if (other != null && left==other.left && top==other.top && width==other.width && height==other.height) { - ret = true; - } - } - return ret; - } - - public override int GetHashCode() { - // TODO: This actually doesn't make sense... - // Place the container in a list, and you can't find it :) - return left.GetHashCode() ^ top.GetHashCode() ^ width.GetHashCode() ^ height.GetHashCode() ^ GetFields().GetHashCode(); - } - protected void OnPropertyChanged(string propertyName) { if (_propertyChanged != null) { _propertyChanged(this, new PropertyChangedEventArgs(propertyName)); @@ -516,7 +515,7 @@ namespace Greenshot.Drawing /// </summary> /// <param name="fieldToBeChanged">The field to be changed</param> /// <param name="newValue">The new value</param> - public virtual void BeforeFieldChange(Field fieldToBeChanged, object newValue) { + public virtual void BeforeFieldChange(IField fieldToBeChanged, object newValue) { _parent.MakeUndoable(new ChangeFieldHolderMemento(this, fieldToBeChanged), true); Invalidate(); } @@ -531,7 +530,6 @@ namespace Greenshot.Drawing if (e.Field.FieldType == FieldType.SHADOW) { accountForShadowChange = true; } - Invalidate(); } /// <summary> diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 692295966..597db8f3e 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -25,6 +25,7 @@ using Greenshot.Memento; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using GreenshotPlugin.Core; +using GreenshotPlugin.Interfaces.Drawing; using System; using System.Collections.Generic; using System.ComponentModel; @@ -38,7 +39,8 @@ namespace Greenshot.Drawing { /// Dispatches most of a DrawableContainer's public properties and methods to a list of DrawableContainers. /// </summary> [Serializable] - public class DrawableContainerList : List<IDrawableContainer> { + public class DrawableContainerList : List<IDrawableContainer>, IDrawableContainerList + { private static readonly ComponentResourceManager editorFormResources = new ComponentResourceManager(typeof(ImageEditorForm)); public Guid ParentID { @@ -116,14 +118,11 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="allowMerge">true means allow the moves to be merged</param> public void MakeBoundsChangeUndoable(bool allowMerge) { - List<IDrawableContainer> movingList = new List<IDrawableContainer>(); - Surface surface = null; - foreach(DrawableContainer dc in this) { - movingList.Add(dc); - surface = dc._parent; - } - if (movingList.Count > 0 && surface != null) { - surface.MakeUndoable(new DrawableContainerBoundsChangeMemento(movingList), allowMerge); + if (Count > 0 && Parent != null) + { + var clone = new DrawableContainerList(); + clone.AddRange(this); + Parent.MakeUndoable(new DrawableContainerBoundsChangeMemento(clone), allowMerge); } } @@ -246,9 +245,19 @@ namespace Greenshot.Drawing { /// <param name="renderMode">the rendermode in which the element is to be drawn</param> /// <param name="clipRectangle"></param> public void Draw(Graphics g, Bitmap bitmap, RenderMode renderMode, Rectangle clipRectangle) { - foreach(var drawableContainer in this) { - var dc = (DrawableContainer) drawableContainer; - if (dc.DrawingBounds.IntersectsWith(clipRectangle)) { + if (Parent == null) + { + return; + } + foreach (var drawableContainer in this) + { + var dc = (DrawableContainer)drawableContainer; + if (dc.Parent == null) + { + continue; + } + if (dc.DrawingBounds.IntersectsWith(clipRectangle)) + { dc.DrawContent(g, bitmap, renderMode, clipRectangle); } } @@ -270,9 +279,16 @@ namespace Greenshot.Drawing { /// Invalidate the bounds of all the DC's in this list /// </summary> public void Invalidate() { - foreach(var dc in this) { - dc.Invalidate(); + if (Parent == null) + { + return; } + Rectangle region = Rectangle.Empty; + foreach (var dc in this) + { + region = Rectangle.Union(region, dc.DrawingBounds); + } + Parent.Invalidate(region); } /// <summary> /// Indicates whether the given list of elements can be pulled up, @@ -280,7 +296,7 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="elements">list of elements to pull up</param> /// <returns>true if the elements could be pulled up</returns> - public bool CanPullUp(DrawableContainerList elements) { + public bool CanPullUp(IDrawableContainerList elements) { if (elements.Count == 0 || elements.Count == Count) { return false; } @@ -296,7 +312,7 @@ namespace Greenshot.Drawing { /// Pulls one or several elements up one level in hierarchy (z-index). /// </summary> /// <param name="elements">list of elements to pull up</param> - public void PullElementsUp(DrawableContainerList elements) { + public void PullElementsUp(IDrawableContainerList elements) { for(int i=Count-1; i>=0; i--) { var dc = this[i]; if (!elements.Contains(dc)) { @@ -312,7 +328,7 @@ namespace Greenshot.Drawing { /// Pulls one or several elements up to the topmost level(s) in hierarchy (z-index). /// </summary> /// <param name="elements">of elements to pull to top</param> - public void PullElementsToTop(DrawableContainerList elements) { + public void PullElementsToTop(IDrawableContainerList elements) { var dcs = ToArray(); for(int i=0; i<dcs.Length; i++) { var dc = dcs[i]; @@ -331,7 +347,7 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="elements">list of elements to push down</param> /// <returns>true if the elements could be pushed down</returns> - public bool CanPushDown(DrawableContainerList elements) { + public bool CanPushDown(IDrawableContainerList elements) { if (elements.Count == 0 || elements.Count == Count) { return false; } @@ -347,7 +363,7 @@ namespace Greenshot.Drawing { /// Pushes one or several elements down one level in hierarchy (z-index). /// </summary> /// <param name="elements">list of elements to push down</param> - public void PushElementsDown(DrawableContainerList elements) { + public void PushElementsDown(IDrawableContainerList elements) { for(int i=0; i<Count; i++) { var dc = this[i]; if (!elements.Contains(dc)) { @@ -363,7 +379,7 @@ namespace Greenshot.Drawing { /// Pushes one or several elements down to the bottommost level(s) in hierarchy (z-index). /// </summary> /// <param name="elements">of elements to push to bottom</param> - public void PushElementsToBottom(DrawableContainerList elements) { + public void PushElementsToBottom(IDrawableContainerList elements) { var dcs = ToArray(); for(int i=dcs.Length-1; i>=0; i--) { var dc = dcs[i]; @@ -397,7 +413,7 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="menu"></param> /// <param name="surface"></param> - public virtual void AddContextMenuItems(ContextMenuStrip menu, Surface surface) { + public virtual void AddContextMenuItems(ContextMenuStrip menu, ISurface surface) { bool push = surface.Elements.CanPushDown(this); bool pull = surface.Elements.CanPullUp(this); @@ -437,7 +453,7 @@ namespace Greenshot.Drawing { // Duplicate item = new ToolStripMenuItem(Language.GetString(LangKey.editor_duplicate)); item.Click += delegate { - DrawableContainerList dcs = this.Clone(); + IDrawableContainerList dcs = this.Clone(); dcs.Parent = surface; dcs.MoveBy(10, 10); surface.AddElements(dcs); @@ -448,48 +464,36 @@ namespace Greenshot.Drawing { // Copy item = new ToolStripMenuItem(Language.GetString(LangKey.editor_copytoclipboard)); - item.Image = (Image)editorFormResources.GetObject("copyToolStripMenuItem.Image"); + item.Image = ((Image)(editorFormResources.GetObject("copyToolStripMenuItem.Image"))); item.Click += delegate { - ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), this); + ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), this); }; menu.Items.Add(item); // Cut item = new ToolStripMenuItem(Language.GetString(LangKey.editor_cuttoclipboard)); - item.Image = (Image)editorFormResources.GetObject("btnCut.Image"); + item.Image = ((Image)(editorFormResources.GetObject("btnCut.Image"))); item.Click += delegate { - ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), this); - List<DrawableContainer> containersToDelete = new List<DrawableContainer>(); - foreach (var drawableContainer in this) { - var container = (DrawableContainer) drawableContainer; - containersToDelete.Add(container); - } - foreach (var container in containersToDelete) { - surface.RemoveElement(container, true); - } + ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), this); + surface.RemoveElements(this, true); }; menu.Items.Add(item); // Delete item = new ToolStripMenuItem(Language.GetString(LangKey.editor_deleteelement)); - item.Image = (Image)editorFormResources.GetObject("removeObjectToolStripMenuItem.Image"); + item.Image = ((Image)(editorFormResources.GetObject("removeObjectToolStripMenuItem.Image"))); item.Click += delegate { - List<DrawableContainer> containersToDelete = new List<DrawableContainer>(); - foreach(var drawableContainer in this) { - var container = (DrawableContainer) drawableContainer; - containersToDelete.Add(container); - } - foreach (DrawableContainer container in containersToDelete) { - surface.RemoveElement(container, true); - } + surface.RemoveElements(this, true); }; menu.Items.Add(item); // Reset bool canReset = false; - foreach (var drawableContainer in this) { - var container = (DrawableContainer) drawableContainer; - if (container.HasDefaultSize) { + foreach (var drawableContainer in this) + { + var container = (DrawableContainer)drawableContainer; + if (container.HasDefaultSize) + { canReset = true; } } @@ -497,24 +501,29 @@ namespace Greenshot.Drawing { item = new ToolStripMenuItem(Language.GetString(LangKey.editor_resetsize)); //item.Image = ((System.Drawing.Image)(editorFormResources.GetObject("removeObjectToolStripMenuItem.Image"))); item.Click += delegate { + MakeBoundsChangeUndoable(false); foreach (var drawableContainer in this) { var container = (DrawableContainer) drawableContainer; if (!container.HasDefaultSize) { continue; } Size defaultSize = container.DefaultSize; - container.Invalidate(); container.MakeBoundsChangeUndoable(false); container.Width = defaultSize.Width; container.Height = defaultSize.Height; - container.Invalidate(); } + surface.Invalidate(); }; menu.Items.Add(item); } } - public virtual void ShowContextMenu(MouseEventArgs e, Surface surface) { + public virtual void ShowContextMenu(MouseEventArgs e, ISurface surface) + { + if (!(surface is Surface)) + { + return; + } bool hasMenu = false; foreach (var drawableContainer in this) { var container = (DrawableContainer) drawableContainer; @@ -528,7 +537,8 @@ namespace Greenshot.Drawing { ContextMenuStrip menu = new ContextMenuStrip(); AddContextMenuItems(menu, surface); if (menu.Items.Count > 0) { - menu.Show(surface, e.Location); + // TODO: cast should be somehow avoided + menu.Show((Surface)surface, e.Location); while (true) { if (menu.Visible) { Application.DoEvents(); @@ -541,5 +551,32 @@ namespace Greenshot.Drawing { } } } + + #region IDisposable Support + private bool _disposedValue = false; // To detect redundant calls + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + foreach (var drawableContainer in this) + { + drawableContainer.Dispose(); + } + } + + _disposedValue = true; + } + } + + // This code added to correctly implement the disposable pattern. + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + } + #endregion } } diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 1c4a98037..203f590c3 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -26,39 +26,48 @@ using System.Runtime.Serialization; using Greenshot.Configuration; using Greenshot.IniFile; using log4net; +using GreenshotPlugin.Interfaces.Drawing; -namespace Greenshot.Drawing.Fields { +namespace Greenshot.Drawing.Fields +{ /// <summary> /// Basic IFieldHolder implementation, providing access to a set of fields /// </summary> [Serializable] - public abstract class AbstractFieldHolder : IFieldHolder { + public abstract class AbstractFieldHolder : IFieldHolder + { private static readonly ILog LOG = LogManager.GetLogger(typeof(AbstractFieldHolder)); - private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); /// <summary> /// called when a field's value has changed /// </summary> [NonSerialized] private FieldChangedEventHandler fieldChanged; - public event FieldChangedEventHandler FieldChanged { + public event FieldChangedEventHandler FieldChanged + { add { fieldChanged += value; } - remove{ fieldChanged -= value; } + remove { fieldChanged -= value; } } - + // we keep two Collections of our fields, dictionary for quick access, list for serialization // this allows us to use default serialization [NonSerialized] - private Dictionary<FieldType, Field> fieldsByType = new Dictionary<FieldType, Field>(); - private readonly List<Field> fields = new List<Field>(); + private IDictionary<IFieldType, IField> fieldsByType = new Dictionary<IFieldType, IField>(); + private IList<IField> fields = new List<IField>(); + + public AbstractFieldHolder() { } [OnDeserialized] - private void OnFieldHolderDeserialized(StreamingContext context) { - fieldsByType = new Dictionary<FieldType, Field>(); + private void OnDeserialized(StreamingContext context) + { + fieldsByType = new Dictionary<IFieldType, IField>(); // listen to changing properties - foreach(Field field in fields) { + foreach (Field field in fields) + { field.PropertyChanged += delegate { - if (fieldChanged != null) { + if (fieldChanged != null) + { fieldChanged(this, new FieldChangedEventArgs(field)); } }; @@ -66,97 +75,124 @@ namespace Greenshot.Drawing.Fields { } } - public void AddField(Type requestingType, FieldType fieldType, object fieldValue) { + public void AddField(Type requestingType, IFieldType fieldType, object fieldValue) + { AddField(editorConfiguration.CreateField(requestingType, fieldType, fieldValue)); } - public virtual void AddField(Field field) { - if (fieldsByType != null && fieldsByType.ContainsKey(field.FieldType)) { - if (LOG.IsDebugEnabled) { + public virtual void AddField(IField field) + { + if (fieldsByType != null && fieldsByType.ContainsKey(field.FieldType)) + { + if (LOG.IsDebugEnabled) + { LOG.DebugFormat("A field with of type '{0}' already exists in this {1}, will overwrite.", field.FieldType, GetType()); } - } - + } + fields.Add(field); fieldsByType[field.FieldType] = field; - field.PropertyChanged += delegate { if(fieldChanged != null) fieldChanged(this, new FieldChangedEventArgs(field)); }; + field.PropertyChanged += delegate { if (fieldChanged != null) fieldChanged(this, new FieldChangedEventArgs(field)); }; } - - public void RemoveField(Field field) { + + public void RemoveField(IField field) + { fields.Remove(field); fieldsByType.Remove(field.FieldType); field.PropertyChanged -= delegate { - if (fieldChanged != null) { + if (fieldChanged != null) + { fieldChanged(this, new FieldChangedEventArgs(field)); } }; } - - public List<Field> GetFields() { + + public IList<IField> GetFields() + { return fields; } - - public Field GetField(FieldType fieldType) { - try { + + public IField GetField(IFieldType fieldType) + { + try + { return fieldsByType[fieldType]; - } catch(KeyNotFoundException e) { + } + catch (KeyNotFoundException e) + { throw new ArgumentException("Field '" + fieldType + "' does not exist in " + GetType(), e); } } - - public object GetFieldValue(FieldType fieldType) { + + public object GetFieldValue(IFieldType fieldType) + { return GetField(fieldType).Value; } - + #region convenience methods to save us some casts outside - public string GetFieldValueAsString(FieldType fieldType) { + public string GetFieldValueAsString(IFieldType fieldType) + { return Convert.ToString(GetFieldValue(fieldType)); } - - public int GetFieldValueAsInt(FieldType fieldType) { + + public int GetFieldValueAsInt(IFieldType fieldType) + { return Convert.ToInt32(GetFieldValue(fieldType)); } - - public decimal GetFieldValueAsDecimal(FieldType fieldType) { + + public decimal GetFieldValueAsDecimal(IFieldType fieldType) + { return Convert.ToDecimal(GetFieldValue(fieldType)); } - - public double GetFieldValueAsDouble(FieldType fieldType) { + + public double GetFieldValueAsDouble(IFieldType fieldType) + { return Convert.ToDouble(GetFieldValue(fieldType)); } - - public float GetFieldValueAsFloat(FieldType fieldType) { + + public float GetFieldValueAsFloat(IFieldType fieldType) + { return Convert.ToSingle(GetFieldValue(fieldType)); } - - public bool GetFieldValueAsBool(FieldType fieldType) { + + public bool GetFieldValueAsBool(IFieldType fieldType) + { return Convert.ToBoolean(GetFieldValue(fieldType)); } - - public Color GetFieldValueAsColor(FieldType fieldType) { + + public Color GetFieldValueAsColor(IFieldType fieldType) + { return (Color)GetFieldValue(fieldType); } #endregion - - public bool HasField(FieldType fieldType) { + + public bool HasField(IFieldType fieldType) + { return fieldsByType.ContainsKey(fieldType); } - - public bool HasFieldValue(FieldType fieldType) { + + public bool HasFieldValue(IFieldType fieldType) + { return HasField(fieldType) && fieldsByType[fieldType].HasValue; } - - public void SetFieldValue(FieldType fieldType, object value) { - try { + + public void SetFieldValue(IFieldType fieldType, object value) + { + try + { fieldsByType[fieldType].Value = value; - } catch(KeyNotFoundException e) { - throw new ArgumentException("Field '"+fieldType+"' does not exist in " + GetType(), e); + } + catch (KeyNotFoundException e) + { + throw new ArgumentException("Field '" + fieldType + "' does not exist in " + GetType(), e); } } - - protected void OnFieldChanged(object sender, FieldChangedEventArgs e){ - if (fieldChanged != null) { + + 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 index a81308d0e..ae610a5fa 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -18,86 +18,110 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +using GreenshotPlugin.Interfaces.Drawing; using System; using System.Collections.Generic; using System.Runtime.Serialization; -namespace Greenshot.Drawing.Fields { +namespace Greenshot.Drawing.Fields +{ /// <summary> /// Basic IFieldHolderWithChildren implementation. Similar to IFieldHolder, /// but has a List<IFieldHolder> of children. /// Field values are passed to and from children as well. /// </summary> - [Serializable()] - public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder { - readonly FieldChangedEventHandler fieldChangedEventHandler; - + [Serializable()] + public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder + { + + FieldChangedEventHandler fieldChangedEventHandler; + [NonSerialized] private EventHandler childrenChanged; - public event EventHandler ChildrenChanged { + public event EventHandler ChildrenChanged + { add { childrenChanged += value; } remove { childrenChanged -= value; } } - + public List<IFieldHolder> Children = new List<IFieldHolder>(); - - public AbstractFieldHolderWithChildren() { + + public AbstractFieldHolderWithChildren() + { fieldChangedEventHandler = OnFieldChanged; } - - [OnDeserialized] - private void OnFieldHolderWithChildrenDeserialized(StreamingContext context) { + + [OnDeserialized()] + private void OnDeserialized(StreamingContext context) + { // listen to changing properties - foreach(IFieldHolder fieldHolder in Children) { + foreach (IFieldHolder fieldHolder in Children) + { fieldHolder.FieldChanged += fieldChangedEventHandler; } - if(childrenChanged != null) childrenChanged(this, EventArgs.Empty); + if (childrenChanged != null) childrenChanged(this, EventArgs.Empty); } - - public void AddChild(IFieldHolder fieldHolder) { + + public void AddChild(IFieldHolder fieldHolder) + { Children.Add(fieldHolder); fieldHolder.FieldChanged += fieldChangedEventHandler; - if(childrenChanged != null) childrenChanged(this, EventArgs.Empty); + if (childrenChanged != null) childrenChanged(this, EventArgs.Empty); } - - public void RemoveChild(IFieldHolder fieldHolder) { + + public void RemoveChild(IFieldHolder fieldHolder) + { Children.Remove(fieldHolder); fieldHolder.FieldChanged -= fieldChangedEventHandler; - if(childrenChanged != null) childrenChanged(this, EventArgs.Empty); + if (childrenChanged != null) childrenChanged(this, EventArgs.Empty); } - - public new List<Field> GetFields() { - List<Field> ret = new List<Field>(); + + public new IList<IField> GetFields() + { + List<IField> ret = new List<IField>(); ret.AddRange(base.GetFields()); - foreach(IFieldHolder fh in Children) { + foreach (IFieldHolder fh in Children) + { ret.AddRange(fh.GetFields()); } return ret; } - - public new Field GetField(FieldType fieldType) { - Field ret = null; - if(base.HasField(fieldType)) { + + public new IField GetField(IFieldType fieldType) + { + IField ret = null; + if (base.HasField(fieldType)) + { ret = base.GetField(fieldType); - } else { - foreach(IFieldHolder fh in Children) { - if(fh.HasField(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()); + if (ret == null) + { + throw new ArgumentException("Field '" + fieldType + "' does not exist in " + GetType()); } return ret; } - - public new bool HasField(FieldType fieldType) { + + public new bool HasField(IFieldType fieldType) + { bool ret = base.HasField(fieldType); - if(!ret) { - foreach(IFieldHolder fh in Children) { - if(fh.HasField(fieldType)) { + if (!ret) + { + foreach (IFieldHolder fh in Children) + { + if (fh.HasField(fieldType)) + { ret = true; break; } @@ -105,16 +129,18 @@ namespace Greenshot.Drawing.Fields { } return ret; } - - public new bool HasFieldValue(FieldType fieldType) { - Field f = GetField(fieldType); + + public new bool HasFieldValue(IFieldType fieldType) + { + IField 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; + + public new void SetFieldValue(IFieldType fieldType, object value) + { + IField f = GetField(fieldType); + if (f != null) f.Value = value; } - + } } diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs index 28246a6cc..cee59f0c6 100644 --- a/Greenshot/Drawing/Fields/Field.cs +++ b/Greenshot/Drawing/Fields/Field.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -18,36 +18,53 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +using GreenshotPlugin.Interfaces.Drawing; using System; using System.ComponentModel; -namespace Greenshot.Drawing.Fields { +namespace Greenshot.Drawing.Fields +{ /// <summary> /// Represents a single field of a drawable element, i.e. /// line thickness of a rectangle. /// </summary> [Serializable] - public class Field : INotifyPropertyChanged { - [field:NonSerialized] + public class Field : IField + { + [field: NonSerialized] public event PropertyChangedEventHandler PropertyChanged; - - public object myValue; - public object Value { - get { - return myValue; + + private object _myValue; + public object Value + { + get + { + return _myValue; } - set { - if (!Equals(myValue,value)) { - myValue = value; - if (PropertyChanged!=null) { + set + { + if (!Equals(_myValue, value)) + { + _myValue = value; + if (PropertyChanged != null) + { PropertyChanged(this, new PropertyChangedEventArgs("Value")); } } } } - public FieldType FieldType; - public string Scope; - + public IFieldType FieldType + { + get; + set; + } + public string Scope + { + get; + set; + } + /// <summary> /// Constructs a new Field instance, usually you should be using FieldFactory /// to create Fields. @@ -59,70 +76,64 @@ namespace Greenshot.Drawing.Fields { /// 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)) /// </param> - public Field(FieldType fieldType, Type scope) { + public Field(IFieldType fieldType, Type scope) + { FieldType = fieldType; Scope = scope.Name; } - public Field(FieldType fieldType, string scope) { + public Field(IFieldType fieldType, string scope) + { FieldType = fieldType; Scope = scope; } - public Field(FieldType fieldType) { + public Field(IFieldType fieldType) + { FieldType = fieldType; } /// <summary> /// Returns true if this field holds a value other than null. /// </summary> - public bool HasValue { - get{ return Value != null; } + public bool HasValue + { + get { return Value != null; } } - + /// <summary> /// Creates a flat clone of this Field. The fields value itself is not cloned. /// </summary> /// <returns></returns> - public Field Clone() { + public Field Clone() + { Field ret = new Field(FieldType, Scope); ret.Value = Value; return ret; } - - public override int GetHashCode() { + + public override int GetHashCode() + { int hashCode = 0; - unchecked { + unchecked + { hashCode += 1000000009 * FieldType.GetHashCode(); if (Scope != null) hashCode += 1000000021 * Scope.GetHashCode(); } return hashCode; } - - public override bool Equals(object obj) { + + public override bool Equals(object obj) + { Field other = obj as Field; - if (other == null) { + if (other == null) + { return false; } return FieldType == other.FieldType && Equals(Scope, other.Scope); } - - public override string ToString() { - return string.Format("[Field FieldType={1} Value={0} Scope={2}]", myValue, FieldType, Scope); - } - } - - - /// <summary> - /// EventHandler to be used when a field value changes - /// </summary> - public delegate void FieldChangedEventHandler(object sender, FieldChangedEventArgs e); - - /// <summary> - /// EventArgs to be used with FieldChangedEventHandler - /// </summary> - public class FieldChangedEventArgs : EventArgs { - public readonly Field Field; - public FieldChangedEventArgs(Field field) { - Field = field; + + public override string ToString() + { + return string.Format("[Field FieldType={1} Value={0} Scope={2}]", _myValue, FieldType, Scope); } } } diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 476233f73..7c2e7558f 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -19,14 +19,18 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +using Greenshot.Configuration; +using Greenshot.IniFile; +using Greenshot.Plugin; +using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Interfaces; +using GreenshotPlugin.Interfaces.Drawing; +using log4net; using System.Collections.Generic; using System.ComponentModel; -using Greenshot.Configuration; -using Greenshot.IniFile; -using Greenshot.Plugin.Drawing; - -namespace Greenshot.Drawing.Fields { +namespace Greenshot.Drawing.Fields +{ /// <summary> /// Represents the current set of properties for the editor. /// When one of EditorProperties' properties is updated, the change will be promoted @@ -38,35 +42,47 @@ namespace Greenshot.Drawing.Fields { /// 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. /// </summary> - public class FieldAggregator : AbstractFieldHolder { - - private readonly List<IDrawableContainer> boundContainers; - private bool internalUpdateRunning; + public class FieldAggregator : AbstractFieldHolder + { - private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + private IDrawableContainerList boundContainers; + private bool internalUpdateRunning = false; - public FieldAggregator() { - foreach(FieldType fieldType in FieldType.Values) { + enum Status { IDLE, BINDING, UPDATING }; + + private static readonly ILog LOG = LogManager.GetLogger(typeof(FieldAggregator)); + private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection<EditorConfiguration>(); + + public FieldAggregator(ISurface parent) + { + foreach (FieldType fieldType in FieldType.Values) + { Field field = new Field(fieldType, GetType()); AddField(field); } - boundContainers = new List<IDrawableContainer>(); + boundContainers = new DrawableContainerList(); + boundContainers.Parent = parent; } - - public override void AddField(Field field) { + + public override void AddField(IField field) + { base.AddField(field); field.PropertyChanged += OwnPropertyChanged; } - - public void BindElements(DrawableContainerList dcs) { - foreach(DrawableContainer dc in dcs) { + + public void BindElements(IDrawableContainerList dcs) + { + foreach (DrawableContainer dc in dcs) + { BindElement(dc); } } - public void BindElement(IDrawableContainer dc) { + public void BindElement(IDrawableContainer dc) + { DrawableContainer container = dc as DrawableContainer; - if (container != null && !boundContainers.Contains(container)) { + if (container != null && !boundContainers.Contains(container)) + { boundContainers.Add(container); container.ChildrenChanged += delegate { UpdateFromBoundElements(); @@ -74,101 +90,126 @@ namespace Greenshot.Drawing.Fields { UpdateFromBoundElements(); } } - - public void BindAndUpdateElement(IDrawableContainer dc) { + + public void BindAndUpdateElement(IDrawableContainer dc) + { UpdateElement(dc); BindElement(dc); } - - public void UpdateElement(IDrawableContainer dc) { + + public void UpdateElement(IDrawableContainer dc) + { DrawableContainer container = dc as DrawableContainer; - if (container == null) { + if (container == null) + { return; } internalUpdateRunning = true; - foreach(Field field in GetFields()) { - if (container.HasField(field.FieldType) && field.HasValue) { + foreach (Field field in GetFields()) + { + if (container.HasField(field.FieldType) && field.HasValue) + { //if(LOG.IsDebugEnabled) LOG.Debug(" "+field+ ": "+field.Value); container.SetFieldValue(field.FieldType, field.Value); } } internalUpdateRunning = false; } - - public void UnbindElement(IDrawableContainer dc) { - if (boundContainers.Contains(dc)) { + + public void UnbindElement(IDrawableContainer dc) + { + if (boundContainers.Contains(dc)) + { boundContainers.Remove(dc); UpdateFromBoundElements(); } } - - public void Clear() { + + public void Clear() + { ClearFields(); - boundContainers.Clear(); + boundContainers.Clear(); UpdateFromBoundElements(); } - + /// <summary> /// sets all field values to null, however does not remove fields /// </summary> - private void ClearFields() { + private void ClearFields() + { internalUpdateRunning = true; - foreach(Field field in GetFields()) { + foreach (Field field in GetFields()) + { field.Value = null; } internalUpdateRunning = false; } - + /// <summary> /// 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. /// </summary> - private void UpdateFromBoundElements() { + private void UpdateFromBoundElements() + { ClearFields(); internalUpdateRunning = true; - foreach(Field field in FindCommonFields()) { + foreach (Field field in FindCommonFields()) + { SetFieldValue(field.FieldType, field.Value); } internalUpdateRunning = false; } - - private List<Field> FindCommonFields() { - List<Field> returnFields = null; - if (boundContainers.Count > 0) { + + private IList<IField> FindCommonFields() + { + IList<IField> returnFields = null; + if (boundContainers.Count > 0) + { // take all fields from the least selected container... DrawableContainer leastSelectedContainer = boundContainers[boundContainers.Count - 1] as DrawableContainer; - if (leastSelectedContainer != null) { + if (leastSelectedContainer != null) + { returnFields = leastSelectedContainer.GetFields(); - for (int i = 0; i < boundContainers.Count - 1; i++) { + for (int i = 0; i < boundContainers.Count - 1; i++) + { DrawableContainer dc = boundContainers[i] as DrawableContainer; - if (dc != null) { - List<Field> fieldsToRemove = new List<Field>(); - foreach (Field f in returnFields) { + if (dc != null) + { + IList<IField> fieldsToRemove = new List<IField>(); + foreach (IField field in returnFields) + { // ... throw out those that do not apply to one of the other containers - if (!dc.HasField(f.FieldType)) { - fieldsToRemove.Add(f); + if (!dc.HasField(field.FieldType)) + { + fieldsToRemove.Add(field); } } - foreach (Field f in fieldsToRemove) { - returnFields.Remove(f); + foreach (IField field in fieldsToRemove) + { + returnFields.Remove(field); } } } } } - if (returnFields == null) { - returnFields = new List<Field>(); + if (returnFields == null) + { + returnFields = new List<IField>(); } return returnFields; } - - public void OwnPropertyChanged(object sender, PropertyChangedEventArgs ea) { - Field field = (Field) sender; - if (!internalUpdateRunning && field.Value != null) { - foreach(DrawableContainer drawableContainer in boundContainers) { - if (drawableContainer.HasField(field.FieldType)) { - Field drawableContainerField = drawableContainer.GetField(field.FieldType); + + public void OwnPropertyChanged(object sender, PropertyChangedEventArgs ea) + { + IField field = (IField)sender; + if (!internalUpdateRunning && field.Value != null) + { + foreach (DrawableContainer drawableContainer in boundContainers) + { + if (drawableContainer.HasField(field.FieldType)) + { + IField drawableContainerField = drawableContainer.GetField(field.FieldType); // Notify before change, so we can e.g. invalidate the area drawableContainer.BeforeFieldChange(drawableContainerField, field.Value); @@ -180,5 +221,5 @@ namespace Greenshot.Drawing.Fields { } } - } + } } diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index 4469f86cf..3090e3e51 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -18,38 +18,41 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +using GreenshotPlugin.Interfaces.Drawing; using System; -namespace Greenshot.Drawing.Fields { +namespace Greenshot.Drawing.Fields +{ /// <summary> /// Defines all FieldTypes + their default value. /// (The additional value is why this is not an enum) /// </summary> [Serializable] - public class FieldType { - - public static readonly FieldType ARROWHEADS = new FieldType("ARROWHEADS"); - public static readonly FieldType BLUR_RADIUS = new FieldType("BLUR_RADIUS"); - public static readonly FieldType BRIGHTNESS = new FieldType("BRIGHTNESS"); - public static readonly FieldType FILL_COLOR = new FieldType("FILL_COLOR"); - public static readonly FieldType FONT_BOLD = new FieldType("FONT_BOLD"); - public static readonly FieldType FONT_FAMILY = new FieldType("FONT_FAMILY"); - public static readonly FieldType FONT_ITALIC = new FieldType("FONT_ITALIC"); - public static readonly FieldType FONT_SIZE = new FieldType("FONT_SIZE"); - public static readonly FieldType TEXT_HORIZONTAL_ALIGNMENT = new FieldType("TEXT_HORIZONTAL_ALIGNMENT"); - public static readonly FieldType TEXT_VERTICAL_ALIGNMENT = new FieldType("TEXT_VERTICAL_ALIGNMENT"); - public static readonly FieldType HIGHLIGHT_COLOR = new FieldType("HIGHLIGHT_COLOR"); - public static readonly FieldType LINE_COLOR = new FieldType("LINE_COLOR"); - public static readonly FieldType LINE_THICKNESS = new FieldType("LINE_THICKNESS"); - public static readonly FieldType MAGNIFICATION_FACTOR = new FieldType("MAGNIFICATION_FACTOR"); - public static readonly FieldType PIXEL_SIZE = new FieldType("PIXEL_SIZE"); - public static readonly FieldType PREVIEW_QUALITY = new FieldType("PREVIEW_QUALITY"); - public static readonly FieldType SHADOW = new FieldType("SHADOW"); - public static readonly FieldType PREPARED_FILTER_OBFUSCATE = new FieldType("PREPARED_FILTER_OBFUSCATE"); - public static readonly FieldType PREPARED_FILTER_HIGHLIGHT = new FieldType("PREPARED_FILTER_HIGHLIGHT"); - public static readonly FieldType FLAGS = new FieldType("FLAGS"); - - public static FieldType[] Values = new FieldType[]{ + public class FieldType : IFieldType + { + + public static readonly IFieldType ARROWHEADS = new FieldType("ARROWHEADS"); + public static readonly IFieldType BLUR_RADIUS = new FieldType("BLUR_RADIUS"); + public static readonly IFieldType BRIGHTNESS = new FieldType("BRIGHTNESS"); + public static readonly IFieldType FILL_COLOR = new FieldType("FILL_COLOR"); + public static readonly IFieldType FONT_BOLD = new FieldType("FONT_BOLD"); + public static readonly IFieldType FONT_FAMILY = new FieldType("FONT_FAMILY"); + public static readonly IFieldType FONT_ITALIC = new FieldType("FONT_ITALIC"); + public static readonly IFieldType FONT_SIZE = new FieldType("FONT_SIZE"); + public static readonly IFieldType TEXT_HORIZONTAL_ALIGNMENT = new FieldType("TEXT_HORIZONTAL_ALIGNMENT"); + public static readonly IFieldType TEXT_VERTICAL_ALIGNMENT = new FieldType("TEXT_VERTICAL_ALIGNMENT"); + public static readonly IFieldType HIGHLIGHT_COLOR = new FieldType("HIGHLIGHT_COLOR"); + public static readonly IFieldType LINE_COLOR = new FieldType("LINE_COLOR"); + public static readonly IFieldType LINE_THICKNESS = new FieldType("LINE_THICKNESS"); + public static readonly IFieldType MAGNIFICATION_FACTOR = new FieldType("MAGNIFICATION_FACTOR"); + public static readonly IFieldType PIXEL_SIZE = new FieldType("PIXEL_SIZE"); + public static readonly IFieldType PREVIEW_QUALITY = new FieldType("PREVIEW_QUALITY"); + public static readonly IFieldType SHADOW = new FieldType("SHADOW"); + public static readonly IFieldType PREPARED_FILTER_OBFUSCATE = new FieldType("PREPARED_FILTER_OBFUSCATE"); + public static readonly IFieldType PREPARED_FILTER_HIGHLIGHT = new FieldType("PREPARED_FILTER_HIGHLIGHT"); + public static readonly IFieldType FLAGS = new FieldType("FLAGS"); + + public static IFieldType[] Values = new IFieldType[]{ ARROWHEADS, BLUR_RADIUS, BRIGHTNESS, @@ -66,53 +69,55 @@ namespace Greenshot.Drawing.Fields { MAGNIFICATION_FACTOR, PIXEL_SIZE, PREVIEW_QUALITY, - SHADOW, + SHADOW, PREPARED_FILTER_OBFUSCATE, - PREPARED_FILTER_HIGHLIGHT, + PREPARED_FILTER_HIGHLIGHT, FLAGS }; - - [Flags] - public enum Flag { - NONE = 0, - CONFIRMABLE = 1 + + public string Name + { + get; + set; } - - - public string Name; - private FieldType(string name) { + + private FieldType(string name) + { Name = name; } - public override string ToString() { + public override string ToString() + { return Name; } public override int GetHashCode() { int hashCode = 0; - unchecked { + 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 Equals(Name,other.Name); + } + return Equals(Name, other.Name); } - - public static bool operator ==(FieldType a, FieldType b) { - return Equals(a,b); + + public static bool operator ==(FieldType a, FieldType b) + { + return Equals(a, b); } - - public static bool operator !=(FieldType a, FieldType b) { - return !Equals(a,b); + + public static bool operator !=(FieldType a, FieldType b) + { + return !Equals(a, b); } - } - - } diff --git a/Greenshot/Drawing/Filters/IFilter.cs b/Greenshot/Drawing/Filters/IFilter.cs index 5840e9650..f2ff0640c 100644 --- a/Greenshot/Drawing/Filters/IFilter.cs +++ b/Greenshot/Drawing/Filters/IFilter.cs @@ -21,11 +21,11 @@ using System.ComponentModel; using System.Drawing; - -using Greenshot.Drawing.Fields; using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Interfaces.Drawing; -namespace Greenshot.Drawing.Filters { +namespace Greenshot.Drawing.Filters +{ public interface IFilter : INotifyPropertyChanged, IFieldHolder { DrawableContainer Parent {get; set; } void Apply(Graphics graphics, Bitmap bmp, Rectangle rect, RenderMode renderMode); diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index 5b8b783e2..fc871e4fe 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -23,6 +23,7 @@ using System.Runtime.Serialization; using Greenshot.Drawing.Fields; using Greenshot.Drawing.Filters; +using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Drawing { /// <summary> diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index ca1742195..0b286fcea 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -28,6 +28,7 @@ using System.Drawing.Drawing2D; using Greenshot.Core; using log4net; using System.Runtime.Serialization; +using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Drawing { /// <summary> diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index 032291527..1805f86d2 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -22,6 +22,7 @@ using System; using System.Runtime.Serialization; using Greenshot.Drawing.Fields; using Greenshot.Drawing.Filters; +using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Drawing { /// <summary> diff --git a/Greenshot/Drawing/SpeechbubbleContainer.cs b/Greenshot/Drawing/SpeechbubbleContainer.cs index e86c52be5..e3e74e113 100644 --- a/Greenshot/Drawing/SpeechbubbleContainer.cs +++ b/Greenshot/Drawing/SpeechbubbleContainer.cs @@ -48,8 +48,8 @@ namespace Greenshot.Drawing /// <param name="context"></param> [OnSerializing] private void SetValuesOnSerializing(StreamingContext context) { - if (TargetGripper != null) { - _storedTargetGripperLocation = TargetGripper.Location; + if (TargetAdorner != null) { + _storedTargetGripperLocation = TargetAdorner.Location; } } @@ -59,7 +59,7 @@ namespace Greenshot.Drawing /// <param name="context"></param> protected override void OnDeserialized(StreamingContext context) { - InitTargetGripper(Color.Green, _storedTargetGripperLocation); + InitAdorner(Color.Green, _storedTargetGripperLocation); } #endregion @@ -88,9 +88,9 @@ namespace Greenshot.Drawing /// </summary> /// <returns>true if the surface doesn't need to handle the event</returns> public override bool HandleMouseDown(int mouseX, int mouseY) { - if (TargetGripper == null) { + if (TargetAdorner == null) { _initialGripperPoint = new Point(mouseX, mouseY); - InitTargetGripper(Color.Green, new Point(mouseX, mouseY)); + InitAdorner(Color.Green, new Point(mouseX, mouseY)); } return base.HandleMouseDown(mouseX, mouseY); } @@ -114,9 +114,9 @@ namespace Greenshot.Drawing Point newGripperLocation = _initialGripperPoint; newGripperLocation.Offset(xOffset, yOffset); - if (TargetGripper.Location != newGripperLocation) { + if (TargetAdorner.Location != newGripperLocation) { Invalidate(); - TargetGripper.Location = newGripperLocation; + TargetAdorner.Location = newGripperLocation; Invalidate(); } return returnValue; @@ -178,7 +178,7 @@ namespace Greenshot.Drawing private GraphicsPath CreateTail() { Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetGripper.Location.X, TargetGripper.Location.Y); + int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetAdorner.Location.X, TargetAdorner.Location.Y); int tailWidth = (Math.Abs(rect.Width) + Math.Abs(rect.Height)) / 20; // This should fix a problem with the tail being to wide @@ -190,7 +190,7 @@ namespace Greenshot.Drawing tail.AddLine(tailWidth, 0, 0, -tailLength); tail.CloseFigure(); - int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2, TargetGripper.Location.X, TargetGripper.Location.Y); + int tailAngle = 90 + (int)GeometryHelper.Angle2D(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2, TargetAdorner.Location.X, TargetAdorner.Location.Y); using (Matrix tailMatrix = new Matrix()) { tailMatrix.Translate(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2); @@ -207,7 +207,7 @@ namespace Greenshot.Drawing /// <param name="graphics"></param> /// <param name="renderMode"></param> public override void Draw(Graphics graphics, RenderMode renderMode) { - if (TargetGripper == null) { + if (TargetAdorner == null) { return; } graphics.SmoothingMode = SmoothingMode.HighQuality; diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 636fd4540..45dce668e 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -94,6 +94,10 @@ namespace Greenshot.Drawing { /// </summary> /// <param name="newParent"></param> protected override void SwitchParent(Surface newParent) { + if (newParent == Parent) + { + return; + } if (Parent != null) { ((Surface)Parent).RemoveStepLabel(this); } diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 13dec90c0..8b56d16f3 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -30,10 +30,10 @@ using Greenshot.Plugin.Drawing; using Greenshot.Plugin.Drawing.Adorners; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; +using GreenshotPlugin.Interfaces.Drawing; using log4net; using System; using System.Collections.Generic; -using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; @@ -43,14 +43,14 @@ using System.Windows.Forms; namespace Greenshot.Drawing { - /// <summary> /// Description of Surface. /// </summary> - public class Surface : Control, ISurface { - private static readonly ILog LOG = LogManager.GetLogger(typeof(Surface)); - public static int Count; - private static readonly CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); + public class Surface : Control, ISurface + { + private static ILog LOG = LogManager.GetLogger(typeof(Surface)); + public static int Count = 0; + private static CoreConfiguration conf = IniConfig.GetIniSection<CoreConfiguration>(); // Property to identify the Surface ID private Guid _uniqueId = Guid.NewGuid(); @@ -58,11 +58,14 @@ namespace Greenshot.Drawing /// <summary> /// The GUID of the surface /// </summary> - public Guid ID { - get { + public Guid ID + { + get + { return _uniqueId; } - set { + set + { _uniqueId = value; } } @@ -72,41 +75,53 @@ namespace Greenshot.Drawing /// </summary> [NonSerialized] private SurfaceElementEventHandler _movingElementChanged; - public event SurfaceElementEventHandler MovingElementChanged { - add { + public event SurfaceElementEventHandler MovingElementChanged + { + add + { _movingElementChanged += value; } - remove { + remove + { _movingElementChanged -= value; } } [NonSerialized] private SurfaceDrawingModeEventHandler _drawingModeChanged; - public event SurfaceDrawingModeEventHandler DrawingModeChanged { - add { + public event SurfaceDrawingModeEventHandler DrawingModeChanged + { + add + { _drawingModeChanged += value; } - remove { + remove + { _drawingModeChanged -= value; } } [NonSerialized] private SurfaceSizeChangeEventHandler _surfaceSizeChanged; - public event SurfaceSizeChangeEventHandler SurfaceSizeChanged { - add { + public event SurfaceSizeChangeEventHandler SurfaceSizeChanged + { + add + { _surfaceSizeChanged += value; } - remove { + remove + { _surfaceSizeChanged -= value; } } [NonSerialized] private SurfaceMessageEventHandler _surfaceMessage; - public event SurfaceMessageEventHandler SurfaceMessage { - add { + public event SurfaceMessageEventHandler SurfaceMessage + { + add + { _surfaceMessage += value; } - remove { + remove + { _surfaceMessage -= value; } } @@ -171,7 +186,7 @@ namespace Greenshot.Drawing /// all selected elements, do not serialize /// </summary> [NonSerialized] - private readonly DrawableContainerList selectedElements; + private readonly IDrawableContainerList selectedElements; /// <summary> /// the element we are drawing with, do not serialize @@ -212,10 +227,15 @@ namespace Greenshot.Drawing /// </summary> private readonly List<StepLabelContainer> _stepLabels = new List<StepLabelContainer>(); - public void AddStepLabel(StepLabelContainer stepLabel) { - _stepLabels.Add(stepLabel); + public void AddStepLabel(StepLabelContainer stepLabel) + { + if (!_stepLabels.Contains(stepLabel)) + { + _stepLabels.Add(stepLabel); + } } - public void RemoveStepLabel(StepLabelContainer stepLabel) { + public void RemoveStepLabel(StepLabelContainer stepLabel) + { _stepLabels.Remove(stepLabel); } @@ -224,13 +244,17 @@ namespace Greenshot.Drawing /// </summary> /// <param name="stopAtContainer">can be null, if not the counting stops here</param> /// <returns>number of steplabels before the supplied container</returns> - public int CountStepLabels(IDrawableContainer stopAtContainer) { + public int CountStepLabels(IDrawableContainer stopAtContainer) + { int number = 1; - foreach (var possibleThis in _stepLabels) { - if (possibleThis.Equals(stopAtContainer)) { + foreach (var possibleThis in _stepLabels) + { + if (possibleThis.Equals(stopAtContainer)) + { break; } - if (IsOnSurface(possibleThis)) { + if (IsOnSurface(possibleThis)) + { number++; } } @@ -240,12 +264,12 @@ namespace Greenshot.Drawing /// <summary> /// all elements on the surface, needed with serialization /// </summary> - private readonly DrawableContainerList _elements; + private readonly IDrawableContainerList _elements; /// <summary> /// all elements on the surface, needed with serialization /// </summary> - private FieldAggregator _fieldAggregator = new FieldAggregator(); + private FieldAggregator _fieldAggregator; /// <summary> /// the cursor container, needed with serialization as we need a direct acces to it. @@ -269,11 +293,14 @@ namespace Greenshot.Drawing /// The image is the actual captured image, needed with serialization /// </summary> private Image _image; - public Image Image { - get { + public Image Image + { + get + { return _image; } - set { + set + { _image = value; Size = _image.Size; } @@ -283,11 +310,14 @@ namespace Greenshot.Drawing /// The field aggregator is that which is used to have access to all the fields inside the currently selected elements. /// e.g. used to decided if and which line thickness is shown when multiple elements are selected. /// </summary> - public FieldAggregator FieldAggregator { - get { + public FieldAggregator FieldAggregator + { + get + { return _fieldAggregator; } - set { + set + { _fieldAggregator = value; } } @@ -295,8 +325,10 @@ namespace Greenshot.Drawing /// <summary> /// The cursor container has it's own accessor so we can find and remove this (when needed) /// </summary> - public IDrawableContainer CursorContainer { - get { + public IDrawableContainer CursorContainer + { + get + { return _cursorContainer; } } @@ -304,8 +336,10 @@ namespace Greenshot.Drawing /// <summary> /// A simple getter to ask if this surface has a cursor /// </summary> - public bool HasCursor { - get { + public bool HasCursor + { + get + { return _cursorContainer != null; } } @@ -313,7 +347,8 @@ namespace Greenshot.Drawing /// <summary> /// A simple helper method to remove the cursor from the surface /// </summary> - public void RemoveCursor() { + public void RemoveCursor() + { RemoveElement(_cursorContainer, true); _cursorContainer = null; } @@ -321,11 +356,14 @@ namespace Greenshot.Drawing /// <summary> /// The brush which is used to draw the transparent background /// </summary> - public Brush TransparencyBackgroundBrush { - get { + public Brush TransparencyBackgroundBrush + { + get + { return _transparencyBackgroundBrush; } - set { + set + { _transparencyBackgroundBrush = value; } } @@ -333,11 +371,14 @@ namespace Greenshot.Drawing /// <summary> /// Are the keys on this surface locked? /// </summary> - public bool KeysLocked { - get { + public bool KeysLocked + { + get + { return _keysLocked; } - set { + set + { _keysLocked = value; } } @@ -345,11 +386,14 @@ namespace Greenshot.Drawing /// <summary> /// Is this surface modified? This is only true if the surface has not been exported. /// </summary> - public bool Modified { - get { + public bool Modified + { + get + { return _modified; } - set { + set + { _modified = value; } } @@ -357,11 +401,14 @@ namespace Greenshot.Drawing /// <summary> /// The DrawingMode property specifies the mode for drawing, more or less the element type. /// </summary> - public DrawingModes DrawingMode { - get {return _drawingMode;} - set { + public DrawingModes DrawingMode + { + get { return _drawingMode; } + set + { _drawingMode = value; - if (_drawingModeChanged != null) { + if (_drawingModeChanged != null) + { SurfaceDrawingModeEventArgs eventArgs = new SurfaceDrawingModeEventArgs(); eventArgs.DrawingMode = _drawingMode; _drawingModeChanged.Invoke(this, eventArgs); @@ -374,11 +421,14 @@ namespace Greenshot.Drawing /// <summary> /// Property for accessing the last save "full" path /// </summary> - public string LastSaveFullPath { - get { + public string LastSaveFullPath + { + get + { return _lastSaveFullPath; } - set { + set + { _lastSaveFullPath = value; } } @@ -386,7 +436,8 @@ namespace Greenshot.Drawing /// <summary> /// Property for accessing the URL to which the surface was recently uploaded /// </summary> - public string UploadURL { + public string UploadURL + { get; set; } @@ -394,11 +445,14 @@ namespace Greenshot.Drawing /// <summary> /// Property for accessing the capture details /// </summary> - public ICaptureDetails CaptureDetails { - get { + public ICaptureDetails CaptureDetails + { + get + { return _captureDetails; } - set { + set + { _captureDetails = value; } } @@ -406,7 +460,9 @@ namespace Greenshot.Drawing /// <summary> /// Base Surface constructor /// </summary> - public Surface() : base(){ + public Surface() : base() + { + _fieldAggregator = new FieldAggregator(this); Count++; _elements = new DrawableContainerList(_uniqueId); selectedElements = new DrawableContainerList(_uniqueId); @@ -429,15 +485,17 @@ namespace Greenshot.Drawing DoubleBuffered = true; SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.ContainerControl | ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true); } - + /// <summary> /// Private method, the current image is disposed the new one will stay. /// </summary> /// <param name="newImage">The new image</param> /// <param name="dispose">true if the old image needs to be disposed, when using undo this should not be true!!</param> - private void SetImage(Image newImage, bool dispose) { + private void SetImage(Image newImage, bool dispose) + { // Dispose - if (_image != null && dispose) { + if (_image != null && dispose) + { _image.Dispose(); } @@ -452,7 +510,8 @@ namespace Greenshot.Drawing /// Surface constructor with an image /// </summary> /// <param name="newImage"></param> - public Surface(Image newImage) : this() { + public Surface(Image newImage) : this() + { LOG.DebugFormat("Got image with dimensions {0} and format {1}", newImage.Size, newImage.PixelFormat); SetImage(newImage, true); } @@ -461,13 +520,16 @@ namespace Greenshot.Drawing /// Surface contructor with a capture /// </summary> /// <param name="capture"></param> - public Surface(ICapture capture) : this(capture.Image) { + public Surface(ICapture capture) : this(capture.Image) + { // check if cursor is captured, and visible - if (capture.Cursor != null && capture.CursorVisible) { + if (capture.Cursor != null && capture.CursorVisible) + { Rectangle cursorRect = new Rectangle(capture.CursorLocation, capture.Cursor.Size); Rectangle captureRect = new Rectangle(Point.Empty, capture.Image.Size); // check if cursor is on the capture, otherwise we leave it out. - if (cursorRect.IntersectsWith(captureRect)) { + if (cursorRect.IntersectsWith(captureRect)) + { _cursorContainer = AddIconContainer(capture.Cursor, capture.CursorLocation.X, capture.CursorLocation.Y); SelectElement(_cursorContainer); } @@ -478,34 +540,43 @@ namespace Greenshot.Drawing _captureDetails = capture.CaptureDetails; } - protected override void Dispose(bool disposing) { - if (disposing) { + protected override void Dispose(bool disposing) + { + if (disposing) + { Count--; LOG.Debug("Disposing surface!"); - if (_buffer != null) { + if (_buffer != null) + { _buffer.Dispose(); _buffer = null; } - if (_transparencyBackgroundBrush != null) { + if (_transparencyBackgroundBrush != null) + { _transparencyBackgroundBrush.Dispose(); _transparencyBackgroundBrush = null; } // Cleanup undo/redo stacks - while (_undoStack != null && _undoStack.Count > 0) { + while (_undoStack != null && _undoStack.Count > 0) + { _undoStack.Pop().Dispose(); } - while (_redoStack != null && _redoStack.Count > 0) { + while (_redoStack != null && _redoStack.Count > 0) + { _redoStack.Pop().Dispose(); } - foreach (IDrawableContainer container in _elements) { + foreach (IDrawableContainer container in _elements) + { container.Dispose(); } - if (_undrawnElement != null) { + if (_undrawnElement != null) + { _undrawnElement.Dispose(); _undrawnElement = null; } - if (_cropContainer != null) { + if (_cropContainer != null) + { _cropContainer.Dispose(); _cropContainer = null; } @@ -516,32 +587,38 @@ namespace Greenshot.Drawing /// <summary> /// Undo the last action /// </summary> - public void Undo() { - if (_undoStack.Count > 0) { + public void Undo() + { + if (_undoStack.Count > 0) + { _inUndoRedo = true; IMemento top = _undoStack.Pop(); _redoStack.Push(top.Restore()); _inUndoRedo = false; } - } + } /// <summary> /// Undo an undo (=redo) /// </summary> - public void Redo() { - if (_redoStack.Count > 0) { + public void Redo() + { + if (_redoStack.Count > 0) + { _inUndoRedo = true; IMemento top = _redoStack.Pop(); _undoStack.Push(top.Restore()); _inUndoRedo = false; } } - + /// <summary> /// Returns if the surface can do a undo /// </summary> - public bool CanUndo { - get { + public bool CanUndo + { + get + { return _undoStack.Count > 0; } } @@ -549,8 +626,10 @@ namespace Greenshot.Drawing /// <summary> /// Returns if the surface can do a redo /// </summary> - public bool CanRedo { - get { + public bool CanRedo + { + get + { return _redoStack.Count > 0; } } @@ -558,11 +637,10 @@ namespace Greenshot.Drawing /// <summary> /// Get the language key for the undo action /// </summary> - public LangKey UndoActionLanguageKey { - get { - if (CanUndo) { - return _undoStack.Peek().ActionLanguageKey; - } + public LangKey UndoActionLanguageKey + { + get + { return LangKey.none; } } @@ -570,11 +648,10 @@ namespace Greenshot.Drawing /// <summary> /// Get the language key for redo action /// </summary> - public LangKey RedoActionLanguageKey { - get { - if (CanRedo) { - return _redoStack.Peek().ActionLanguageKey; - } + public LangKey RedoActionLanguageKey + { + get + { return LangKey.none; } } @@ -584,19 +661,25 @@ namespace Greenshot.Drawing /// </summary> /// <param name="memento">The memento implementing the undo</param> /// <param name="allowMerge">Allow changes to be merged</param> - public void MakeUndoable(IMemento memento, bool allowMerge) { - if (_inUndoRedo) { + public void MakeUndoable(IMemento memento, bool allowMerge) + { + if (_inUndoRedo) + { throw new InvalidOperationException("Invoking do within an undo/redo action."); } - if (memento != null) { + if (memento != null) + { bool allowPush = true; - if (_undoStack.Count > 0 && allowMerge) { + if (_undoStack.Count > 0 && allowMerge) + { // Check if merge is possible allowPush = !_undoStack.Peek().Merge(memento); } - if (allowPush) { + if (allowPush) + { // Clear the redo-stack and dispose - while(_redoStack.Count > 0) { + while (_redoStack.Count > 0) + { _redoStack.Pop().Dispose(); } _undoStack.Push(memento); @@ -610,14 +693,18 @@ namespace Greenshot.Drawing /// </summary> /// <param name="streamWrite"></param> /// <returns></returns> - public long SaveElementsToStream(Stream streamWrite) { + public long SaveElementsToStream(Stream streamWrite) + { long bytesWritten = 0; - try { + try + { long lengtBefore = streamWrite.Length; BinaryFormatter binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, _elements); bytesWritten = streamWrite.Length - lengtBefore; - } catch (Exception e) { + } + catch (Exception e) + { LOG.Error("Error serializing elements to stream.", e); } return bytesWritten; @@ -627,20 +714,24 @@ namespace Greenshot.Drawing /// This loads elements from a stream, among others this is used to load a surface. /// </summary> /// <param name="streamRead"></param> - public void LoadElementsFromStream(Stream streamRead) { - try { + public void LoadElementsFromStream(Stream streamRead) + { + try + { BinaryFormatter binaryRead = new BinaryFormatter(); - DrawableContainerList loadedElements = (DrawableContainerList) binaryRead.Deserialize(streamRead); + IDrawableContainerList loadedElements = (IDrawableContainerList)binaryRead.Deserialize(streamRead); loadedElements.Parent = this; // Make sure the steplabels are sorted accoring to their number - _stepLabels.Sort(delegate(StepLabelContainer p1, StepLabelContainer p2) { + _stepLabels.Sort(delegate (StepLabelContainer p1, StepLabelContainer p2) { return p1.Number.CompareTo(p2.Number); }); DeselectAllElements(); AddElements(loadedElements); SelectElements(loadedElements); FieldAggregator.BindElements(loadedElements); - } catch (Exception e) { + } + catch (Exception e) + { LOG.Error("Error serializing elements from stream.", e); } } @@ -650,11 +741,14 @@ namespace Greenshot.Drawing /// But here an element is created which is not yet draw, thus "undrawnElement". /// The element is than used while drawing on the surface. /// </summary> - private void CreateUndrawnElement() { - if(_undrawnElement != null) { + private void CreateUndrawnElement() + { + if (_undrawnElement != null) + { FieldAggregator.UnbindElement(_undrawnElement); } - switch (DrawingMode) { + switch (DrawingMode) + { case DrawingModes.Rect: _undrawnElement = new RectangleContainer(this); break; @@ -696,13 +790,15 @@ namespace Greenshot.Drawing _undrawnElement = null; break; } - if (_undrawnElement != null) { + if (_undrawnElement != null) + { FieldAggregator.BindElement(_undrawnElement); } } #region Plugin interface implementations - public IImageContainer AddImageContainer(Image image, int x, int y) { + public IImageContainer AddImageContainer(Image image, int x, int y) + { ImageContainer bitmapContainer = new ImageContainer(this); bitmapContainer.Image = image; bitmapContainer.Left = x; @@ -711,7 +807,8 @@ namespace Greenshot.Drawing return bitmapContainer; } - public IImageContainer AddImageContainer(string filename, int x, int y) { + public IImageContainer AddImageContainer(string filename, int x, int y) + { ImageContainer bitmapContainer = new ImageContainer(this); bitmapContainer.Load(filename); bitmapContainer.Left = x; @@ -719,7 +816,8 @@ namespace Greenshot.Drawing AddElement(bitmapContainer); return bitmapContainer; } - public IIconContainer AddIconContainer(Icon icon, int x, int y) { + public IIconContainer AddIconContainer(Icon icon, int x, int y) + { IconContainer iconContainer = new IconContainer(this); iconContainer.Icon = icon; iconContainer.Left = x; @@ -727,7 +825,8 @@ namespace Greenshot.Drawing AddElement(iconContainer); return iconContainer; } - public IIconContainer AddIconContainer(string filename, int x, int y) { + public IIconContainer AddIconContainer(string filename, int x, int y) + { IconContainer iconContainer = new IconContainer(this); iconContainer.Load(filename); iconContainer.Left = x; @@ -735,7 +834,8 @@ namespace Greenshot.Drawing AddElement(iconContainer); return iconContainer; } - public ICursorContainer AddCursorContainer(Cursor cursor, int x, int y) { + public ICursorContainer AddCursorContainer(Cursor cursor, int x, int y) + { CursorContainer cursorContainer = new CursorContainer(this); cursorContainer.Cursor = cursor; cursorContainer.Left = x; @@ -743,7 +843,8 @@ namespace Greenshot.Drawing AddElement(cursorContainer); return cursorContainer; } - public ICursorContainer AddCursorContainer(string filename, int x, int y) { + public ICursorContainer AddCursorContainer(string filename, int x, int y) + { CursorContainer cursorContainer = new CursorContainer(this); cursorContainer.Load(filename); cursorContainer.Left = x; @@ -752,7 +853,8 @@ namespace Greenshot.Drawing return cursorContainer; } - 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) { + 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); @@ -776,19 +878,28 @@ namespace Greenshot.Drawing #region DragDrop - private void OnDragEnter(object sender, DragEventArgs e) { - if(LOG.IsDebugEnabled) { + private void OnDragEnter(object sender, DragEventArgs e) + { + if (LOG.IsDebugEnabled) + { LOG.Debug("DragEnter got following formats: "); - foreach(string format in ClipboardHelper.GetFormats(e.Data)) { + foreach (string format in ClipboardHelper.GetFormats(e.Data)) + { LOG.Debug(format); } } - if ((e.AllowedEffect & DragDropEffects.Copy) != DragDropEffects.Copy) { - e.Effect=DragDropEffects.None; - } else { - if (ClipboardHelper.ContainsImage(e.Data) || ClipboardHelper.ContainsFormat(e.Data, "DragImageBits")) { + if ((e.AllowedEffect & DragDropEffects.Copy) != DragDropEffects.Copy) + { + e.Effect = DragDropEffects.None; + } + else + { + if (ClipboardHelper.ContainsImage(e.Data) || ClipboardHelper.ContainsFormat(e.Data, "DragImageBits")) + { e.Effect = DragDropEffects.Copy; - } else { + } + else + { e.Effect = DragDropEffects.None; } } @@ -799,14 +910,19 @@ namespace Greenshot.Drawing /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - private void OnDragDrop(object sender, DragEventArgs e) { + private void OnDragDrop(object sender, DragEventArgs e) + { Point mouse = PointToClient(new Point(e.X, e.Y)); - if (e.Data.GetDataPresent("Text")) { + if (e.Data.GetDataPresent("Text")) + { string possibleUrl = ClipboardHelper.GetText(e.Data); // Test if it's an url and try to download the image so we have it in the original form - if (possibleUrl != null && possibleUrl.StartsWith("http")) { - using (Image image = NetworkHelper.DownloadImage(possibleUrl)) { - if (image != null) { + if (possibleUrl != null && possibleUrl.StartsWith("http")) + { + using (Image image = NetworkHelper.DownloadImage(possibleUrl)) + { + if (image != null) + { AddImageContainer(image, mouse.X, mouse.Y); return; } @@ -814,25 +930,29 @@ namespace Greenshot.Drawing } } - foreach (Image image in ClipboardHelper.GetImages(e.Data)) { + foreach (Image image in ClipboardHelper.GetImages(e.Data)) + { AddImageContainer(image, mouse.X, mouse.Y); mouse.Offset(10, 10); image.Dispose(); } } - + #endregion /// <summary> /// Auto crop the image /// </summary> /// <returns>true if cropped</returns> - public bool AutoCrop() { + public bool AutoCrop() + { Rectangle cropRectangle; - using (Image tmpImage = GetImageForExport()) { + using (Image tmpImage = GetImageForExport()) + { cropRectangle = ImageHelper.FindAutoCropRectangle(tmpImage, conf.AutoCropDifference); } - if (!IsCropPossible(ref cropRectangle)) { + if (!IsCropPossible(ref cropRectangle)) + { return false; } DeselectAllElements(); @@ -855,10 +975,12 @@ namespace Greenshot.Drawing /// A simple clear /// </summary> /// <param name="newColor">The color for the background</param> - public void Clear(Color newColor) { + public void Clear(Color newColor) + { //create a blank bitmap the same size as original Bitmap newBitmap = ImageHelper.CreateEmptyLike(Image, Color.Empty); - if (newBitmap != null) { + if (newBitmap != null) + { // Make undoable MakeUndoable(new SurfaceBackgroundChangeMemento(this, null), false); SetImage(newBitmap, false); @@ -870,29 +992,37 @@ namespace Greenshot.Drawing /// Apply a bitmap effect to the surface /// </summary> /// <param name="effect"></param> - public void ApplyBitmapEffect(IEffect effect) { + public void ApplyBitmapEffect(IEffect effect) + { BackgroundForm backgroundForm = new BackgroundForm("Effect", "Please wait"); backgroundForm.Show(); Application.DoEvents(); - try { + try + { Rectangle imageRectangle = new Rectangle(Point.Empty, Image.Size); Matrix matrix = new Matrix(); Image newImage = ImageHelper.ApplyEffect(Image, effect, matrix); - if (newImage != null) { + if (newImage != null) + { // Make sure the elements move according to the offset the effect made the bitmap move _elements.Transform(matrix); // Make undoable MakeUndoable(new SurfaceBackgroundChangeMemento(this, matrix), false); SetImage(newImage, false); Invalidate(); - if (_surfaceSizeChanged != null && !imageRectangle.Equals(new Rectangle(Point.Empty, newImage.Size))) { + if (_surfaceSizeChanged != null && !imageRectangle.Equals(new Rectangle(Point.Empty, newImage.Size))) + { _surfaceSizeChanged(this, null); } - } else { + } + else + { // clean up matrix, as it hasn't been used in the undo stack. matrix.Dispose(); } - } finally { + } + finally + { // Always close the background form backgroundForm.CloseDialog(); } @@ -903,34 +1033,42 @@ namespace Greenshot.Drawing /// </summary> /// <param name="cropRectangle"></param> /// <returns>true if this is possible</returns> - public bool IsCropPossible(ref Rectangle cropRectangle) { + public bool IsCropPossible(ref Rectangle cropRectangle) + { cropRectangle = GuiRectangle.GetGuiRectangle(cropRectangle.Left, cropRectangle.Top, cropRectangle.Width, cropRectangle.Height); - if (cropRectangle.Left < 0) { + if (cropRectangle.Left < 0) + { cropRectangle = new Rectangle(0, cropRectangle.Top, cropRectangle.Width + cropRectangle.Left, cropRectangle.Height); } - if (cropRectangle.Top < 0) { + if (cropRectangle.Top < 0) + { cropRectangle = new Rectangle(cropRectangle.Left, 0, cropRectangle.Width, cropRectangle.Height + cropRectangle.Top); } - if (cropRectangle.Left + cropRectangle.Width > Width) { + if (cropRectangle.Left + cropRectangle.Width > Width) + { cropRectangle = new Rectangle(cropRectangle.Left, cropRectangle.Top, Width - cropRectangle.Left, cropRectangle.Height); } - if (cropRectangle.Top + cropRectangle.Height > Height) { + if (cropRectangle.Top + cropRectangle.Height > Height) + { cropRectangle = new Rectangle(cropRectangle.Left, cropRectangle.Top, cropRectangle.Width, Height - cropRectangle.Top); } - if (cropRectangle.Height > 0 && cropRectangle.Width > 0) { + if (cropRectangle.Height > 0 && cropRectangle.Width > 0) + { return true; } return false; } - + /// <summary> /// Use to send any registered SurfaceMessageEventHandler a message, e.g. used for the notification area /// </summary> /// <param name="source">Who send</param> /// <param name="messageType">Type of message</param> /// <param name="message">Message itself</param> - public void SendMessageEvent(object source, SurfaceMessageTyp messageType, string message) { - if (_surfaceMessage != null) { + public void SendMessageEvent(object source, SurfaceMessageTyp messageType, string message) + { + if (_surfaceMessage != null) + { SurfaceMessageEventArgs eventArgs = new SurfaceMessageEventArgs(); eventArgs.Message = message; eventArgs.MessageType = messageType; @@ -944,14 +1082,19 @@ namespace Greenshot.Drawing /// </summary> /// <param name="cropRectangle"></param> /// <returns></returns> - public bool ApplyCrop(Rectangle cropRectangle) { - if (IsCropPossible(ref cropRectangle)) { + public bool ApplyCrop(Rectangle cropRectangle) + { + if (IsCropPossible(ref cropRectangle)) + { Rectangle imageRectangle = new Rectangle(Point.Empty, Image.Size); Bitmap tmpImage; // Make sure we have information, this this fails - try { + try + { tmpImage = ImageHelper.CloneArea(Image, cropRectangle, PixelFormat.DontCare); - } catch (Exception ex) { + } + catch (Exception ex) + { ex.Data.Add("CropRectangle", cropRectangle); ex.Data.Add("Width", Image.Width); ex.Data.Add("Height", Image.Height); @@ -967,7 +1110,8 @@ namespace Greenshot.Drawing // Do not dispose otherwise we can't undo the image! SetImage(tmpImage, false); _elements.Transform(matrix); - if (_surfaceSizeChanged != null && !imageRectangle.Equals(new Rectangle(Point.Empty, tmpImage.Size))) { + if (_surfaceSizeChanged != null && !imageRectangle.Equals(new Rectangle(Point.Empty, tmpImage.Size))) + { _surfaceSizeChanged(this, null); } Invalidate(); @@ -982,17 +1126,19 @@ namespace Greenshot.Drawing /// </summary> /// <param name="previous"></param> /// <param name="matrix"></param> - public void UndoBackgroundChange(Image previous, Matrix matrix) { + public void UndoBackgroundChange(Image previous, Matrix matrix) + { SetImage(previous, false); - if (matrix != null) { + if (matrix != null) + { _elements.Transform(matrix); } - if (_surfaceSizeChanged != null) { + if (_surfaceSizeChanged != null) + { _surfaceSizeChanged(this, null); } Invalidate(); } - /// <summary> /// Check if an adorner was "hit", and change the cursor if so /// </summary> @@ -1000,11 +1146,11 @@ namespace Greenshot.Drawing /// <returns>IAdorner</returns> private IAdorner FindActiveAdorner(MouseEventArgs mouseEventArgs) { - foreach(IDrawableContainer drawableContainer in selectedElements) + foreach (IDrawableContainer drawableContainer in selectedElements) { - foreach(IAdorner adorner in drawableContainer.Adorners) + foreach (IAdorner adorner in drawableContainer.Adorners) { - + if (adorner.IsActive || adorner.HitTest(mouseEventArgs.Location)) { if (adorner.Cursor != null) @@ -1023,7 +1169,8 @@ namespace Greenshot.Drawing /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void SurfaceMouseDown(object sender, MouseEventArgs e) { + void SurfaceMouseDown(object sender, MouseEventArgs e) + { // Handle Adorners var adorner = FindActiveAdorner(e); @@ -1034,21 +1181,27 @@ namespace Greenshot.Drawing } _mouseStart = e.Location; - + // check contextmenu - if (e.Button == MouseButtons.Right) { - DrawableContainerList selectedList = null; - if (selectedElements != null && selectedElements.Count > 0) { + if (e.Button == MouseButtons.Right) + { + IDrawableContainerList selectedList = null; + if (selectedElements != null && selectedElements.Count > 0) + { selectedList = selectedElements; - } else { + } + else + { // Single element IDrawableContainer rightClickedContainer = _elements.ClickableElementAt(_mouseStart.X, _mouseStart.Y); - if (rightClickedContainer != null) { + if (rightClickedContainer != null) + { selectedList = new DrawableContainerList(ID); selectedList.Add(rightClickedContainer); } } - if (selectedList != null && selectedList.Count > 0) { + if (selectedList != null && selectedList.Count > 0) + { selectedList.ShowContextMenu(e, this); } return; @@ -1057,28 +1210,30 @@ namespace Greenshot.Drawing _mouseDown = true; _isSurfaceMoveMadeUndoable = false; - if (_cropContainer != null && ((_undrawnElement == null) || (_undrawnElement != null && DrawingMode != DrawingModes.Crop))) { + if (_cropContainer != null && ((_undrawnElement == null) || (_undrawnElement != null && DrawingMode != DrawingModes.Crop))) + { RemoveElement(_cropContainer, false); _cropContainer = null; _drawingElement = null; } - if (_drawingElement == null && DrawingMode != DrawingModes.None) { - if (_undrawnElement == null) { + if (_drawingElement == null && DrawingMode != DrawingModes.None) + { + if (_undrawnElement == null) + { DeselectAllElements(); - if (_undrawnElement == null) { + if (_undrawnElement == null) + { CreateUndrawnElement(); } } _drawingElement = _undrawnElement; // if a new element has been drawn, set location and register it - if (_drawingElement != null) { - if (_undrawnElement != null) + if (_drawingElement != null) + { + _drawingElement.Status = _undrawnElement.DefaultEditMode; + if (!_drawingElement.HandleMouseDown(_mouseStart.X, _mouseStart.Y)) { - _drawingElement.Status = _undrawnElement.DefaultEditMode; - } - _drawingElement.PropertyChanged += ElementPropertyChanged; - if (!_drawingElement.HandleMouseDown(_mouseStart.X, _mouseStart.Y)) { _drawingElement.Left = _mouseStart.X; _drawingElement.Top = _mouseStart.Y; } @@ -1086,13 +1241,16 @@ namespace Greenshot.Drawing _drawingElement.Selected = true; } _undrawnElement = null; - } else { + } + 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(_mouseStart.X, _mouseStart.Y); - if (_mouseDownElement != null) { + if (_mouseDownElement != null) + { _mouseDownElement.Status = EditStatus.MOVING; } } @@ -1103,7 +1261,8 @@ namespace Greenshot.Drawing /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void SurfaceMouseUp(object sender, MouseEventArgs e) { + void SurfaceMouseUp(object sender, MouseEventArgs e) + { // Handle Adorners var adorner = FindActiveAdorner(e); @@ -1116,48 +1275,66 @@ namespace Greenshot.Drawing Point currentMouse = new Point(e.X, e.Y); _elements.Status = EditStatus.IDLE; - if (_mouseDownElement != null) { + if (_mouseDownElement != null) + { _mouseDownElement.Status = EditStatus.IDLE; } _mouseDown = false; _mouseDownElement = null; - if (DrawingMode == DrawingModes.None) { + if (DrawingMode == DrawingModes.None) + { // check whether an existing element was clicked IDrawableContainer element = _elements.ClickableElementAt(currentMouse.X, currentMouse.Y); bool shiftModifier = (ModifierKeys & Keys.Shift) == Keys.Shift; - if (element != null) { + if (element != null) + { element.Invalidate(); bool alreadySelected = selectedElements.Contains(element); - if (shiftModifier) { - if (alreadySelected) { + if (shiftModifier) + { + if (alreadySelected) + { DeselectElement(element); - } else { + } + else + { SelectElement(element); } - } else { - if (!alreadySelected) { + } + else + { + if (!alreadySelected) + { DeselectAllElements(); SelectElement(element); } } - } else if(!shiftModifier) { + } + else if (!shiftModifier) + { DeselectAllElements(); } } - - if (selectedElements.Count > 0) { + + if (selectedElements.Count > 0) + { selectedElements.Invalidate(); selectedElements.Selected = true; } - if (_drawingElement != null) { - if (!_drawingElement.InitContent()) { + if (_drawingElement != null) + { + if (!_drawingElement.InitContent()) + { _elements.Remove(_drawingElement); _drawingElement.Invalidate(); - } else { + } + else + { _drawingElement.HandleMouseUp(currentMouse.X, currentMouse.Y); _drawingElement.Invalidate(); - if (Math.Abs(_drawingElement.Width) < 5 && Math.Abs(_drawingElement.Height) < 5) { + if (Math.Abs(_drawingElement.Width) < 5 && Math.Abs(_drawingElement.Height) < 5) + { _drawingElement.Width = 25; _drawingElement.Height = 25; } @@ -1173,7 +1350,8 @@ namespace Greenshot.Drawing /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void SurfaceMouseMove(object sender, MouseEventArgs e) { + void SurfaceMouseMove(object sender, MouseEventArgs e) + { // Handle Adorners var adorner = FindActiveAdorner(e); if (adorner != null) @@ -1184,27 +1362,37 @@ namespace Greenshot.Drawing Point currentMouse = e.Location; - if (DrawingMode != DrawingModes.None) { + if (DrawingMode != DrawingModes.None) + { Cursor = Cursors.Cross; - } else { + } + else + { Cursor = Cursors.Default; } - if (_mouseDown) { - if (_mouseDownElement != null) { // an element is currently dragged + if (_mouseDown) + { + if (_mouseDownElement != null) + { // an element is currently dragged _mouseDownElement.Invalidate(); selectedElements.Invalidate(); // Move the element - if (_mouseDownElement.Selected) { - if (!_isSurfaceMoveMadeUndoable) { + if (_mouseDownElement.Selected) + { + if (!_isSurfaceMoveMadeUndoable) + { // Only allow one undoable per mouse-down/move/up "cycle" _isSurfaceMoveMadeUndoable = true; selectedElements.MakeBoundsChangeUndoable(false); } // dragged element has been selected before -> move all selectedElements.MoveBy(currentMouse.X - _mouseStart.X, currentMouse.Y - _mouseStart.Y); - } else { - if (!_isSurfaceMoveMadeUndoable) { + } + else + { + if (!_isSurfaceMoveMadeUndoable) + { // Only allow one undoable per mouse-down/move/up "cycle" _isSurfaceMoveMadeUndoable = true; _mouseDownElement.MakeBoundsChangeUndoable(false); @@ -1215,19 +1403,22 @@ namespace Greenshot.Drawing _mouseStart = currentMouse; _mouseDownElement.Invalidate(); _modified = true; - } else if (_drawingElement != null) { + } + else if (_drawingElement != null) + { _drawingElement.HandleMouseMove(currentMouse.X, currentMouse.Y); _modified = true; } } } - + /// <summary> /// This event handler is called when the surface is double clicked. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> - void SurfaceDoubleClick(object sender, MouseEventArgs e) { + void SurfaceDoubleClick(object sender, MouseEventArgs e) + { selectedElements.OnDoubleClick(); selectedElements.Invalidate(); } @@ -1237,11 +1428,13 @@ namespace Greenshot.Drawing /// </summary> /// <param name="renderMode"></param> /// <returns></returns> - private Image GetImage(RenderMode renderMode) { + private Image GetImage(RenderMode renderMode) + { // Generate a copy of the original image with a dpi equal to the default... Bitmap clone = ImageHelper.Clone(_image, PixelFormat.DontCare); // otherwise we would have a problem drawing the image to the surface... :( - using (Graphics graphics = Graphics.FromImage(clone)) { + using (Graphics graphics = Graphics.FromImage(clone)) + { // Do not set the following, the containers need to decide themselves //graphics.SmoothingMode = SmoothingMode.HighQuality; //graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; @@ -1256,7 +1449,8 @@ namespace Greenshot.Drawing /// This returns the image "result" of this surface, with all the elements rendered on it. /// </summary> /// <returns></returns> - public Image GetImageForExport() { + public Image GetImageForExport() + { return GetImage(RenderMode.EXPORT); } @@ -1265,27 +1459,34 @@ namespace Greenshot.Drawing /// </summary> /// <param name="sender"></param> /// <param name="paintEventArgs">PaintEventArgs</param> - void SurfacePaint(object sender, PaintEventArgs paintEventArgs) { + void SurfacePaint(object sender, PaintEventArgs paintEventArgs) + { Graphics targetGraphics = paintEventArgs.Graphics; Rectangle clipRectangle = paintEventArgs.ClipRectangle; - if (Rectangle.Empty.Equals(clipRectangle)) { + if (Rectangle.Empty.Equals(clipRectangle)) + { LOG.Debug("Empty cliprectangle??"); return; } - if (_elements.HasIntersectingFilters(clipRectangle)) { - if (_buffer != null) { - if (_buffer.Width != Image.Width || _buffer.Height != Image.Height || _buffer.PixelFormat != Image.PixelFormat) { + if (_elements.HasIntersectingFilters(clipRectangle)) + { + if (_buffer != null) + { + if (_buffer.Width != Image.Width || _buffer.Height != Image.Height || _buffer.PixelFormat != Image.PixelFormat) + { _buffer.Dispose(); _buffer = null; } } - if (_buffer == null) { + if (_buffer == null) + { _buffer = ImageHelper.CreateEmpty(Image.Width, Image.Height, Image.PixelFormat, Color.Empty, Image.HorizontalResolution, Image.VerticalResolution); LOG.DebugFormat("Created buffer with size: {0}x{1}", Image.Width, Image.Height); } // Elements might need the bitmap, so we copy the part we need - using (Graphics graphics = Graphics.FromImage(_buffer)) { + using (Graphics graphics = Graphics.FromImage(_buffer)) + { // do not set the following, the containers need to decide this themselves! //graphics.SmoothingMode = SmoothingMode.HighQuality; //graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; @@ -1297,7 +1498,9 @@ namespace Greenshot.Drawing _elements.Draw(graphics, _buffer, RenderMode.EDIT, clipRectangle); } targetGraphics.DrawImage(_buffer, clipRectangle, clipRectangle, GraphicsUnit.Pixel); - } else { + } + else + { DrawBackground(targetGraphics, clipRectangle); targetGraphics.DrawImage(Image, clipRectangle, clipRectangle, GraphicsUnit.Pixel); _elements.Draw(targetGraphics, null, RenderMode.EDIT, clipRectangle); @@ -1308,35 +1511,32 @@ namespace Greenshot.Drawing // Draw adorners last foreach (var drawableContainer in selectedElements) { - foreach(var adorner in drawableContainer.Adorners) + foreach (var adorner in drawableContainer.Adorners) { adorner.Paint(paintEventArgs); } } } - private void DrawBackground(Graphics targetGraphics, Rectangle clipRectangle) { + private void DrawBackground(Graphics targetGraphics, Rectangle clipRectangle) + { // check if we need to draw the checkerboard - if (Image.IsAlphaPixelFormat(Image.PixelFormat) && _transparencyBackgroundBrush != null) { + if (Image.IsAlphaPixelFormat(Image.PixelFormat) && _transparencyBackgroundBrush != null) + { targetGraphics.FillRectangle(_transparencyBackgroundBrush, clipRectangle); - } else { + } + else + { targetGraphics.Clear(BackColor); } } - + /// <summary> /// Draw a checkboard when capturing with transparency /// </summary> /// <param name="e">PaintEventArgs</param> - protected override void OnPaintBackground(PaintEventArgs e) { - } - - /// <summary> - /// Wrapper for makeUndoable flag which was introduced later, will call AddElement with makeundoable set to true - /// </summary> - /// <param name="element">the new element</param> - public void AddElement(IDrawableContainer element) { - AddElement(element, true); + protected override void OnPaintBackground(PaintEventArgs e) + { } /// <summary> @@ -1344,39 +1544,88 @@ namespace Greenshot.Drawing /// </summary> /// <param name="element">the new element</param> /// <param name="makeUndoable">true if the adding should be undoable</param> - public void AddElement(IDrawableContainer element, bool makeUndoable) { + /// <param name="invalidate">true if invalidate needs to be called</param> + public void AddElement(IDrawableContainer element, bool makeUndoable = true, bool invalidate = true) + { _elements.Add(element); DrawableContainer container = element as DrawableContainer; - if (container != null) { + if (container != null) + { container.FieldChanged += element_FieldChanged; } - element.PropertyChanged += ElementPropertyChanged; - if (element.Status == EditStatus.UNDRAWN) { + element.Parent = this; + if (element.Status == EditStatus.UNDRAWN) + { element.Status = EditStatus.IDLE; } - element.Invalidate(); - if (makeUndoable) { + if (element.Selected) + { + // Use false, as the element is invalidated when invalidate == true anyway + SelectElement(element, false); + } + if (invalidate) + { + element.Invalidate(); + } + if (makeUndoable) + { MakeUndoable(new AddElementMemento(this, element), false); } _modified = true; } + /// <summary> + /// Remove the list of elements + /// </summary> + /// <param name="elementsToRemove">IDrawableContainerList</param> + /// <param name="makeUndoable">flag specifying if the remove needs to be undoable</param> + public void RemoveElements(IDrawableContainerList elementsToRemove, bool makeUndoable = true) + { + // fix potential issues with iterating a changing list + DrawableContainerList cloned = new DrawableContainerList(); + cloned.AddRange(elementsToRemove); + if (makeUndoable) + { + MakeUndoable(new DeleteElementsMemento(this, cloned), false); + } + SuspendLayout(); + foreach (var drawableContainer in cloned) + { + RemoveElement(drawableContainer, false, false, false); + } + ResumeLayout(); + Invalidate(); + if (_movingElementChanged != null) + { + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); + eventArgs.Elements = cloned; + _movingElementChanged(this, eventArgs); + } + } + /// <summary> /// Remove an element of the elements list /// </summary> /// <param name="elementToRemove">Element to remove</param> /// <param name="makeUndoable">flag specifying if the remove needs to be undoable</param> - public void RemoveElement(IDrawableContainer elementToRemove, bool makeUndoable) { - DeselectElement(elementToRemove); + /// <param name="invalidate">flag specifying if an surface invalidate needs to be called</param> + public void RemoveElement(IDrawableContainer elementToRemove, bool makeUndoable = true, bool invalidate = true, bool generateEvents = true) + { + DeselectElement(elementToRemove, generateEvents); _elements.Remove(elementToRemove); DrawableContainer element = elementToRemove as DrawableContainer; - if (element != null) { + if (element != null) + { element.FieldChanged -= element_FieldChanged; } - elementToRemove.PropertyChanged -= ElementPropertyChanged; + element.Parent = null; // Do not dispose, the memento should!! element.Dispose(); - Invalidate(); - if (makeUndoable) { + if (invalidate) + { + Invalidate(); + } + if (makeUndoable) + { MakeUndoable(new DeleteElementMemento(this, elementToRemove), false); } _modified = true; @@ -1385,43 +1634,52 @@ namespace Greenshot.Drawing /// <summary> /// Add the supplied elements to the surface /// </summary> - /// <param name="elementsToAdd"></param> - public void AddElements(DrawableContainerList elementsToAdd) { - foreach(IDrawableContainer element in elementsToAdd) { - AddElement(element, true); + /// <param name="elementsToAdd">DrawableContainerList</param> + /// <param name="makeUndoable">true if the adding should be undoable</param> + /// <param name="invalidate">true if invalidate needs to be called</param> + public void AddElements(IDrawableContainerList elementsToAdd, bool makeUndoable = true) + { + // fix potential issues with iterating a changing list + DrawableContainerList cloned = new DrawableContainerList(); + cloned.AddRange(elementsToAdd); + if (makeUndoable) + { + MakeUndoable(new AddElementsMemento(this, cloned), false); } + SuspendLayout(); + foreach (var element in cloned) + { + element.Selected = true; + AddElement(element, false, false); + } + ResumeLayout(); + Invalidate(); } /// <summary> /// Returns if this surface has selected elements /// </summary> /// <returns></returns> - public bool HasSelectedElements { - get { - return selectedElements != null && selectedElements.Count > 0; + public bool HasSelectedElements + { + get + { + return (selectedElements != null && selectedElements.Count > 0); } } /// <summary> /// Remove all the selected elements /// </summary> - public void RemoveSelectedElements() { - if (HasSelectedElements) { - // As RemoveElement will remove the element from the selectedElements list we need to copy the element - // to another list. - List<DrawableContainer> elementsToRemove = new List<DrawableContainer>(); - foreach (DrawableContainer element in selectedElements) { - // Collect to remove later - elementsToRemove.Add(element); - } - // Remove now - foreach(DrawableContainer element in elementsToRemove) { - RemoveElement(element, true); - } - selectedElements.Clear(); - if (_movingElementChanged != null) { + public void RemoveSelectedElements() + { + if (HasSelectedElements) + { + // As RemoveElement will remove the element from the selectedElements list we need to copy the element to another list. + RemoveElements(selectedElements); + if (_movingElementChanged != null) + { SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = selectedElements; _movingElementChanged(this, eventArgs); } } @@ -1430,9 +1688,11 @@ namespace Greenshot.Drawing /// <summary> /// Cut the selected elements from the surface to the clipboard /// </summary> - public void CutSelectedElements() { - if (HasSelectedElements) { - ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), selectedElements); + public void CutSelectedElements() + { + if (HasSelectedElements) + { + ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), selectedElements); RemoveSelectedElements(); } } @@ -1440,9 +1700,11 @@ namespace Greenshot.Drawing /// <summary> /// Copy the selected elements to the clipboard /// </summary> - public void CopySelectedElements() { - if (HasSelectedElements) { - ClipboardHelper.SetClipboardData(typeof(DrawableContainerList), selectedElements); + public void CopySelectedElements() + { + if (HasSelectedElements) + { + ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), selectedElements); } } @@ -1451,24 +1713,23 @@ namespace Greenshot.Drawing /// Called when pressing enter or using the "check" in the editor. /// </summary> /// <param name="confirm"></param> - public void ConfirmSelectedConfirmableElements(bool confirm){ + public void ConfirmSelectedConfirmableElements(bool confirm) + { // create new collection so that we can iterate safely (selectedElements might change due with confirm/cancel) List<IDrawableContainer> selectedDCs = new List<IDrawableContainer>(selectedElements); - if (_cropContainer == null) + foreach (IDrawableContainer dc in selectedDCs) { - return; - } - foreach (IDrawableContainer dc in selectedDCs){ - if (dc.Equals(_cropContainer)){ + if (dc.Equals(_cropContainer)) + { DrawingMode = DrawingModes.None; // No undo memento for the cropcontainer itself, only for the effect RemoveElement(_cropContainer, false); - if (confirm) { + if (confirm) + { ApplyCrop(_cropContainer.Bounds); } _cropContainer.Dispose(); _cropContainer = null; - break; } } } @@ -1476,78 +1737,106 @@ namespace Greenshot.Drawing /// <summary> /// Paste all the elements that are on the clipboard /// </summary> - public void PasteElementFromClipboard() { + public void PasteElementFromClipboard() + { IDataObject clipboard = ClipboardHelper.GetDataObject(); List<string> formats = ClipboardHelper.GetFormats(clipboard); - if (formats == null || formats.Count == 0) { + if (formats == null || formats.Count == 0) + { return; } - if (LOG.IsDebugEnabled) { + if (LOG.IsDebugEnabled) + { LOG.Debug("List of clipboard formats available for pasting:"); - foreach(string format in formats) { + foreach (string format in formats) + { LOG.Debug("\tgot format: " + format); } } - if (formats.Contains(typeof(DrawableContainerList).FullName)) { - DrawableContainerList dcs = (DrawableContainerList)ClipboardHelper.GetFromDataObject(clipboard, typeof(DrawableContainerList)); - if (dcs != null) { + if (formats.Contains(typeof(IDrawableContainerList).FullName)) + { + IDrawableContainerList dcs = (IDrawableContainerList)ClipboardHelper.GetFromDataObject(clipboard, typeof(IDrawableContainerList)); + if (dcs != null) + { // Make element(s) only move 10,10 if the surface is the same Point moveOffset; - bool isSameSurface = dcs.ParentID == _uniqueId; + bool isSameSurface = (dcs.ParentID == _uniqueId); dcs.Parent = this; - if (isSameSurface) { + if (isSameSurface) + { moveOffset = new Point(10, 10); - } else { + } + else + { moveOffset = Point.Empty; } - // Here a fix for bug #1475, first calculate the bounds of the complete DrawableContainerList + // Here a fix for bug #1475, first calculate the bounds of the complete IDrawableContainerList Rectangle drawableContainerListBounds = Rectangle.Empty; - foreach (IDrawableContainer element in dcs) { - if (drawableContainerListBounds == Rectangle.Empty) { + foreach (IDrawableContainer element in dcs) + { + if (drawableContainerListBounds == Rectangle.Empty) + { drawableContainerListBounds = element.DrawingBounds; - } else { + } + else + { drawableContainerListBounds = Rectangle.Union(drawableContainerListBounds, element.DrawingBounds); } } // And find a location inside the target surface to paste to bool containersCanFit = drawableContainerListBounds.Width < Bounds.Width && drawableContainerListBounds.Height < Bounds.Height; - if (!containersCanFit) { + if (!containersCanFit) + { Point containersLocation = drawableContainerListBounds.Location; containersLocation.Offset(moveOffset); - if (!Bounds.Contains(containersLocation)) { + if (!Bounds.Contains(containersLocation)) + { // Easy fix for same surface - if (isSameSurface) { + if (isSameSurface) + { moveOffset = new Point(-10, -10); - } else { + } + else + { // For different surface, which is most likely smaller, we move to "10,10" moveOffset = new Point(-drawableContainerListBounds.Location.X + 10, -drawableContainerListBounds.Location.Y + 10); } } - } else { + } + else + { Rectangle moveContainerListBounds = drawableContainerListBounds; moveContainerListBounds.Offset(moveOffset); // check if the element is inside - if (!Bounds.Contains(moveContainerListBounds)) { + if (!Bounds.Contains(moveContainerListBounds)) + { // Easy fix for same surface - if (isSameSurface) { + if (isSameSurface) + { moveOffset = new Point(-10, -10); - } else { + } + else + { // For different surface, which is most likely smaller int offsetX = 0; int offsetY = 0; - if (drawableContainerListBounds.Right > Bounds.Right) { + if (drawableContainerListBounds.Right > Bounds.Right) + { offsetX = Bounds.Right - drawableContainerListBounds.Right; // Correction for the correction - if (drawableContainerListBounds.Left + offsetX < 0) { + if (drawableContainerListBounds.Left + offsetX < 0) + { offsetX += Math.Abs(drawableContainerListBounds.Left + offsetX); } } - if (drawableContainerListBounds.Bottom > Bounds.Bottom) { + if (drawableContainerListBounds.Bottom > Bounds.Bottom) + { offsetY = Bounds.Bottom - drawableContainerListBounds.Bottom; // Correction for the correction - if (drawableContainerListBounds.Top + offsetY < 0) { + if (drawableContainerListBounds.Top + offsetY < 0) + { offsetY += Math.Abs(drawableContainerListBounds.Top + offsetY); } } @@ -1561,11 +1850,15 @@ namespace Greenshot.Drawing DeselectAllElements(); SelectElements(dcs); } - } else if (ClipboardHelper.ContainsImage(clipboard)) { + } + else if (ClipboardHelper.ContainsImage(clipboard)) + { int x = 10; int y = 10; - foreach (Image clipboardImage in ClipboardHelper.GetImages(clipboard)) { - if (clipboardImage != null) { + foreach (Image clipboardImage in ClipboardHelper.GetImages(clipboard)) + { + if (clipboardImage != null) + { DeselectAllElements(); IImageContainer container = AddImageContainer(clipboardImage as Bitmap, x, y); SelectElement(container); @@ -1574,9 +1867,12 @@ namespace Greenshot.Drawing y += 10; } } - } else if (ClipboardHelper.ContainsText(clipboard)) { + } + else if (ClipboardHelper.ContainsText(clipboard)) + { string text = ClipboardHelper.GetText(clipboard); - if (text != null) { + if (text != null) + { DeselectAllElements(); ITextContainer textContainer = AddTextContainer(text, HorizontalAlignment.Center, VerticalAlignment.CENTER, FontFamily.GenericSansSerif, 12f, false, false, false, 2, Color.Black, Color.Transparent); @@ -1584,78 +1880,99 @@ namespace Greenshot.Drawing } } } - + /// <summary> /// Duplicate all the selecteded elements /// </summary> - public void DuplicateSelectedElements() { + public void DuplicateSelectedElements() + { LOG.DebugFormat("Duplicating {0} selected elements", selectedElements.Count); - DrawableContainerList dcs = selectedElements.Clone(); + IDrawableContainerList dcs = selectedElements.Clone(); dcs.Parent = this; - dcs.MoveBy(10,10); + dcs.MoveBy(10, 10); AddElements(dcs); DeselectAllElements(); SelectElements(dcs); } - + /// <summary> /// Deselect the specified element /// </summary> /// <param name="container"></param> - public void DeselectElement(IDrawableContainer container) { + public void DeselectElement(IDrawableContainer container, bool generateEvents = true) + { container.Selected = false; selectedElements.Remove(container); - container.Invalidate(); FieldAggregator.UnbindElement(container); - if (_movingElementChanged != null) { + if (generateEvents && _movingElementChanged != null) + { SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); eventArgs.Elements = selectedElements; _movingElementChanged(this, eventArgs); } } + /// <summary> + /// Deselect the specified elements + /// </summary> + /// <param name="container"></param> + public void DeselectElements(IDrawableContainerList elements) + { + if (elements.Count == 0) + { + return; + } + while (elements.Count > 0) + { + var element = elements[0]; + DeselectElement(element, false); + } + if (_movingElementChanged != null) + { + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); + eventArgs.Elements = selectedElements; + _movingElementChanged(this, eventArgs); + } + Invalidate(); + } + /// <summary> /// Deselect all the selected elements /// </summary> - public void DeselectAllElements() { - if (HasSelectedElements) { - while(selectedElements.Count > 0) { - IDrawableContainer element = selectedElements[0]; - element.Selected = false; - selectedElements.Remove(element); - element.Invalidate(); - FieldAggregator.UnbindElement(element); - } - if (_movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = selectedElements; - _movingElementChanged(this, eventArgs); - } - } + public void DeselectAllElements() + { + DeselectElements(selectedElements); } /// <summary> /// Select the supplied element /// </summary> /// <param name="container"></param> - public void SelectElement(IDrawableContainer container) { - if (!selectedElements.Contains(container)) { + public void SelectElement(IDrawableContainer container, bool invalidate = true, bool generateEvents = true) + { + if (!selectedElements.Contains(container)) + { selectedElements.Add(container); container.Selected = true; FieldAggregator.BindElement(container); - if (_movingElementChanged != null) { + if (generateEvents && _movingElementChanged != null) + { SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); eventArgs.Elements = selectedElements; _movingElementChanged(this, eventArgs); } - container.Invalidate(); + if (invalidate) + { + container.Invalidate(); + } } } /// <summary> /// Select all elements, this is called when Ctrl+A is pressed /// </summary> - public void SelectAllElements() { + public void SelectAllElements() + { SelectElements(_elements); } @@ -1663,10 +1980,21 @@ namespace Greenshot.Drawing /// Select the supplied elements /// </summary> /// <param name="elements"></param> - public void SelectElements(DrawableContainerList elements) { - foreach(DrawableContainer element in elements) { - SelectElement(element); + public void SelectElements(IDrawableContainerList elements) + { + SuspendLayout(); + foreach (DrawableContainer element in elements) + { + SelectElement(element, false, false); } + if (_movingElementChanged != null) + { + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); + eventArgs.Elements = selectedElements; + _movingElementChanged(this, eventArgs); + } + ResumeLayout(); + Invalidate(); } /// <summary> @@ -1674,13 +2002,16 @@ namespace Greenshot.Drawing /// </summary> /// <param name="k">Keys</param> /// <returns>false if no keys were processed</returns> - public bool ProcessCmdKey(Keys k) { - if (selectedElements.Count > 0) { + public bool ProcessCmdKey(Keys k) + { + if (selectedElements.Count > 0) + { bool shiftModifier = (ModifierKeys & Keys.Shift) == Keys.Shift; int px = shiftModifier ? 10 : 1; Point moveBy = Point.Empty; - - switch (k) { + + switch (k) + { case Keys.Left: case Keys.Left | Keys.Shift: moveBy = new Point(-px, 0); @@ -1721,7 +2052,8 @@ namespace Greenshot.Drawing default: return false; } - if (!Point.Empty.Equals(moveBy)) { + if (!Point.Empty.Equals(moveBy)) + { selectedElements.MakeBoundsChangeUndoable(true); selectedElements.MoveBy(moveBy.X, moveBy.Y); } @@ -1733,8 +2065,10 @@ namespace Greenshot.Drawing /// <summary> /// Property for accessing the elements on the surface /// </summary> - public DrawableContainerList Elements { - get { + public IDrawableContainerList Elements + { + get + { return _elements; } } @@ -1742,60 +2076,64 @@ namespace Greenshot.Drawing /// <summary> /// pulls selected elements up one level in hierarchy /// </summary> - public void PullElementsUp() { + public void PullElementsUp() + { _elements.PullElementsUp(selectedElements); _elements.Invalidate(); } - + /// <summary> /// pushes selected elements up to top in hierarchy /// </summary> - public void PullElementsToTop() { + public void PullElementsToTop() + { _elements.PullElementsToTop(selectedElements); _elements.Invalidate(); } - + /// <summary> /// pushes selected elements down one level in hierarchy /// </summary> - public void PushElementsDown() { + public void PushElementsDown() + { _elements.PushElementsDown(selectedElements); _elements.Invalidate(); } - + /// <summary> /// pushes selected elements down to bottom in hierarchy /// </summary> - public void PushElementsToBottom() { + public void PushElementsToBottom() + { _elements.PushElementsToBottom(selectedElements); _elements.Invalidate(); } - + /// <summary> /// indicates whether the selected elements could be pulled up in hierarchy /// </summary> /// <returns>true if selected elements could be pulled up, false otherwise</returns> - public bool CanPullSelectionUp() { + public bool CanPullSelectionUp() + { return _elements.CanPullUp(selectedElements); } - + /// <summary> /// indicates whether the selected elements could be pushed down in hierarchy /// </summary> /// <returns>true if selected elements could be pushed down, false otherwise</returns> - public bool CanPushSelectionDown() { + public bool CanPushSelectionDown() + { return _elements.CanPushDown(selectedElements); } - - public void ElementPropertyChanged(object sender, PropertyChangedEventArgs e) { - //Invalidate(); - } - - public void element_FieldChanged(object sender, FieldChangedEventArgs e) { + + public void element_FieldChanged(object sender, FieldChangedEventArgs e) + { selectedElements.HandleFieldChangedEvent(sender, e); } - public bool IsOnSurface(IDrawableContainer container) { + public bool IsOnSurface(IDrawableContainer container) + { return _elements.Contains(container); } } diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 1b369ea78..96792de69 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -23,6 +23,7 @@ using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.Memento; using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Interfaces.Drawing; using System; using System.ComponentModel; using System.Drawing; diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index e72052944..5f8252549 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -30,8 +30,10 @@ using Greenshot.Help; using Greenshot.Helpers; using Greenshot.IniFile; using Greenshot.Plugin; +using Greenshot.Plugin.Drawing; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; +using GreenshotPlugin.Interfaces.Drawing; using GreenshotPlugin.UnmanagedHelpers; using log4net; using System; @@ -56,7 +58,7 @@ namespace Greenshot { private Surface _surface; private GreenshotToolStripButton[] _toolbarButtons; - private static readonly string[] SupportedClipboardFormats = {typeof(string).FullName, "Text", typeof(DrawableContainerList).FullName}; + private static readonly string[] SupportedClipboardFormats = {typeof(string).FullName, "Text", typeof(IDrawableContainerList).FullName}; private bool _originalBoldCheckState; private bool _originalItalicCheckState; @@ -1045,8 +1047,8 @@ namespace Greenshot { textVerticalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_VERTICAL_ALIGNMENT); shadowButton.Visible = props.HasFieldValue(FieldType.SHADOW); btnConfirm.Visible = btnCancel.Visible = props.HasFieldValue(FieldType.FLAGS) - && ((FieldType.Flag)props.GetFieldValue(FieldType.FLAGS)&FieldType.Flag.CONFIRMABLE) == FieldType.Flag.CONFIRMABLE; - + && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE; + obfuscateModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_OBFUSCATE); highlightModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_HIGHLIGHT); } else { @@ -1078,9 +1080,10 @@ namespace Greenshot { FieldAggregator props = _surface.FieldAggregator; // if a confirmable element is selected, we must disable most of the controls // since we demand confirmation or cancel for confirmable element - if (props.HasFieldValue(FieldType.FLAGS) && ((FieldType.Flag)props.GetFieldValue(FieldType.FLAGS) & FieldType.Flag.CONFIRMABLE) == FieldType.Flag.CONFIRMABLE) { + if (props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE) + { // disable most controls - if(!_controlsDisabledDueToConfirmable) { + if (!_controlsDisabledDueToConfirmable) { ToolStripItemEndisabler.Disable(menuStrip1); ToolStripItemEndisabler.Disable(destinationsToolStrip); ToolStripItemEndisabler.Disable(toolsToolStrip); diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index 0fc6043a0..8e743d8b7 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -112,7 +112,6 @@ <Compile Include="Drawing\Fields\AbstractFieldHolder.cs" /> <Compile Include="Drawing\Fields\Field.cs" /> <Compile Include="Drawing\Fields\FieldType.cs" /> - <Compile Include="Drawing\Fields\IFieldHolder.cs" /> <Compile Include="Drawing\Fields\FieldAggregator.cs" /> <Compile Include="Drawing\ObfuscateContainer.cs" /> <Compile Include="Drawing\FreehandContainer.cs" /> @@ -215,13 +214,14 @@ <Compile Include="Helpers\IEInterop\IEContainer.cs" /> <Compile Include="Helpers\ProcessorHelper.cs" /> <Compile Include="Help\HelpFileLoader.cs" /> + <Compile Include="Memento\AddElementsMemento.cs" /> + <Compile Include="Memento\DeleteElementsMemento.cs" /> <Compile Include="Processors\TitleFixProcessor.cs" /> <Compile Include="Helpers\WindowWrapper.cs" /> <Compile Include="Memento\AddElementMemento.cs" /> <Compile Include="Memento\ChangeFieldHolderMemento.cs" /> <Compile Include="Memento\DeleteElementMemento.cs" /> <Compile Include="Memento\TextChangeMemento.cs" /> - <Compile Include="Memento\IMemento.cs" /> <Compile Include="Memento\DrawableContainerBoundsChangeMemento.cs" /> <Compile Include="Memento\SurfaceBackgroundChangeMemento.cs" /> <Compile Include="Helpers\UpdateHelper.cs" /> diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 98a70214e..c7f21dbde 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -47,12 +47,6 @@ namespace Greenshot.Memento { _surface = null; } - public LangKey ActionLanguageKey { - get { - return LangKey.none; - } - } - public bool Merge(IMemento otherMemento) { return false; } diff --git a/Greenshot/Memento/AddElementsMemento.cs b/Greenshot/Memento/AddElementsMemento.cs new file mode 100644 index 000000000..ce566c3c2 --- /dev/null +++ b/Greenshot/Memento/AddElementsMemento.cs @@ -0,0 +1,77 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 <http://www.gnu.org/licenses/>. + */ +using Greenshot.Drawing; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Memento +{ + /// <summary> + /// The AddElementMemento makes it possible to undo adding an element + /// </summary> + public class AddElementsMemento : IMemento + { + private IDrawableContainerList _containerList; + private Surface _surface; + + public AddElementsMemento(Surface surface, IDrawableContainerList containerList) + { + _surface = surface; + _containerList = containerList; + } + + public void Dispose() + { + Dispose(true); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_containerList != null) + { + _containerList.Dispose(); + } + } + _containerList = null; + _surface = null; + } + + public bool Merge(IMemento otherMemento) + { + return false; + } + + public IMemento Restore() + { + // Store the selected state, as it's overwritten by the RemoveElement + bool selected = _containerList.Selected; + + var oldState = new DeleteElementsMemento(_surface, _containerList); + + _surface.RemoveElements(_containerList, false); + + // After, so everything is gone + _surface.Invalidate(); + return oldState; + } + } +} diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index 03a04ab5d..7314f097a 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -18,47 +18,54 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; -using Greenshot.Plugin.Drawing; -using Greenshot.Drawing.Fields; -using Greenshot.Configuration; -namespace Greenshot.Memento { +using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Interfaces.Drawing; + +namespace Greenshot.Memento +{ /// <summary> /// The ChangeFieldHolderMemento makes it possible to undo-redo an IDrawableContainer move /// </summary> - public class ChangeFieldHolderMemento : IMemento { - private IDrawableContainer drawableContainer; - private readonly Field fieldToBeChanged; - private readonly object oldValue; - - public ChangeFieldHolderMemento(IDrawableContainer drawableContainer, Field fieldToBeChanged) { - this.drawableContainer = drawableContainer; - this.fieldToBeChanged = fieldToBeChanged; - oldValue = fieldToBeChanged.Value; + public class ChangeFieldHolderMemento : IMemento + { + private IDrawableContainer _drawableContainer; + private IField _fieldToBeChanged; + private object _oldValue; + + public ChangeFieldHolderMemento(IDrawableContainer drawableContainer, IField fieldToBeChanged) + { + _drawableContainer = drawableContainer; + _fieldToBeChanged = fieldToBeChanged; + _oldValue = fieldToBeChanged.Value; } - public void Dispose() { + public void Dispose() + { Dispose(true); - GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) { - //if (disposing) { } - drawableContainer = null; - } - - public LangKey ActionLanguageKey { - get { - return LangKey.none; + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_drawableContainer != null) + { + _drawableContainer.Dispose(); + } } + _drawableContainer = null; } - public bool Merge(IMemento otherMemento) { + public bool Merge(IMemento otherMemento) + { ChangeFieldHolderMemento other = otherMemento as ChangeFieldHolderMemento; - if (other != null) { - if (other.drawableContainer.Equals(drawableContainer)) { - if (other.fieldToBeChanged.Equals(fieldToBeChanged)) { + if (other != null) + { + if (other._drawableContainer.Equals(_drawableContainer)) + { + if (other._fieldToBeChanged.Equals(_fieldToBeChanged)) + { // Match, do not store anything as the initial state is what we want. return true; } @@ -67,13 +74,14 @@ namespace Greenshot.Memento { return false; } - public IMemento Restore() { + public IMemento Restore() + { // Before - drawableContainer.Invalidate(); - ChangeFieldHolderMemento oldState = new ChangeFieldHolderMemento(drawableContainer, fieldToBeChanged); - fieldToBeChanged.Value = oldValue; + _drawableContainer.Invalidate(); + ChangeFieldHolderMemento oldState = new ChangeFieldHolderMemento(_drawableContainer, _fieldToBeChanged); + _fieldToBeChanged.Value = _oldValue; // After - drawableContainer.Invalidate(); + _drawableContainer.Invalidate(); return oldState; } } diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index b715e26a8..dc1d012de 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -50,13 +50,6 @@ namespace Greenshot.Memento { } } - public LangKey ActionLanguageKey { - get { - //return LangKey.editor_deleteelement; - return LangKey.none; - } - } - public bool Merge(IMemento otherMemento) { return false; } diff --git a/Greenshot/Memento/DeleteElementsMemento.cs b/Greenshot/Memento/DeleteElementsMemento.cs new file mode 100644 index 000000000..d01bc3089 --- /dev/null +++ b/Greenshot/Memento/DeleteElementsMemento.cs @@ -0,0 +1,72 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 <http://www.gnu.org/licenses/>. + */ +using Greenshot.Drawing; +using Greenshot.Plugin.Drawing; + +namespace Greenshot.Memento +{ + /// <summary> + /// The DeleteElementMemento makes it possible to undo deleting an element + /// </summary> + public class DeleteElementsMemento : IMemento + { + private IDrawableContainerList _containerList; + private Surface _surface; + + public DeleteElementsMemento(Surface surface, IDrawableContainerList containerList) + { + _surface = surface; + _containerList = containerList; + } + + public void Dispose() + { + Dispose(true); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_containerList != null) + { + _containerList.Dispose(); + } + } + _containerList = null; + _surface = null; + } + + public bool Merge(IMemento otherMemento) + { + return false; + } + + public IMemento Restore() + { + AddElementsMemento oldState = new AddElementsMemento(_surface, _containerList); + _surface.AddElements(_containerList, false); + // After + _surface.Invalidate(); + return oldState; + } + } +} diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index 940fbd4ee..123d260f0 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -18,61 +18,70 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -using System; +using Greenshot.Drawing; +using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Core; using System.Collections.Generic; using System.Drawing; -using Greenshot.Configuration; -using Greenshot.Plugin.Drawing; -using GreenshotPlugin.Core; - -namespace Greenshot.Memento { +namespace Greenshot.Memento +{ /// <summary> /// The DrawableContainerBoundsChangeMemento makes it possible to undo-redo an IDrawableContainer resize & move /// </summary> - public class DrawableContainerBoundsChangeMemento : IMemento { - readonly List<Point> points = new List<Point>(); - readonly List<Size> sizes = new List<Size>(); - List<IDrawableContainer> listOfdrawableContainer; - - private void StoreBounds() { - foreach(IDrawableContainer drawableContainer in listOfdrawableContainer) { + public class DrawableContainerBoundsChangeMemento : IMemento + { + List<Point> points = new List<Point>(); + List<Size> sizes = new List<Size>(); + IDrawableContainerList listOfdrawableContainer; + + private void StoreBounds() + { + foreach (IDrawableContainer drawableContainer in listOfdrawableContainer) + { points.Add(drawableContainer.Location); sizes.Add(drawableContainer.Size); } } - public DrawableContainerBoundsChangeMemento(List<IDrawableContainer> listOfdrawableContainer) { + public DrawableContainerBoundsChangeMemento(IDrawableContainerList listOfdrawableContainer) + { this.listOfdrawableContainer = listOfdrawableContainer; StoreBounds(); } - public DrawableContainerBoundsChangeMemento(IDrawableContainer drawableContainer) { - listOfdrawableContainer = new List<IDrawableContainer>(); + public DrawableContainerBoundsChangeMemento(IDrawableContainer drawableContainer) + { + listOfdrawableContainer = new DrawableContainerList(); listOfdrawableContainer.Add(drawableContainer); + listOfdrawableContainer.Parent = drawableContainer.Parent; StoreBounds(); } - public void Dispose() { + public void Dispose() + { Dispose(true); - GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) { - // if (disposing) { } + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (listOfdrawableContainer != null) + { + listOfdrawableContainer.Dispose(); + } + } listOfdrawableContainer = null; } - public LangKey ActionLanguageKey { - get { - return LangKey.none; - } - } - - public bool Merge(IMemento otherMemento) { - DrawableContainerBoundsChangeMemento other = otherMemento as DrawableContainerBoundsChangeMemento; - if (other != null) { - if (Objects.CompareLists<IDrawableContainer>(listOfdrawableContainer, other.listOfdrawableContainer)) { + public bool Merge(IMemento otherMemento) + { + var other = otherMemento as DrawableContainerBoundsChangeMemento; + if (other != null) + { + if (Objects.CompareLists<IDrawableContainer>(listOfdrawableContainer, other.listOfdrawableContainer)) + { // Lists are equal, as we have the state already we can ignore the new memento return true; } @@ -80,9 +89,11 @@ namespace Greenshot.Memento { return false; } - public IMemento Restore() { - DrawableContainerBoundsChangeMemento oldState = new DrawableContainerBoundsChangeMemento(listOfdrawableContainer); - for(int index = 0; index < listOfdrawableContainer.Count; index++) { + public IMemento Restore() + { + var oldState = new DrawableContainerBoundsChangeMemento(listOfdrawableContainer); + for (int index = 0; index < listOfdrawableContainer.Count; index++) + { IDrawableContainer drawableContainer = listOfdrawableContainer[index]; // Before drawableContainer.Invalidate(); diff --git a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs index 9c8935abc..32f371261 100644 --- a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs +++ b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs @@ -44,7 +44,6 @@ namespace Greenshot.Memento { public void Dispose() { Dispose(true); - GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { @@ -64,13 +63,6 @@ namespace Greenshot.Memento { public bool Merge(IMemento otherMemento) { return false; } - - public LangKey ActionLanguageKey { - get { - //return LangKey.editor_crop; - return LangKey.none; - } - } public IMemento Restore() { SurfaceBackgroundChangeMemento oldState = new SurfaceBackgroundChangeMemento(_surface, _matrix); diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index 716b9e171..d7b9a8d54 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -37,7 +37,6 @@ namespace Greenshot.Memento { public void Dispose() { Dispose(true); - GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { @@ -46,12 +45,6 @@ namespace Greenshot.Memento { } } - public LangKey ActionLanguageKey { - get { - return LangKey.none; - } - } - public bool Merge(IMemento otherMemento) { TextChangeMemento other = otherMemento as TextChangeMemento; if (other != null) { diff --git a/GreenshotPlugin/Core/OperatingSystemExtensions.cs b/GreenshotPlugin/Core/OperatingSystemExtensions.cs index 769547e03..ffe07bc6f 100644 --- a/GreenshotPlugin/Core/OperatingSystemExtensions.cs +++ b/GreenshotPlugin/Core/OperatingSystemExtensions.cs @@ -55,7 +55,7 @@ namespace GreenshotPlugin.Core /// <returns>true if we are running on Windows 8 or later</returns> public static bool IsWindows8OrLater(this OperatingSystem operatingSystem) { - return (operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 2) || operatingSystem.Version.Major >= 6; + return (operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 2) || operatingSystem.Version.Major > 6; } /// <summary> @@ -65,7 +65,7 @@ namespace GreenshotPlugin.Core /// <returns>true if we are running on Windows 7 or later</returns> public static bool IsWindows7OrLater(this OperatingSystem operatingSystem) { - return (operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 1) || operatingSystem.Version.Major >= 6; + return (operatingSystem.Version.Major == 6 && operatingSystem.Version.Minor >= 1) || operatingSystem.Version.Major > 6; } /// <summary> diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 855dd79be..1a829b4a5 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -1017,7 +1017,11 @@ namespace GreenshotPlugin.Core { // and subtracting the border from the size (2 times, as we move right/down for the capture without resizing) captureRectangle.Inflate(borderSize.Width, borderSize.Height); } else { - captureRectangle.Inflate(-1, -1); + // TODO: Also 8.x? + if (Environment.OSVersion.IsWindows10()) + { + captureRectangle.Inflate(-1, -1); + } if (autoMode) { // check if the capture fits diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 8bc85a253..86922e91e 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -68,6 +68,9 @@ <Compile Include="IEInterop\IHTMLWindow4.cs" /> <Compile Include="IEInterop\IWebBrowser2.cs" /> <Compile Include="Interfaces\Drawing\Adorners\IAdorner.cs" /> + <Compile Include="Interfaces\Drawing\IField.cs" /> + <Compile Include="Interfaces\Drawing\IFieldHolder.cs" /> + <Compile Include="Interfaces\Drawing\IMemento.cs" /> <Compile Include="Interop\Base.cs" /> <Compile Include="Interop\ComProgIdAttribute.cs" /> <Compile Include="Interop\COMWrapper.cs" /> diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index afae80489..02e52cd65 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -25,65 +25,80 @@ using System.Drawing.Imaging; using System.Windows.Forms; using System.ComponentModel; using System.Collections.Generic; +using GreenshotPlugin.Interfaces.Drawing; using Greenshot.Plugin.Drawing.Adorners; -using System.Runtime.Serialization; -namespace Greenshot.Plugin.Drawing { - public enum RenderMode {EDIT, EXPORT}; - public enum EditStatus {UNDRAWN, DRAWING, MOVING, RESIZING, IDLE}; +namespace Greenshot.Plugin.Drawing +{ + public enum RenderMode { EDIT, EXPORT }; + public enum EditStatus { UNDRAWN, DRAWING, MOVING, RESIZING, IDLE }; - public interface IDrawableContainer : INotifyPropertyChanged, IDisposable { - ISurface Parent { - get; - } - bool Selected { + public interface IDrawableContainer : INotifyPropertyChanged, IDisposable + { + ISurface Parent + { get; set; } - - int Left { + bool Selected + { get; set; } - - int Top { + + int Left + { get; set; } - - int Width { + + int Top + { get; set; } - - int Height { + + int Width + { get; set; } - - Point Location { + + int Height + { + get; + set; + } + + Point Location + { get; } - Size Size { - get; - } - - Rectangle Bounds { + Size Size + { get; } - Rectangle DrawingBounds { + Rectangle Bounds + { + get; + } + + Rectangle DrawingBounds + { get; } void ApplyBounds(RectangleF newBounds); - - bool hasFilters { + + bool hasFilters + { get; } - EditStatus Status { + EditStatus Status + { get; set; } @@ -97,7 +112,8 @@ namespace Greenshot.Plugin.Drawing { bool HandleMouseMove(int x, int y); bool InitContent(); void MakeBoundsChangeUndoable(bool allowMerge); - EditStatus DefaultEditMode { + EditStatus DefaultEditMode + { get; } @@ -107,38 +123,91 @@ namespace Greenshot.Plugin.Drawing { IList<IAdorner> Adorners { get; } } - public interface ITextContainer: IDrawableContainer { - string Text { + public interface IDrawableContainerList : IList<IDrawableContainer>, IDisposable + { + Guid ParentID + { + get; + } + + bool Selected + { + get; + set; + } + + ISurface Parent + { + get; + set; + } + EditStatus Status + { + get; + set; + } + void MakeBoundsChangeUndoable(bool allowMerge); + void Transform(Matrix matrix); + void MoveBy(int dx, int dy); + bool ClickableAt(int x, int y); + IDrawableContainer ClickableElementAt(int x, int y); + void OnDoubleClick(); + bool HasIntersectingFilters(Rectangle clipRectangle); + bool IntersectsWith(Rectangle clipRectangle); + void Draw(Graphics g, Bitmap bitmap, RenderMode renderMode, Rectangle clipRectangle); + void Invalidate(); + void PullElementsToTop(IDrawableContainerList elements); + bool CanPushDown(IDrawableContainerList elements); + void PullElementsUp(IDrawableContainerList elements); + bool CanPullUp(IDrawableContainerList elements); + void PushElementsDown(IDrawableContainerList elements); + void PushElementsToBottom(IDrawableContainerList elements); + void ShowContextMenu(MouseEventArgs e, ISurface surface); + void HandleFieldChangedEvent(object sender, FieldChangedEventArgs e); + } + + public interface ITextContainer : IDrawableContainer + { + string Text + { get; set; } void FitToText(); } - public interface IImageContainer: IDrawableContainer { - Image Image { + public interface IImageContainer : IDrawableContainer + { + Image Image + { get; set; } void Load(string filename); } - public interface ICursorContainer: IDrawableContainer { - Cursor Cursor { + public interface ICursorContainer : IDrawableContainer + { + Cursor Cursor + { get; set; } void Load(string filename); } - public interface IIconContainer: IDrawableContainer { - Icon Icon { + public interface IIconContainer : IDrawableContainer + { + Icon Icon + { get; set; } void Load(string filename); } - public interface IMetafileContainer: IDrawableContainer { - Metafile Metafile { + public interface IMetafileContainer : IDrawableContainer + { + Metafile Metafile + { get; set; } diff --git a/GreenshotPlugin/Interfaces/Drawing/IField.cs b/GreenshotPlugin/Interfaces/Drawing/IField.cs new file mode 100644 index 000000000..515c8b107 --- /dev/null +++ b/GreenshotPlugin/Interfaces/Drawing/IField.cs @@ -0,0 +1,84 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 <http://www.gnu.org/licenses/>. + */ + +using System; +using System.ComponentModel; + +namespace GreenshotPlugin.Interfaces.Drawing +{ + [Flags] + public enum FieldFlag + { + NONE = 0, + CONFIRMABLE = 1 + } + public interface IFieldType + { + string Name + { + get; + set; + } + } + + public interface IField : INotifyPropertyChanged + { + object Value + { + get; + set; + } + IFieldType FieldType + { + get; + set; + } + string Scope + { + get; + set; + } + bool HasValue + { + get; + } + } + /// <summary> + /// EventHandler to be used when a field value changes + /// </summary> + public delegate void FieldChangedEventHandler(object sender, FieldChangedEventArgs e); + + /// <summary> + /// EventArgs to be used with FieldChangedEventHandler + /// </summary> + public class FieldChangedEventArgs : EventArgs + { + public IField Field + { + get; + private set; + } + public FieldChangedEventArgs(IField field) + { + Field = field; + } + } +} diff --git a/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs b/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs new file mode 100644 index 000000000..5e6f9e15b --- /dev/null +++ b/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs @@ -0,0 +1,56 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 <http://www.gnu.org/licenses/>. + */ + +using System.Collections.Generic; + +namespace GreenshotPlugin.Interfaces.Drawing +{ + /// <summary> + /// 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. + /// </summary> + public interface IFieldHolder + { + + event FieldChangedEventHandler FieldChanged; + + void AddField(IField field); + void RemoveField(IField field); + IList<IField> GetFields(); + IField GetField(IFieldType fieldType); + bool HasField(IFieldType fieldType); + void SetFieldValue(IFieldType fieldType, object value); + } + + /// <summary> + /// Extended fieldHolder which has fieldHolder children. + /// Implementations should pass field values to and from + /// their children. + /// AbstractFieldHolderWithChildren is the basic implementation. + /// </summary> + public interface IFieldHolderWithChildren : IFieldHolder + { + void AddChild(IFieldHolder fieldHolder); + void RemoveChild(IFieldHolder fieldHolder); + } +} diff --git a/GreenshotPlugin/Interfaces/Drawing/IMemento.cs b/GreenshotPlugin/Interfaces/Drawing/IMemento.cs new file mode 100644 index 000000000..1d5971c55 --- /dev/null +++ b/GreenshotPlugin/Interfaces/Drawing/IMemento.cs @@ -0,0 +1,43 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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 <http://www.gnu.org/licenses/>. + */ +using System; + +namespace Greenshot.Memento { + /// <summary> + /// Description of IMemento. + /// </summary> + public interface IMemento : IDisposable { + /// <summary> + /// Restores target to the state memorized by this memento. + /// </summary> + /// <returns> + /// A memento of the state before restoring + /// </returns> + IMemento Restore(); + + /// <summary> + /// Try to merge the current memento with another, preventing loads of items on the stack + /// </summary> + /// <param name="other">The memento to try to merge with</param> + /// <returns></returns> + bool Merge(IMemento other); + } +} diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 29a66597f..ca0ea04b7 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -3,7 +3,7 @@ * Copyright (C) 2007-2015 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/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 @@ -18,63 +18,74 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +using Greenshot.Core; +using Greenshot.Memento; +using Greenshot.Plugin.Drawing; +using GreenshotPlugin.Interfaces.Drawing; using System; using System.Drawing; +using System.IO; using System.Windows.Forms; -using Greenshot.Plugin.Drawing; -using System.IO; -using System.Collections.Generic; -using Greenshot.Core; - -namespace Greenshot.Plugin { +namespace Greenshot.Plugin +{ /// <summary> /// Alignment Enums for possitioning /// </summary> //public enum HorizontalAlignment {LEFT, CENTER, RIGHT}; - public enum VerticalAlignment {TOP, CENTER, BOTTOM}; + public enum VerticalAlignment { TOP, CENTER, BOTTOM }; - public enum SurfaceMessageTyp { + public enum SurfaceMessageTyp + { FileSaved, Error, Info, UploadedUri } - public class SurfaceMessageEventArgs : EventArgs { - public SurfaceMessageTyp MessageType { + public class SurfaceMessageEventArgs : EventArgs + { + public SurfaceMessageTyp MessageType + { get; set; } - public string Message { + public string Message + { get; set; } - public ISurface Surface { + public ISurface Surface + { get; set; } } - public class SurfaceElementEventArgs : EventArgs { - public IList<IDrawableContainer> Elements { + public class SurfaceElementEventArgs : EventArgs + { + public IDrawableContainerList Elements + { get; set; } } - public class SurfaceDrawingModeEventArgs : EventArgs { - public DrawingModes DrawingMode { + public class SurfaceDrawingModeEventArgs : EventArgs + { + public DrawingModes DrawingMode + { get; set; } } - + public delegate void SurfaceSizeChangeEventHandler(object sender, EventArgs e); public delegate void SurfaceMessageEventHandler(object sender, SurfaceMessageEventArgs e); public delegate void SurfaceElementEventHandler(object sender, SurfaceElementEventArgs e); public delegate void SurfaceDrawingModeEventHandler(object sender, SurfaceDrawingModeEventArgs e); - public enum DrawingModes { + public enum DrawingModes + { None, Rect, Ellipse, @@ -93,7 +104,8 @@ namespace Greenshot.Plugin { /// <summary> /// The interface to the Surface object, so Plugins can use it. /// </summary> - public interface ISurface : IDisposable { + public interface ISurface : IDisposable + { event SurfaceSizeChangeEventHandler SurfaceSizeChanged; event SurfaceMessageEventHandler SurfaceMessage; event SurfaceDrawingModeEventHandler DrawingModeChanged; @@ -102,11 +114,17 @@ namespace Greenshot.Plugin { /// <summary> /// Unique ID of the Surface /// </summary> - Guid ID { + Guid ID + { get; set; } + IDrawableContainerList Elements + { + get; + } + /// <summary> /// Get/Set the image to the Surface /// get will give the image as is currently visible @@ -116,18 +134,19 @@ namespace Greenshot.Plugin { /// The setter will clone the passed bitmap and dispose it when the Surface is disposed /// This means that the supplied image needs to be disposed by the calling code (if needed!) /// </summary> - Image Image { + Image Image + { get; set; } - + /// <summary> /// Get the current Image from the Editor for Exporting (save/upload etc) /// Don't forget to call image.Dispose() when finished!!! /// </summary> /// <returns>Bitmap</returns> Image GetImageForExport(); - + /// <summary> /// Add a TextContainer, at the given location, to the Surface. /// The TextContainer will be "re"sized to the text size. @@ -154,7 +173,8 @@ namespace Greenshot.Plugin { long SaveElementsToStream(Stream stream); void LoadElementsFromStream(Stream stream); - bool HasSelectedElements { + bool HasSelectedElements + { get; } void RemoveSelectedElements(); @@ -162,9 +182,32 @@ namespace Greenshot.Plugin { void CopySelectedElements(); void PasteElementFromClipboard(); void DuplicateSelectedElements(); - void DeselectElement(IDrawableContainer container); + void DeselectElement(IDrawableContainer container, bool generateEvents = true); void DeselectAllElements(); - void SelectElement(IDrawableContainer container); + + /// <summary> + /// Add an element to the surface + /// </summary> + /// <param name="elements">IDrawableContainerList</param> + /// <param name="makeUndoable">Should it be placed on the undo stack?</param> + void AddElements(IDrawableContainerList elements, bool makeUndoable = true); + void RemoveElements(IDrawableContainerList elements, bool makeUndoable = true); + void SelectElements(IDrawableContainerList elements); + + /// <summary> + /// Add an element to the surface + /// </summary> + /// <param name="element">IDrawableContainer</param> + /// <param name="makeUndoable">Should it be placed on the undo stack?</param> + /// <param name="invalidate">Should it be invalidated (draw)</param> + void AddElement(IDrawableContainer element, bool makeUndoable = true, bool invalidate = true); + + /// <summary> + /// Select the supplied container + /// </summary> + /// <param name="container">IDrawableContainer</param> + /// <param name="invalidate">false to skip invalidation</param> + void SelectElement(IDrawableContainer container, bool invalidate = true, bool generateEvents = true); /// <summary> /// Is the supplied container "on" the surface? /// </summary> @@ -173,31 +216,46 @@ namespace Greenshot.Plugin { bool IsOnSurface(IDrawableContainer container); void Invalidate(Rectangle rectangleToInvalidate); void Invalidate(); - bool Modified { + bool Modified + { get; set; } - string LastSaveFullPath { + string LastSaveFullPath + { get; set; } - string UploadURL { + string UploadURL + { get; set; } - void RemoveElement(IDrawableContainer elementToRemove, bool makeUndoable); + /// <summary> + /// Remove an element of the elements list + /// </summary> + /// <param name="elementToRemove">Element to remove</param> + /// <param name="makeUndoable">flag specifying if the remove needs to be undoable</param> + /// <param name="invalidate">flag specifying if an surface invalidate needs to be called</param> + /// <param name="generateEvents">flag specifying if the deselect needs to generate an event</param> + void RemoveElement(IDrawableContainer elementToRemove, bool makeUndoable = true, bool invalidate = true, bool generateEvents = true); + void SendMessageEvent(object source, SurfaceMessageTyp messageType, string message); void ApplyBitmapEffect(IEffect effect); void RemoveCursor(); - bool HasCursor { + bool HasCursor + { get; } - ICaptureDetails CaptureDetails { + ICaptureDetails CaptureDetails + { get; set; } int Width { get; } int Height { get; } + + void MakeUndoable(IMemento memento, bool allowMerge); } } \ No newline at end of file From 44fba6847784bcc6aba2e33dc93d5ca505fcc36c Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 24 May 2016 13:19:30 +0200 Subject: [PATCH 041/170] Removed unneeded file. --- Greenshot/Language.cs | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 Greenshot/Language.cs diff --git a/Greenshot/Language.cs b/Greenshot/Language.cs deleted file mode 100644 index ccead6ad4..000000000 --- a/Greenshot/Language.cs +++ /dev/null @@ -1,39 +0,0 @@ - -using System; -using System.Resources; -using System.Globalization; -using System.Threading; -using Greenshot.Configuration; -using System.Diagnostics; - - -namespace Greenshot -{ - /// <summary> - /// Description of Language. - /// </summary> - public class Language - { - private ResourceManager rm; - private static Language uniqueInstance; - private Language() { - rm = new ResourceManager("Greenshot.UI", System.Reflection.Assembly.GetExecutingAssembly()); - SetLanguage(AppConfig.GetInstance().Ui_Language); - } - - public static Language GetInstance() { - if(uniqueInstance == null) { - uniqueInstance = new Language(); - } - return uniqueInstance; - - } - public void SetLanguage(string cultureInfo) { - Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureInfo); - } - public string GetString(string id) { - string s = rm.GetString(id); - return (s != null) ? s : "string ###"+id+"### not found"; - } - } -} From 7c3812c529eaa02c21fce417b802832257af2f25 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 24 May 2016 13:33:24 +0200 Subject: [PATCH 042/170] Fixed a NPE while disposing the StepLabelContainer --- Greenshot/Drawing/StepLabelContainer.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 386a23787..08f6fbd01 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -148,7 +148,10 @@ namespace Greenshot.Drawing { if (!disposing) { return; } - ((Surface)Parent).RemoveStepLabel(this); + if (Parent != null) + { + ((Surface)Parent).RemoveStepLabel(this); + } if (_stringFormat != null) { _stringFormat.Dispose(); _stringFormat = null; From b638b1cea21d3756ced640c17114ac63bb73b928 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 24 May 2016 13:49:46 +0200 Subject: [PATCH 043/170] Another NPE fix --- Greenshot/Drawing/DrawableContainer.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index b1bdecbec..650e20992 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -89,9 +89,14 @@ namespace Greenshot.Drawing if (!disposing) { return; } - - FieldAggregator aggProps = _parent.FieldAggregator; - aggProps.UnbindElement(this); + if (_parent != null) + { + FieldAggregator fieldAggregator = _parent.FieldAggregator; + if (fieldAggregator != null) + { + fieldAggregator.UnbindElement(this); + } + } } ~DrawableContainer() { From b04be588e5b7dde8578f10fa94bb3cbe46c3cd2d Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 24 May 2016 15:23:45 +0200 Subject: [PATCH 044/170] FEATURE-919: Added increase and reduce size (Ctrl + & Ctrl -) --- Greenshot/Forms/ImageEditorForm.cs | 36 +++++++++++++++++++ .../additional_files/readme.txt.template | 24 +++++++++---- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index 070ff4d41..7afa3d9ac 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -854,6 +854,12 @@ namespace Greenshot { case Keys.OemPeriod: // Rotate CW Ctrl + . RotateCwToolstripButtonClick(sender, e); break; + case Keys.Add: // Ctrl + + + EnlargeCanvasToolStripMenuItemClick(sender, e); + break; + case Keys.Subtract: // Ctrl + - + ShrinkCanvasToolStripMenuItemClick(sender, e); + break; } } } @@ -1297,6 +1303,36 @@ namespace Greenshot { UpdateUndoRedoSurfaceDependencies(); } + /// <summary> + /// Added for FEATURE-919, increasing the canvas by 25 pixels in every direction. + /// </summary> + /// <param name="sender"></param> + /// <param name="e"></param> + private void EnlargeCanvasToolStripMenuItemClick(object sender, EventArgs e) + { + _surface.ApplyBitmapEffect(new ResizeCanvasEffect(25, 25, 25, 25)); + UpdateUndoRedoSurfaceDependencies(); + } + + /// <summary> + /// Added for FEATURE-919, to make the capture as small as possible again. + /// </summary> + /// <param name="sender"></param> + /// <param name="e"></param> + private void ShrinkCanvasToolStripMenuItemClick(object sender, EventArgs e) + { + Rectangle cropRectangle; + using (Image tmpImage = GetImageForExport()) + { + cropRectangle = ImageHelper.FindAutoCropRectangle(tmpImage, coreConfiguration.AutoCropDifference); + } + if (_surface.IsCropPossible(ref cropRectangle)) + { + _surface.ApplyCrop(cropRectangle); + UpdateUndoRedoSurfaceDependencies(); + } + } + /// <summary> /// This is used when the dropshadow button is used /// </summary> diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 5f93deaf5..a102c0066 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,17 +9,27 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ +Fixed: +* BUG-1876: Already running message, multi user environment +* BUG-1884: OCR has trailing blank spaces +* BUG-1887: hang on exit - hang time proportional to number of objects +* BUG-1890: Slight cropping around window on Windows 10 +* BUG-1892: Greenshot saves blank JPG file with reduce colors +* BUG-1898: Specify GPLv3 in the license text +* BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on and transparency is used +* BUG-1933: Greenshot Installer sets bad registry key permission +* BUG-1935: Delay when pasting and ShapeShifter from FlameFusion is running +* BUG-1941: Error when creating speech bubble +* BUG-1945: Failure starting Greenshot at system startup +* BUG-1949: Can't delete Imgur upload +* BUG-1965: Activation border around window is visible in the capture +* FEATURE-919: Allow adding of space around screenshot +* FEATURE-945: Added environment variables to the external command + Open issues planned for this version: -BUG-1887: hang on exit - hang time proportional to number of objects BUG-1872: OneDrive prevents Greenshot hotkeys from working -BUG-1876: Already running message, multi user environment -BUG-1892: Greenshot saves blank JPG file with reduce colors -BUG-1898: Specify it's GPLv3 in the license text -BUG-1912: Translation (Enu) FEATURE-916: Save file as icon -FEATURE-919: Allow adding of space around screenshot FEATURE-912: [Storage Location] Define directory pattern -BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on 1.2.8.12-cab854b RELEASE From 9bee8290a0a5a13c328bf9808d64df3367b07620 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Wed, 25 May 2016 22:56:01 +0200 Subject: [PATCH 045/170] FEATURE-916: Added some support for .ico files when writing, this will currently only write 256x256 .ico files!!! These files are not supported by Windows XP and older! --- GreenshotPlugin/Core/CoreConfiguration.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 2 +- GreenshotPlugin/Core/ImageOutput.cs | 127 ++++++++++++++++++---- 3 files changed, 110 insertions(+), 21 deletions(-) diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index f7361aadb..68ffe9a5b 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -34,7 +34,7 @@ namespace GreenshotPlugin.Core { PNG, DIB, HTML, HTMLDATAURL, BITMAP, DIBV5 } public enum OutputFormat { - bmp, gif, jpg, png, tiff, greenshot + bmp, gif, jpg, png, tiff, greenshot, ico } public enum WindowCaptureMode { Screen, GDI, Aero, AeroTransparent, Auto diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 514256986..1219fe1a5 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -1345,7 +1345,7 @@ namespace GreenshotPlugin.Core { /// </summary> /// <param name="sourceImage">Image to scale</param> /// <param name="maintainAspectRatio">true to maintain the aspect ratio</param> - /// <param name="canvasUseNewSize"></param> + /// <param name="canvasUseNewSize">Makes the image maintain aspect ratio, but the canvas get's the specified size</param> /// <param name="backgroundColor">The color to fill with, or Color.Empty to take the default depending on the pixel format</param> /// <param name="newWidth">new width</param> /// <param name="newHeight">new height</param> diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index e0ee6c801..64f6709ff 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -24,6 +24,7 @@ using Greenshot.Plugin; using GreenshotPlugin.Controls; using log4net; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; @@ -101,7 +102,6 @@ namespace GreenshotPlugin.Core { /// <param name="stream">Stream to save to</param> /// <param name="outputSettings">SurfaceOutputSettings</param> public static void SaveToStream(Image imageToSave, ISurface surface, Stream stream, SurfaceOutputSettings outputSettings) { - ImageFormat imageFormat; bool useMemoryStream = false; MemoryStream memoryStream = null; if (outputSettings.Format == OutputFormat.greenshot && surface == null) { @@ -109,6 +109,7 @@ namespace GreenshotPlugin.Core { } try { + ImageFormat imageFormat; switch (outputSettings.Format) { case OutputFormat.bmp: imageFormat = ImageFormat.Bmp; @@ -122,13 +123,15 @@ namespace GreenshotPlugin.Core { case OutputFormat.tiff: imageFormat = ImageFormat.Tiff; break; + case OutputFormat.ico: + imageFormat = ImageFormat.Icon; + break; default: // Problem with non-seekable streams most likely doesn't happen with Windows 7 (OS Version 6.1 and later) // http://stackoverflow.com/questions/8349260/generic-gdi-error-on-one-machine-but-not-the-other if (!stream.CanSeek) { - int majorVersion = Environment.OSVersion.Version.Major; - int minorVersion = Environment.OSVersion.Version.Minor; - if (majorVersion < 6 || (majorVersion == 6 && minorVersion == 0)) { + if (!Environment.OSVersion.IsWindows7OrLater()) + { useMemoryStream = true; LOG.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); } @@ -146,20 +149,26 @@ namespace GreenshotPlugin.Core { targetStream = memoryStream; } - if (Equals(imageFormat, ImageFormat.Jpeg)) { + if (Equals(imageFormat, ImageFormat.Jpeg)) + { bool foundEncoder = false; - foreach (ImageCodecInfo imageCodec in ImageCodecInfo.GetImageEncoders()) { - if (imageCodec.FormatID == imageFormat.Guid) { + foreach (ImageCodecInfo imageCodec in ImageCodecInfo.GetImageEncoders()) + { + if (imageCodec.FormatID == imageFormat.Guid) + { EncoderParameters parameters = new EncoderParameters(1); parameters.Param[0] = new EncoderParameter(Encoder.Quality, outputSettings.JPGQuality); // Removing transparency if it's not supported in the output - if (Image.IsAlphaPixelFormat(imageToSave.PixelFormat)) { + if (Image.IsAlphaPixelFormat(imageToSave.PixelFormat)) + { Image nonAlphaImage = ImageHelper.Clone(imageToSave, PixelFormat.Format24bppRgb); AddTag(nonAlphaImage); nonAlphaImage.Save(targetStream, imageCodec, parameters); nonAlphaImage.Dispose(); nonAlphaImage = null; - } else { + } + else + { AddTag(imageToSave); imageToSave.Save(targetStream, imageCodec, parameters); } @@ -167,9 +176,15 @@ namespace GreenshotPlugin.Core { break; } } - if (!foundEncoder) { + if (!foundEncoder) + { throw new ApplicationException("No JPG encoder found, this should not happen."); } + } else if (Equals(imageFormat, ImageFormat.Icon)) { + // FEATURE-916: Added Icon support + IList<Image> images = new List<Image>(); + images.Add(imageToSave); + WriteIcon(stream, images); } else { bool needsDispose = false; // Removing transparency if it's not supported in the output @@ -181,7 +196,7 @@ namespace GreenshotPlugin.Core { // Added for OptiPNG bool processed = false; if (Equals(imageFormat, ImageFormat.Png) && !string.IsNullOrEmpty(conf.OptimizePNGCommand)) { - processed = ProcessPNGImageExternally(imageToSave, targetStream); + processed = ProcessPngImageExternally(imageToSave, targetStream); } if (!processed) { imageToSave.Save(targetStream, imageFormat); @@ -223,7 +238,7 @@ namespace GreenshotPlugin.Core { /// <param name="imageToProcess">Image to pass to the external process</param> /// <param name="targetStream">stream to write the processed image to</param> /// <returns></returns> - private static bool ProcessPNGImageExternally(Image imageToProcess, Stream targetStream) { + private static bool ProcessPngImageExternally(Image imageToProcess, Stream targetStream) { if (string.IsNullOrEmpty(conf.OptimizePNGCommand)) { return false; } @@ -244,12 +259,14 @@ namespace GreenshotPlugin.Core { LOG.DebugFormat("Starting : {0}", conf.OptimizePNGCommand); } - ProcessStartInfo processStartInfo = new ProcessStartInfo(conf.OptimizePNGCommand); - processStartInfo.Arguments = string.Format(conf.OptimizePNGCommandArguments, tmpFileName); - processStartInfo.CreateNoWindow = true; - processStartInfo.RedirectStandardOutput = true; - processStartInfo.RedirectStandardError = true; - processStartInfo.UseShellExecute = false; + ProcessStartInfo processStartInfo = new ProcessStartInfo(conf.OptimizePNGCommand) + { + Arguments = string.Format(conf.OptimizePNGCommandArguments, tmpFileName), + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false + }; using (Process process = Process.Start(processStartInfo)) { if (process != null) { process.WaitForExit(); @@ -450,7 +467,7 @@ namespace GreenshotPlugin.Core { /// <returns>OutputFormat</returns> public static OutputFormat FormatForFilename(string fullPath) { // Fix for bug 2912959 - string extension = fullPath.Substring(fullPath.LastIndexOf(".") + 1); + string extension = fullPath.Substring(fullPath.LastIndexOf(".", StringComparison.Ordinal) + 1); OutputFormat format = OutputFormat.png; try { format = (OutputFormat)Enum.Parse(typeof(OutputFormat), extension.ToLower()); @@ -601,5 +618,77 @@ namespace GreenshotPlugin.Core { File.Delete(path); } } + + #region Icon + + /// <summary> + /// Write the images to the stream as icon + /// Every image is resized to 256x256 (but the content maintains the aspect ratio) + /// </summary> + /// <param name="stream">Stream to write to</param> + /// <param name="images">List of images</param> + public static void WriteIcon(Stream stream, IList<Image> images) + { + var binaryWriter = new BinaryWriter(stream); + // + // ICONDIR structure + // + binaryWriter.Write((short)0); // reserved + binaryWriter.Write((short)1); // image type (icon) + binaryWriter.Write((short)images.Count); // number of images + + IList<Size> imageSizes = new List<Size>(); + IList<MemoryStream> encodedImages = new List<MemoryStream>(); + foreach (var image in images) + { + var imageStream = new MemoryStream(); + // Always size to 256x256, first make sure the image is 32bpp + using (var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb)) + { + using (var resizedImage = ImageHelper.ResizeImage(clonedImage, true, true, Color.Empty, 256, 256, null)) + { + resizedImage.Save(imageStream, ImageFormat.Png); + imageSizes.Add(resizedImage.Size); + } + + } + imageStream.Seek(0, SeekOrigin.Begin); + encodedImages.Add(imageStream); + } + + // + // ICONDIRENTRY structure + // + const int iconDirSize = 6; + const int iconDirEntrySize = 16; + + var offset = iconDirSize + (images.Count * iconDirEntrySize); + for (int i = 0; i < images.Count; i++) + { + var imageSize = imageSizes[i]; + // Write the width / height, 0 means 256 + binaryWriter.Write(imageSize.Width == 256 ? (byte)0 : (byte)imageSize.Width); + binaryWriter.Write(imageSize.Height == 256 ? (byte)0 : (byte)imageSize.Height); + binaryWriter.Write((byte)0); // no pallete + binaryWriter.Write((byte)0); // reserved + binaryWriter.Write((short)0); // no color planes + binaryWriter.Write((short)32); // 32 bpp + binaryWriter.Write((int)encodedImages[i].Length); // image data length + binaryWriter.Write(offset); + offset += (int)encodedImages[i].Length; + } + + binaryWriter.Flush(); + // + // Write image data + // + foreach (var encodedImage in encodedImages) + { + encodedImage.WriteTo(stream); + encodedImage.Dispose(); + } + } + #endregion + } } From 3dff32b8e0a86409d9171b595dbb25360d675744 Mon Sep 17 00:00:00 2001 From: Robin <robin@getgreenshot.org> Date: Tue, 31 May 2016 22:26:47 +0200 Subject: [PATCH 046/170] Trying build with InnoSetup from NuGet package for easier maintaining. --- Greenshot/packages.config | 4 + Greenshot/tools/innosetup/Compil32.exe | Bin 1102848 -> 0 bytes Greenshot/tools/innosetup/Default.isl | 336 ----- Greenshot/tools/innosetup/ISCC.exe | Bin 159232 -> 0 bytes Greenshot/tools/innosetup/ISCmplr.dll | Bin 587776 -> 0 bytes Greenshot/tools/innosetup/ISPP.chm | Bin 69970 -> 0 bytes Greenshot/tools/innosetup/ISPP.dll | Bin 256512 -> 0 bytes Greenshot/tools/innosetup/ISPPBuiltins.iss | 345 ----- Greenshot/tools/innosetup/ISetup.chm | Bin 380962 -> 0 bytes .../tools/innosetup/Languages/Basque.isl | 318 ----- .../Languages/BrazilianPortuguese.isl | 354 ----- .../tools/innosetup/Languages/Catalan.isl | 319 ----- .../innosetup/Languages/ChineseSimplified.isl | 336 ----- .../tools/innosetup/Languages/Corsican.isl | 345 ----- Greenshot/tools/innosetup/Languages/Czech.isl | 337 ----- .../tools/innosetup/Languages/Danish.isl | 334 ----- Greenshot/tools/innosetup/Languages/Dutch.isl | 314 ----- .../tools/innosetup/Languages/Finnish.isl | 314 ----- .../tools/innosetup/Languages/French.isl | 354 ----- .../tools/innosetup/Languages/German.isl | 346 ----- Greenshot/tools/innosetup/Languages/Greek.isl | 337 ----- .../tools/innosetup/Languages/Hebrew.isl | 331 ----- .../tools/innosetup/Languages/Hungarian.isl | 358 ----- .../tools/innosetup/Languages/Italian.isl | 341 ----- .../tools/innosetup/Languages/Japanese.isl | 322 ----- .../tools/innosetup/Languages/Latvian.isl | 346 ----- .../tools/innosetup/Languages/Nepali.islu | 337 ----- .../tools/innosetup/Languages/Norwegian.isl | 330 ----- .../innosetup/Languages/NorwegianNynorsk.isl | 301 ----- .../tools/innosetup/Languages/Polish.isl | 327 ----- .../tools/innosetup/Languages/Portuguese.isl | 318 ----- .../tools/innosetup/Languages/Russian.isl | 324 ----- .../innosetup/Languages/SerbianCyrillic.isl | 338 ----- .../innosetup/Languages/SerbianLatin.isl | 338 ----- .../tools/innosetup/Languages/Slovak.isl | 244 ---- .../tools/innosetup/Languages/Slovenian.isl | 327 ----- .../tools/innosetup/Languages/Spanish.isl | 335 ----- .../tools/innosetup/Languages/Swedish.isl | 339 ----- .../tools/innosetup/Languages/Ukrainian.isl | 340 ----- Greenshot/tools/innosetup/Setup.e32 | Bin 1170432 -> 0 bytes Greenshot/tools/innosetup/SetupLdr.e32 | Bin 118784 -> 0 bytes .../tools/innosetup/WizModernImage-IS.bmp | Bin 52574 -> 0 bytes Greenshot/tools/innosetup/WizModernImage.bmp | Bin 26494 -> 0 bytes .../innosetup/WizModernSmallImage-IS.bmp | Bin 4158 -> 0 bytes .../tools/innosetup/WizModernSmallImage.bmp | Bin 1658 -> 0 bytes Greenshot/tools/innosetup/isbunzip.dll | Bin 19456 -> 0 bytes Greenshot/tools/innosetup/isbzip.dll | Bin 23040 -> 0 bytes Greenshot/tools/innosetup/isfaq.htm | 474 ------- Greenshot/tools/innosetup/islzma.dll | Bin 74240 -> 0 bytes Greenshot/tools/innosetup/islzma32.exe | Bin 72192 -> 0 bytes Greenshot/tools/innosetup/islzma64.exe | Bin 99840 -> 0 bytes Greenshot/tools/innosetup/isscint.dll | Bin 274432 -> 0 bytes Greenshot/tools/innosetup/isunzlib.dll | Bin 13312 -> 0 bytes Greenshot/tools/innosetup/iszlib.dll | Bin 18432 -> 0 bytes Greenshot/tools/innosetup/license.txt | 37 - Greenshot/tools/innosetup/whatsnew.htm | 1168 ----------------- appveyor12.yml | 1 + build.ps1 | 2 +- 58 files changed, 6 insertions(+), 12265 deletions(-) create mode 100644 Greenshot/packages.config delete mode 100644 Greenshot/tools/innosetup/Compil32.exe delete mode 100644 Greenshot/tools/innosetup/Default.isl delete mode 100644 Greenshot/tools/innosetup/ISCC.exe delete mode 100644 Greenshot/tools/innosetup/ISCmplr.dll delete mode 100644 Greenshot/tools/innosetup/ISPP.chm delete mode 100644 Greenshot/tools/innosetup/ISPP.dll delete mode 100644 Greenshot/tools/innosetup/ISPPBuiltins.iss delete mode 100644 Greenshot/tools/innosetup/ISetup.chm delete mode 100644 Greenshot/tools/innosetup/Languages/Basque.isl delete mode 100644 Greenshot/tools/innosetup/Languages/BrazilianPortuguese.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Catalan.isl delete mode 100644 Greenshot/tools/innosetup/Languages/ChineseSimplified.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Corsican.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Czech.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Danish.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Dutch.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Finnish.isl delete mode 100644 Greenshot/tools/innosetup/Languages/French.isl delete mode 100644 Greenshot/tools/innosetup/Languages/German.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Greek.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Hebrew.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Hungarian.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Italian.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Japanese.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Latvian.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Nepali.islu delete mode 100644 Greenshot/tools/innosetup/Languages/Norwegian.isl delete mode 100644 Greenshot/tools/innosetup/Languages/NorwegianNynorsk.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Polish.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Portuguese.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Russian.isl delete mode 100644 Greenshot/tools/innosetup/Languages/SerbianCyrillic.isl delete mode 100644 Greenshot/tools/innosetup/Languages/SerbianLatin.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Slovak.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Slovenian.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Spanish.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Swedish.isl delete mode 100644 Greenshot/tools/innosetup/Languages/Ukrainian.isl delete mode 100644 Greenshot/tools/innosetup/Setup.e32 delete mode 100644 Greenshot/tools/innosetup/SetupLdr.e32 delete mode 100644 Greenshot/tools/innosetup/WizModernImage-IS.bmp delete mode 100644 Greenshot/tools/innosetup/WizModernImage.bmp delete mode 100644 Greenshot/tools/innosetup/WizModernSmallImage-IS.bmp delete mode 100644 Greenshot/tools/innosetup/WizModernSmallImage.bmp delete mode 100644 Greenshot/tools/innosetup/isbunzip.dll delete mode 100644 Greenshot/tools/innosetup/isbzip.dll delete mode 100644 Greenshot/tools/innosetup/isfaq.htm delete mode 100644 Greenshot/tools/innosetup/islzma.dll delete mode 100644 Greenshot/tools/innosetup/islzma32.exe delete mode 100644 Greenshot/tools/innosetup/islzma64.exe delete mode 100644 Greenshot/tools/innosetup/isscint.dll delete mode 100644 Greenshot/tools/innosetup/isunzlib.dll delete mode 100644 Greenshot/tools/innosetup/iszlib.dll delete mode 100644 Greenshot/tools/innosetup/license.txt delete mode 100644 Greenshot/tools/innosetup/whatsnew.htm diff --git a/Greenshot/packages.config b/Greenshot/packages.config new file mode 100644 index 000000000..a9672879a --- /dev/null +++ b/Greenshot/packages.config @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="Tools.InnoSetup" version="5.5.9" targetFramework="net20" /> +</packages> \ No newline at end of file diff --git a/Greenshot/tools/innosetup/Compil32.exe b/Greenshot/tools/innosetup/Compil32.exe deleted file mode 100644 index d6b62d3550cbcb98c0ad1ac386572997ea560b10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102848 zcmd44dwf*I`9FU4l4J=ByI_ETs6nHGASMQd5TZ*+FoxSE;S$14B*aJ&XmS=%10+33 z<uI;Bi+*gityJ4;Yg_7#c&To(kc5knfJ(S15m0AY)CegASlRFUnKK&#+WtP@-ygr% zFR=TbGnZ#(o|$>(nP+CsPAPONW<^n~ibDy96{Qw#`g19R499=_HYv)xPNnyCZ}#|T zNUdq|M?-3Ark6Zemaw99`2(d3A4+)0Q>G@|zc``Pvn;{0tY~p*!mJ0ErQF^tHgWWS zBm4hlm^({RCYx-EHljyvB;PjW$;zH4^FZa7v5JxtExZT+25u*uF9N|G;RfTPMCc_{ zD*6yJ#UJriM081{^!SrtJS6p0PTm1$O;1HR5us)T{ja_&dMfch5ixOWPbJCr69Lj| zq`G*u3U~QxS+7TcvfPnW35s&x$Onyx_n~-74dU2=Yl#P!{t_r&(L!}0ybj-tFXGWq z;D*cNxfI1W^8T_igeXJv@zpHDU%xyaLVP11GzbdbfJe%m@Vz3Qi{hzE1-)?yR#s3U z@yCCHUa3J(@CrN=o&Jh=E;Q`O(z4P;M1$HQ(k3S^r$_N9O4lE?IsJWnS<6x+{Qv*= zpVjG7EHN3&moHtsa2dw4qKGf}MonC}v~00;dZ}lz*QJbrkJ&bUS=oaVN*0!iIFJ@f zO(y(%Sjo>qiAjXi6u{3EbMG>B@dJxXsZUje!{K$zw}Skw84s(AFQu;%ezTUB7F|mJ z9QoNMEG#X0aM{A8VoZQQxMnl_`$m_kr4KH9;C;AbW2rp(;#pCcFR_n{%J3imC_FMG ztm9mY9iP|IUCPV&Y{jPupI!L)@M#<CQbPEQNpmSN)2H3PWbq<33F%`Z50^5F&VRT} zUHp)uxDoD%y_YIpTD)-4Vk(HJDLH)fr6?0+YztVmOUq2Ob_Obo6~%D<zRUG0T)WnQ z-edSYg-;h9(C`r<ka_|Bk@_U`bt$jl`9J+pIQ7n5;M<jTKfKDNaC{<l?}R&2_de6R zs#9cef%(EWwvC+xeur;7EU{JM#}b<*?vm)1*mMPMmCrtj?@OF4u~y=n5;seHP2wvO zUzYfy#1|w!Cvl_18i|if%$B%bVwJ=SiQ^=WkvK|Xxy02HRf!`c4waZF@Lg)Wr`sKM zW|#k6>dC^L?GN9$LdIJvu|#0Lw)Oq@NaQqH6EgwR`B)@6lbJZeq((Wm%uP&Uer;>! z96!co_{Jic_CASo1s=DW(8I#vLZqL#uuPpYB_U&Z>C%PEiW0Jl9#kJ(zARzrqG1WQ zCnb$axRqc`g8RY6rKO7#mM%`ndvH<7;)L50+@;Hl7nhYG^1`JF`OAydRSOXzbMeZ> zOP8;BXz?;kAmeFfU%Yw+hR5QfgohSCw7m3TkXZP$gp!423CkBP@_=U1$OIHanGT}e zB9}e1aOu*7`<E_X^fQs7ECJNV_KFqp${u`VG13=zPe5cvCPfc=9!j99EL~Xoz+!`h zky_-Fa6d#$*;wJ8vFvBdmakfda$b@YGnPHLXnE1%h~Q9=r847EC8ijan2g*MrQNZ) z5Am7V^jMZ{WiFeZW7RWk-TdIevf*uG*>>h~>N$2j!}%Y=5y-L;#mTbcm@8h-iPJOU zDejS>M@no*N}NYZ;#qcro|ACok@zEzIFCGHJ2Li)@FOJ&EPJS)GxW$Km&K~-Mgwt< zlniCrNqSDwkw>nKd3k<D+#@APEPITeGv>%6Kat|cv=RSE$rzUH(sNu#9{K51$VUs< zO--g9XAeAl)sYdVBTG%TBjtT;N5=Kh>YS^;A+K?LSf<IQXZ8_1)dE%{z7eF=*;fCX zSxvgNkH3ca?@Vpc`+(!B*<Vu`XgZjq=sW5H7RTG4)?P$+-{%`*eI^^eo;LBUx4<VV z6CQr%t2{x9MBNEn<%uw6n}OSh?5M0Km)HIYQDV8))E&A_cUyI{KHjQY{54nRK_huz zTMr|TT6#hbZ9R+}v~(A!C>~0;X&jtqTp^R^MlCyJWBn*-ShF|BqGyNn>E_PL^Hdmz z_5eza`0us@Z*YeU@6x{9foDM^62f{35@2TV9e+(eYvqq4$`We{$@P-<@KwqZg@1D) z9Ip1MQ&_(dRH3Fu(@@|`^q}XWTCBOUo}#iHV05F2G}L$6@H~8{F31nx$Le3AqH8-5 zS36<V2hH)P_+Fx{Q+#v$H5KW(&8VZA9voJYexQ}An}B?)k?%WA=W~?TO({O!7z&50 zeCog@v3%)e0e=?(o^2@q%vm!S_rB%C%r;ePuvUIW%7dtlQ<({hHy|Nvtv;kCu?zZg zo3`7kud?$s#Fb{`(-^Z0-}*J=*6*?E@eNUwy`uS@%s+3z{5fcE%0t_Fn6+!)I{5^o zWDU%z$0af}@bpA0bKB3<+dP9xlnMpBo5^d>3+7o<!oj<>J>lS3_BlJDec7H8UNYF5 znP_+C^FD|o<LC4BBEBbz;`U~0VqDs{E2D>hYdRg=QyunP#W1_GxJ2E_tceWyp<l^D zvPNxdq9~-`gSNGeonoEv<yNM!R_$237K}^#+@XDe_F?<#PM9tG(mq{jWha7W_AT45 zop5Sx?UrWLMU>3uMqV~IFFO|wSC%Knk=o%|QCXCTo`G6_idM}`bfz_z&1Ihq-&a{r z;W?E@Mc~0Sf0>!J66X^XB_9#(ZvH0_LN~fqv`3e3jo~|h3hLBX*jTfr(5~&Y>4kQ7 zB)E!g<Bw2zsnM2H{xBles;snOrZVDE8c0vJkL`Jie?^Vk$oF9E1@CSNrkyU0Wk<B{ zocbzT@HW=KZ;#NqzVf1^6UlQQYh=6mCkBBhK!E1L1i?(N+fsMJl0G69CEn1B`l;iw zY;^Ie?T)v9(T2Y29lWjNMaYJkEZ@p9Z0~fUPoy4H2WS~~(+wDwIT-sPb!dY{K~Jx# zVfjwSmPuw)UD^cus+AN;pJYQIA{pVB31-LXldLj9Eoo_(Fm6zPulW-$Jw0{Vlcoh- zr!kI<!Lt)xJsaiditVUcfKp-P+z#L1Ycpp>MqFwn%8g?V<|yhdmuP$i8rE(!j0inI z<J+^K(dhV~%yh#YBm~tJj`th9qqc#)3bR*}pme;y-E04+cicxp0<N;MnO1$4RUezW z-!tG{AyVsy#EF=m7{?nz(0wRm)!I;H_`X<^Qo2+>@7VI_pke2|*3p;b8-D_$BRB&L zjAueFrtT@diQPf61%89PPm%ab-Ct_f_YAu@OvKPdXmE&Q%Y;FCBOi!1)*GsQ9_JsZ z#_KIKsw;{{ht7JZMe9>T$v)w)U#m~FHBPh(VO-|)PE4Ri^TwI<e4FX)us!;tc51T~ zAxd6zITI&c&cqMTTxtl(Wiato_y!x%AJDU4CV8wEa`Ha64=k)aMmm<}PpaDP`IGlo z%^fIkOWlcHbpcx~0>b;+ZZKvF)vkTf=6K)Nqb@kVrY15owcQ}tsSa?w-^`4Nj`y4N z=DM~hM7*O$O8f(*gTzEItW`*6Lr_CL>jj};jNZz>$FOXOA{L?B&Yab)DJNP<G>%Da z^bELSc0^P5qYe>iO8xw>gX(o&Ys#etlrxcoZ=;TAL;VfjPcnn|GC#eYm^!E0=g^0v zxs!c<<_?{ykJ0P$H(VnIVD&NZsp=3L<XNaKv70dJ)DhJ_j5M#yq>m4&G0DF57PJeS zWYr7fNVm$3)AMOWCDU|M11WSB%ZOtL$hPX^<C1-;`A&~TpI~2a(VJOb$jB#9jcg)q zdxN_1QoEkW&BO5c5=~P$yDNgDYB`z*A+da?2no`7j|3Y{pK*x>4X~FG@A3#kklG7h z(KpW2M>(p$Mj^DL?Nx{LeKYk2&p*y)ri7?lvdJkS&mG!!n-0gBi6NWERe6D?UDfTK zV9_Ur^tmaWdb@s*&&Gh2yiN8|e?^mMU$mQcR-U8rQd-Z?Qg3{(hE44pw!6#wpL#q0 zoC02{6eEdfdq!Z|W6?C8NuiNcyC%Dxr_pmeO#?+PH8tMfQ5v3#{2M2PNH1uNqDh~8 z^=oL<URJD{IcMrEj;h~~)S;g4XW5}Mbusy<wxfDIRe2zdLMR!jEv2KqgP(E1FLh_B zmFlGL)0_D;F?p)}^#gjn?nn8}C_mu69{{Zst;RdKN5U+9f3j~_i`E<-(qwAp1C3OP zm0>Y0SoGDMG9OTB)Z4@PgF#~z(dZQ8{Y)L&<pI=3-w8fqaF|dg?U*BV#|+0~4jRcL z`lfzVYBOeI=zHf!fX`+9D$nmiBF8VbqTKJ2S8B`3L*BoLQU9eF_1luPI_t1NL_ANt zymQ>vt@q@j`xKoDhr9Zp(ZTGw=s=UnAHDBA2Qs>0eyB%KpC8h9vRN2LCQlD-hfSXq z3J$2zJJGRB`%L@gu#Dp0qU-4kI;jI?jto^^5d9<8YaNMh)c4<A-AHd2Rnzx_=ZDZ- z7*PH7ZQxeBevUsuG}`$+P|I{K;<0-|ub3QF-=H*5F}x#8sV5wd9l=wio^vj*XG-^a z(nx#s`|cynsA+F8(iV!4;D=px6?v&^Bl)aS(?uP6>YcfH+<~GM&eogixY^W{93IxJ z?GF#>^j4Xv32qcE;7jt(unwzV)l*9xc~;wI4PIMQqfZ|h@;+kG%acO-Hp#0PQ#)5c zuE%HkvP+Unws=I6U6GNg8BE%f$6vvKC<M=1q(WoS-JM<RyAERr?6c8CWw5Vi{+u&) z7#KIAGm|v*<$DXl+OZJ74|Hg_ZTH4mdhD#cK;5^j@7Y5KzWprjD$Q?O-KocZ<~wkf z^j6lyTA+HfzG!kw3#%83xOl4G>oKSJXgw&`8tNd{j|OL2bEz|;+ouViGOOlu`Y(wC zHAYM#L76^(CiF~yf<A~j(=wbM8!NP>71~!0WbN#8Eofy|LkYEf?%0xH9^R@C#BhY< z&el!j@L^19KGVD77p&0F9<Afo>MfN=Ap@?f3tZ!kd)id5H)%~t>tpn0?VL$F60YNe zMYy9!o$&WspGLGu*wrE|<|o4ji7?Agh7A;9rk@Op7h%dzh7F*wbw3@}pTh3`>9Bqj zc3royNCo1IO5I~xK<xs)e$Ng<%iYbBVJc^SOM~E9K0AnB)K~L0F~#w=&BgZd7VvD2 zf75hmq&$5%;x@5;#?uxNQZs{{%txa_<SEL^5(r$+A~wUu@{Y5nw3by)HqVCtmi%_e zp|qB=0SHUkuIIEb84Q<Je>~64@BapRc9u<B-EJ+t7LLl*9kg2X^o9G3tMiQ7LpaWv zRBMVa7_-?lXC792_!4=~oW;(w*2*x4mc3>%V!EMg`(EKiDBf(W@A4vE%{*6n-Ayr? z85yX2ucXC$ZmvF~-YlXu@LOe^tLWJ~%fzDjvxb+4a*y6@qRt7aJr8{hb=S5Y&u8%| zK0T{_M#^61=Or?>Ipq-Z&tYFuyogx3Vm<orlUR?ootNv;(cgBhM-N{XaIFaNY}3*Y zBd+3!Um};&v_gU~`yFDxL_sow;~6ogvG%S)S-^r}n<%t$%*DIGqQT+;E4Y5-sn7j| zRd|FIqh<|JR3PYRSeLT)4=GN{A?<EOy_?@@P`i`GFlSEn-twC=QhdyjrdC=#1K0r8 zmpNG6Q_P`Hue7oO;n+7!L8~jr^O>Z`{4~``o_!4JdRB<xzf#F*xl_lZ>e_7R6W%xL zmF$aQ@03>WjKhe)&q8no$}kDCtixD)o>5GW>H_1D&k{v)RA-B4TSG<oo{M1=7*Y8G ztP5CYb=XmT5yBWgm8-3^_HlUo8>z`mmeqj(#}=1a&pN5CIcZX3@ojcgpB70vTxTCT zsrl?^Ty0H<;&|e)@J6922?~>z)$Vw_5uOcM$4r#oGl@z`DLBjOsP?VBUeEftV$Cr{ zwXrN-F(#pmdXagvX?@nQa25|w`PlOX1v{!L1!+W4JP*Hz0xH4M2&v-+sl*5=jECdJ z+GVt~tm9@Pc0}Yg#)zPJZhMcEq~Or^FgTR7ai6OWZQSRI+G9fH1q@eZ?MVaIMd{-{ zN54K4&ivde8ind-$^!onr)9M|epv}#qWP#dqtCl*Y5%Nps})NucedvYQdDkj!`y*Z z^;T2srEGs!f#He&9;;k$_2C%9$AwKVFMKdssyoq84b{|KCYDZ?pTI9b6U*%;EEL4* zycEL|riP@m4a5!4%(D%&OQZIjfkCzfy3_37gvx&r84?z2Mr&Wef@0O*Itd@dNJoq+ zpC`e{Lt!FA_6&vU8%2r2hL@k;E_3ue!PZ$T!(@wcRF|S>F=4m~jwU(b<UzwMbW?<4 zncc{e6j(t@f3rK?Io8SxWc^X?mr7awR>i+W4|P;OiH2#YK1;<Xc5pa0Ws;C>y^(~h z_nE_w{UCj&LbkHj#_D#&p)Kjg>NdERAhNeQG!6BsK8$B3d>va9Fio#M4xfhVGx%0M zq?TqzoOW;Zq3{pkv{uJsBfwSdF2(Un8Vwcy5+(5r*_2IXm@diyK`)+m3;q~|HC6me z5cSM#u=JYHV2Pc;MA>Po*Z{?iwKiB1;D0MV2@^2Gh?4N-B50GFh@VZQ3WB(J`ne=d zR82t`E=CwBVM#HS#;8NG)v>|p#)R`hB%zp$#)yQ$%uNME^be6R@if>78@g#Oh5a%T zCY}@{%+4l;Q07=8dr{`qM$Xaj{t%s+wNBH%wP|4pkOmSZq9#U5RSIs>ww5Nio)Gp@ z<2b5UA);n<%C+kxQ&ne#RT11YnTqw@4U!My=|RCE_7-*Msnusn$4^WN8zaYP-s-S= zi8)4N!sy2Pi-Ja4byd%MG!bT<>e;>NKFURp<RYFd$fd-YpeUP)5a>n*=w<FD3Lp7p z*8qopFmqOlFXha;)Ws^&Z^C#`)TlFNhvyo{ma%o;S=esNcFXp(&XqmauP2L@E3I?Y zzggo%tv*4!INGyo!F<Sh$bt{3x4u^eDq5Q2iEgyq*WaahCmh!&U_pRyj-EfEy>Y@x z8sM;}d}Z-jd|s<7>N`9~v}d7imqpc*)*aPsg=w7k(mG>SM%Bh37HfJvy!Yt({4eX; zdKE_{^(@vWgkb0S%CV)9HPwA#_1f>PtRr%jUkGiyE(vSYGOV4V-XXvPsV#T_usV&y zEVG~ONZEV#`{J|T6{8@<C`Ym8O9J7GP(`OYs*@lY_(3#uV-$%B`ZPw71S8i6bUfkR zCb(F=uIMhSR&Sf?Io%jVqJTb)QDh7z7fpvk7n?QXJ&}|=*`wBAU$z_*d<B_%XYuXF z(e-{vyWlzTE^)J#=1SJ2V`Bzi)<&0&cn6It+phT%ay-ZNtMxh7cc~Qbh*H!UrKq#z zcuuqVMEubR@qE6Nh#yJ&+;c*|Q(tKniw!OPILe`@eK!%h`J2!vVOyt%iu6{prK?f= zEQXELHq?Q#tU`@&^LWrid{P{E0$4?Lgi;wB?l=9<Ipi{*_HQ-?=Aqnv%#T-v`(=0c z&w_ul@3fz6Do8U~gn1~9IWUaUFkAI@_4ew$YP?%-3iop(!t5R}<Lf4h5{)RjlL9DZ z51%JUnYDvQNa1wr%|>>V;%lTp+4y%;FpO&v12uE-FYv@F=mF{h)J#9$b6I#@w{R<k z=kvdJd7;c#vjSVnUfpfe(i6lUgq``r{m4o4D>Oop=c8Ro{CYntnv_3vHR=Yv{1j`g zIJQnpw~55D>{Cik4^@Xez4!!5_Z%8m2|6k+3|bZIc-!xI`?>p2SGd@x{O{nn(XX_& zb+GFPUZo~*=jC!6l4`Y-RGD2^;4%4=eSuclKD1B6Cxdf>G;}|H5Kl%%d=H$cQ4J-P z<xg!^leKdRtID;2ZCy+_(aV#uIf!ktq1rjy+CJDM)Xq8AM$=BA+#SRQ8f+!o5N+b^ zE@d)4`S{$2&tiO5;Ijsw_4wo+8S2e6b$Tbqb{-j;d-i~Kl-#z$uC2E6e;*lJi2cU3 zBU77KwG7*l+U$+%v$6?A$rVK~wP;^-4r`I|QNVxCJ~Ec_$BJfstlzQ4R;<VRi<xbM z%M9203^V!^e8|H}&sI2#8M%vf@xWXbJyy@K__22>_Bo4RN<f<(I(pz%LVwK?<-oYa z0<j)B^pNd<PdjOa$AR)h^Yg`(lM~H~<G|8H^MTOw2Sy}nTdki5=GEI3^gZn)HW?G2 zFDQh()K1!eBF&NVL@TA5ZNy1W65S#?+>ac!d(k9;MFVM6`0^cFvaQ9Hfq(8-9rqS% z0dtw19SrYdt--5P4h09K58Ve{BqqJ{6KpM5;S=@V14xZskQiu77oaW4wq@?Yd~>8< zVEvtP29nuYoc_=KrMDHQzp;PSu;LqE-(Q^m`hE{m!j#3@tIrtDL~>#TH1NNIUa)WF zg#wgPjjg4e`2SEIa-HdTd(haOE6r@@dRvCe@%Hwo`Kt((@-SE5UH7e7y@}b_pwt7N ztf^{0+EgvH;$e*D!>SP?^=L3!^Fg{==WAbC)H^rW#>RS*rm9zM$Tp45!G7jc)wUtq zJT}Md86<3!^T!<UILG|pvDXEhbwMYd%wvAQNU71zC#?Ud{O)2M-69(u0!-Aiqp^AQ znethj`LpR}n_j1V5rghE47-}9=CcQ-w^r{g?;vXkS!JvDu63`UYz}KjFP=T<jhk_1 z6iz)Ht*HU6!T1cqCmx^v_{8DU7au1+z45W*gPxX6`A6eJ`J)^*zu14&8{9BlS83p2 zvM>42hr4#|vKO;!wFYysb|FFScuN7^s;<QMaJ3ZQiK>e4)#@^Q7pNupPVx-wO0im< zDg52VX!)CiQ3Q7sYr!P=_E<GMwR6?YUTcNPXKIy6st<YEE`Fr;toE%b3HC&`!RWKC zYv-+=GiTW6!PytL8PS5j{19En(UnI16!aFBT0uD>LVaa#xcb09YL&lO^T#5u_v+fL z-E-P;@gtA<Z0qdgGcDihw;Sul04-gpe<vTR_LWb8ITz3A3bqd&-by(2dhO_SFx4D- zEq}|MF6Hy>SV^i6ldnUy8~)#nHvFyXLR9Y1YZJ6F<Ppq2+bRgHnRq3Ub3|m+kBPwF zst)c(<Xo`#XRU|+`Zwepw0_ol;M+NVl!^W-V81c`DqyWK{$4b@42RMb6>*)nNtf#d zyL7qz4(Uql=xewto_!9w6a6K;|G_}RHS}lS4mMop%+DkUmut&}cW)3b=N~`jHwo7* zUspYK3%M#f625xtR&u?V{OW>ZN#wGAxc%xU&{q{@+sOC-@J}#GajhKtv!0*hR2h^< z>kW+??t<(7*R};$|82ZWsd!|-mYepsX1bJ`*OuMB`j?MoyOcL)#opb&<kd+oWz#pi zc3)k;Z>sCXsyNre+}TxmuBJZ@ta;~;%l|mTHP(^Par2WqcNe&-dTi`moqBiWT-TR9 z-??*t%#)iIxQ<MH!1~elQ`_%%J$rp+maBYuXtC>eZ><>q%HOvA_CePtf7%ni_qx^f z`&=)@J-@C0U*GsHeSF*Ffr{<-y!)$H#{Xr&SL=pv>i>4%jGxW8In{f1MO%4B()Mx3 z!q4Vy_&Vc>&(Hn#LU8S0awj}~+mg8hLpSYxZ^FuByG{+et*Y{-%)PNShm@ON{(Vj6 zfWLJ9-Fa-=*7KROU)UUod11q;qO6ZkpACMI^T;!MvhM%GGcku-@2X9m*!WcMKmGm1 zfyZ8&IKb|y{H15*_UtLg|NN`ev^#2F|0e&-dFk8crLo^VUHGT=O$ol~e|&uOLRQFH zZ=9!}JM=*3>6<_NL({y^DwaL}KM5PmdG~F-(bGQrlV$h!x#RCU9>rO!OmQwMKjjc~ za+rN!jg9dPUSi@<!otu*spt2Co)VKz8lK1ehKZy$*}=4}9gZzgG#%+#o!+dFdx>d@ zQc|1hQcAGWtl*y=Agj7(N{Vkr$y4wx3MUom35{7DG_8BHI^5o@PAmkFrX8VJ(YyKU zNRr|!oISfpca}UC@qHY={y;-4RFLmvj>R|n!j3I7I*YZVcNh1pH)cn&733?^l!?l8 zWtK8t$y2hFxk`qzTq#wSDhrimN)etjmBn~kp_C{O;wcYtp=}_ITbZFuL98<6XUa_A zQpJOq^mpjk^K#l{zRgjAepmoWy@`FQ`J0%97iTDnp#urNbml`np3<q$2(ebwi!Vwb z3&f0)ZRp|#7rZk%$)*4ngK>NhL<|4>4LB)Du@4|N@rKuu_x~8)oxGmBmzXwv429Uu zoA*;onH?LU5K4aS0(B&N7tB|<g4q7R(>=hmAR27;Y}hWDtC^HxCS)5*=I1w2)Bv^s zSTmmH;)(2K(9Q7lCp-bZMkvi$zFi_+)n3)6ZEfc&8WC;>_rp>2WE3JR+E%-tTi~qP zyEcmd0Rcj%j(Oe0Y~kDx+4r!cwg0bd(ynA*Ze759@9DqJ*1oWu{)^tMA7ztXgPLv1 zWpkP_L%`A={3i8d^_n@Xr{=e^GAHKwX!dBFJ}O4@55CufK+iElUSoI7uQ#we*~~ZD z%4TTYF?{^35Yw&D5(3x=u0Tm>-hHg4@*Ij8F6$%kVrh)y!|fJZcu4q*$}i9qim47; zr+ory8cGgbDXreI(FcBzTed5fsfYA=o$PyR+fHiJjW{f8v?-RB(G1=(d=asZj(a4t z32|WgRhCZuE?7R)AuQU>l(5?x9N?YO$@1f2eJV!I4BerDhsJ`3u#Y@*sZE~;b?OS+ z5#$f}vHlFU3$rFQDAk)ycnuj0V>YNJ?Dn)IPdqENrme7goUGKAw!(%Tj8c2r3cGrh z<^$IbU*hgIp`;l4KZ@E5dcTExQF7R@qEcx4b2Dvgpzg?^zh1|Bq_(KN*}cux+dZc@ z#|C<%WB6-kJ&U6^ce1rxVJ+z8*y7058qKGQ|DndtrlvT9Ch`}Ue8ZZUdQWHpc<Ih% z3U5S}XBVjE@K>_~&tppt{xkJY5kPARy?wqXdUilF{6SrT?r#%)*F)<#>Wj6aFV>>T zDyYATHH;|#Vpz;jXrs-j?DUyg%x*94aYh|bTzOIPl{wJ_JQFz;s8Ra&^TS`vNB3OV zPP$L!Rs{su!4k6CdT}->&+)c1&jl$}68Hf_<^0D8Z8t)z60I0%ZpYgeY*w4PqU@(A zt@&OVJX0Ky>Ke9v5GsbP4_O)AlFC0Td3$nr!yu|GTj4`b?^n$3g66YfYV?=`>ab$g z+q8R{=X-+*hk|z^YS5kMofyrtQIF*9RldRk^+fRMx0DTYlcUf0D?DG^KDZCzfr?{C zJk9rdzGf56G+IO*k%m@%>|=DgH_+MP@bi`MMWIk}M5FUpMw!4Yw&HyhDNYnA+9=Wp zubLb)&2!2q(c!{i>V`oG338)UuftX$OZ9bdV5CgPWSI_8nf6ebq6<yUkui+CyO-<g zNV&)?dZ}D_x%pLl%PnDdNAh0p<V0r?8>A1^AG9@&x7OY5QuOimB0YA_>_UIwC~AUJ zTO*jujt<<L*<P=7Lkbme$V7!VK}=EKV9sz}C;AJ<cP`1NtWe6{870@bXi(o?q+bt# zOi^GD4|Pd7TX0~Y3e+LjAg=ooxraec&_r!8GMTSx?>Z9}!IYL4Vx7iGA!AMmr=FM_ zY^<J>m?l1BzcIZ@7&-cCkJ@3pWfSb|4)O`lv@(CnUS9N_=+rgLsnzddeJynUkk!+f z!$eHJrj>nY5=9q1a{im%;eK&g07b$Sb%5KQH+_j2p~t&IwXL=Ss{3>?VYhYjw+jCV z-5&06nKke!_#dHXS{dWc4{RkLq=&d3$i|y0QUj{JA~oo-J3jD@A0M=6by21|@E}6x z8Zrj#L84qE$1l2aoDI9cCE9&aQc@v~c7+#$g%K)FqZ-F91r{I=w6OK8%Nh-4I;yWi zqg0Oh95I+1$A#n6Wg&hySvmVT!IbK~j;ikwFT9tQH(yhGOi#44$%)p=)ZOR5>#dIF zWOc1b9}2E2D{+pK*sH8cKtHp(b9s6*ja{X{QT11()$1v19BmFJbvccsrj^%5lJ;|B z_}lVw-CQveqrU12E!%3w+5)FAi`doqU=GSLbcy0FsmOpaBHS+?g=OW5LwO^{KzK7U zQ}h?<n=QAo1=hxUtgmHYCGU^o#VBw1SRfyLiT{QM3>`61SRcJc;CNf09Mu=+aj)dn z@-AMf*M;~%GV1oTOD^RjjJV{94Tx<nS3HEk^h6s5$PAn~VzZ;XKkuP$W6>B`6ZG#O zw(f?M?o>y!>|JToc42SM)x>5sC2tpN<Q}dJ{_FN|SdC}vnvo{#Y1SHSlRQ2${slxk zWG2R4)^6j&qQ#KsV17H6>5(?M#8}xTukMbt$?s8P(GYReCO7|=rtlbPs3{&wKGdxV zs9kWx)?H%5VnepW9MKSWVfwwIA<zn=5DlHc#&=@U2rse*cA^ZtFXH~V9XihZbURc% zi8MxMm{D>V1dGBcMfwdWmC=Po_b5*s#otT4q6pKh=ng0aCBlf~Pf#IR_^%M}^6a&( zI2~r_h{W+=LI5hI!k7FgB13<fd__5_+2#0BuS456W>`mM(RMz1!V(+h+h62Mlq3BN zHqhAGR?1^66qds2GiJ?1HT1UWOJbIoN@#fIv3`R^UsF@VE8@c|;=(JO;T87q3R`%E zHJr30CY<EX<Jm!I19gQ3kTVu`FOCHniS@SdUTteq_(mb=NQP%7CN;XOXHhP`aSW<& z^!`}g7!4VA?LO-dM*o7ElVRfzK)2u@V2>-=2j&zp=WNzj?{ldNpvfow1R)#06)6i@ zQR0YXAJ!<gf_eOI>=lQP`jhuUkl08hfG0(|Iotw!8^#>w6*`+>PJbHrlh%z;=cYeF zj(+N_TQOz$)Va4l21cpr+3M8beNjKhF$;~GOYc;Zf_drBQp`ST`mMjBm?N{*tFqO^ z;MiNCiTKppG@h>B6dbX+DR|4~?ZKNie-yla^Pb?fcpkKQf3W}N-NC+_TZ6qf9}LEB zK7dmMJFo{FcD(Ild3Jt25Dw3)x8kl6mAFfO>L^M?bU7fotZtsYQw%Wm=M*u-zsIpG z>Jl_cM&8pkO4wWo(KI1=^W)frc=eh~BKJIGl-_Cx-EZM$`F4I2?JxGSQWw|`HL!(* zaP0x)&Tz^RCS)^sgJVKy2REkqto9-n3!dsWv@)NFS-!+J8y6A8{Oz(PLsF@O5hb+= z+OC3#e%3=fhuy1Gljq+|fze&G1N!WycI*)#_EdIF2V875w#H|a49t$G@YRRb_M4;| zVd@bpv>tQ#)9OR(f{{g5FfOnG8xj0(Xmnl$$;9{J3w>Xn%^)2jl1VNb1M@qKy3i?* zOJ!FsX&2TGAiZK#>jWb&BcHSj>jK^Kxt{XLqI?EZK0h<^p><qi6!rW}*l8N0Xs(zH z*Gp70Y=Tg=^nRUGxeV(|qYzrl@xb2%=NqEN;Te0aAWFPL-&}%`OsXIiaKyb4Hh8g$ z@$)~XpgrJfcn1xm@S|7JB37<7QxKO{u212Hr#~<pV<6ZrG@mPIK6(Ys+z3s+vpcz8 zNOBp1++p+%Nsja*(p0f0!TTYt(Cr~EXU$~e;=O9Tl})rVYdq_3I>@HdHciaEYR`LB z$1Z*yDjBr%r36v@Er8ZwpXS*!e}Q51y@E!6P_az3>DECa+DVEQxhv*G^^=lsPZ@Q` zoukL3j?b8onKhAEg0}v!3i}{$IN2QvR0VJ<7T&);d#<8B37aG9<6?vdYk-&DFbT_{ z!*2{`chK$&YtY&pF4pg5v5%5z#>m{a-a6nN%8ND7ZlIB1Kl&E6mEOn}#Ixmb;Z=jf zs}k7gckGCG`i~3dC;J|YqRh{>4)nRUlhCQjtw?uML#wljE7M272oJ+~oR&TcE@frU zS~AOr`(@&Li6RF1l50w+8cY7oGq5sq^SStr1er^+VP!+m%_3+#z6<>o=_5!p@>~UF ztsE(h<O-i7LX`;LNW-N&WHecPK)vw8$taeVPW4yRKKy<3Nj?oNgMLeXTKeD%6f%UL z2cfj6OgwqwYU2Ss4zrBmI)zjfYlk9)&ImbJjE?299uwY&N6+^NF?)Jz>BJI+*0K6T zJKuR6;)d4aebJ4UK%3_8NFUF){3tpvQkhovkg2c@u*_Ng4W_$o{EJ)A921>vwG-cI ztF3A**16HMxZVJY4ScOk>#>AqCQ_lWwb8)cC?VGIo<Umr2+<DMJR!#>DwLbwN@=5K zvWu);w&MH%jdPlR{4Y@)z5^8eHBUwnR|1gLVLAiDRh(Lzk-WWxL|_r?lUJk<!I3d> z`wIs{?>dI2DG2XP-iw(jcJ@3&z9SvUBz8a;ESSfsr6&<<u*?wqeDn}>)Y{NgybUHl zJzigd>o{~q-GqrNkIk^>xoc}CLlQ$|xo7bO+l0KEE%%dPD?-l_6mh2|+>f03JOh!i z3a91H;6{)J6LUK6EqAtub2>e-Zf`~he-fEN_ZPOCPuW$7IjGUn6|=X9X`_h6hzJYN zRL?<Lmm=QSV(pPLCbcK)wF`@+K#oIDAHVKeEVnYS6`$9^mw}L8Uyz5>*SucvC5V$l z8J&+&iEwBhW$BiK6*<rtqtaeZ``g|I?X~|UbpuRCWanBt!L9jvuNb4XUBn5)jqoj; zUEG*y#!)bw&ML&^m_}D86l+X*o@k@&`i^4V-BH}=I%9$q-2`<<oQ*}Bp~+y=`c&Ve z;~e)48~-i(fPPMI#7xnH&M5Pf)K;zh*XSsE8qGhL&5>><^VlF}qS+n98(J0Sq2286 zT)M|qgoWGudG$8h2c$f3N;02aLlN`24;cs|Mp#!WI+MsPNGQ`WT>TMz=X+rlhE37Q zH<81z89oaq!?gwI6$Ynqoi4UmOEu#_rIXX%FAR<K#A_q|6J7E1#U^`yc0davK^ir$ z?XeyF6H3y=>VynLnYFE*#2Ul4+KCEiYdV#6Jzz$A67yqlCN`IF9cPQE6oYx$vBmFZ zQ?RDT?YqywD;(o(OxccIYg#c@pIM8;pE6PmqQRf;gRmHlV~Z?47z4Va<-CgyPx{hh z_Qc%e?dT~(^2Wxh1F-R@_Q95)+H-7<MUBGdV322IWaur0!&(BPXcVKaU1@I3D^815 z6N=N2U;w_YYHxf;Q#xDlxK?jA{)^Ntfq)&Azbt(e%L&21L(<JhG2&Ta2!gFo>Va~z zeqg=L^)zp3qrul;*m9xl3~?uKA8SKdv#G4vRMu=Ns}E&$xm>e{HKDy|ar_~TQ%s_c zs%If>ySiZNZq-w)J&YmOKY4Glw)Tw4V|8qq*}-w@E{w|sbxW`z2w!y&&d!fY<PTyP z>uruLvpV=q#LZEO`Z@M+h|LU{&aarQw>q}m+rg_~{L<Um)DXMMbe>;}BI|9U&qVQU z5UK?v3yn;B>8;6o`C&AJUZ=N$kbb`9=!!mq%3YwsEc&@6N^nbHAqTst9xY;!IjWjL zD9!1pYQl4xP3?^}{J-E;SP<w9&QksM>AS@agi-z>C_RSOtC+W_qK_IC&F|3Lcoecn zMTDn1Sckexc4b5)M$jb6(<lb~*@Tc~Vra#D!6CZO2M(P_xhIAAm?L;PFKTVc5Ak7m z#1+V%NUhrSHp6az61q=8L4kfA^Nb}tt&{fz31Wu6BcKqq9f4dhHK2ZN^o<$%mo&;z znLM|?FB$VToBWIwiqKsK_Yz?k&wR$pKZfMd4|?H*N+;He;O0TyiV6oYV1C}AdqSx; zk6qux#)oo(wq#$h03R5RB)uGi-pzW04r4WutOQ9It|K(ZqR-$FWQnL{e8^GpD==PL z6H;hM8aeFon3Kafo>x)3tFc<oI?h%>Vo&SfDtO7(91oASjGh$iNoD*CIN_$!|JI65 z?9@-;8&}OkrrrFz&%)tJo-f%9t~Z};^=4Kd=Wjw=E(AST7wi}o7ECm}8GeZ4P25;e z2o@F;%qxI9+!h%96`03-sm+cmS|U~hp8*mhi?!A0$#HoQvTcTt<^fEOg=i>aY7izJ zs|?zWpaQIitT^a#ORVR{d{z(|UKq;PTEasP49^Y?YZ|tL4K}3=?&G-ur_ooRhAn)K zZ0h0{n5}2F6-S#oVWTPjZ9#$G@&2K@pv83H;nodS(^zYtIdg)vwn2p))eF#NQ{5qd zT1JRuLf~#Z)3_z3xH~gwhH`b%Jf!ya(<yBPWA6@swcDq=uo5MCJlUv14>!Mqx*2oQ zOsL+Ok8K1waoz!zp<OKcRc@L)e|eaqWgF9FcBcoo(>nMk2f@~>=IG6$94{H=2t03K zJ_;}uT!2ivC#QT|>cKUxVf(7Lmyb<7u<mxjTu)z9J<j@e(A``+cOt{!O)W=FWKOe% z#k9q*Lg|8ilJ^F;>IZ^5D1dK<focvUFy+}LnfO{{Ds+cYkc?ByN2cyxb4zu2?M=hJ zPu;VYZcv^xo$^`-@DC1AJQ6)Q9k?4e>^z6y5Xa#_YlfI<KS~bcM8(6*f(qoxUa$mm zOb@WD_*a-M7U-S&smIc^)tx3!GA0PEzSoLGH)I3ta~9A6Yzr<^Heg~w=N>x?0U_8@ z76fk#G(iKw4%Z33AC-V2Pgywi^I&l5_mJA(^XpJN$dg@&ucrw$knHbL0chfH!XI;0 zJS0aynyvYhL?=c+wf+F#jG;i{0Y}c(pk4e#8X}Faf1fsA9aYeCjX8wcKRS<Bz@K<1 z`a^F+H-o9=L3j(>uhhq=i1tRIkGc6|1PTp|BO|0ub*eXzoUJA9(~RV(qV;et)SiJd z+lMIIz&`pGYj1gSTiY5!#pLc;^%*g7lYKw9)H~6X9*)7O>f2_DYY^2TsOgxJ-z87J zgv^sr;Mex?J|hAe*-oB|CJd%{=bLczc_05P1c*qA{kPKyq3L`dPnHSS&`CIoR)uKb z7q*JgnW!&C6rfos2I-fW{n{X4-O#8r-!pjlBAyGwx9et}0Uv+O|91X=k*be8MEw8D zxnJ#`_G)lh3|&uu(j}-DKL(3Q;3b*~#v-OzKTz9S{WTcz?-tOA_fg-5!lWZAI{~T8 zwjl;|8(gMu;aF5-;_2?u4&8}N9w}bywfs$*&N|sn%XYRO>!3Bz-Mn!N=ol^~;}7AP zuJ7;XFCk*k2Ddm*HM>xBU&>p|M?N-rqm%4+m=AJ1r&>6lgZM(MzYy15qz?wcNuEGq z0nbB(LP%>Ns>PmhgT5bIfTbu}E{4{0Iz~M!G^}}**;Jp0cK~3$)|*|2lUn0*aBOR; z6(({#jDn3>Ys48;I=0nd)f%mZ+EM5}*h?#B*A*ki5R)%>ji40l51PZ8gN{P-?_r$R zf|CXo+Apw*8bjKU#5yuYTm@?hYUfRBtSNhgF*#`m*O(au9UjjFW7+B9r_y%A=X*BA zX4z|LW(`mAO{kcms8he2IV%^Ijn0%q7}<AV(KsPQT^yHM>ZzryiQQU;&a9@jgIWV? z0{`pLjlcO6v8g{NA{k9?qMYABn4+8k4OTkB-y4XL57GO`8M7J{=%7hEr*r(e!D6+< zvtzqfN-baTXF;~G;J>YvTCssid4XpC2+bEI&HuJadNGpDr<(k=Z^CFG&XD{Uxo{_# z9(>@x%Y{5#H2jfVxR>O@$cS86bV)84BH>z@rb{G@?=BL$<iP@DZ|s9c7Giubb`Iqt ztS2qPz_7(wpg?l>#T8Dm4D;vdN8bTE6z)g*!vDRjs6zDrx3Z!@rk&-^rCY(+e#eov zmI6~<!GgfJ?sNwjE!Iy65C{^8l>prz2t*@R;1l#uf7e<Ct1wz++b9n8r`ZSzti?8t ztdm@e97gi4a>q(JW%fh`-oPAwnXo!Tos-TDRc;L-Cm8mGO`@IlP&42`Cdk<N5fh}m zEfn=0DKUtG;n1J%d!krlF^XY(BpvaW;5+vqMq2ASGlKvWH|DN)d#fo6F@2yhxC7B} zno!)POKZhI@~_9%)mn#lrpfE2m{0K+FjsY1H~XL%WZirNgUcV70&S7Zk#xKWvVTKt zM&MJV5xQ2Ckfw&LrG6rmh&5t{$EnBF7;=3{iGT|6C>YgUg%}ML!nAkAaIL=giknD{ zc($dR8d2P6T>-^ZDiUveYbX-yNKa_y8=;LzHKK1fH3Hr7)4ifQYKU)i#~PZa-zFA{ zb=|28UF$lm>Xwp9kEJ=EhGxCAkTa|CusevQ++PqMMY|2*mo4MY)`O(aGY4JYg03SM zaxGt*&Z7{yREWr8t`jz^uEm^LH5PM6Ft>MG%t>m!_!jU;F6aIkc$(B1QGU`=XkH$L z($ISD18Q(%JvRhiSkLuGAxLBDzMeCyI4eZ!xi8TZQ3<m9$t4`s&{)E4N0?Z?O{UPU z<=d;GdiU{Lun*C-enZt(qK!mlTfSiVA!x1V`675hT=x{KII)I9UN=##yRYINMm{8^ zv3y%b#n};9MC0!7P#rNQXbp$rU$KIN%%<kKPOjjtrF3Ei$A3@l8(F?xv1*%g*{bbs zg9cWCWdEa8+kOl~3>{jv@mZh)_oXG9sJEl~7pQ)!T&lf^PB@U3Y8*>7-j9aW8Xg|q z@)a%AY}^J#`qC<`ub9&DDz8w>7g(p=(@c~4F*f6*T&Hnv$IVf!(|GrF+FVhjlU?hy z$TF=4IswTRu!fdqr~~u>N7eJx9nPqapkQlg;f`MA#gg+Bk4I+^ExZnXV*g4%&n@Ix z4h^Wg*3fd||3YbiE$aV9X+T*-H@LLEi-%#4)_2qa0=JPs7P^G6%i>bBaVwSI)oIAU zA&Vk1@IQ*ZC&5GrL__#!7f1&=6pWda=7(s*p*K8+p@Vb|zmRqoJ{M^T4trWwNaL}% ztrxTw*W!M_79S2G;cZO&pr4>`z>vI$_eM(u9q1C4eTK(3qEK?vXDCWWV(|qi)&9Vp zuy6+HJtx94hBjj7#8!=;ABW5pA~5cf#O}eag6;iNaN<(IFPh5lOlv5=9V@nxQ(5!y zPlxYkuzO%)#$wGIS310r_4HcDvptsWJoFJMptu*wpO!;O@DN84Y24#1U4)JF9uS&J z>Wls#*+~1#U8SLm1db>EiN5vIMZfy8$epk|n%2Z%dm*bc*fTt(Gi^=h8jHTBlUdTT zLXM4Dr@hv@aMhRY@UDsC4Nw!9pUvptAA`e)D-4g82C8NTv#=?hUTgMnq^7F&K~*c( zoL2CH7Yo@};@qTm^YgpF@3`(>Xi<I~zFqUycGQ^~=)%9Lfu1=c8;B+@vEG9XhqOSf z|Fcd&K*{z0C}aK4(^2<JYkx?)^`QNu)&Kq-sESzq*987-^yR?s4aAf>)@|~wNFqD< zaQ+lxlI2^Py<q^ytmak}vUgMe>(`96EE&N4fj>bzH1>PZ9```EypviL<DE?l&4S@D zXLUj`gBouh*0Q!g={J4!orutKy7<ov=EHb)Ab6q>axWG%3iZxm%`Ke98l81JPQxEN zh*gKw+p#5Atog=g7em8_Wj@h77G;6lRupelVqa*1?vf}{7v6s@9G=cc{!L5`HtG3i zc!Ef;NL1b%;j96N1a0q#RBO@kDz^>>HDqm^kEXs!=S4&7r(B>yP`|vkq^n=1>1%Mw zyIoOx!@+Rjo7-u4!dMnX%lzWBc8?WT<ZlrjvP=6R(>TUb%6480gJ)O&#bSS>ugd4B z&OsF_)?82=Rdi90{Wz0|3^2ji1zU!lbg8TOA@rGGtl_?{16BJ^I#*xhN|)Rre!jD^ zyJtDJG+>J%#IL7BO~TS%2IC|ak0>J+h`+%kgDde*R7Qr@Pt@dFk)Vs_f6V(?#FL|n z1X_pCzQm3C4w(9la{LDRy&FeaPn|>|_Rr>Dk@`kAj&i?&2N^bgq5uzpa5q-2wK0p> z14!x`TQ{QJXl#i!RUq|nx3QJHJ%2-v3H{OURr|!U@;*4@gp+YtRN|@$>uanBdZPMR zl1^LqHFZs4XTV7in%j)^Me^Pa(Hmx(lDChGRc{*CQ@wtiT^%~EmpXb}Z#8$EL+v}R zkJ@`&Up00!o#PDDG=URzGJ4v&&R~|_6K`9?OW5>DcD(3s+Pd$8x6jZ&Vbe#(>aCW! zBh75`$Y|D=KZbESZ5^K%j6<jqf@w2d_!_UnsS$+@%%=ejUH5-cubaE-rMFVeFkfrw zcCjHC6YfV2|7Iuuq7ekObLf;bR@_(C8g;%Ebz6jbXQ1AtsP~$2y&Y9#Kpy9CRBa;c z<EVNC7<iL%JZI8d*TwQ*!?YIoJ3RCq{Ga6hL$|<qG<e`CBQTNN)m?!xd_Q#B;3_2h zlpM=+y!FM&GXyJ62N(Pl_Y6LPd*i!vZ$I?7Y3thO1&0#}E58m~TGQ5@4i45^^;6_= zJ9Nlt>%I^61a}H>U-Z)kp$cN})8O@2Ab>N?>2VRBk%M^lH$)`+hp<m3`!<X>dCP6F zY&l-=#-?>vf8(g?30~&1Y1UzNYq20TwVMv|kCBMogSTO@z8hjI&c&)@E6(*)3oFj` zRWmEj+0}&==X$9RRh$EJtH6zlbKveq;Q)JIfMc_nEI5HAq7#>7YULZS(<m-+2B^Op zet&_sEc}9N437Y2N5f;OSEL#NPS(<4hTt45nQ}~FwT~H}Xf_!mq=ymbJ_Hv8(?mG@ z&AEDu5fFpK1;OhL(qCcZ7^M5?Er!?C5VFF{at{nUwkeM4vtZ(Eup!nP7mv3Z?Z*Cd zmmSrx@9tqs6XP~Gx>z!qSTdhj0&etD%LPkt;>uvjUxWiJc?%B7l50Q|8#(>?YG^)a zSy+{(c)kt%88L+SmzYy8dBYB8c&~;0>+%kkQ@7x~QC##lt-%Qj!4hy_8X7m%Oo42g zjr9nxvhwlZg5^5P=qVnK5snbNnCcto-{=bWm@IS0m@VoU^AyjQ!J#7i4`9i;lusP_ zAwfH)wTSOYVu`e&=kZhZ(8MA0V%$6i>s<6lH(vts1-t_xG>(n^R;ix;9s`KxuhNGi z^OsP5{-dZ4f=OKxm9D!qA?nlo1u&^gralZ>BvU7Wwm<OYrzBIcAxn1~Hunkq4JH&n zHlp#0&a;V$xPXAE`fO36-BgG5mT>HtJsZ2(WcRc%SIEyH`NP>_?hSiv+yo|*mA59K zK?#7)&Hs$?V(8v@wJ6CT=#8hSe)B>&ZwU=}Om%qOAZVa5o2`5#vPY4zCyd?ia9}3V zQjK9HReO^8&qA+g31a7GqRG?%)12F^&*01*4ebRtF>v+z3~N055ZAHCm392rXTxb( zTqU}ng1dNk3U;oKD<Y$9@Bq;$?0S3d(C4+Kt!ZC#4Hh^9=_MdGw%_rO8QfCOrnC>= zgTm1I!JE~_W*p~5btvJyw&46Q=ECEA2tDGyQ9E8NleXq0siP-B<`yi!h=ia9tzj*? zG0QsXhL(>P=!h(K^X=djte{g6a|&nsupdoT$NOthwnhu8PMt_k!x!5>d`7#Vm&G0b z$ZEHcCUOgCl199Cq?To~LLHt~9WKBA9^CapN|<l(hNP?xuT_Jhiz<{Ovv5|&G|yMa zM2|<OG|chSH7iWZ^AU=31$3Azg;xG}b!hnBPS4G_dv8dJ>6l;l;y{0Ph|YUqT6-Bf zwZ?6HoR7LOY|kv78i5XcfUj}w;YppI-Z+4|BRrv#zl6LC3v?&V!LXN$T{D`qwjReT zW9i0+n`a^pUKi^WuY`)GZbvU*(zXt!J_I`v^(E3RJ1|;s{N+)n;u&5Ni-9IiQ?Us+ zHmUysL0exp8T*>;I$dAFsf-C$eS(usa8_=$BRc5;=!H0waLpLVe3UgItqezu(#mXV zR9czc(-T_DuaF<>goXWTx)+N>Lyh2<ac>}K%jdP5s0@xRDaB~&=wj{ST+a#SH|Aks zYukvvPhA~5vuIK9JFBClrqqSIen=_aG6V&5Ldk3JLf3KgBjoKzS#A@`u($eI5FiE5 z9o`3q4Wt7T-8}hz#1G`5had{x5H#15CLF8Ha~;)bhBr<c@X1t-_F}r;RFw#C??f{n z)6LHbzhE@;gdkPf=fmfPS}r_n(e~lp9VU^v%#xQ-cH7V?hyY1_dOz^+hL%pmZdNRQ zS2`&ejwgMH(k;N{o@r1J%iVf6PXHZn^^0i1NNxDvuwP>^B<!fFp!CF#C*kX@-bE4l zX>#YAEcHe%>*g0XR?Q>+%vEYB+u{CfP!n;x=cf70ZvKyMbp8sr%hJlu3Vu{46CbW% zYXzcU%ot+>8@fNkUBpt{V5GZ?Da!52NZe&yihuNX&ti4*@?{UW7pf&w7e2Ij7Ws*` z{}`plhF(@kHYJ%YX>&06dl)1dvyOv{$hKr4e&Yrw`CJ~{+(a!Z_zlP$Z9V@-q3E;~ zJjw`lbq`g$(tZuvNPB(v&{w)bw~J6m^>Zj9%_bdXk=dj%s|^#F;;p7azDwNX<KTj* z!(GVZ;*^FFhVIbm=If1Y61#_&aO5LGml&bZMkQHRo9rK0?oq9~CZG$*UL+WX1pdGx z*sFry31(4;m-+FI-{CxDlsD^J_Yw==g9kU?gzuCy#oE89v{I`r*4BKhczObk!-w`D zBLv<<Y}RTyWIS71aYZJG%k*g@)mXzTt=02Q#D#rTB-Q+g07B|*Y~S$amh<S|du1o9 z7Yxbg^Qc%jpb^O>opON{!}F*piK-d_KbihpytDh7E7Je)TbVu$Y&#Vx{eMjUIih#Z z{sWPmUbjH@hJ4(*Eml-z6>id&qSww<Ccvi%u6ytyzqz<~yIffW_fq(jq0T=}bLHLL zD^vV$(p-Mu_s0~_(P(W(vi$}FaW>635V_|aaHQWj$Y#9YrNH_UxeS?&ceJx~dc;a^ z2=wi=Z63Ug7|%=*vEIeO5PG%PtDq3Pl^uaRy_uyzL|=_XAtJ{?kVos5NVH#2v}hsX z4;Xr@p?i_w&I$>_Ff`FwH#L=p&3h{&!-nB9YE~$mkG&1UN*9a`@EzC{N!x?6XLaKE zyOGdC^9E^FIGfjxrW@V)5&@o(S1z)li*N2#L^yKs4X5qZa5sHz7DAC*S`;Pp*x^KV z$sN3I69LA3f4nzyM#$4cXcxK@m4dJ5gg+4T5vo{k<WFZ2y3QUjbJ%U%M}zM`=zHco zT#zkbwkPSNB+l-eauGqighzMc3b64=`x<YeY_s&nCCc>NJWz2W`<TrG0v>9$7(5tv zZEXd5%mUI8<<(odKWgQVKaT-V^Zsfp4()C>^ShCX`oJ;LcwAP<A92<MyrFZFY>E>n zVKE(dKr6)i4QVSWs@CjMDsX7hj&p&C2Q`N%-vr9WSwTuW6N$YOtb8zh#o+9LTZ5<! zZX(i95&Ef!hf@*sR>>5){i&k62$T1$eA1n8C&{>e`qFPmwyvC!)>)ccflH8znv>S) zxiM(Uh9L*H&fv9f<$yDpmT-mYbi6$sc+^*M-sd?IG`Sk!tpo>>C7u3VMmPtA(LLmu z2w5Is&P92`Y6;3St@_N$Ni#)xP&A`F!C#B=+?&>3npLcoPq>JSEHGLPqSEv)t|X7c zrM-kBd}Nh18>N5*hOZLr7b!y*vEPB%Wo0nVdWxI$hL(<%!oV+#RY=VvT?3$jZ-h=p zHf}?5qF0K3_@m9j*)YN)#ITyPR&U%K%u(-%d%b54iNS)<K@pR+2|EZ`oy7=;4VF(K z1MVfG7uXQu$tVj=MtuE2%u};Wvw6xz#G+#=ec8U8F5<ri@t_TlJcyk!tQ0`+4k|J( zgvY|FiL<7SO5lgc0516-)Qw{Q3$bZ+bZZ;UO^w?@h0L197)Bdm|DcO6Cd47Zknm_1 zU;Yyt@;){S2}aQSY(-UyksNOToM?KNwp+zrlWc65LhD^0-BqreL7U3++apw-(NvzU zJ0GI0E^n&)4;V!{d#Omc*T9z}wb+nYX*5*)C5HC`b(jpXulqUJ)4i!6$M*4GAB8qU zjE@Ip!T5iG7WA>%JO{I|V0<rw@%$mgC2M9Ua?C|6gX^b1?<UMHit2Ro-SDJpO~po@ zKX4!HYC)WHA})i+VqXs9vYnW_p}dQ^jiCESB&<LiW;@=#76eejv*;0`g#D>tQ%xuv z{|DCA-HI0Cdl5+(T0!D%kianx)VQE~(Vjv^RHPJm`U4-qb|yDkgx(*y4>K=J=Sd*5 z@@KlSp@XZhmtK!qm8c{@iP&l-vol6-dgY_AnV6I{w}_ub=~}2@J3-;APm@X${VdAT zB<_UAp!nE8YQWDy@Snkr>(`(r@(SNrAl?^(-w&D27f}-2-PE=wk}Tzu=(!m$1V&-R zt3&FzO*<cjUjpegl|{j|vS(uyy}x1|BKQqw50uN8gNVhu*F;zxjyjBpp3$}RLMQ&^ zTQDcl#T9;tT=YsQ-U1i*{S%Ka%su=GOn9|)orYJz)zxc10Y!g+?rQ`)v40=Fu|t$U zd}F)BlM=Z=_YxP!U=VXd?KmnX_{&ehNAU4ZExi_5gmJ;~C<6KH-3ah=P)C3D*bUE2 zcn0n6O%&73u@b~Vk`2AGag9ZI;YSf}D#8!ZAU(7G!Y|JD%ecz~9h{Ka<VI}2n^PNO zARO}7`lx0Z*p5RVplRYIqP|4o!x7`9$wZsJUfK#@1U4D4ixSl##=Ddp1+BxV6*gM* zZDa3@wR_jJ{}F%e0Hy@i>Gg=GiW8<%yW02S4s`%NR|kh!=C$huxcLt0HGCf?cBf@t zhhAXE!gNLm9&Rf{ld+69_CDweLwDL2E+ae?L?_@gFZeL7_i<W3!fJ6S>*V1nHeU1w z3|}x~Ot1wZqTBhX%R(n2lnT+TUlklj!Pi_Ce6vX0fgeH$VpO(s>Wi01_YjFgNSq%j zu#If+;`eY)dGQ-Df)(v>S;?i_6ERlexY!rONn<$4+KeT8d7|BdNG)M#=KB>G7j2fM ziO!ZE@c0Q9r>4k?bQ>A4tnQYJ2>4XN@66!ZjSO?M#@WN`ypv2V=MdPUSoZK+K^&vW z&;gk(Ef(+d$hM{B*zi7&Y%6XI;D)2io|a)(EqD<iUWP$)HB=0oJ;hJAWZ6+|Yy)5- zx6$2Bw{5r+*DdgaKEvJg#sG{_-GtveLZ8kRn_&34A2W<;IH#1$n(;23a4~LQ)^WTi z47+0@fW@ZS%KN2d+t%Q)ur)2)T8<ZOThrY3a#;Y-q?SIw+UZ8qDPr1uY=W9`{Fdw; zX&KhF_$3D%i?^j^*kF^IXv6yrPyuq<aqjIpVrOf`X%pTy*c&(Bw&RymF|b-+r-6k& zg|ea^Y0kAhQH?Y=s2LSUz8Dz2O-_^BX3DmjvhCmog5cksCzdAg!!pCJ=i3EW4p+MH zTZ`GVre?w{j~mtat7(Uy#XL4y_|Uz&lkkXLUX;IhsrdOe+w!7&N*6x7xCnlk50)*w zf9c|)9?Od+lq_C^-(7=i;_^kFGU3WxT)fb;R7J$><?7@IA1EQ`y~`FZQXgEo7%`_V zAHQhP;-$UFB~s-fhn~xe@)nmZE?v2}D7l;a_TI>2`9t?F&se^iew!`^KN4HCd{tS^ zi@$Iw(T?fURxMjxnpwJVRld4VU2LI3i{Bu0O%ixmVyncDB{oakC9z53R*61|?@O$e z_@>0yB)%f?<ty+-`TT;!=LDinSeDbRt+AV~_POw;NKD|kS@aqBPYN{T@<tiIM&jcV z*GsIDSRt`o;%bSi#1#^kN-Vhoi{$ft66Xq}J}eYo+*Rjaqg2%O(3ddZ$#~Nxx+PAQ zm@P3=qD$g9iDM*=l9(iMgv6l|6D1}{94s+jVw^;$M7u<rM5{zaV(4z8A9PCWkk~E| z?LoQ?n`g(3F`9WNR7YlB=7$9E^vs_r-r0e-IVK40<{cU@JZUG!B~+7*m}A{D#XV@6 zjpPZD91tPJ#SAUVABg*q6c@5a;)sZi+W4d_1DAMQVw=Rn5?dvHEU{VQE{RPNw@UO$ zd|zU%#5W~wmiU^)S0uhH@kNO*NPJG>Mu{~NAD6gZVwJ=SiRBVkOH?JUkhoN0iNqp_ z_eq>9u|VQ<iEfFLC1y*^l<1N;PU0Aeqa-Ft93gS2#6*dMCB{pPllXDE(TD8v*(T8{ zQIQzBOZGL19TM9mo|MQX9+%iA@vy{Ji62XBmbgn|lf<nOeG=c7SS#^OiJK+9Ch--C zFH3w;;tLX=lekf0jl{<#u9sLPu|i_G#MKg2i7O;7l~^LNNaB4G=SnP)I9;M!;$(^0 z5;G;bB#x6fM&c-mNfJj$94awUVuHlM65}PtNpwoIOSDO}N>n6<WIySY*dei9;z@~I z;&F*>5)Vt<C9z53R*61|?@O$e_@>0o5?_<}io};Cz9{hpiO)&gD6vN3;}X|PtddwE zv0UP6iK@gE5|>IWx#GD<KHn#CuEYX~(<QnkPQC)O<#VP)m&9=r$4DF{F-hVGi9;nO zN=%SASYo`yIEhY)c8NBLR*8zl&^S5nC3Z+`mv~Ylmv~%ao5aHsTP1!hv036SiA@r> zO7uy5Ut+DqHzjVC_?pC5B)%;1MTsv+d`{v<i8T@*m$+VHmBb2(<q}s*R3)yExKv_^ z#7I6x^7+0iaISogV1ay|F427jPL|Kv5;G;bB#yfR$H?bV5=Tf(k~maiqQnG=gC)jG zjFae;XqRY{XqBi)45i6_BC$hayTp?cxy0iV+aw;A*edbkE1sL>^Dc=^61Ph9Nqk>o zt;9DaZkG6(#8)J~Eb&E&FGze&;zo%zS3Ey1pVv#Ql2{?JT;ghps>Br%mr5*=SS0a2 ziE||uNSrRwEpf8MY>Al?U02{Z`5eJ9@_CfRB#9#=4waZFG2uVpVCf$(F;1dWqFtg* zqE(_IF(hm;&{64(w2qs6u)y&i*p_EF-#~{6?D*h4j#)Sxn-!1GV0;qrNyKL;K6q2b zOiud)SgHH@hp@r0259uqLlYIUPl&VE(D!L?baf5(Jzu~V58`MsYb|+=-22I-h_mtL zl3n!JghxHPq?6q5lRJjYxA8Eo#R*GxG&a;uiX?X3jN^t`cD%seNpC2*6bJ9l6Lj!i z4aA|Jm}*okP^yg=dXkE)h&Rwafc-Gq+od<wCcq~jZ?nzDyKJ+tV@7{duy5wUj@e?R zP(F8$u>kM1orai`Map|b{CuQe(2YvIG6V0sbt4|V|8_xFOrmYX&BuOSgw6ucx>uQs z{PQo13qI1yVZl?8l|wjcI&4t%u9*TL&YW)|#2z~AXI*QAVnp``I<dYdgPf${?M7oR z(sae%C}QuBv6+vIT<x&w5PmQ5l*H2#J0$*F;u(o&C3Z?YC-J;Q`hg;%8<O~gMEs(S z@TUva6y7HB3yEa!B>!U)k4yYg;#U&CmPj@!iXV`8LSj(jNr~S`{8r+35}PHqNZc!N zpTv(Pej@QxiTfqCN<1L(pu|HG4@>+^;^z{NNc2gplUOg&FLA5HZ4w(KHcD)gxLx87 zi903klK7Ft-4gdm+$`~*5?`12hQv1|z9sQ(iCZMrN_<BmZF*39&|Nda_a**I;s+8x zl=z~=O%neg@g<2bOZ=n6KS}(v#8)J~D)BE8|0?k{iGP#$cZvUySR?T%iBC)XmBft_ zpON^i#Q%}_oWx&C{EfutCB7i>w-SFR@%IudBvwlNg+xtamBea^zm)ix#Pt$&i5ny` ziH}S4N_;}%lM+`*{JF$ZiDeR1i5`h7C9aaVTH?bJACdT|#B!kZ!icCci(yhEcd2!R z#Ur0_btWBA6vzLe?Ogz)Dz3->O|rlOfejcmDnittJS_++lB5R0#-IcuAv_eQR9GJJ zYS;x-0-;MP>vdadwbiPvRN7j_Z)vd-qSe4+fJ!YO)$kIO)XuV~Q6mHh+5hLvy}Mb^ z$oDJ1f8g$&d*;lXGw(BJX3qSEyI2^Jg6bF}4Q7)^__F6vf3Q2HhNG0m_>8e@^D&3f zVH!~9#?-sGAc$L5KXh_?Wrvv-3_D;+yVgiJ=d1P<<s&MTo<SvhQHisYzHg<hMl|^| z@C$S7_HAxB;I0F<d!2c3kt{`XyPNDw(7a61ym;cnW$HManfs$K|6Q09+gtZ=p9x2Y zmP_hc8!^)loK^AUW?t_JHj^9t9m$z%TW{P;*351<v+I*s`<LcfsIHf-{VZ#d&;6IP z2gCvo`ZNZ<T)?Ui0Do&S#nno+0b;afQ~p1a9DZFOxVSo5mxDNgN+F0d+23J-<xKH+ z@Zd};O!aqJf&;A}BV)d{E<cvvVT_F~(l-e1I<+1<>;cboxj0b&b>eqUN{-D@^uWSm z M(I-v<uXEe6d9&tBm%Uo6=kVRJ-Poe(Q%mlfi86Qr3waWL0`OGcM|em7RGd2s zI}NNWA3LFA&&shS^K5U-v8~O{v2Eqq&a;!Jis#6X99tt#I{piIrtx&t5edb05(DqH zt|j+PU*MTFf8M00a<p$tKhy9R+N<E<yU=d!8v4WeC7#t=FF<D}{^|b*I_YQ4H1_4K z)9A{dK6ODXS*r*AI)~U={>#EY9q&2N{okbPe0s^Q(O%DJcfs_z^GhC}%-3Fk-a3ok zcg@H4t`YN~=qf3hUy|~4PRj|yCk_8}-rtp0TbFBzXL`xJsdJ2~r5B*J(xO#C`u;ch zcz)gN9HZ4-c6Aq^*>I6G+me@NP8wB{p2;DnTK=1ce>&bzLi4+%ubpf7tVP2fxO;lZ z{MFkpKx@}U(rWJ-Gj-mK>AH>#dN!x!MB$T#e>(5)nyzHY!_kYTm$>K5Uo7?i0`%5d z^uB97Y3C}K>Y1sNwmRiEIdI<cUmE`Dc#nkUcPq0I^A=5=Gi%!D1*?}{fY!>3q}ARf zRf9S*Yua>m0a|qzNvo|ZT3|-i*x%-~oPqdE!atq&chAG(dDG0=vAXI4w6<HczH49X zq%P|6Dx5!S9vxTz=W^h@<-fuBcg6d=_K#BcHND)a3q92R=Pp3+g^Q%u!Ie9I9!)LU zXQiykX*qHDq~V{=`@6Qa6qhVuFI+fo*8DkBMMxlxD=$Fv(Tk+n&Q(}KBbYON#`M*7 z7ogQ}k+eFxSWUn0{%B)Zeedsb$gP(DX8!Kt^0Td!pQmL0oLr-7Cvkn--(LJLrfzm{ zjhk9BYiewK%X<FX=?%yKV(3v<7P75DYDwNyif<ZqW&H(cR$L^_j>wb?Jtb_oFvo-R zwcnn`p7>u(8av8Z=a$B9(p!B2dQak?Zu{>2i^Da#NK+y&8!tf1{`-qdTW43%RQL4z zrp}quEPpK^&Tso$a*;G0u7dgVW_jk9kiLT#pjB(pO5^=q#_}#vS|jJ*cYiF2jDLUl z_B2kyU+T<vrF(^I)O;(IMcxGqm;%L!uU<;rosx#!I!LBsG9^Qupx?1cq*3*piPQh4 zZ^2p5<wVT-BMAi0;OY6t9DZB=6aRd?<L8m<vcG*Exg>3<?UJ!$XO>K#I*lxxIwyC& zSH{?#zN)>U`5tz%@qXWW-?z~GZX@69h}#=l!)Y7S^=8bq1J};U@G^tvM?Bd)E}jCO zVjfA)m`76{`q@<nMm}?R{E;7Bo_*U=;If-i{!(7Zu|3ImOMl`&2+!@En(It7od-GI zpm?J5<p$g`C+T~|P+P{>0`_&y8beYktU2C=?B^O^GRrf)=z)3n%`BnLJ~&<KY!>l% zYBx4_=G2m*C2Sf?v>1`H$T?3J@H)8P_O})Pi|d<Q^X{8JZPvUQX5ZBJPv1^2AAi|= z_kXDagEP@@3~c#nJ2uLLQMK*@^!MT~>D^1ZqwP6bHZAEgH2t1KZRtG2c_#2I;VI); z$z#7BIM1Uz9mW<6%Pnf=C+o#;&yQ*N3qNDw>;J;fLFm@<Gz$G*Lv3AoGI)fa=Xjd= zDIS}5OEW(^FThW|#ZT=;@-q`&7Vvm@dh(pZ&){Z$CcX6S`Lh&%sW1Q6^4bN>8lHL{ zTW`varzg)~p0&VI#um?;Ma7*SWrcR7F2IXpoym(Gy#GsC2`~3TS9p1xca)c17B82N z9X4x*Yu+@(rt_H6XMTz>Iksi<u@v{oFWH6b_9wXgm*`_Oq8EMpuL*1Nk?&Pxl+C6- zeo}O&v3-W@H;nmTIU4_J{LTHYMQg_X2}NXzzl(l%=^Nw=Rb@La`mU7yscMX9iQm=w zQO>Gq(6xXJ9l)Q$=5h(rnO)iJ*?wMPStF2bwxwi~-q+~Pwk0fda2<^E`NR@yOKs7( zyNvy^V9FWooqwit&a`=M#@5UhHU)FBH^;MD$<1S(v3j|*8<$%9Hvg7epRZVmK^ceJ z_jx)u2y@i+j`BU;k1*gVXBDt<$(be=N!xMIJkIzOhG($QWxVh2n!zq(t@94&iv7Om z=^V_o!^9ugv-|zTvR;Ohi#8#e?%bGU)cL9*`{@-6x$3tLnhCzmiJX=cvPZNfOz1YJ z!~VZY$D48K*zx~99fx7!o6-SUGacK%F&$#;Yz@UN_NkxYEep-2QNfPdKDE03f5e!Y zX_=b*)R&E^&HzoD)EnEmF_VWmAzQEQ;p@dV^?)7m)~R=Y7-ygQYSTXTJ^l}kPVMi) zGCk+*O_Sske?x?K-)&l_wkI4A`_#^j_5>C*I`!Ih&plyo^OT~~W~wJpF~t@`AIwxI zaC^1yb8J90__j3oHn%NWo{KT;OpIZd1iDgecHhyYUi+5cU;!r^lM?KilRDYGMZV3B z<(FCDycjqO@UlI=Q}*TUEx+Cp$*I=Mxp}f{f?HxvliF~q&GNR+S0}U?a(5eV8+|L) zJ={I7>%ClRCKVZj*C%VR7VotSw?)OAv5RJI3YjYhWYqR`-;li<0P5^DW;SAbzt^G5 zcU&Dx*cTX-&sE+3IJwWW$gqzxy54bXjc10NpYQjGL^zsrRDOL8Q<pk?4G%8IxKKJP zIDDLuk8pag8gGsnu7_+&UvX4^2`!uPxjXz@1GXW_OCRy8ub13!pMh83R>zddI_+hr z61=U|8`LDuF|uMK`<pSWdwJU`&t+}pUX1+4%sU#r$?APP$tYRwqG+xC60x&pPyER| z*tPmE(RF|GBv;I=QnP)|kDt}YSE5JmWaID|LURd3H3poYdlBCQ%Q_YrtyL}HLUm(J z+(v<45x;CE?uQrW-yW0A#Il7$_6+FrW-*%vDp4Zk$lU1{Ox7m+^@6P332VA*GLOL# znksy55*p;B-nD|qscL$rPwmFdn3!%*w+OTPpqKE*rMxp`<wVtq7^^VB7u&t?1Nh(& zn%R!#!dx&E`8ny}N?!AbnR!-*J1v^ia<i3&D>hs(4G&Ykaed}%A{>Vkax=eNnj#su z1aFRIPH0MB6wdszv;(Yj=Iqly!a&9-K^Si$ECAs%Jh3y^=k1}!yHZS(=(1wTxEfXj z|9OH2L)nr7DG7=q#{c-30lq~b$+nQquSEH;cAb%9!(Yo^ZNfFk!Pr<DsB~iS>=x`m zkmG4wlB6*BI#?_`a=?yba!-J5)Hye{RvcE5C0Eu!zyAYm^_4YHF@N?cd4Qd^2U{dK zCZ3?t;QK7m`RLyWbo*-}tG7t`N{jOFDNX7ZChZh5cS_R_JPdxkZ}2Y49qoNHJf}s< zHTw8&bchqmOK-aX)!!3D(koQ2GO3!>e&BULZ5vse5G$tb<hT@5<L{-Ie)%&gCg-cJ zGqUkX%F40Bds*A62RfdtQEf=-`hG)4t!f?I)DHKUaRaz=Y83ZYm7N|^l2o>(&8kbe z#_!m~yL)}!>mQ3!5_Yfe-|M|_(klCncX&?|iny*Ku2kZ};FZl?(a+}g=Qa60O&l5@ zquaNoKQOnCSQ)Rkv~l|--dc%wcZirTP1xP*J$FTa8?oCtlQixQ?<u#xb#R>jW8d+V z0XxQU_s4L?6#o|!)V+V8eQiydVx94!55V{Vd#Q>Ws$GpKT&P^R_is5i^+`vYjr4AD zz?UsL50<j+!LBL!gZDu?)m(hXXPM_Zee0nA$jPo5K1{&aPGSgF5sPi8ds|*pKN~5a z7Y&Z{9k=gWnvu9KE5p4aIm71M*Ehq>39)@D8qxJSq7~CJ?6ACiX7nd=nB!rG`)1T^ z`Cu~%2qzxydDxz@Z!_`kYdGBP;3<q7x?A<PxwD7Z$fj0p$jjFIHrKrS^x-4FS-5ZC zoDAsO4+RfxIkfpu)kMj<wtJRbA=wwryoBB7WS^9E|8vrK%{Qe{ioQB8(r?tz|6kHK ziqv(@IC$z2dxpJ#){v4!dz)3w>H6^N>5{6}>%H~;NlkNAlRidQhx7qE^mTv^)y=9A zqt;4|NY|Gd8CAa1>5CEv>@jig(pRY|2Yd3Q?qpb)Qg@2RadkcNx!ii3Tq+IBmz80| z$}PoS&1Dmv#17D!C%3W<ZHKzE9)xP&)@1WMP?3n1d)2>}LRbPN8o|5GeF|dE-HfvW zPqrQ4jY&q4grT`+bt4-%#&BenKCaj7gbMlA2H=b?Oa4Hujl3#Jv1`1_ofSY_>{?v& zxCFbhIhcG~!Jd&|+pS;%udJ0|9SIhU)qAPnW3jdoy~{q@9$Ep<)3!HcAECAv<J+o` z*yRv+BZjdC?kJx5=_cvI2XN0=wd<tZpZjP9sKfll$4M!NMHe(0nRGaQui}~&6<Q+) zsT=&I`s)B+E%t=(JR!Lr8&q2yeE%SL&ByM?%ivo{#DxsQjcUEPqJ!_k9ps-%w9H_7 zTElTd7;A`FqdM*^A4P?U^^;$btk|gh{&Uh<&U!>fWjf1~be3YjM9Ua;MS4^V6xRv4 zThkaGc5&%_=L2)=YOX4)%&|%PbUu+39-+D-G8LPJ?3FX7yG-}*0Z-I{T2&_{gs(0( z3v`T$q6_!OF_fh0B%85ClP8;-`z{&Q`^SAtU)IkyfM1&&;rblwrh7bn)l*b;M!rtS zR$ZiaVHqot#D%XFfRF<4`ESiL<JDX@Xrw+dftjH?WWlOrZn~claeKu0()V$auPJfy zZN|GRKB|L`?{v=M8?pOPhI@9>Z1$}75b$O$ldzZ1A(}$N{<nMedz-opvW4o@HgiI2 z&I9$~I_p+JIb*l+AG#^D*=En6Y{Z1Np1kQf<N3IEa_Ed^b3SfV4%7|L<-pL1oPc#T zj-yVp2e^Ulwrikb8bFD7Q`En<YgwbsHY}zHO#&1*>cNr0g1t=i3k^n1_=-R-dx>+q z7OGcC0)*SDCkScOg(n)h>DT6_c|RB%$Q@Lumg8L%$W7D}uR=AGPa`*H;2w;a<Yo=r zW9%AO)gIH}^d@w#9B1YbDiL4;ERdTTC>ps*tc<8UG7DRA)f1z0W@DexaB`3Dqf7lo zX_}L5s`@vQq3IGow#2&nnj(m*L3O7jLYh$uA2(AR;WjF)k@Rk7-Pd90BAOaGrjDr9 z7UWKZyeFvM02!SGtvR==uOZ^;P^dP5v@N%*<d5`g(LBb0Sfe!hM)gYsVv+Cm{yi$+ z0sUs#?!QQiG1*S<#1<Pvln0aHNf_NjF_5Me1Lw$ie<74ngG{v$dm{af(nc(hq#4`J z7X=>?v<BzKv5T9eTM+vO6jiHHTr0CS*3=Kcq=-bJXQY+;ej*}~xf2|LNa{Q43FF<0 zu5ZwBN}d>X<GB=I6Rzdt(s%|9QOS_A(SB3f-Xz-)es!N2Z-b*08j>*^iELV=|1^I( zwX0&6MExplTqYaKdbXHXudTL(^&1#8#NHhH={k=yInfgNKc0vAwsJS9>Z2)HXD;7> zfF!ZCPU3Url0@qC<mNFT30`loxQ^MaW3U>_EEn^}QVU7!4+&qW*1iR&+hqXcY<2`t z%v7CK7Zmdz2N?~A^owHx#q~T5JdIe+yIDd@Ejc-tsfORBWT<e}>lT3l`QqcMFWL#C zAXy(n$G%#ekLWEhvt#-MwJm`Z+iGb;Y9NANY_DM@f_R~Nj%tck3C<GBJ#m9=o=g2( zPVRRbqJeT_H|VPXH!tp1dj6{YFFDVju_8#E<BYnb9gnGJe+2RBDKYyR)#{JbfgF9` z%Dd!5srZXoJ?c#HT}DU_ByhU`7M_+%t*OZjFHAHJ>FaXd12_tFj9pJ5W9irQX?|n? z+7k6e8j>DQ3XtukzHG0G)t8nU(r<n$L})J2$trhK$jo4u@ixqfoEbOi{1@>_h4|_z zsq;TWFG!u&hj1kiqvxCnx4?|zUle{1qL7-t8t?7K7tW1ncP@2j?((*BQ`RW>XlPsd zV1`iCE7ghN55x?iDNDr#z!+i>-CWqx%^CaSKEL4F!xp2fGOZetN8`rR2P0FHMW+Yu z$V|>y*qhm&b0gO!TA@3#{nWW}PoFLR;TUG@3^%@Qi9^9Gc@O)Xz{K9dL<SQntMenv zHzWIBGTJh!igQWb6AZVPS|^HBDxl~?Gk1GGk^1FE$JACmz}U?AaV3`nIY9JuZpNxZ z{H#h0e=gO}sA6bD9difjm^|!4zwaJUC0#%So98EYkMP{+f5(5g8PMzVMd|*-fhiIH zd+wLTEP7}E_VNCGVin!L*?TN-ds8?Oz1Nf<#Ld%n_0y(XVI$jD>aclkF;4X<bzrgc zhT8`oaQm{R*gWY*FsTar^aWzxL(QQ3q8eb1Qh@Z|VLOx0f79)nQ%j7jiY+2qel=Eb zZl&H)mGs`=qyu6yG^onw(C?>V9!uZ~Wtg;QZM~ZxvmQzPmJ53&Xi)WRlnl$GmLlLr zjCY9lE<ie7hLm;^Hbvb*w9;mMTPqkf>wIUrFKYE#ce*=cEBd8$0?-O4$tM*93s@P$ z+tIb5Y5Q9lq6*UeTqRO>KGB-(6I&W7Jjr5Hqez{hw?~_A+4qVy9ok_p2HhSo$2B#P zLc~(eB)ww<D`9oHdW%qy&6QqNI&$(T&K{U$=PNFbY>C4>(qu-1(exGH6o<$t(uYtg zKYw_)5)nRXKkRD;fVk{oYdswM3+gFxEgChd1Blbo<J?#s?Qvd{1)LVgr0bE2W8-(W zjdh07+gn6F?T<qyJzVf7*;3FLD6cz=1)7KxVMpIr>#7U)X)&4&@zEGH{>k)R`I)Y| z<x9d-lMYbjWc-t9fwl=%&Z0?+Dw~-^ML*Jn{9xItk8wp{n_3{z$Te|yXj{S9{xnG~ z`;|mqT&J!l_Apn@3I75r;ND%Gh1Sq}EBPort?{_@v^|zdPfKZ=W^i;_iB?(a%|010 zB<o*^Wjz6@)b+p6)~D#l-&bWn*ApmdaZmkHQ&j&XW~-OKlrAJD*Sw}FH>ghd3kUs> z9)h9gOW~l|Mp%*2A-|eywQsd?+w)c8G_I6YBW#P`HCx0xtIj)Ljj!~h>{g|hdH0H~ zqR=mrOAP9yHf{62GXNvVjSSR*<WbyrAz$_69356Ct`zFve%YPfgUh|$FWuq&%-_(* z)v#NI9!3Jev(EB78ko}PpM2cycO7$Q_p^Ch<G0uSvU-pTEh-Rid;jEmU{&sy!~6Y{ zYhQzfh&%fRJb=CkW+9kZO7?pXa!uc3eB5nJuI=^q!o&geU!}+TdE58;$3lC;?g4wg zbpQV0ebEnhMY`=v_e;$Hd?y;-gQ4$3fS}pEZJz7g+5K%LIqvLRZHtH8f1sVaUw_U@ zR3!u<ZHJ*F6GAdrQj;=Wj^&-PV@!8Zwlv7)z+HnL7y$2}`{iK9;Z>XU(t|O%K6A2T z`MrY4WebBoFj_lb9cPbZJTY@S_C<Ks^JMPGvEBHO99t>x6y87QEpT}Xa3AM+lII5e zCRu*(@ZN!cCGP=MsuO(%B9>8bu-ES0A;fF-5LG7N{k2hi#8Qp;-!2Occdk5hJQC6B zk+L%roGU+(uXbc&*_mSJ%ENqx{}TAygObSNBmTF2r&C0$q64-*CtyQ3KHxFFLS90Z zohoulf6q-xT2m3u){wh_=<lHZl(`FnS;8VGt1Z}R8Z9HFw=VpH0Xs~D-XL(TYR(&K zd=B;k-{?AlSF1Nx@zN2r!#~N}s6*3TH%8vON5Xg4o}Vyc`K#NW@ce}<hQp~Ewl4~M z7TE4kX2FrgSeGm~Vv>7J`%=TPu3vEEXd8Wt+UU{#Q=)DA0XT)u@?U|YO?K+cGxI3) z#j!|aV?sD_BNr5HfVJB_w{1u$JLU2W-jG;!D$mn-LsHqPQJ(f?r?69BObi?B6`jd# zGWXUki+bp_0sOpII$!Pb(=*u8?2NtIN|D)p4V@RYs-WAn6%~#NluHKszi__#FDcsL zjBWnSfhPn=_6cZcK<8lF6WBq7j80^*2xGC@xBa861u^BLltj|gofLL=#tk^}BImh0 zNjFx#=-~cGE?sTcc28;R_5Dun54U#IdfKl#5<_^bu*iSZhuLYA#jifj2#UUV)g`$j z(CB{BcE|G2-4pM8B<aPnvu1R+zU!@<ATo`fL)IYK&~dC;NfH^3+-n}iK^Jhsz2*_q zRsY;79IISkKIhl(FDfpPN_ooWy^PV372{GYZkpM$td-6}Kj(leoY#X?n!+l!j5h(- ze)Xs{gi`JmcJ1#MSuXjQxbO=9X2s4U+wKnouZ*~9XO3-?<S^|&e0{)sNP57sGYKAk z?2Fqv-*oNIbR{oK++YiIefDaQrQej!tZ}zOnhN!Rz(l}1cv}C{e3tQ+L$Y~1LwVLY zWC5-Js2gj8Wu*sg*ya`$`Ab3dDFxtsvta*#J(&f`%X|1von4wv=3OI7aQ91MQ1DK- zLAJbfa-V?cufplN-3%j2Px_6u?w3CLN}OG9tlfMhMQ~q|&ko`f{>lnNe{APQoNI#m zj$AblqVAW>c$t2U(1zuR=;SMXkS17CrHSuY?|NkNAte7di}&B5j?x~3`VIn)EBj7& zE@@RMwN^NXTZhSQ_=W)oB=0@#{M++4B%Szj)zMs)sA-MxbiUL3B^2wKL3ob2U)qoq zu7#^>H4}gm-7g(YHlw-2(_yH$K^vi$apOdAz=205f2m7I=bht`$zN=8GA<2%dr{)5 zw{79TGf#g+es2;H=#iwX9M9Ev6=h|3+GX{&vLRWoN`zaf+hFFNiMb!`3yw3q=p8U1 zJF1alpAyXI&E@C4Gx*6!$Jsj_XU~k@y>j}APewoa>D>=l?+jpq*t?(nWB}_Y*!?6N zj(!q>{1BvfKRkN!-K!@)y+jg7mU$od4M_dxhCp;rFfG;E(@qUw>K(FCo3t<&I>D#g z$aDC&^pJY%>6R@o?=|j|d97Kd=p-lE+OAkeM(~xCGhk13ZjvqZPd*Ra&@XbE%{Hql zr2wT|LrM-!Og9k*;C&xT_o%L$K~C&zq+uNR^D5eI&Az7(m7aLoebRNpHq_I0|3+!h z5m&=uuL?YrRN0nTpMGR`@BgmaTBYn|wN4f&`b+7A=_!oThNM!*18oLW>AO)gOOt7R zrOCcX=Y`joEzL~2sia5s@XRFJ=p`MRcnj#(#h-+`ySL>g4G<#X)HkIzSxA=)LVwTa zZetwx4m7woA9K3>NvnzygLFrq%Fr~8N6}(aXzZNg8)x@#ZoAvLawFijdmd<Wa{tL1 z-+nIIHA)?Axj<|{#22wI?f$0Z)X;te|Kp1N8(uxqVc{1es4{%*kuSgNh`+e@@Z2N* z)A}}%Uc1<*Qrfuxm4_exSB}lhho{@_@Lst|GUJiqz0ADuc3X8M!|Cll!h1Y?>#FVc z{x6>E4?qxjjqo1xHv~prlGJN^bsO90vfKK5PQv@<W8K4K-GDu-a+9od(yK^aahP?b zUg`?BUs-kKIq51_xz70CetKVN!_x;o+Sl(%%4*-Is$BT`ep#fCr&U>`pEn_o%cPeA zlgosLxXySTd1@}7C->j_xo7kvtuqd1xxDT2#^|1KLc$j1!jm4yJJ7$2?$4XV1WnhK z)6=Lc5@X`NBV}i79{b_j!ifiNL*4EEQ(FW!)@bdAY6esZFLN874v&)#$exw%IXMcA z%YZ%W`VO(TTj<>1LFyC&;(k~Cu<$X{?~#sWr-a{A!tW!kHD<@W`}ed<*s|huJuRT* znD`~0+#fV^MRf5|DOzsKMT$PMJ34_8Df<0QB*UhjSjM1-EPU$6yx(K~w_ZlU=EeB` z5=dm_=?{slytqW9b<6aEH9syx6N<#{)XRziR~Zw;oKwWHJy2Z6oV1SlM0DKLZQ8;| z#%CE4{J$jV`^=;GRZ)CwpIP(cpgOZkxFhE4=$XuUr@0;_)90W%DBgSVZiBa8ILJ8A zH{(FRt$T88AMBI$hQ*yUU{?&VFmd1>764iUKGf}LV~e>~MUE`|>w!%^|D|6v1>@Yg zvSuLbUnaddQF<cV#L*k{?s@cbVt_b$`_7@aXXaUV)^B!1mQ~qoF?Wt$qcDj@9+tF| zOT8i1Jm(&8z`yyB%TZ%ILv8ULcO1^jczVL!wChe*yFR($Iebpmgj<`gR(C(q&gSpr zA8OY&9d%hW(7z{FyCQO_S=zz^R-CgI-tP9D%33(oy`o7aEgXUrKdY+j)0+|J_srUJ z?=hP#iHqoW&)Op$i#Xp)+CsN^z|~N5Q`%kzeV5}<+S5dtz`9Umin*j*_V(J5CcT(C z069bC4z^ElKMO@Tmy%;=Lc2A?-(q#;%l9LZLvf0dfYt+=lXKJJAa$~k)rpAQ#8$7u zQVv{}QqbhCy!V)TlHlWvx1qsz7WcaIt>@MM0@UcPR7uJU2#L-dYp7@2of|j%jwGS5 zx!SpLpAmdRI?sW7PM$y$m1+bxt)`9f`MGR^((0D=39+(3UuI2L5zU&aU1!NGSCc~j z8o_2`z@8Hr^j6~w2yVX8rUd7Ye?rXe6{Sti>lZI``yvS?OZZJ*T*AThgpxVVjoaLr zlk%Dt{}31Uq?dKna*R7^(x|4P`QDSxjRj33jLn+Ar%pD_`g|^&8N18(U=4Lk(&p2N zNniA-Gd636pE`LeiG2{kq`DQK>eBa0K}Cz`tQ65%GC>MS-|Mc+i1kdZ|Ik;TOm;*w zS*f4MWTW7C`Htlo^ca}mhA!id`L5S*_cm(9z&)Wa#BcK(ZFs@sF!pzjaI?{7#i_px zNwh7!WJO5c?iIn+2_~rYlYr|B5xU)#>wfxkRr7C|=9Jdiz3tqQf;#sK*B9%4>b~Dq zH_e??qcICemg@_5<=<MVmq6yD4lP^N`QCFA)T3XIYi@!Y!@N{FyKcVDSGUBK5z|lS zMry;zQB7{YkSX}Womo&<(jHfxyH~*%IpM?TKivMyxtE8Hl)^`jQBaT5*b=Q!W_`U2 zJvkMWYn1}7ra}~7&qxc_n=CB(z9H(}VCwE%jhoCoJ7sLiG20Fc%zDK^jec3uIXvUi zLYT`)V+|+cQu$6*Ynav?>YDNNA$x{zYntc?x7LkS-8H^|QldHwq}JEuFhHND<o@Q& zce&?uKRUIp2&=|p0s<lM_+2*17A~<@uTRwNCgDl(yGO6@%AE%?UcAM4A%jYOO>|HJ zihz3VW-z_|=+eb;Ixa|!K{rDT_tQKk#&k2IiATm6FYyLLPG-X4I+kOseA;D=1oRoR z?SAjBYS&&=88y|eg9O^ea`vXR^mPHIfN17yY9{kFV;7&QwGh#z63YX*aNxL+!gV6H zM8o0S*jDx+XWn_t^O<4mv&FJ9oFnFjhSi#BrooggIcoFv#$n_*A`6lu3lO;+f&A0* zTPXLy`l^~#Tipves&kGe=)3}4w&Ww5cL0v~aK5T9M9mk-ub1D#6a2E>Q(b{d6K8eK zM+7(ZNVVj9(KvP&1jHpao!DxuHDdc?*&al<H+qE*>fD$^rFF@r3OK2wu1`(pX`Ek> zy_LHNr@Ua#lzI>-7wb##g6<3$4e&VmtJb`PTm9-qDK_WIN@>f%z!QSHNkXX|l+h?> z`5HXdjAV%%wX)|rpX%T&|0$p%BdHQB?n=6mfZL;AIgFX%ANjHi36S8O$xUG8iWrT* z$#3(fh9q_{zkGvCKkeRJ!qT7E)T1ohv*dKb<Tt5~EkJ>C$q|rkBDm-ebHm^gld5dT zmUPA{*lVQR45T`hnfkxBywU&7g0cUYbp&GZYnC%?Gl1wd%N1LNPhA$xrLg0`Ii;{; z`TwF6*dVZ+OA;C@YYD855hN`8^eP+V^8lacmrMj$v}D>)CWY$k3%WrKKeto{lG;(; z?-@xbi28f4Zy|$=jCV$mt)dc8FaIPie|AA%8esi0$&{bYlm-~hl=wV(!1jR7lPFAP z3j&M6^%%03@sOp=;=TUj8tS9e*uNZ&=9RDXxXroJO-CmczoLPBP2^U2^E*-|-`u5h zB;8i+I?D4A&tY4r8~$#8=`lvmW44--Zt~`Sj7zzdO}*Y<n=3a%h3Z>N%*WLqOsI3? zWG?seRk6mV^cq{3bsAsQoBFd0gKmMoe&|TP*Y1986f`CuVaW7Vec)>t?0onMB6Gf4 z_Md}j9W%<i9m?U_C;s#g?+)@|{&h58?QO}el5B|tv)SzM%+5KP2-y<a%^?S-5W&kl z`+3@YkYk&}bNS&MTl$e4+g&_A=Gn-jcqV_8V|$I~Bc9fTEmm3d5EF~lEO~LyQR4Dz z$w7t#SJNg-T>0GCVwUY&r@;w@n7BnzDy5{<%No8Lc(M9K+{L=znJ8Grfnt`SYxVjJ zfEtyok=JVEDic|Uv5@x)@(~6fkoT&?2>la7i#75uOk^Dfq<q$mOYEMsaDR&##)VpS zjgCF9nZ-tS#jIo2rXJT(^*z_;p!htfeL8C*H%Rzs?Cm@~@;xK+J#)j$i&ehqqqF9; zklLt&9UupU0UomtSBo2DOs#@$GToBus?lEg8d_ltt*4-U#plFOz(QN|xG>g=T01fH zKos_*z&@9(2~7u9tX4?W#p+{uRl7c5%k1&cuP6}ritkgKJM*G4w?{^(>j#r{;bpA3 z`Wo_=U*cKjQ`dOz^Ql&zDO6xj$MC&AHPzF`r`mY#3y&=;{lMlORar&-(25;m81j+s z9(q^q6rgmV0DG9gE|q%)2ulJ?(Lirk8dyU3Ql!BT1|_U=eZcCldB@rhB3iUU%yAto zD?M!UT!~b6(B^f}(heru!pZWPyr`AiH}_z&RLEuQ5~@v<$jy3rP%?jr&aNpiQmh^n zcd<GwuWt%)LISka0s83xBg_E*(^7zX2~cyA=t7MUE>>w4W&&b6Ossi9N@9kzn9u<b zG)z~rA`RQ7109tJs5e&FB%KbOb7nfe5Go~_$}e?*Zh}b}G7_DW_ir4Ly!ZAbV;WHJ z_^MkALER+D?<FS)<#Qc(NQQ?-64N<lwBr20TuwmX1hcR*t-y92*eQYI%W}9Gc#x*N zu#-;bbCUMkB^>wDOJ=MUz|B@f?Dm6;YND?^5?3kC9M(y=u~;QYf+ZY})nM|ziZ&SC z62g2+f?9``OEkwN8mq#+5{sr%=$#u)g#Dp$?QX3VjXgA&XaqIjI%WzHF7XOo4Y*ik zM<X(u++${w`h`Fx)i!TuUMI}k<mwq>!d6ABsE02zx)TuAysXi6V6<-VLGawZ?A2rr zp=4XTuuvi2W~eF&6?(=*d&Wc)QAeZ6w~6+YpoN!EEy6t*fZQtv)3i~;i;LFHQG(;D zQ*S*~h3({8qIk(RoMapvIC5vYj(MwfP8A>T^PY8o9rY&1<l00|laR9B5tmDH_c+NS zlEH4S4KII}>Ip(*l?<ja5vYP}2)Oo|14Qa#8R!3SFXMdJoCpU|!57%RhlR@m(l%7P z<XvDv#BKh=JLXEq&6vMptB^uW*8-})TxJYxm?#%0Q;hb-Ot(Ii`V>wst|+W!gnL)M z0#E44Mzs-;04fMm<{Zi)G;+<j<M)ddERuMOXKo-0Yrj}GPH%|h^2Tgpc=iD%HZ{vr z1n@Ed^C*Ys1An(zHdGQ+yxS2~FtnCV&f5EBp35*d05lk<t(ndNuSwDKpD0Dy*GukJ zQvu!=*?A(}q|u#SDwiA8NmT)R8H>?O&+cw=`;PT@a|>;q=C7OZcXo;9FO6_a-X=8p zs<=W#wOiOm>sw0R$n3uCGR_iS)_V&xkX4EP?lQ&p_m_>iu>?E>Cz5~>a25<5ogxWn z-i6ClUdv!|my9eyH?S@&GY8DJ)(N-mt@P~rxH&za+03iJ>d0`^F{~_>>$yw|GrHl3 z%yB!6QRB$+dp9CR8B>V4xPM6$qn1h~Y~h4Z!nskPy!qPXk*>X7?L!ca+r-5_x_b4A z2Pt?wQLCfkif(59!!y=qW^Z58`L*cuT=Ws5!^b>Zl|T>pS#!3&Plmw1Ipz3jq2%qu zlcjl(x1U)}M9)X#?BGg<R)Q*3a@l{Q89MNQWMZSrp-#8RN`$3_7%Q2rmomF-f$4vP zX|S<uX<?Js9%;RyndNdwN=>*;bGvVn)P$&Z*3v<s%`s=}mso6GrkdG&gMQT(z8T6? z#sy989*5}&)o@RDcVxS#BTk2h^ExWo(>k28Au*iJ({<p1aN351aB7|qz5~`&FB(#2 z-Lg#s55%fyH;9P;A5a(vLpc^>dWWUSm!&h?Z!xzBJjufYG3LTWEpAbH%T0dN8A;BK zOY@rC7}TsOq4`82hofd4QTvybqJi(oIb4{S+JinfDV!Kd5|(~NXtjvCnwhlp60Y)+ zwmN)RtRebiY52%W!$<5(42G88BbjSz%S4wz>tau%qK~s@yeV@2YZH(S-|+AwM}T`7 zZz&gvDm0Q*Ht)OD{nyD}Tkc+NO^9$?uIy!(*J$q^Bf8m9*DaLkzHFIPclHkPow;v$ zhWZ|BpJ=4$a5!}N)W9u$wj^ywzc&q%==bignwEsn?(i*Xv@Pq1<K%=!?vJGJ&lj}> zL6U-KF)Tfbo|n-l>_vIvpL|gF40W<yAEjV}`h0;|2v>a)t05<l^gd>E)c4+2yN)my z`^;tzzrUq&uX24VyW$!(gv4DLy_YW0lTsmaF?;CwRhLYco_O#K@6B>hu0fq4Y`}G} z&}ctG51j(*PS0q#4zf2^b=@w`di5lo5V425n$c8b!I=79hUDWi#~R6Md;_kdg@J<O zX2e5~{5jCJat7j&@vd`Y2N}dAcG<ix9;5IGxIQApF*Ah23USl<Auh2(>?WfFt`7;p z9p4hwdk75@RT3fS8b0ltP~z}h+qB)26)tve^eSK<u5vMnWOVntKIVOlcWrp^xt;<P zPeG~;Uy0{&LLN0kMm?2yO5eP!BXL)&{bbxkrU&!NN{=Kio~b&sw?wNeTQ#6y?nA|R z)2tW~H#NhZREJz6KDI?!1kc>Q>?XIbdRq8<YM-dc>dHz#P4IS(GGTH0aX7_-#CSg^ zD^HVSW=`CTm{FEJmU2LD`ha}0%4wvO(+oyp(H}8P+O!mogcBX@E-}N`BZ7zifWO%` zsTV(_ZSJSN(Kb6Xtf*rEj7u2A3!Bot2h32%5FEts9YKECM4lFK)f84}d3U3Le+d}f z6V1OtRnyju;+i$u_p7bC*Byi$R9K<K;fDp^9f$u*jlb6vmfzC&&T<A>s$?CL?Sfk8 z#^R5W$`X|{fX`z6MFy!B@k#_>^*0tYWH6zQ*whPr1Vcl{(}R2vH<-k9P0|Zb=ZWf6 zB!+4FpR5DPJ!^HcyY~yan*+Xo$vRyJNeo>~XG(x&lg`F_n{qzO5r|DgxN9{M?k$Lt zM!+F5%|aY&BEGL7o>p&)B?R`dwgvkw6+oIs-<(_+7@6VFkpBXa>Yfjm?rp;}TAMEf zH2G>L0t4+#q+o)7U{YTcjiQ~7VyzX0Tu>d4z23ymk76fl>_ry#`|zc)WhIxme{5o3 z5ykGPvGXnLKj~DI76FWA&R5ziK68$0$k#GwXEUOeIWlMAEI}-DGN^)_arETrck<%z zn{RI$$pbrCk$|`6XXIDXBFPx@3Omu&)11a;uq~QwRpqtRBi1a@%Ih8Ou`-v6BC@vp zMeBjUOle%p*fM6uP7Du6e=Z~D2b88M2yb&WNJTQ<=4gQodt2x$NW%>+$`z%EzRePd ztHJq<K0^_=`uiUumof7&qH8epz*tkhh~D$5&%VV@xNiVQ7^<p^GPEJVVoAmbg&r_a zP-pQrPxqnv-12QL@^^?v7tdd*9CPkSKWs(vAwBe<1d=E<0WM{)8YhviJ>=q~*)G_S zmEV%~d>(WuR(Zp1#W`J^u|~TMG)duE<k4X0S4CzDql!<mvxs{<CEop<<I+0wu^Emr zvu)h1K9d{eQPe#~kOWz%>qIdR7n%R+61v@E9X!W4Ecy1&)u&_(kx-b{*&s7U=1QNl z^k7CB5E^%J801I4kTi1_?)DMZ+$gB$F&ttMm9`r;%?T1)C#&ci?lPA{XD8As?1dZ= z>u*ND?ti3=L}T0Ch%DCHhsdqgy%4ffo68^&54bz_J#8Z!sm03_6(w8+TWk+KqSr_D zVwKE`2JW~^{}F{0a`=mAA*+QDWEj@x=-*gRQ+@LYKgF}#%Uod7I@V?6dfD9J`HBI7 z!K=8QzVkQ8;Tol`aMQsk%HVu8&P2hIiFyc>T;Ddk2uf!<c>l*FkiuZ|W?y~+xvipW zWt?R$p50m&FE%B=sL9do`>F;ghZ);(2=>ziK~jaAdd4C3R!7NsxKfaG#FKP*pNZ9y zFGwyyO%>{XWZqzC&Rvvybmkn$kvSKu11C�<C>#+IYI>`m&zYgQK@DVAn3@bZRt3 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%0DW@sv5CnT*fX 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%0D#2=FXHl&U2Q+$|uZJKR-e_DL6)AlTdSoS}W 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 XE?bHqMPB9}h6gbU{_^(!O9TH4Ll31- diff --git a/Greenshot/tools/innosetup/Default.isl b/Greenshot/tools/innosetup/Default.isl deleted file mode 100644 index 0fddced4f..000000000 --- a/Greenshot/tools/innosetup/Default.isl +++ /dev/null @@ -1,336 +0,0 @@ -; *** Inno Setup version 5.5.3+ English messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=English -LanguageID=$0409 -LanguageCodePage=0 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Setup -SetupWindowTitle=Setup - %1 -UninstallAppTitle=Uninstall -UninstallAppFullTitle=%1 Uninstall - -; *** Misc. common -InformationTitle=Information -ConfirmTitle=Confirm -ErrorTitle=Error - -; *** SetupLdr messages -SetupLdrStartupMessage=This will install %1. Do you wish to continue? -LdrCannotCreateTemp=Unable to create a temporary file. Setup aborted -LdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted - -; *** Startup error messages -LastErrorMessage=%1.%n%nError %2: %3 -SetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program. -SetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program. -SetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program. -InvalidParameter=An invalid parameter was passed on the command line:%n%n%1 -SetupAlreadyRunning=Setup is already running. -WindowsVersionNotSupported=This program does not support the version of Windows your computer is running. -WindowsServicePackRequired=This program requires %1 Service Pack %2 or later. -NotOnThisPlatform=This program will not run on %1. -OnlyOnThisPlatform=This program must be run on %1. -OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 -MissingWOW64APIs=The version of Windows you are running does not include functionality required by Setup to perform a 64-bit installation. To correct this problem, please install Service Pack %1. -WinVersionTooLowError=This program requires %1 version %2 or later. -WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. -AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. -PowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program. -SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. -UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. - -; *** Misc. errors -ErrorCreatingDir=Setup was unable to create the directory "%1" -ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files - -; *** Setup common messages -ExitSetupTitle=Exit Setup -ExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup? -AboutSetupMenuItem=&About Setup... -AboutSetupTitle=About Setup -AboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< &Back -ButtonNext=&Next > -ButtonInstall=&Install -ButtonOK=OK -ButtonCancel=Cancel -ButtonYes=&Yes -ButtonYesToAll=Yes to &All -ButtonNo=&No -ButtonNoToAll=N&o to All -ButtonFinish=&Finish -ButtonBrowse=&Browse... -ButtonWizardBrowse=B&rowse... -ButtonNewFolder=&Make New Folder - -; *** "Select Language" dialog messages -SelectLanguageTitle=Select Setup Language -SelectLanguageLabel=Select the language to use during the installation: - -; *** Common wizard text -ClickNext=Click Next to continue, or Cancel to exit Setup. -BeveledLabel= -BrowseDialogTitle=Browse For Folder -BrowseDialogLabel=Select a folder in the list below, then click OK. -NewFolderName=New Folder - -; *** "Welcome" wizard page -WelcomeLabel1=Welcome to the [name] Setup Wizard -WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing. - -; *** "Password" wizard page -WizardPassword=Password -PasswordLabel1=This installation is password protected. -PasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive. -PasswordEditLabel=&Password: -IncorrectPassword=The password you entered is not correct. Please try again. - -; *** "License Agreement" wizard page -WizardLicense=License Agreement -LicenseLabel=Please read the following important information before continuing. -LicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation. -LicenseAccepted=I &accept the agreement -LicenseNotAccepted=I &do not accept the agreement - -; *** "Information" wizard pages -WizardInfoBefore=Information -InfoBeforeLabel=Please read the following important information before continuing. -InfoBeforeClickLabel=When you are ready to continue with Setup, click Next. -WizardInfoAfter=Information -InfoAfterLabel=Please read the following important information before continuing. -InfoAfterClickLabel=When you are ready to continue with Setup, click Next. - -; *** "User Information" wizard page -WizardUserInfo=User Information -UserInfoDesc=Please enter your information. -UserInfoName=&User Name: -UserInfoOrg=&Organization: -UserInfoSerial=&Serial Number: -UserInfoNameRequired=You must enter a name. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Select Destination Location -SelectDirDesc=Where should [name] be installed? -SelectDirLabel3=Setup will install [name] into the following folder. -SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. -DiskSpaceMBLabel=At least [mb] MB of free disk space is required. -CannotInstallToNetworkDrive=Setup cannot install to a network drive. -CannotInstallToUNCPath=Setup cannot install to a UNC path. -InvalidPath=You must enter a full path with drive letter; for example:%n%nC:\APP%n%nor a UNC path in the form:%n%n\\server\share -InvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another. -DiskSpaceWarningTitle=Not Enough Disk Space -DiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway? -DirNameTooLong=The folder name or path is too long. -InvalidDirName=The folder name is not valid. -BadDirName32=Folder names cannot include any of the following characters:%n%n%1 -DirExistsTitle=Folder Exists -DirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway? -DirDoesntExistTitle=Folder Does Not Exist -DirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created? - -; *** "Select Components" wizard page -WizardSelectComponents=Select Components -SelectComponentsDesc=Which components should be installed? -SelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue. -FullInstallation=Full installation -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Compact installation -CustomInstallation=Custom installation -NoUninstallWarningTitle=Components Exist -NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Select Additional Tasks -SelectTasksDesc=Which additional tasks should be performed? -SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Select Start Menu Folder -SelectStartMenuFolderDesc=Where should Setup place the program's shortcuts? -SelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder. -SelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. -MustEnterGroupName=You must enter a folder name. -GroupNameTooLong=The folder name or path is too long. -InvalidGroupName=The folder name is not valid. -BadGroupName=The folder name cannot include any of the following characters:%n%n%1 -NoProgramGroupCheck2=&Don't create a Start Menu folder - -; *** "Ready to Install" wizard page -WizardReady=Ready to Install -ReadyLabel1=Setup is now ready to begin installing [name] on your computer. -ReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings. -ReadyLabel2b=Click Install to continue with the installation. -ReadyMemoUserInfo=User information: -ReadyMemoDir=Destination location: -ReadyMemoType=Setup type: -ReadyMemoComponents=Selected components: -ReadyMemoGroup=Start Menu folder: -ReadyMemoTasks=Additional tasks: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparing to Install -PreparingDesc=Setup is preparing to install [name] on your computer. -PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. -CannotContinue=Setup cannot continue. Please click Cancel to exit. -ApplicationsFound=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. -ApplicationsFound2=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. After the installation has completed, Setup will attempt to restart the applications. -CloseApplications=&Automatically close the applications -DontCloseApplications=&Do not close the applications -ErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing. - -; *** "Installing" wizard page -WizardInstalling=Installing -InstallingLabel=Please wait while Setup installs [name] on your computer. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Completing the [name] Setup Wizard -FinishedLabelNoIcons=Setup has finished installing [name] on your computer. -FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed icons. -ClickFinish=Click Finish to exit Setup. -FinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now? -FinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now? -ShowReadmeCheck=Yes, I would like to view the README file -YesRadio=&Yes, restart the computer now -NoRadio=&No, I will restart the computer later -; used for example as 'Run MyProg.exe' -RunEntryExec=Run %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=View %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Setup Needs the Next Disk -SelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse. -PathLabel=&Path: -FileNotInDir2=The file "%1" could not be located in "%2". Please insert the correct disk or select another folder. -SelectDirectoryLabel=Please specify the location of the next disk. - -; *** Installation phase messages -SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. -EntryAbortRetryIgnore=Click Retry to try again, Ignore to proceed anyway, or Abort to cancel installation. - -; *** Installation status messages -StatusClosingApplications=Closing applications... -StatusCreateDirs=Creating directories... -StatusExtractFiles=Extracting files... -StatusCreateIcons=Creating shortcuts... -StatusCreateIniEntries=Creating INI entries... -StatusCreateRegistryEntries=Creating registry entries... -StatusRegisterFiles=Registering files... -StatusSavingUninstall=Saving uninstall information... -StatusRunProgram=Finishing installation... -StatusRestartingApplications=Restarting applications... -StatusRollback=Rolling back changes... - -; *** Misc. errors -ErrorInternal2=Internal error: %1 -ErrorFunctionFailedNoCode=%1 failed -ErrorFunctionFailed=%1 failed; code %2 -ErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3 -ErrorExecutingProgram=Unable to execute file:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Error opening registry key:%n%1\%2 -ErrorRegCreateKey=Error creating registry key:%n%1\%2 -ErrorRegWriteKey=Error writing to registry key:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Error creating INI entry in file "%1". - -; *** File copying errors -FileAbortRetryIgnore=Click Retry to try again, Ignore to skip this file (not recommended), or Abort to cancel installation. -FileAbortRetryIgnore2=Click Retry to try again, Ignore to proceed anyway (not recommended), or Abort to cancel installation. -SourceIsCorrupted=The source file is corrupted -SourceDoesntExist=The source file "%1" does not exist -ExistingFileReadOnly=The existing file is marked as read-only.%n%nClick Retry to remove the read-only attribute and try again, Ignore to skip this file, or Abort to cancel installation. -ErrorReadingExistingDest=An error occurred while trying to read the existing file: -FileExists=The file already exists.%n%nWould you like Setup to overwrite it? -ExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file? -ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: -ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: -ErrorReadingSource=An error occurred while trying to read the source file: -ErrorCopying=An error occurred while trying to copy a file: -ErrorReplacingExistingFile=An error occurred while trying to replace the existing file: -ErrorRestartReplace=RestartReplace failed: -ErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory: -ErrorRegisterServer=Unable to register the DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 -ErrorRegisterTypeLib=Unable to register the type library: %1 - -; *** Post-installation errors -ErrorOpeningReadme=An error occurred while trying to open the README file. -ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. - -; *** Uninstaller messages -UninstallNotFound=File "%1" does not exist. Cannot uninstall. -UninstallOpenError=File "%1" could not be opened. Cannot uninstall -UninstallUnsupportedVer=The uninstall log file "%1" is in a format not recognized by this version of the uninstaller. Cannot uninstall -UninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log -ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? -UninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows. -OnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges. -UninstallStatusLabel=Please wait while %1 is removed from your computer. -UninstalledAll=%1 was successfully removed from your computer. -UninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually. -UninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now? -UninstallDataCorrupted="%1" file is corrupted. Cannot uninstall - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Remove Shared File? -ConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm. -SharedFileNameLabel=File name: -SharedFileLocationLabel=Location: -WizardUninstalling=Uninstall Status -StatusUninstalling=Uninstalling %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installing %1. -ShutdownBlockReasonUninstallingApp=Uninstalling %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 version %2 -AdditionalIcons=Additional icons: -CreateDesktopIcon=Create a &desktop icon -CreateQuickLaunchIcon=Create a &Quick Launch icon -ProgramOnTheWeb=%1 on the Web -UninstallProgram=Uninstall %1 -LaunchProgram=Launch %1 -AssocFileExtension=&Associate %1 with the %2 file extension -AssocingFileExtension=Associating %1 with the %2 file extension... -AutoStartProgramGroupDescription=Startup: -AutoStartProgram=Automatically start %1 -AddonHostProgramNotFound=%1 could not be located in the folder you selected.%n%nDo you want to continue anyway? diff --git a/Greenshot/tools/innosetup/ISCC.exe b/Greenshot/tools/innosetup/ISCC.exe deleted file mode 100644 index 076e85f1e2e694adb0cd2522d94d6a2e45c64b92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159232 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 Iwcio=f3F$VYXATM diff --git a/Greenshot/tools/innosetup/ISCmplr.dll b/Greenshot/tools/innosetup/ISCmplr.dll deleted file mode 100644 index d364a21fe523ea72f2b2e82bdc69473508988d42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587776 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%0DFb;{D+1o9#$eHUy0}+u6^612vvc@cs<m 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š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 RCNLfD+(rfdi@**7XB5~& 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 Osh>!J*5m(^5%@n%6GLbK diff --git a/Greenshot/tools/innosetup/ISPP.chm b/Greenshot/tools/innosetup/ISPP.chm deleted file mode 100644 index a0ef97fd53df52aa758e08f60f7d768d2a83e006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69970 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 G~fUL&`deMUS+F(NF<vfAYEVJ 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 diff --git a/Greenshot/tools/innosetup/ISPP.dll b/Greenshot/tools/innosetup/ISPP.dll deleted file mode 100644 index 4fda2b7eb0578aee5522a7d774f7b2333dd6a4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256512 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 A0lG2Rerj_(hK97qERI9t4Tk6G97q+gs%JnVC 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 l(EHn9 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 YWV8t%E6}v6Ak*CN4@hAE`;dYE2lJfPbpQYW diff --git a/Greenshot/tools/innosetup/ISPPBuiltins.iss b/Greenshot/tools/innosetup/ISPPBuiltins.iss deleted file mode 100644 index d8d0aa8ca..000000000 --- a/Greenshot/tools/innosetup/ISPPBuiltins.iss +++ /dev/null @@ -1,345 +0,0 @@ -; BEGIN ISPPBUILTINS.ISS -// -// Inno Setup Preprocessor 5 -// -// Copyright (C) 2001-2004 Alex Yackimoff. All Rights Reserved. -// Portions by Martijn Laan. -// http://ispp.sourceforge.net -// -// Inno Setup (C) 1997-2009 Jordan Russell. All Rights Reserved. -// Portions by Martijn Laan. -// -// $Id: ISPPBuiltins.iss,v 1.3 2010/12/29 15:20:26 mlaan Exp $ -// -#if defined(ISPP_INVOKED) && !defined(_BUILTINS_ISS_) -// -#if PREPROCVER < 0x01000000 -# error Inno Setup Preprocessor version is outdated -#endif -// -#define _BUILTINS_ISS_ -// -// =========================================================================== -// -// Default states for options. -// -//#pragma parseroption -b+ ; short circuit boolean evaluation: on -//#pragma parseroption -m- ; short circuit multiplication evaluation (0 * A will not eval A): off -//#pragma parseroption -p+ ; string literals without escape sequences: on -//#pragma parseroption -u- ; allow undeclared identifiers: off -//#pragma option -c+ ; pass script to the compiler: on -//#pragma option -e- ; emit empty lines to translation: off -//#pragma option -v- ; verbose mode: off -// -// --------------------------------------------------------------------------- -// -// Verbose levels: -// 0 - #include and #file acknowledgements -// 1 - information about any temp files created by #file -// 2 - #insert and #append acknowledgements -// 3 - reserved -// 4 - #dim, #define and #undef acknowledgements -// 5 - reserved -// 6 - conditional inclusion acknowledgements -// 7 - reserved -// 8 - show strings emitted with #emit directive -// 9 - macro and functions successfull call acknowledgements -//10 - Local macro array allocation acknowledgements -// -//#pragma verboselevel 0 -// -#ifndef __POPT_P__ -# define private CStrings -# pragma parseroption -p+ -#endif -// -#pragma spansymbol "\" -// -#define True 1 -#define False 0 -#define Yes True -#define No False -// -#define MaxInt 0x7FFFFFFFL -#define MinInt 0x80000000L -// -#define NULL -#define void -// -// TypeOf constants -// -#define TYPE_ERROR 0 -#define TYPE_NULL 1 -#define TYPE_INTEGER 2 -#define TYPE_STRING 3 -#define TYPE_MACRO 4 -#define TYPE_FUNC 5 -#define TYPE_ARRAY 6 -// -// Helper macro to find out the type of an array element or expression. TypeOf -// standard function only allows identifier as its parameter. Use this macro -// to convert an expression to identifier. -// -#define TypeOf2(any Expr) TypeOf(Expr) -// -// ReadReg constants -// -#define HKEY_CLASSES_ROOT 0x80000000UL -#define HKEY_CURRENT_USER 0x80000001UL -#define HKEY_LOCAL_MACHINE 0x80000002UL -#define HKEY_USERS 0x80000003UL -// -#define HKCR HKEY_CLASSES_ROOT -#define HKCU HKEY_CURRENT_USER -#define HKLM HKEY_LOCAL_MACHINE -#define HKU HKEY_USERS -// -// Exec constants -// -#define SW_HIDE 0 -#define SW_SHOWNORMAL 1 -#define SW_NORMAL 1 -#define SW_SHOWMINIMIZED 2 -#define SW_SHOWMAXIMIZED 3 -#define SW_MAXIMIZE 3 -#define SW_SHOWNOACTIVATE 4 -#define SW_SHOW 5 -#define SW_MINIMIZE 6 -#define SW_SHOWMINNOACTIVE 7 -#define SW_SHOWNA 8 -#define SW_RESTORE 9 -#define SW_SHOWDEFAULT 10 -#define SW_MAX 10 -// -// Find constants -// -#define FIND_MATCH 0x00 -#define FIND_BEGINS 0x01 -#define FIND_ENDS 0x02 -#define FIND_CONTAINS 0x03 -#define FIND_CASESENSITIVE 0x04 -#define FIND_SENSITIVE FIND_CASESENSITIVE -#define FIND_AND 0x00 -#define FIND_OR 0x08 -#define FIND_NOT 0x10 -#define FIND_TRIM 0x20 -// -// FindFirst constants -// -#define faReadOnly 0x00000001 -#define faHidden 0x00000002 -#define faSysFile 0x00000004 -#define faVolumeID 0x00000008 -#define faDirectory 0x00000010 -#define faArchive 0x00000020 -#define faSymLink 0x00000040 -#define faAnyFile 0x0000003F -// -// GetStringFileInfo standard names -// -#define COMPANY_NAME "CompanyName" -#define FILE_DESCRIPTION "FileDescription" -#define FILE_VERSION "FileVersion" -#define INTERNAL_NAME "InternalName" -#define LEGAL_COPYRIGHT "LegalCopyright" -#define ORIGINAL_FILENAME "OriginalFilename" -#define PRODUCT_NAME "ProductName" -#define PRODUCT_VERSION "ProductVersion" -// -// GetStringFileInfo helpers -// -#define GetFileCompany(str FileName) GetStringFileInfo(FileName, COMPANY_NAME) -#define GetFileCopyright(str FileName) GetStringFileInfo(FileName, LEGAL_COPYRIGHT) -#define GetFileDescription(str FileName) GetStringFileInfo(FileName, FILE_DESCRIPTION) -#define GetFileProductVersion(str FileName) GetStringFileInfo(FileName, PRODUCT_VERSION) -#define GetFileVersionString(str FileName) GetStringFileInfo(FileName, FILE_VERSION) -// -// ParseVersion -// -// Macro internally calls GetFileVersion function and parses string returned -// by that function (in form "0.0.0.0"). All four version elements are stored -// in by-reference parameters Major, Minor, Rev, and Build. Macro returns -// string returned by GetFileVersion. -// -#define DeleteToFirstPeriod(str *S) \ - Local[1] = Copy(S, 1, (Local[0] = Pos(".", S)) - 1), \ - S = Copy(S, Local[0] + 1), \ - Local[1] -// -#define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build) \ - Local[1] = Local[0] = GetFileVersion(FileName), \ - Local[1] == "" ? "" : ( \ - Major = Int(DeleteToFirstPeriod(Local[1])), \ - Minor = Int(DeleteToFirstPeriod(Local[1])), \ - Rev = Int(DeleteToFirstPeriod(Local[1])), \ - Build = Int(Local[1]), \ - Local[0]) -// -// EncodeVer -// -// Encodes given four version elements to a 32 bit integer number (8 bits for -// each element, i.e. elements must be within 0...255 range). -// -#define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1) \ - Major << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0) -// -// DecodeVer -// -// Decodes given 32 bit integer encoded version to its string representation, -// Digits parameter indicates how many elements to show (if the fourth element -// is 0, it won't be shown anyway). -// -#define DecodeVer(int Ver, int Digits = 3) \ - Str(Ver >> 0x18 & 0xFF) + (Digits > 1 ? "." : "") + \ - (Digits > 1 ? \ - Str(Ver >> 0x10 & 0xFF) + (Digits > 2 ? "." : "") : "") + \ - (Digits > 2 ? \ - Str(Ver >> 0x08 & 0xFF) + (Digits > 3 && (Local = Ver & 0xFF) ? "." : "") : "") + \ - (Digits > 3 && Local ? \ - Str(Ver & 0xFF) : "") -// -// FindSection -// -// Returns index of the line following the header of the section. This macro -// is intended to be used with #insert directive. -// -#define FindSection(str Section = "Files") \ - Find(0, "[" + Section + "]", FIND_MATCH | FIND_TRIM) + 1 -// -// FindSectionEnd -// -// Returns index of the line following last entry of the section. This macro -// is intended to be used with #insert directive. -// -#if VER >= 0x03000000 -# define FindNextSection(int Line) \ - Find(Line, "[", FIND_BEGINS | FIND_TRIM, "]", FIND_ENDS | FIND_AND) -# define FindSectionEnd(str Section = "Files") \ - FindNextSection(FindSection(Section)) -#else -# define FindSectionEnd(str Section = "Files") \ - FindSection(Section) + EntryCount(Section) -#endif -// -// FindCode -// -// Returns index of the line (of translation) following either [Code] section -// header, or "program" keyword, if any. -// -#define FindCode() \ - Local[1] = FindSection("Code"), \ - Local[0] = Find(Local[1] - 1, "program", FIND_BEGINS, ";", FIND_ENDS | FIND_AND), \ - (Local[0] < 0 ? Local[1] : Local[0] + 1) -// -// ExtractFilePath -// -// Returns directory portion of the given filename without backslash (unless -// it is a root directory). If PathName doesn't contain directory portion, -// the result is an empty string. -// -#define ExtractFilePath(str PathName) \ - (Local[0] = \ - !(Local[1] = RPos("\", PathName)) ? \ - "" : \ - Copy(PathName, 1, Local[1] - 1)), \ - Local[0] + \ - ((Local[2] = Len(Local[0])) == 2 && Copy(Local[0], Local[2]) == ":" ? \ - "\" : \ - "") -#define ExtractFileDir(str PathName) \ - RemoveBackslash(ExtractFilePath(PathName)) - -#define ExtractFileExt(str PathName) \ - Local[0] = RPos(".", PathName), \ - Copy(PathName, Local[0] + 1) -// -// ExtractFileName -// -// Returns name portion of the given filename. If PathName ends with -// a backslash, the result is an empty string. -// -#define ExtractFileName(str PathName) \ - !(Local[0] = RPos("\", PathName)) ? \ - PathName : \ - Copy(PathName, Local[0] + 1) -// -// ChangeFileExt -// -// Changes extension in FileName with NewExt. NewExt must not contain -// period. -// -#define ChangeFileExt(str FileName, str NewExt) \ - !(Local[0] = RPos(".", FileName)) ? \ - FileName + "." + NewExt : \ - Copy(FileName, 1, Local[0]) + NewExt -// -// AddBackslash -// -// Adds a backslash to the string, if it's not already there. -// -#define AddBackslash(str S) \ - Copy(S, Len(S)) == "\" ? S : S + "\" -// -// RemoveBackslash -// -// Removes trailing backslash from the string unless the string points to -// a root directory. -// -#define RemoveBackslash(str S) \ - Local[0] = Len(S), \ - Local[0] > 0 ? \ - Copy(S, Local[0]) == "\" ? \ - (Local[0] == 3 && Copy(S, 2, 1) == ":" ? \ - S : \ - Copy(S, 1, Local[0] - 1)) : \ - S : \ - "" -// -// Delete -// -// Deletes specified number of characters beginning with Index from S. S is -// passed by reference (therefore is modified). Acts like Delete function in -// Delphi (from System unit). -// -#define Delete(str *S, int Index, int Count = MaxInt) \ - S = Copy(S, 1, Index - 1) + Copy(S, Index + Count) -// -// Insert -// -// Inserts specified Substr at Index'th character into S. S is passed by -// reference (therefore is modified). -// -#define Insert(str *S, int Index, str Substr) \ - Index > Len(S) + 1 ? \ - S : \ - S = Copy(S, 1, Index - 1) + SubStr + Copy(S, Index) -// -// YesNo, IsDirSet -// -// Returns nonzero value if given string is "yes", "true" or "1". Intended to -// be used with SetupSetting function. This macro replaces YesNo function -// available in previous releases. -// -#define YesNo(str S) \ - (S = LowerCase(S)) == "yes" || S == "true" || S == "1" -// -#define IsDirSet(str SetupDirective) \ - YesNo(SetupSetting(SetupDirective)) -// -// -#define Power(int X, int P = 2) \ - !P ? 1 : X * Power(X, P - 1) -// -#define Min(int A, int B, int C = MaxInt) \ - A < B ? A < C ? Int(A) : Int(C) : Int(B) -// -#define Max(int A, int B, int C = MinInt) \ - A > B ? A > C ? Int(A) : Int(C) : Int(B) -// - -#ifdef CStrings -# pragma parseroption -p- -#endif -#endif -; END ISPPBUILTINS.ISS - diff --git a/Greenshot/tools/innosetup/ISetup.chm b/Greenshot/tools/innosetup/ISetup.chm deleted file mode 100644 index 6f7600f8601869462fd1e84ff17d3bf079b760d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380962 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Π&(vOIS7p)yPVI#q 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ͳ(TEBxIDC+b>o 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%0ANLTkx(Q;nZc`dh#Y8 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%0AJ63oRPg3vIpJQ2HHG{OZ0PeSa@nB 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 A4gdfE diff --git a/Greenshot/tools/innosetup/Languages/Basque.isl b/Greenshot/tools/innosetup/Languages/Basque.isl deleted file mode 100644 index 1b130bf4c..000000000 --- a/Greenshot/tools/innosetup/Languages/Basque.isl +++ /dev/null @@ -1,318 +0,0 @@ -; *** Inno Setup version 5.1.11+ Basque messages *** -; -; Translated by 3ARRANO (3arrano@3arrano.com) -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/is3rdparty.php -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Euskara -LanguageID=$042d -LanguageCodePage=0 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Instalaketa -SetupWindowTitle=Instalaketa - %1 -UninstallAppTitle=Desinstalaketa -UninstallAppFullTitle=Desinstalaketa - %1 - -; *** Misc. common -InformationTitle=Argibideak -ConfirmTitle=Berretsi -ErrorTitle=Akatsa - -; *** SetupLdr messages -SetupLdrStartupMessage=Programa honek %1 instalatuko du. Jarraitu nahi duzu? -LdrCannotCreateTemp=Ezin izan da aldi baterako fitxategirik sortu. Instalaketa ezeztatu da -LdrCannotExecTemp=Aldi baterako karpetako fitxategia ezin izan da abiarazi. Instalaketa ezeztatu da -; *** Startup error messages -LastErrorMessage=%1.%n%n%2 akatsa: %3 -SetupFileMissing=Ez da %1 fitxategia aurkitu instalaketaren direktorioan. Zuzendu arazoa edo eskuratu programaren kopia berri bat. -SetupFileCorrupt=Instalaketa fitxategiak hondaturik daude. Eskuratu programaren kopia berri bat. -SetupFileCorruptOrWrongVer=Instalaketa fitxategiak hondaturik daude, edo ez dira instalatzailearen bertsio honekin bateragarriak. Zuzendu arazoa edo eskuratu programaren kopia berri bat. -NotOnThisPlatform=Programa hau ez dabil %1 sistemapean. -OnlyOnThisPlatform=Programa hau %1 sistemapean soilik dabil. -OnlyOnTheseArchitectures=Programa hau ondorengo prozesagailuen arkitekturetarako diseinatu diren Windowsen bertsioetan soilik instala daiteke:%n%n%1 -MissingWOW64APIs=Darabilzun Windowsen bertsioak ez dakar 64-biteko instalaketa bat burutzeko instalatzaileak behar duen funtzionalitaterik. Arazo hau konpontzeko, instalatu Service Pack %1 zerbitzu paketea. -WinVersionTooLowError=Programa honek %1 %2 edo bertsio berriagoa behar du. -WinVersionTooHighError=Programa hau ezin da instalatu %1 %2 edo bertsio berriagoan. -AdminPrivilegesRequired=Programa hau instalatzeko administratzaile gisa hasi behar duzu saioa. -PowerUserPrivilegesRequired=Programa hau instalatzeko administratzaile gisa edo Agintedun Erabiltzaileen taldeko kide gisa hasi behar duzu saioa. -SetupAppRunningError=Instalatzaileak une honetan %1 irekita dagoela nabaritu du.%n%nItxi bere leiho guztiak, ondoren klikatu Ados jarraitzeko, edo Utzi irteteko. -UninstallAppRunningError=Instalatzaileak une honetan %1 irekita dagoela nabaritu du.%n%nItxi bere leiho guztiak, ondoren klikatu Ados jarraitzeko, edo Utzi irteteko. - -; *** Misc. errors -ErrorCreatingDir=Instalatzaileak ezin izan du "%1" direktorioa sortu -ErrorTooManyFilesInDir=Ezinezkoa izan da "%1" direktorioan fitxategi bat sortzea, fitxategi gehiegi dituelako barnean - -; *** Setup common messages -ExitSetupTitle=Instalatzailetik Irten -ExitSetupMessage=Instalaketa ez da burutu. Orain irtenez gero, programa ez da instalatuko.%n%nInstalaketa burutzeko edonoiz ireki dezakezu berriro instalatzailea.%n%nInstalatzailetik Irten? -AboutSetupMenuItem=&Instalatzaileari Buruz... -AboutSetupTitle=Instalatzaileari Buruz -AboutSetupMessage=%1 %2%n%3%n%n%1en webgunea :%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< A&urrekoa -ButtonNext=&Hurrengoa > -ButtonInstall=&Instalatu -ButtonOK=Ados -ButtonCancel=Utzi -ButtonYes=&Bai -ButtonYesToAll=Bai &Guztiari -ButtonNo=&Ez -ButtonNoToAll=E&z Guztiari -ButtonFinish=A&maitu -ButtonBrowse=&Arakatu... -ButtonWizardBrowse=A&rakatu... -ButtonNewFolder=&Karpeta Berria Sortu - -; *** "Select Language" dialog messages -SelectLanguageTitle=Hautatu Instalatzailearen Hizkuntza -SelectLanguageLabel=Hautatu instalaketarako erabili nahi duzun hizkuntza: - -; *** Common wizard text -ClickNext=Klikatu Hurrengoa jarraitzeko, edo Utzi instalatzailetik irteteko. -BeveledLabel= -BrowseDialogTitle=Karpetak Arakatu -BrowseDialogLabel=Hautatu karpeta bat azpiko zerrendan, ondoren klikatu Ados. -NewFolderName=Karpeta Berria - -; *** "Welcome" wizard page -WelcomeLabel1=Ongietorri [name] Instalatzeko Morroira -WelcomeLabel2=Programa honek [name/ver] zure konputagailuan instalatuko du.%n%nGomendagarria da jarraitu aurretik gainontzeko aplikazioak ixtea. - -; *** "Password" wizard page -WizardPassword=Pasahitza -PasswordLabel1=Instalaketa hau pasahitzez babesturik dago. -PasswordLabel3=Sartu pasahitza, ondoren klikatu Hurrengoa jarraitzeko. Pasahitzetan maiuskulak bereizten dira. -PasswordEditLabel=&Pasahitza: -IncorrectPassword=Sartu duzun pasahitza ez da zuzena. Saiatu berriro. - -; *** "License Agreement" wizard page -WizardLicense=Lizentziaren Onarpena -LicenseLabel=Irakurri ondorengo argibide garrantzitsu hauek jarraitu aurretik. -LicenseLabel3=Irakurri ondorengo Lizentziaren Onarpena. Lizentzia honen baldintzak onartu behar dituzu instalaketaren jarraitu aurretik. -LicenseAccepted=Lizentziaren baldintzak &onartzen ditut -LicenseNotAccepted=&Ez ditut lizentziaren baldintzak onartzen - -; *** "Information" wizard pages -WizardInfoBefore=Argibideak -InfoBeforeLabel=Irakurri ondorengo argibide garrantzitsu hauek jarraitu aurretik. -InfoBeforeClickLabel=Instalaketarekin jarraitzeko gertu egotean, klikatu Hurrengoa. -WizardInfoAfter=Argibideak -InfoAfterLabel=Irakurri ondorengo argibide garrantzitsu hauek jarraitu aurretik. -InfoAfterClickLabel=Instalaketarekin jarraitzeko gertu egotean, klikatu Hurrengoa. - -; *** "User Information" wizard page -WizardUserInfo=Erabiltzailearen Datuak -UserInfoDesc=Sartu zure datuak. -UserInfoName=&Erabiltzaile Izena: -UserInfoOrg=E&rakundea: -UserInfoSerial=&Serie Zenbakia: -UserInfoNameRequired=Izen bat sartu behar duzu. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Hautatu Helburu Direktorioa -SelectDirDesc=Non instalatu beharko litzateke [name]? -SelectDirLabel3=Instalatzaileak [name] ondorengo karpetan instalatuko du. -SelectDirBrowseLabel=Jarraitzeko, klikatu Hurrengoa. Beste karpeta bat hautatu nahi baduzu, klikatu Arakatu. -DiskSpaceMBLabel=Gutxienez [mb] MBko toki hutsa behar da diskan. -ToUNCPathname=Instalatzaileak ezin du UNC bideizen baten instalatu. Sarean instalatzen saiatzen ari bazara, sareko diska bat mapeatu beharko duzu. -InvalidPath=Bideizen oso bat sartu behar duzu, unitate hizki eta guzti; adibidez:%n%nC:\APP%n%nedo UNC bideizen bat honela:%n%n\\zerbitzaria\elkarbanatua -InvalidDrive=Hautatu duzun unitatea edo UNC elkarbanatua ez dago edo ezin da bertara sartu. Hautatu beste bat. -DiskSpaceWarningTitle=Ez Dago Behar Beste Toki Diskan -DiskSpaceWarning=Instalatzaileak gutxienez %1 KBko toki hutsa behar du instalatzeko, baina hautaturiko unitateak %2 KB soilik ditu hutsik.%n%nHala ere jarraitu nahi duzu? -DirNameTooLong=Karpetaren izena edo bideizena luzeegia da. -InvalidDirName=Karpetaren izena ez da zuzena. -BadDirName32=Karpetaren izenak ezin dezake ondorengo karaktereetarik bat ere eduki:%n%n%1 -DirExistsTitle=Karpeta Badago -DirExists=Karpeta hau:%n%n%1%n%nlehendik ere badago. Hala ere bertan instalatu nahi duzu? -DirDoesntExistTitle=Karpeta Ez Dago -DirDoesntExist=Karpeta hau:%n%n%1%n%nez dago. Sortu nahi duzu? - -; *** "Select Components" wizard page -WizardSelectComponents=Hautatu Osagaiak -SelectComponentsDesc=Zein osagai instalatu behar dira? -SelectComponentsLabel2=Hautatu instalatu nahi dituzun osagaiak; garbitu instalatu nahi ez dituzunak. Klikatu Hurrengoa jarraitzeko gertu egotean. -FullInstallation=Guztia instalatu -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Instalaketa Trinkoa -CustomInstallation=Instalaketa Pertsonalizatua -NoUninstallWarningTitle=Osagai Hauek Badituzu -NoUninstallWarning=Instalatzaileak nabaritu du ondorengo osagaiok jadanik konputagailuan instalaturik dituzula:%n%n%1%n%nOsagai hauek ez aukeratzeak ez ditu desinstalatuko.%n%nHala ere jarraitu nahi duzu? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Uneko aukeraketak gutxienez [mb] MBko toki hutsa behar du diskan. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Hautatu Ataza Gehigarriak -SelectTasksDesc=Zein ataza gehigarri burutu behar dira? -SelectTasksLabel2=Hautatu [name] instalatu bitartean instalatzaileak burutu beharreko ataza gehigarriak, ondoren klikatu Hurrengoa. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Hautatu Hasi Menuko Karpeta -SelectStartMenuFolderDesc=Non sortu behar ditu instalatzaileak programaren lasterbideak? -SelectStartMenuFolderLabel3=Instalatzaileak Hasi Menuko ondorengo karpetan sortuko ditu programaren lasterbideak. -SelectStartMenuFolderBrowseLabel=Jarraitzeko, klikatu Hurrengoa. Beste karpeta bat hautatu nahi baduzu, klikatu Arakatu. -MustEnterGroupName=Karpeta izen bat sartu behar duzu. -GroupNameTooLong=Karpetaren izena edo bideizena luzeegia da. -InvalidGroupName=Karpetaren izena ez da zuzena. -BadGroupName=Karpetaren izenak ezin dezake ondorengo karaktereetarik bat ere eduki:%n%n%1 -NoProgramGroupCheck2=&Ez sortu Hasi Menuko karpetarik - -; *** "Ready to Install" wizard page -WizardReady=Instalatzeko Gertu -ReadyLabel1=Instalatzailea [name] zure konputagailuan instalatzen hasteko gertu dago. -ReadyLabel2a=Klikatu Instalatu instalaketarekin jarraitzeko, edo klikatu Aurrekoa ezarpenen bat berrikusi edo aldatu nahi baduzu. -ReadyLabel2b=Klikatu Instalatu instalaketarekin jarraitzeko. -ReadyMemoUserInfo=Erabiltzailearen datuak: -ReadyMemoDir=Helburu direktorioa: -ReadyMemoType=Instalaketa mota: -ReadyMemoComponents=Hautaturiko osagaiak: -ReadyMemoGroup=Hasi Menuko karpeta: -ReadyMemoTasks=Ataza gehigarriak: - -; *** "Preparing to Install" wizard page -WizardPreparing=Instalatzeko Gertatzen -PreparingDesc=Instalatzailea [name] zure konputagailuan instalatzeko gertatzen ari da. -PreviousInstallNotCompleted=Aurreko programa baten instalaketa/desinstalaketa ez da burutu. Instalaketa hura burutzeko konputagailua berrabiarazi beharko duzu.%n%nKonputagailua berrabiarazi ondoren, ireki instalatzailea berriro [name] instalatzen bukatzeko. -CannotContinue=Ezinezkoa da instalaketarekin jarraitzea. Klikatu Utzi irteteko. - -; *** "Installing" wizard page -WizardInstalling=Instalatzen -InstallingLabel=Itxaron instalatzaileak [name] zure konputagailuan instalatu artean. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=[name] Instalatzeko Morroia Burutzen -FinishedLabelNoIcons=Instalatzaileak [name] zure konputagailuan instalatu du. -FinishedLabel=Instalatzaileak [name] zure konputagailuan instalatu du. Aplikazioa abiarazteko instalaturiko ikonoetan klikatu. -ClickFinish=Klikatu Amaitu instalatzailetik irteteko. -FinishedRestartLabel=[name] programaren instalaketa burutzeko, instalatzaileak konputagailua berrabiarazi beharra du. Orain berrabiarazi nahi duzu? -FinishedRestartMessage=[name] programaren instalaketa burutzeko, instalatzaileak konputagailua berrabiarazi beharra du.%n%nOrain berrabiarazi nahi duzu? -ShowReadmeCheck=Bai, IRAKURRI fitxategia ikusi nahi dut -YesRadio=&Bai, berrabiarazi orain -NoRadio=&Ez, beranduago berrabiaraziko dut -; used for example as 'Run MyProg.exe' -RunEntryExec=Abiarazi %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Ikusi %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Instalatzaileak Hurrengo Diska Behar Du -SelectDiskLabel2=Sartu %1. diska eta klikatu Ados.%n%nDiska honetako fitxategiak ez badaude azpian ageri den karpetan, sartu bideizen egokia edo klikatu Arakatu. -PathLabel=&Bideizena: -FileNotInDir2="%1" fitxategia ezin izan da "%2" karpetan aurkitu. Sartu diska zuzena edo hautatu beste karpeta bat. -SelectDirectoryLabel=Zehaztu hurrengo diskaren kokapena. - -; *** Installation phase messages -SetupAborted=Instalaketa ez da burutu.%n%nKonpondu arazoa eta abiarazi instalatzailea berriro. -EntryAbortRetryIgnore=Klikatu Saiatu Berriz berriro saiatzeko, Ezikusi hala ere jarraitzeko, edo Utzi instalaketa uzteko. - -; *** Installation status messages -StatusCreateDirs=Direktorioak sortzen... -StatusExtractFiles=Fitxategiak ateratzen... -StatusCreateIcons=Lasterbideak sortzen... -StatusCreateIniEntries=INI sarrerak sortzen... -StatusCreateRegistryEntries=Erregistroko sarrerak sortzen... -StatusRegisterFiles=Fitxategiak erregistratzen... -StatusSavingUninstall=Desinstalaketarako datuak gordetzen... -StatusRunProgram=Instalaketa burutzen... -StatusRollback=Aldaketak desegiten... - -; *** Misc. errors -ErrorInternal2=Barneko akatsa: %1 -ErrorFunctionFailedNoCode=Hutsegitea: %1 -ErrorFunctionFailed=Hutsegitea: %1; Kodea: %2 -ErrorFunctionFailedWithMessage=Hutsegitea: %1; Kodea: %2.%n%3 -ErrorExecutingProgram=Ezin izan da fitxategi hau abiarazi:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Akatsa erregistroko gakoa irekitzean:%n%1\%2 -ErrorRegCreateKey=Akatsa erregistroko gakoa sortzean:%n%1\%2 -ErrorRegWriteKey=Akatsa erregistroko gakoa idaztean:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Akatsa "%1" fitxategian INI sarrera sortzean. - -; *** File copying errors -FileAbortRetryIgnore=Klikatu Saiatu Berriz berriro saiatzeko, Ezikusi fitxategi hau saltatzeko (ez da gomendagarria), edo Utzi instalaketa uzteko. -FileAbortRetryIgnore2=Klikatu Saiatu Berriz berriro saiatzeko, Ezikusi hala ere jarraitzeko (ez da gomendagarria), edo Utzi instalaketa uzteko. -SourceIsCorrupted=Iturburu fitxategia hondaturik dago -SourceDoesntExist=Ez dago "%1" izeneko iturburu fitxategirik -ExistingFileReadOnly=Lehendik zegoen fitxategia irakurtzeko-soilik gisa markaturik dago.%n%nKlikatu Saiatu Berriz irakurtzeko-soilik atributua ezabatu eta berriro saiatzeko, Ezikusi fitxategi hau saltatzeko, edo Utzi instalaketa uzteko. -ErrorReadingExistingDest=Akats bat izan da lehendik zegoen fitxategi hau irakurtzean: -FileExists=Fitxategia lehendik ere bazegoen.%n%nInstalatzaileak gainidatzi dezan nahi duzu? -ExistingFileNewer=Lehendik zegoen fitxategia Instalatzaileak instalatu nahi duena baino berriagoa da. Lehendik zegoena mantentzea gomendatzen da.%n%nLehengoa mantendu nahi duzu? -ErrorChangingAttr=Akats bat izan da lehendik zegoen fitxategi honen atributuak aldatzean: -ErrorCreatingTemp=Akats bat izan da ondorengo helburu direktorioan fitxategi bat sortzean: -ErrorReadingSource=Akats bat izan da iturburu fitxategia irakurtzean: -ErrorCopying=Akats bat izan da fitxategi hau kopiatzean: -ErrorReplacingExistingFile=Akats bat izan da lehendik zegoen fitxategi hau ordezkatzean: -ErrorRestartReplace=RestartReplacek huts egin du: -ErrorRenamingTemp=Akats bat izan da ondorengo helburu direktorioan fitxategi bat berrizendatzean: -ErrorRegisterServer=Ezinezkoa izan da DLL/OCX hau erregistratzea: %1 -ErrorRegSvr32Failed=RegSvr32k huts egin du %1 itxiera kodea emanez -ErrorRegisterTypeLib=Ezinezkoa izan da moten liburutegi hau erregistratzea: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Akats bat izan da IRAKURRI fitxategia irekitzean. -ErrorRestartingComputer=Instalatzaileak ezin izan du konputagailua berrabiarazi. Egin ezazu eskuz. - -; *** Uninstaller messages -UninstallNotFound=Ez da "%1" fitxategia aurkitu. Ezin izan da desinstalatu. -UninstallOpenError=Ezin izan da "%1" ireki. Ezin izan da desinstalatu -UninstallUnsupportedVer=Desinstalaketarako "%1" log fitxategia instalatzailearen bertsio honek ezagutzen ez duen formatu batean dago. Ezin izan da desinstalatu -UninstallUnknownEntry=Sarrera ezezagun bat (%1) aurkitu da desinstalaketarako logean -ConfirmUninstall=Ziur %1 eta bere osagai guztiak ezabatu nahi dituzula? -UninstallOnlyOnWin64=Instalaketa hau 64-biteko Windowsean soilik desinstala daiteke. -OnlyAdminCanUninstall=Instalaketa hau administratzaile eskumenak dituen erabiltzaile batek soilik desinstala dezake. -UninstallStatusLabel=Itxaron %1 zure konputagailutik ezabatzen den artean. -UninstalledAll=%1 arrakastatsuki ezabatu da zure konputagailutik. -UninstalledMost=%1 desinstalatu da.%n%nZenbait fitxategi ezin izan dira ezabatu. Fitxategi hauek eskuz ezaba daitezke. -UninstalledAndNeedsRestart=%1 guztiz desinstalatzeko, zure konputagailua berrabiarazi beharra dago.%n%nOrain berrabiarazi nahi duzu? -UninstallDataCorrupted="%1" fitxategia hondaturik dago. Ezin izan da desinstalatu - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Fitxategi Elkarbanatua Ezabatu? -ConfirmDeleteSharedFile2=Sistemaren arabera ondorengo fitxategi elkarbanatua ez du inongo programak erabiliko hemendik aurrera. Desinstalatzaileak fitxategi hau ezabatu nahi duzu?%n%nProgramaren bat fitxategi hau erabiltzen badabil oraindik eta ezabatzen baduzu, programa hori ez da egoki ibiliko. Ziur ez bazaude, hautatu Ez. Fitxategia sisteman uzteak ez dizu inongo kalterik eragingo. -SharedFileNameLabel=Fitxategi izena: -SharedFileLocationLabel=Kokapena: -WizardUninstalling=Desinstalaketaren Egoera -StatusUninstalling=Orain desinstalatzen: %1... - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 %2 bertsioa -AdditionalIcons=Ikono gehigarriak: -CreateDesktopIcon=&Mahaigainean lasterbidea sortu -CreateQuickLaunchIcon=&Ataza Barran lasterbidea sortu -ProgramOnTheWeb=%1 sarean -UninstallProgram=%1 desinstalatu -LaunchProgram=%1 abiarazi -AssocFileExtension=&Lotu %1 programa %2 fitxategi luzapenarekin -AssocingFileExtension=%1 programa %2 fitxategi luzapenarekin lotzen... diff --git a/Greenshot/tools/innosetup/Languages/BrazilianPortuguese.isl b/Greenshot/tools/innosetup/Languages/BrazilianPortuguese.isl deleted file mode 100644 index e9d420f86..000000000 --- a/Greenshot/tools/innosetup/Languages/BrazilianPortuguese.isl +++ /dev/null @@ -1,354 +0,0 @@ -; *************************************************************** -; *** *** -; *** Inno Setup version 5.5.3+ Portuguese (Brazil) messages *** -; *** *** -; *** Original Author: *** -; *** *** -; *** Paulo Andre Rosa (parosa@gmail.com) *** -; *** *** -; *** Maintainer: *** -; *** *** -; *** Eduardo Mauro (emauro@acabit.com.br) *** -; *** *** -; *** Contributors: *** -; *** *** -; *** Felipe (felipefpl@ig.com.br) *** -; *** Jeferson Oliveira (jefersonfoliveira@gmail.com) *** -; *** *** -; *************************************************************** - -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/is3rdparty.php -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Portugu<00EA>s (Brasil) -LanguageID=$0416 -LanguageCodePage=1252 - -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Programa de Instalao -SetupWindowTitle=%1 - Programa de Instalao -UninstallAppTitle=Desinstalar -UninstallAppFullTitle=Desinstalar %1 - -; *** Misc. common -InformationTitle=Informao -ConfirmTitle=Confirmao -ErrorTitle=Erro - -; *** SetupLdr messages -SetupLdrStartupMessage=Este programa instalar %1. Voc quer continuar? -LdrCannotCreateTemp=No foi possvel criar um arquivo temporrio. Instalao cancelada -LdrCannotExecTemp=No foi possvel executar um arquivo na pasta de arquivos temporrios. Instalao cancelada - -; *** Startup error messages -LastErrorMessage=%1.%n%nErro %2: %3 -SetupFileMissing=O arquivo %1 no se encontra no diretrio de instalao. Por favor, corrija o problema ou obtenha uma nova cpia do programa. -SetupFileCorrupt=Os arquivos de instalao esto corrompidos. Por favor, obtenha uma nova cpia do programa. -SetupFileCorruptOrWrongVer=Os arquivos de instalao esto corrompidos ou so incompatveis com esta verso do Instalador. Por favor, corrija o problema ou obtenha uma nova cpia do programa. -InvalidParameter=Um parmetro invlido foi passado na linha de comando:%n%n%1 -SetupAlreadyRunning=O programa de instalao j est sendo executado. -WindowsVersionNotSupported=Este programa no suporta a verso do Windows instalada em seu computador. -WindowsServicePackRequired=Este programa necessita %1 Service Pack %2 ou posterior. -NotOnThisPlatform=Este programa no executar no %1. -OnlyOnThisPlatform=Este programa deve ser executado no %1. -OnlyOnTheseArchitectures=Este programa s pode ser instalado em verses do Windows projetadas para as seguintes arquiteturas de processador:%n%n%1 -MissingWOW64APIs=A verso do Windows que voc est executando no inclui a funcionalidade requerida pelo Programa de Instalao para realizar uma instalao de 64 bits. Para corrigir este problema, por favor instale o Service Pack %1. -WinVersionTooLowError=Este programa requer %1 verso %2 ou posterior. -WinVersionTooHighError=Este programa no pode ser instalado em %1 verso %2 ou posterior. -AdminPrivilegesRequired=Voc deve estar logado como um administrador para instalar este programa. -PowerUserPrivilegesRequired=Voc deve estar logado como um administrador ou como membro do grupo Usurios Avanados para instalar este programa. -SetupAppRunningError=O Programa de Instalao detectou que %1 est sendo executado.%n%nPor favor, feche todas as instncias do programa agora e clique em OK para continuar, ou em Cancelar para sair. -UninstallAppRunningError=O Desinstalador detectou que %1 est em execuo atualmente.%n%nPor favor, feche todas as instncias dele agora, ento clique em OK para continuar, ou em Cancelar para sair. - -; *** Misc. errors -ErrorCreatingDir=O Programa de Instalao foi incapaz de criar o diretrio "%1" -ErrorTooManyFilesInDir=Incapaz de criar um arquivo no diretrio "%1" porque ele contm arquivos demais - -; *** Setup common messages -ExitSetupTitle=Sair do Programa de Instalao -ExitSetupMessage=A Instalao no foi concluda. Se voc sair agora, o programa no ser instalado.%n%nVoc pode executar o Programa de instalao novamente em outra hora, para concluir a instalao.%n%nSair do Programa de Instalao? -AboutSetupMenuItem=&Sobre o Programa de Instalao... -AboutSetupTitle=Sobre o Programa de Instalao -AboutSetupMessage=%1 verso %2%n%3%n%n%1 pgina na internet:%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< &Voltar -ButtonNext=&Avanar > -ButtonInstall=&Instalar -ButtonOK=OK -ButtonCancel=Cancelar -ButtonYes=&Sim -ButtonYesToAll=Sim para &Todos -ButtonNo=&No -ButtonNoToAll=N&o para Todos -ButtonFinish=&Concluir -ButtonBrowse=&Procurar... -ButtonWizardBrowse=P&rocurar... -ButtonNewFolder=&Criar Nova Pasta - -; *** "Select Language" dialog messages -SelectLanguageTitle=Selecionar Idioma do Programa de Instalao -SelectLanguageLabel=Selecione o idioma a ser utilizado durante a instalao: - -; *** Common wizard text -ClickNext=Clique em Avanar para continuar, ou em Cancelar para sair do Programa de Instalao. -BeveledLabel= -BrowseDialogTitle=Procurar Pasta -BrowseDialogLabel=Selecione uma pasta na lista abaixo e clique em OK. -NewFolderName=Nova Pasta - -; *** "Welcome" wizard page -WelcomeLabel1=Bem-vindo ao Assistente de Instalao de [name] -WelcomeLabel2=Este Assistente instalar [name/ver] no seu computador.%n%n recomendado que voc feche todos os outros aplicativos antes de continuar. - -; *** "Password" wizard page -WizardPassword=Senha -PasswordLabel1=Esta instalao protegida por senha. -PasswordLabel3=Por favor, fornea a senha e clique em Avanar para continuar. As senhas diferenciam maisculas de minsculas. -PasswordEditLabel=&Senha: -IncorrectPassword=A senha que voc informou no correta. Por favor, tente novamente. - -; *** "License Agreement" wizard page -WizardLicense=Contrato de Licena de Uso -LicenseLabel=Por favor, leia as seguintes informaes importantes antes de continuar. -LicenseLabel3=Por favor, leia o seguinte Contrato de Licena de Uso. Voc deve aceitar os termos do Contrato antes de prosseguir com a instalao. -LicenseAccepted=Eu aceito os termos do &Contrato -LicenseNotAccepted=Eu &no aceito os termos do Contrato - -; *** "Information" wizard pages -WizardInfoBefore=Informao -InfoBeforeLabel=Por favor, leia as seguintes informaes importantes antes de continuar. -InfoBeforeClickLabel=Quando voc estiver pronto para continuar, clique em Avanar. -WizardInfoAfter=Informao -InfoAfterLabel=Por favor, leia as seguintes informaes importantes antes de continuar. -InfoAfterClickLabel=Quando voc estiver pronto para continuar, clique Avanar. - -; *** "User Information" wizard page -WizardUserInfo=Informaes do Usurio -UserInfoDesc=Por favor, insira suas informaes. -UserInfoName=&Nome do Usurio: -UserInfoOrg=&Empresa: -UserInfoSerial=Nmero de &Srie: -UserInfoNameRequired=Voc deve informar um nome. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Selecione o Local de Destino -SelectDirDesc=Onde [name] deve ser instalado? -SelectDirLabel3=O Programa de Instalao instalar [name] na seguinte pasta. -SelectDirBrowseLabel=Para continuar, clique em Avanar. Se voc deseja escolher uma pasta diferente, clique em Procurar. -DiskSpaceMBLabel=So necessrios pelo menos [mb] MB de espao livre em disco. -CannotInstallToNetworkDrive=O programa de instalao no pode fazer a instalao em uma unidade de rede. -CannotInstallToUNCPath=O programa de instalao no fazer a instalao num caminhho de rede UNC. -InvalidPath=Voc deve informar um caminho completo, incluindo a letra da unidade de disco; por exemplo:%n%nC:\APP%n%e no um caminho de rede UNC na forma:%n%n\\servidor\compartilhamento -InvalidDrive=A unidade de disco ou compartilhamento de rede UNC que voc selecionou no existe ou no est acessvel. Por favor, selecione outro local. -DiskSpaceWarningTitle=Espao em Disco Insuficiente -DiskSpaceWarning=O Programa de Instalao requer pelo menos %1 KB de espao livre, mas a unidade de disco selecionada tem apenas %2 KB disponveis.%n%nVoc quer continuar assim mesmo? -DirNameTooLong=O nome da pasta ou caminho muito longo. -InvalidDirName=O nome da pasta no vlido. -BadDirName32=Nomes de pastas no podem incluir quaisquer dos seguintes caracteres:%n%n%1 -DirExistsTitle=A Pasta Existe -DirExists=A pasta:%n%n%1%n%nj existe. Voc quer instalar nesta pasta assim mesmo? -DirDoesntExistTitle=A Pasta No Existe -DirDoesntExist=A pasta:%n%n%1%n%nno existe. Voc gostaria que a pasta fosse criada? - -; *** "Select Components" wizard page -WizardSelectComponents=Selecionar Componentes -SelectComponentsDesc=Quais componentes devem ser instalados? -SelectComponentsLabel2=Selecione os componentes que voc quer instalar; desmarque os componentes que voc no quer instalar. Clique em Avanar quando estiver pronto para continuar. -FullInstallation=Instalao completa -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Instalao compacta -CustomInstallation=Instalao personalizada -NoUninstallWarningTitle=Componente Existe -NoUninstallWarning=O Programa de Instalao detectou que os seguintes componentes j esto instalados em seu computador:%n%n%1%n%nDesmarcar estes componentes, no ir desinstalar eles.%n%nVoc quer continuar assim mesmo? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=A seleo atual requer pelo menos [mb] MB de espao em disco. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Selecionar Tarefas Adicionais -SelectTasksDesc=Quais tarefas adicionais devem ser executadas? -SelectTasksLabel2=Selecione as tarefas adicionais que voc deseja que o Programa de Instalao execute enquanto instala [name] e clique em Avanar. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Selecionar a Pasta do Menu Iniciar -SelectStartMenuFolderDesc=Onde o Programa de Instalao deve colocar os atalhos do programa? -SelectStartMenuFolderLabel3=O Programa de Instalao ir criar os atalhos do programa na seguinte pasta do Menu Iniciar. -SelectStartMenuFolderBrowseLabel=Clique em Avanar para continuar. Se voc quiser escolher outra pasta, clique em Procurar. -MustEnterGroupName=Voc deve informar um nome de pasta. -GroupNameTooLong=O nome da pasta ou caminho muito longo. -InvalidGroupName=O nome da pasta no vlido. -BadGroupName=O nome da pasta no pode incluir quaisquer dos seguintes caracteres:%n%n%1 -NoProgramGroupCheck2=&No criar uma pasta no Menu Iniciar - -; *** "Ready to Install" wizard page -WizardReady=Pronto para Instalar -ReadyLabel1=O Programa de Instalao est pronto para comear a instalao de [name] no seu computador. -ReadyLabel2a=Clique Instalar para iniciar a instalao, ou clique em Voltar se voc quer revisar ou alterar alguma configurao. -ReadyLabel2b=Clique em Instalar para iniciar a instalao. -ReadyMemoUserInfo=Dados do Usurio: -ReadyMemoDir=Local de destino: -ReadyMemoType=Tipo de Instalao: -ReadyMemoComponents=Componentes selecionados: -ReadyMemoGroup=Pasta do Menu Iniciar: -ReadyMemoTasks=Tarefas adicionais: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparando para Instalar -PreparingDesc=O Programa de Instalao est se preparando para instalar [name] no seu computador. -PreviousInstallNotCompleted=A instalao/remoo de um programa anterior no foi concluda. Voc precisar reiniciar seu computador para finaliz-la.%n%nAps reiniciar o computador, execute novamente o Programa de Instalao para concluir a instalao de [name]. -CannotContinue=O Programa de Instalao no pode continuar. Por favor, clique em Cancelar para sair. -ApplicationsFound=As seguintes aplicaes estap usando arquivos que necessitam ser atualizados pelo programa de instalao. recomendvel que voc permita que o programa da instalao encerre automaticamente estas aplicaes. -ApplicationsFound2=As seguintes aplicaes esto usandos arquivos que necessitam ser atualizados pelo programa de instalao. recomendvel que voc permita que o programa da instalao encerre automaticamente estas aplicaes. Aps a instalao estar completa, o programa de instalao tentar iniciar novamente as aplicaes. -CloseApplications=&Automaticamente encerre as aplicaes -DontCloseApplications=&No encerre as aplicaes -ErrorCloseApplications=O instalador foi incapaz de fechar automaticamente todos os aplicativos. recomendado que voc feche todos os aplicativos usando os arquivos que precisam ser atualizados pelo Instalador antes de continuar. - -; *** "Installing" wizard page -WizardInstalling=Instalando -InstallingLabel=Por favor, aguarde enquanto o Programa de Instalao instala [name] no seu computador. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Finalizando o Assistente de Instalao de [name] -FinishedLabelNoIcons=O Programa de Instalao finalizou a instalao de [name] no seu computador. -FinishedLabel=O Programa de Instalao terminou de instalar [name] no seu computador. O programa pode ser iniciado clicando nos cones instalados. -ClickFinish=Clique em Concluir para sair do Programa de Instalao. -FinishedRestartLabel=Para concluir a instalao de [name], o Programa de Instalao deve reiniciar o computador. Voc gostaria de reiniciar agora? -FinishedRestartMessage=Para concluir a instalao de [name], o Programa de Instalao deve reiniciar o computador.%n%nVoc gostaria de reiniciar agora? -ShowReadmeCheck=Sim, eu quero visualizar o arquivo LEIA-ME -YesRadio=&Sim, reiniciar o computador agora -NoRadio=&No, eu vou reiniciar o computador depois -; used for example as 'Run MyProg.exe' -RunEntryExec=Executar %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Visualizar %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=O Programa de Instalao Precisa do Prximo Disco -SelectDiskLabel2=Por favor, insira o Disco %1 e clique em OK.%n%nSe os arquivos deste disco esto numa pasta diferente da indicada abaixo, informe o caminho correto ou clique em Procurar. -PathLabel=&Caminho: -FileNotInDir2=O arquivo "%1" no pde ser encontrado em "%2". Por favor, insira o disco correto ou escolha outra pasta. -SelectDirectoryLabel=Por favor, informe o local do prximo disco. - -; *** Installation phase messages -SetupAborted=A instalao no foi concluda.%n%nPor favor, corrija o problema e execute novamente o Programa de Instalao. -EntryAbortRetryIgnore=Clique Repetir para tentar novamente, Ignorar para continuar assim mesmo, or Cancelar para cancelar a instalao. - -; *** Installation status messages -StatusClosingApplications=Encerrando aplicaes... -StatusCreateDirs=Criando diretrios... -StatusExtractFiles=Extraindo arquivos... -StatusCreateIcons=Criando atalhos... -StatusCreateIniEntries=Criando entradas INI... -StatusCreateRegistryEntries=Criando entradas no Registro... -StatusRegisterFiles=Registrando arquivos... -StatusSavingUninstall=Salvando informaes de desinstalao... -StatusRunProgram=Finalizando a instalao... -StatusRestartingApplications=Reiniciando applicaes... -StatusRollback=Desfazendo as alteraes efetuadas... - -; *** Misc. errors -ErrorInternal2=Erro interno: %1 -ErrorFunctionFailedNoCode=%1 falhou -ErrorFunctionFailed=%1 falhou; cdigo %2 -ErrorFunctionFailedWithMessage=%1 falhou; cdigo %2.%n%3 -ErrorExecutingProgram=No foi possvel executar o arquivo:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Erro ao abrir a chave do registro:%n%1\%2 -ErrorRegCreateKey=Erro ao criar a chave do registro:%n%1\%2 -ErrorRegWriteKey=Erro ao escrever na chave do registro:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Erro ao criar entrada INI no arquivo "%1". - -; *** File copying errors -FileAbortRetryIgnore=Clique em Repetir para tentar novamente, em Ignorar para ignorar este arquivo (no recomendado) ou em Cancelar para cancelar a instalao. -FileAbortRetryIgnore2=Clique em Repetir para tentar novamente, em Ignorar para ignorar este arquivo (no recomendado) ou em Cancelar para cancelar a instalao. -SourceIsCorrupted=O arquivo de origem est corrompido -SourceDoesntExist=O arquivo de origem "%1" no existe -ExistingFileReadOnly=O arquivo existente est marcado como somente leitura.%n%nClique em Repetir para remover o atributo de somente leitura e tentar novamente, em Ignorar para ignorar este arquivo, ou em Anular para cancelar a instalao. -ErrorReadingExistingDest=Ocorreu um erro ao tentar ler o arquivo existente: -FileExists=O arquivo j existe.%n%nVoc quer que o Programa de Instalao sobrescreva o arquivo? -ExistingFileNewer=O arquivo j existente mais recente do que o arquivo que o Programa de Instalao est tentando instalar. Recomenda-se que voc mantenha o arquivo existente.%n%nVoc quer manter o arquivo existente? -ErrorChangingAttr=Ocorreu um erro ao tentar modificar os atributos do arquivo existente: -ErrorCreatingTemp=Ocorreu um erro ao tentar criar um arquivo nao diretrio de destino: -ErrorReadingSource=Ocorreu um erro ao tentar ler o arquivo de origem: -ErrorCopying=Ocorreu um erro ao tentar copiar um arquivo: -ErrorReplacingExistingFile=Ocorreu um erro ao tentar substituir o arquivo existente: -ErrorRestartReplace=Reiniciar/Substituir falhou: -ErrorRenamingTemp=Ocorreu um erro ao tentar renomear um arquivo no diretrio de destino: -ErrorRegisterServer=No foi possvel registrar a DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 falhou com o cdigo de sada %1 -ErrorRegisterTypeLib=No foi possvel registrar a biblioteca de tipos: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Ocorreu um erro ao tentar abrir o arquivo LEIA-ME. -ErrorRestartingComputer=O Programa de Instalao no conseguiu reiniciar o computador. Por favor, reinicie o computador manualmente. - -; *** Uninstaller messages -UninstallNotFound=O arquivo "%1" no existe. No possvel desinstalar. -UninstallOpenError=O arquivo "%1" no pode ser aberto. No possvel desinstalar -UninstallUnsupportedVer=O arquivo de log de desinstalao "%1" est num formato no reconhecido por esta verso do desinstalador. No possvel desinstalar -UninstallUnknownEntry=Foi encontrada uma entrada desconhecida (%1) no arquivo de log de desinstalao -ConfirmUninstall=Voc tem certeza que deseja remover completamente %1 e todos os seus componentes? -UninstallOnlyOnWin64=Esta instalao no pode ser desinstalada em Windows 64 bits. -OnlyAdminCanUninstall=Esta instalao s pode ser desinstalada por usurios com direitos administrativos. -UninstallStatusLabel=Por favor, aguarde enquanto %1 removido do seu computador. -UninstalledAll=%1 foi removido com sucesso do seu computador. -UninstalledMost=A desinstalao de %1 foi concluda.%n%nAlguns elementos no puderam ser removidos. Estes podem ser removidos manualmente. -UninstalledAndNeedsRestart=Para concluir a desinstalao de %1, o computador deve ser reiniciado.%n%nVoc quer que o computador seja reiniciado agora? -UninstallDataCorrupted=O arquivo "%1" est corrompido. No possvel desinstalar - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Remover Arquivo Compartilhado? -ConfirmDeleteSharedFile2=O sistema indica que o seguinte arquivo compartilhado no est mais em uso por nenhum outro programa. Voc quer que a desinstalao remova este arquivo compartilhado?%n%nSe ainda houver programas utilizando este arquivo e ele for removido, esses programas podero no funcionar corretamente. Se voc no tem certeza, escolha No. Manter o arquivo no seu computador no trar prejuzo algum. -SharedFileNameLabel=Nome do arquivo: -SharedFileLocationLabel=Local: -WizardUninstalling=Status da Desinstalao -StatusUninstalling=Desinstalando %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Instalando %1. -ShutdownBlockReasonUninstallingApp=Removendo %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 verso %2 -AdditionalIcons=cones adicionais: -CreateDesktopIcon=Criar um cone na rea de &Trabalho -CreateQuickLaunchIcon=Criar um cone na &Barra de Inicializao Rpida -ProgramOnTheWeb=%1 na Internet -UninstallProgram=Desinstalar %1 -LaunchProgram=Executar %1 -AssocFileExtension=Associar %1 com a e&xtenso de arquivo %2 -AssocingFileExtension=Associando %1 com a extenso de arquivo... -AutoStartProgramGroupDescription=Startup: -AutoStartProgram=Iniciar automaticamente %1 -AddonHostProgramNotFound=%1 no pde ser localizado na pasta que voc selecionou.%n%nVoc deseja continuar assim mesmo? diff --git a/Greenshot/tools/innosetup/Languages/Catalan.isl b/Greenshot/tools/innosetup/Languages/Catalan.isl deleted file mode 100644 index 72ccd6bc3..000000000 --- a/Greenshot/tools/innosetup/Languages/Catalan.isl +++ /dev/null @@ -1,319 +0,0 @@ -; *** Inno Setup version 5.5.3+ Catalan messages *** -; -; Translated by Carles Millan (email: carles@carlesmillan.cat) - -[LangOptions] - -LanguageName=Catal<00E0> -LanguageID=$0403 -LanguageCodePage=1252 - -[Messages] - -; *** Application titles -SetupAppTitle=Installaci -SetupWindowTitle=Installaci - %1 -UninstallAppTitle=Desinstallaci -UninstallAppFullTitle=Desinstalla %1 - -; *** Misc. common -InformationTitle=Informaci -ConfirmTitle=Confirmaci -ErrorTitle=Error - -; *** SetupLdr messages -SetupLdrStartupMessage=Aquest programa installar %1. Voleu continuar? -LdrCannotCreateTemp=No s'ha pogut crear un fitxer temporal. Installaci cancellada -LdrCannotExecTemp=No s'ha pogut executar el fitxer a la carpeta temporal. Installaci cancellada - -; *** Startup error messages -LastErrorMessage=%1.%n%nError %2: %3 -SetupFileMissing=El fitxer %1 no es troba a la carpeta d'installaci. Resoleu el problema o obteniu una nova cpia del programa. -SetupFileCorrupt=Els fitxers d'installaci estan corromputs. Obteniu una nova cpia del programa. -SetupFileCorruptOrWrongVer=Els fitxers d'installaci estan espatllats, o sn incompatibles amb aquesta versi del programa. Resoleu el problema o obteniu una nova cpia del programa. -InvalidParameter=Un parmetre invlid ha estat passat a la lnia de comanda:%n%n%1 -SetupAlreadyRunning=La installaci ja est en curs. -WindowsVersionNotSupported=Aquest programa no suporta la versi de Windows installada al vostre ordinador. -WindowsServicePackRequired=Aquest programa necessita %1 Service Pack %2 o posterior. -NotOnThisPlatform=Aquest programa no funcionar sota %1. -OnlyOnThisPlatform=Aquest programa noms pot ser executat sota %1. -OnlyOnTheseArchitectures=Aquest programa noms pot ser installat en versions de Windows dissenyades per a les segents arquitectures de processador:%n%n%1 -MissingWOW64APIs=Aquesta versi de Windows no cont la funcionalitat necessria per a realitzar una installaci de 64 bits. Per tal de corregir aquest problema installeu el Service Pack %1. -WinVersionTooLowError=Aquest programa requereix %1 versi %2 o posterior. -WinVersionTooHighError=Aquest programa no pot ser installat sota %1 versi %2 o posterior. -AdminPrivilegesRequired=Cal que tingueu privilegis d'administrador per poder installar aquest programa. -PowerUserPrivilegesRequired=Cal que accediu com a administrador o com a membre del grup Power Users en installar aquest programa. -SetupAppRunningError=El programa d'installaci ha detectat que %1 s'est executant actualment.%n%nTanqueu el programa i premeu Accepta per a continuar o Cancella per a sortir. -UninstallAppRunningError=El programa de desinstallaci ha detectat que %1 s'est executant en aquest moment.%n%nTanqueu el programa i premeu Accepta per a continuar o Cancella per a sortir. - -; *** Misc. errors -ErrorCreatingDir=El programa d'installaci no ha pogut crear la carpeta "%1" -ErrorTooManyFilesInDir=No s'ha pogut crear un fitxer a la carpeta "%1" perqu cont massa fitxers - -; *** Setup common messages -ExitSetupTitle=Surt -ExitSetupMessage=La installaci no s'ha completat. Si sortiu ara, el programa no ser installat.%n%nPer a completar-la podreu tornar a executar el programa d'installaci quan vulgueu.%n%nVoleu sortir-ne? -AboutSetupMenuItem=&Sobre la installaci... -AboutSetupTitle=Sobre la installaci -AboutSetupMessage=%1 versi %2%n%3%n%nPgina web de %1:%n%4 -AboutSetupNote= -TranslatorNote=Catalan translation by Carles Millan (carles at carlesmillan.cat) - -; *** Buttons -ButtonBack=< &Enrere -ButtonNext=&Segent > -ButtonInstall=&Installa -ButtonOK=Accepta -ButtonCancel=Cancella -ButtonYes=&S -ButtonYesToAll=S a &tot -ButtonNo=&No -ButtonNoToAll=N&o a tot -ButtonFinish=&Finalitza -ButtonBrowse=&Explora... -ButtonWizardBrowse=&Cerca... -ButtonNewFolder=Crea &nova carpeta - -; *** "Select Language" dialog messages -SelectLanguageTitle=Trieu idioma -SelectLanguageLabel=Trieu idioma a emprar durant la installaci: - -; *** Common wizard text -ClickNext=Premeu Segent per a continuar o Cancella per a abandonar la installaci. -BeveledLabel= -BrowseDialogTitle=Trieu una carpeta -BrowseDialogLabel=Trieu la carpeta de destinaci i premeu Accepta. -NewFolderName=Nova carpeta - -; *** "Welcome" wizard page -WelcomeLabel1=Benvingut a l'assistent d'installaci de [name] -WelcomeLabel2=Aquest programa installar [name/ver] al vostre ordinador.%n%ns molt recomanable que abans de continuar tanqueu tots els altres programes oberts, per tal d'evitar conflictes durant el procs d'installaci. - -; *** "Password" wizard page -WizardPassword=Contrasenya -PasswordLabel1=Aquesta installaci est protegida amb una contrasenya. -PasswordLabel3=Indiqueu la contrasenya i premeu Segent per a continuar. Aquesta contrasenya distingeix entre majscules i minscules. -PasswordEditLabel=&Contrasenya: -IncorrectPassword=La contrasenya introduda no s correcta. Torneu-ho a intentar. - -; *** "License Agreement" wizard page -WizardLicense=Acord de Llicncia -LicenseLabel=Cal que llegiu aquesta informaci abans de continuar. -LicenseLabel3=Cal que llegiu l'Acord de Llicncia segent. Cal que n'accepteu els termes abans de continuar amb la installaci. -LicenseAccepted=&Accepto l'acord -LicenseNotAccepted=&No accepto l'acord - -; *** "Information" wizard pages -WizardInfoBefore=Informaci -InfoBeforeLabel=Llegiu la informaci segent abans de continuar. -InfoBeforeClickLabel=Quan estigueu preparat per a continuar, premeu Segent. -WizardInfoAfter=Informaci -InfoAfterLabel=Llegiu la informaci segent abans de continuar. -InfoAfterClickLabel=Quan estigueu preparat per a continuar, premeu Segent - -; *** "User Information" wizard page -WizardUserInfo=Informaci sobre l'usuari -UserInfoDesc=Introduu la vostra informaci. -UserInfoName=&Nom de l'usuari: -UserInfoOrg=&Organitzaci -UserInfoSerial=&Nmero de srie: -UserInfoNameRequired=Cal que hi introduu un nom - -; *** "Select Destination Location" wizard page -WizardSelectDir=Trieu Carpeta de Destinaci -SelectDirDesc=On s'ha d'installar [name]? -SelectDirLabel3=El programa d'installaci installar [name] a la carpeta segent. -SelectDirBrowseLabel=Per a continuar, premeu Segent. Si desitgeu triar una altra capeta, premeu Cerca. -DiskSpaceMBLabel=Aquest programa necessita un mnim de [mb] MB d'espai a disc. -CannotInstallToNetworkDrive=La installaci no es pot fer en un disc de xarxa. -CannotInstallToUNCPath=La installaci no es pot fer a una ruta UNC. -InvalidPath=Cal donar una ruta completa amb lletra d'unitat, per exemple:%n%nC:\Aplicaci%n%no b una ruta UNC en la forma:%n%n\\servidor\compartit -InvalidDrive=El disc o ruta de xarxa seleccionat no existeix, trieu-ne un altre. -DiskSpaceWarningTitle=No hi ha prou espai al disc -DiskSpaceWarning=El programa d'installaci necessita com a mnim %1 KB d'espai lliure, per el disc seleccionat noms t %2 KB disponibles.%n%nTot i amb aix, desitgeu continuar? -DirNameTooLong=El nom de la carpeta o de la ruta s massa llarg. -InvalidDirName=El nom de la carpeta no s vlid. -BadDirName32=Un nom de carpeta no pot contenir cap dels carcters segents:%n%n%1 -DirExistsTitle=La carpeta existeix -DirExists=La carpeta:%n%n%1%n%nja existeix. Voleu installar igualment el programa en aquesta carpeta? -DirDoesntExistTitle=La Carpeta No Existeix -DirDoesntExist=La carpeta:%n%n%1%n%nno existeix. Voleu que sigui creada? - -; *** "Select Program Group" wizard page -WizardSelectComponents=Trieu Components -SelectComponentsDesc=Quins components cal installar? -SelectComponentsLabel2=Trieu els components que voleu installar; elimineu els components que no voleu installar. Premeu Segent per a continuar. -FullInstallation=Installaci completa -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Installaci compacta -CustomInstallation=Installaci personalitzada -NoUninstallWarningTitle=Els components Existeixen -NoUninstallWarning=El programa d'installaci ha detectat que els components segents ja es troben al vostre ordinador:%n%n%1%n%nSi no estan seleccionats no seran desinstallats.%n%nVoleu continuar igualment? -ComponentSize1=%1 Kb -ComponentSize2=%1 Mb -ComponentsDiskSpaceMBLabel=Aquesta selecci requereix un mnim de [mb] Mb d'espai al disc. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Trieu tasques addicionals -SelectTasksDesc=Quines tasques addicionals cal executar? -SelectTasksLabel2=Trieu les tasques addicionals que voleu que siguin executades mentre s'installa [name], i desprs premeu Segent. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Trieu la carpeta del Men Inici -SelectStartMenuFolderDesc=On cal situar els enllaos del programa? -SelectStartMenuFolderLabel3=El programa d'installaci crear l'accs directe al programa a la segent carpeta del men d'Inici. -SelectStartMenuFolderBrowseLabel=Per a continuar, premeu Segent. Si desitgeu triar una altra carpeta, premeu Cerca. -MustEnterGroupName=Cal que hi introduu un nom de carpeta. -GroupNameTooLong=El nom de la carpeta o de la ruta s massa llarg. -InvalidGroupName=El nom de la carpeta no s vlid. -BadGroupName=El nom del grup no pot contenir cap dels carcters segents:%n%n%1 -NoProgramGroupCheck2=&No cres una carpeta al Men Inici - -; *** "Ready to Install" wizard page -WizardReady=Preparat per a installar -ReadyLabel1=El programa d'installaci est preparat per a iniciar la installaci de [name] al vostre ordinador. -ReadyLabel2a=Premeu Installa per a continuar amb la installaci, o Enrere si voleu revisar o modificar les opcions d'installaci. -ReadyLabel2b=Premeu Installa per a continuar amb la installaci. -ReadyMemoUserInfo=Informaci de l'usuari: -ReadyMemoDir=Carpeta de destinaci: -ReadyMemoType=Tipus d'installaci: -ReadyMemoComponents=Components seleccionats: -ReadyMemoGroup=Carpeta del Men Inici: -ReadyMemoTasks=Tasques addicionals: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparant la installaci -PreparingDesc=Preparant la installaci de [name] al vostre ordinador. -PreviousInstallNotCompleted=La installaci o desinstallaci anterior no s'ha dut a terme. Caldr que reinicieu l'ordinador per a finalitzar aquesta installaci.%n%nDesprs de reiniciar l'ordinador, executeu aquest programa de nou per completar la installaci de [name]. -CannotContinue=La installaci no pot continuar. Premeu Cancella per a sortir. -ApplicationsFound=Les segents aplicacions estan fent servir fitxers que necessiten ser actualitzats per la installaci. Es recomana que permeteu a la installaci tancar automticament aquestes aplicacions. -ApplicationsFound2=Les segents aplicacions estan fent servir fitxers que necessiten ser actualitzats per la installaci. Es recomana que permeteu a la installaci tancar automticament aquestes aplicacions. Desprs de completar la installaci s'intentar reiniciar les aplicacions. -CloseApplications=&Tanca automticament les aplicacions -DontCloseApplications=&No tanquis les aplicacions -ErrorCloseApplications=El programa d'installaci no ha pogut tancar automticament totes les aplicacions. Es recomana que abans de continuar tanqueu totes les aplicacions que estan usant fitxers que han de ser actualitzats pel programa d'installaci. - -; *** "Installing" wizard page -WizardInstalling=Installant -InstallingLabel=Espereu mentre s'installa [name] al vostre ordinador. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Completant l'assistent d'installaci de [name] -FinishedLabelNoIcons=El programa ha finalitzat la installaci de [name] al vostre ordinador. -FinishedLabel=El programa ha finalitzat la installaci de [name] al vostre ordinador. L'aplicaci pot ser iniciada seleccionant les icones installades. -ClickFinish=Premeu Finalitza per a sortir de la installaci. -FinishedRestartLabel=Per a completar la installaci de [name] cal reiniciar l'ordinador. Voleu fer-ho ara? -FinishedRestartMessage=Per a completar la installaci de [name] cal reiniciar l'ordinador. Voleu fer-ho ara? -ShowReadmeCheck=S, vull visualitzar el fitxer LLEGIUME.TXT -YesRadio=&S, reiniciar l'ordinador ara -NoRadio=&No, reiniciar l'ordinador ms tard -; used for example as 'Run MyProg.exe' -RunEntryExec=Executa %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Visualitza %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=El programa d'installaci necessita el disc segent -SelectDiskLabel2=Introduiu el disc %1 i premeu Continua.%n%nSi els fitxers d'aquest disc es poden trobar en una carpeta diferent de la indicada tot seguit, introduu-ne la ruta correcta o b premeu Explora. -PathLabel=&Ruta: -FileNotInDir2=El fitxer "%1" no s'ha pogut trobar a "%2". Introduu el disc correcte o trieu una altra carpeta. -SelectDirectoryLabel=Indiqueu on es troba el disc segent. - -; *** Installation phase messages -SetupAborted=La installaci no s'ha completat.%n%n%Resoleu el problema i executeu de nou el programa d'installaci. -EntryAbortRetryIgnore=Premeu Reintenta per a intentar-ho de nou, Ignora per a continuar igualment, o Abandona per a abandonar la installaci. - -; *** Installation status messages -StatusClosingApplications=Tancant aplicacions... -StatusCreateDirs=Creant carpetes... -StatusExtractFiles=Extraient fitxers... -StatusCreateIcons=Creant enllaos del programa... -StatusCreateIniEntries=Creant entrades al fitxer INI... -StatusCreateRegistryEntries=Creant entrades de registre... -StatusRegisterFiles=Registrant fitxers... -StatusSavingUninstall=Desant informaci de desinstallaci... -StatusRunProgram=Finalitzant la installaci... -StatusRestartingApplications=Reiniciant aplicacions... -StatusRollback=Desfent els canvis... - -; *** Misc. errors -ErrorInternal2=Error intern: %1 -ErrorFunctionFailedNoCode=%1 ha fallat -ErrorFunctionFailed=%1 ha fallat; codi %2 -ErrorFunctionFailedWithMessage=%1 ha fallat; codi %2.%n%3 -ErrorExecutingProgram=No es pot executar el fitxer:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Error en obrir la clau de registre:%n%1\%2 -ErrorRegCreateKey=Error en crear la clau de registre:%n%1\%2 -ErrorRegWriteKey=Error en escriure a la clau de registre:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Error en crear l'entrada INI al fitxer "%1". - -; *** File copying errors -FileAbortRetryIgnore=Premeu Reintenta per a intentar-ho de nou, Ignora per a saltar-se aquest fitxer (no recomanat), o Abandona per a abandonar la installaci. -FileAbortRetryIgnore2=Premeu Reintenta per a intentar-ho de nou, Ignora per a continuar igualment (no recomanat), o Abandona per a abandonar la installaci. -SourceIsCorrupted=El fitxer d'origen est corromput -SourceDoesntExist=El fitxer d'origen "%1" no existeix -ExistingFileReadOnly=El fitxer s de noms lectura.%n%nPremeu Reintenta per a treure-li l'atribut de noms lectura i tornar-ho a intentar, Ignora per a saltar-se'l (no recomanat), o Abandona per a abandonar la installaci. -ErrorReadingExistingDest=S'ha produt un error en llegir el fitxer: -FileExists=El fitxer ja existeix.%n%nVoleu que sigui sobre-escrit? -ExistingFileNewer=El fitxer existent s ms nou que el que s'intenta installar. Es recomana mantenir el fitxer existent.%n%nVoleu mantenir-lo? -ErrorChangingAttr=Hi ha hagut un error en canviar els atributs del fitxer: -ErrorCreatingTemp=Hi ha hagut un error en crear un fitxer a la carpeta de destinaci: -ErrorReadingSource=Hi ha hagut un error en llegir el fitxer d'origen: -ErrorCopying=Hi ha hagut un error en copiar un fitxer: -ErrorReplacingExistingFile=Hi ha hagut un error en reemplaar el fitxer existent: -ErrorRestartReplace=Ha fallat reemplaar: -ErrorRenamingTemp=Hi ha hagut un error en reanomenar un fitxer a la carpeta de destinaci: -ErrorRegisterServer=No s'ha pogut registrar el DLL/OCX: %1 -ErrorRegSvr32Failed=Ha fallat RegSvr32 amb el codi de sortida %1 -ErrorRegisterTypeLib=No s'ha pogut registrar la biblioteca de tipus: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Hi ha hagut un error en obrir el fitxer LLEGIUME.TXT. -ErrorRestartingComputer=El programa d'installaci no ha pogut reiniciar l'ordinador. Cal que ho feu manualment. - -; *** Uninstaller messages -UninstallNotFound=El fitxer "%1" no existeix. No es pot desinstallar. -UninstallOpenError=El fitxer "%1" no pot ser obert. No es pot desinstallar -UninstallUnsupportedVer=El fitxer de desinstallaci "%1" est en un format no reconegut per aquesta versi del desinstallador. No es pot desinstallar -UninstallUnknownEntry=S'ha trobat una entrada desconeguda (%1) al fitxer de desinstallaci. -ConfirmUninstall=Esteu segur de voler eliminar completament %1 i tots els seus components? -UninstallOnlyOnWin64=Aquest programa noms pot ser desinstallat en Windows de 64 bits. -OnlyAdminCanUninstall=Aquest programa noms pot ser desinstallat per un usuari amb privilegis d'administrador. -UninstallStatusLabel=Espereu mentre s'elimina %1 del vostre ordinador. -UninstalledAll=%1 ha estat desinstallat correctament del vostre ordinador. -UninstalledMost=Desinstallaci de %1 completada.%n%nAlguns elements no s'han pogut eliminar. Poden ser eliminats manualment. -UninstalledAndNeedsRestart=Per completar la installaci de %1, cal reiniciar el vostre ordinador.%n%nVoleu fer-ho ara? -UninstallDataCorrupted=El fitxer "%1" est corromput. No es pot desinstallar. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Eliminar fitxer compartit? -ConfirmDeleteSharedFile2=El sistema indica que el fitxer compartit segent ja no s emprat per cap altre programa. Voleu que la desinstallaci elimini aquest fitxer?%n%nSi algun programa encara el fa servir i s eliminat, podria no funcionar correctament. Si no n'esteu segur, trieu No. Deixar el fitxer al sistema no far cap mal. -SharedFileNameLabel=Nom del fitxer: -SharedFileLocationLabel=Localitzaci: -WizardUninstalling=Estat de la desinstallaci -StatusUninstalling=Desinstallant %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installant %1. -ShutdownBlockReasonUninstallingApp=Desinstallant %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versi %2 -AdditionalIcons=Icones addicionals: -CreateDesktopIcon=Crea una icona a l'&Escriptori -CreateQuickLaunchIcon=Crea una icona a la &Barra de tasques -ProgramOnTheWeb=%1 a Internet -UninstallProgram=Desinstalla %1 -LaunchProgram=Obre %1 -AssocFileExtension=&Associa %1 amb l'extensi de fitxer %2 -AssocingFileExtension=Associant %1 amb l'extensi de fitxer %2... -AutoStartProgramGroupDescription=Inici: -AutoStartProgram=Inicia automticament %1 -AddonHostProgramNotFound=%1 no ha pogut ser trobat a la carpeta seleccionada.%n%nVoleu continuar igualment? diff --git a/Greenshot/tools/innosetup/Languages/ChineseSimplified.isl b/Greenshot/tools/innosetup/Languages/ChineseSimplified.isl deleted file mode 100644 index 9cf26394d..000000000 --- a/Greenshot/tools/innosetup/Languages/ChineseSimplified.isl +++ /dev/null @@ -1,336 +0,0 @@ -; *** Inno Setup version 5.5.0+ Chinese (Simplified) messages *** -; by Mack Zhang (hua_wuxin@21cn.com) -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=<4E2D><6587><FF08><7B80><4F53><FF09> -LanguageID=$0804 -LanguageCodePage=936 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -DialogFontName= -DialogFontSize=9 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=װ -SetupWindowTitle=װ - %1 -UninstallAppTitle=ж -UninstallAppFullTitle=%1 ж - -; *** Misc. common -InformationTitle=Ϣ -ConfirmTitle=ȷ -ErrorTitle= - -; *** SetupLdr messages -SetupLdrStartupMessage=װ򵼽ĵϰװ %1ȷҪ -LdrCannotCreateTemp=޷ʱļװֹ -LdrCannotExecTemp=޷ʱļеļװֹ - -; *** Startup error messages -LastErrorMessage=%1.%n%n %2%3 -SetupFileMissing=װļȱļ %1ȡ°汾 -SetupFileCorrupt=װļ𻵡ȡ°汾 -SetupFileCorruptOrWrongVer=װļ𻵣뱾װ򵼵İ汾ݡȡ°汾 -InvalidParameter=һIJݵУ%n%n%1 -SetupAlreadyRunning=װѾС -WindowsVersionNotSupported=֧ĵе Windows 汾 -WindowsServicePackRequired=Ҫ %1 Service Pack %2 µİ汾 -NotOnThisPlatform= %1 С -OnlyOnThisPlatform= %1 С -OnlyOnTheseArchitectures=ֻܰװΪдܹƵ Windows 汾У%n%n%1 -MissingWOW64APIs=ǰ Windows 汾ûаִ 64 λװĺҪ⣬밲װ Service Pack %1 -WinVersionTooLowError=Ҫ %1 v%2 ߰汾 -WinVersionTooHighError=ܰװ %1 v%2 ߰汾ϡ -AdminPrivilegesRequired=װʱԹԱݵ¼ -PowerUserPrivilegesRequired=װʱԹԱ Power Users Աݵ¼ -SetupAppRunningError=װ򵼷 %1 С%n%nرʵȻ󵥻ȷ򵥻ȡ˳ -UninstallAppRunningError=ж򵼷 %1 С%n%nرʵȻ󵥻ȷ򵥻ȡ˳ - -; *** Misc. errors -ErrorCreatingDir=װ޷ļС%1 -ErrorTooManyFilesInDir=޷ļС%1дļΪ̫ļ - -; *** Setup common messages -ExitSetupTitle=˳װ -ExitSetupMessage=װδɡ˳ᰲװ%n%nʱаװɰװ%n%n˳װ -AboutSetupMenuItem=ڰװ(&A) -AboutSetupTitle=ڰװ -AboutSetupMessage=%1 汾 %2%n%3%n%n%1 ҳ%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< һ(&B) -ButtonNext=һ(&N) > -ButtonInstall=װ(&I) -ButtonOK=ȷ -ButtonCancel=ȡ -ButtonYes=(&Y) -ButtonYesToAll=ȫ(&A) -ButtonNo=(&N) -ButtonNoToAll=ȫ(&O) -ButtonFinish=(&F) -ButtonBrowse=(&B) -ButtonWizardBrowse=(&R) -ButtonNewFolder=ļ(&M) - -; *** "Select Language" dialog messages -SelectLanguageTitle=ѡװ -SelectLanguageLabel=ѡװڼҪʹõԣ - -; *** Common wizard text -ClickNext=һ򵥻ȡ˳װ -BeveledLabel= -BrowseDialogTitle=ļ -BrowseDialogLabel=ѡһļУȻ󵥻ȷ -NewFolderName=½ļ - -; *** "Welcome" wizard page -WelcomeLabel1=ӭʹ [name] װ -WelcomeLabel2=װ򵼽ĵϰװ [name/ver]%n%nڼ֮ǰرӦó - -; *** "Password" wizard page -WizardPassword= -PasswordLabel1=װ뱣 -PasswordLabel3=룬Ȼ󵥻һһִСд -PasswordEditLabel=(&P) -IncorrectPassword=벻ȷԡ - -; *** "License Agreement" wizard page -WizardLicense=Э -LicenseLabel=ڼ֮ǰĶҪϢ -LicenseLabel3=ĶЭ顣ڼװ֮ǰܴЭ -LicenseAccepted=ҽЭ(&A) -LicenseNotAccepted=ҲЭ(&D) - -; *** "Information" wizard pages -WizardInfoBefore=Ϣ -InfoBeforeLabel=ڼ֮ǰĶҪϢ -InfoBeforeClickLabel=׼üװ뵥һ -WizardInfoAfter=Ϣ -InfoAfterLabel=ڼ֮ǰĶҪϢ -InfoAfterClickLabel=׼üװ뵥һ - -; *** "User Information" wizard page -WizardUserInfo=ûϢ -UserInfoDesc=Ϣ -UserInfoName=û(&U) -UserInfoOrg=֯(&O) -UserInfoSerial=к(&S) -UserInfoNameRequired=û - -; *** "Select Destination Location" wizard page -WizardSelectDir=ѡĿλ -SelectDirDesc= [name] װ -SelectDirLabel3=װ򵼽 [name] װļС -SelectDirBrowseLabel=ҪһҪѡͬļУ뵥 -DiskSpaceMBLabel=Ҫ [mb] MB Ŀд̿ռ䡣 -CannotInstallToNetworkDrive=޷װ -CannotInstallToUNCPath=޷װ UNC · -InvalidPath=̷·磺%n%nC:\APP%n%n UNC ·ʽ%n%n\\server\share -InvalidDrive=ѡ UNC ڻ򲻿ɷʡѡ -DiskSpaceWarningTitle=û㹻Ĵ̿ռ -DiskSpaceWarning=װҪ %1 KB ʣռ䣬ѡֻ %2 KB á%n%nȻҪ -DirNameTooLong=ļƻ·̫ -InvalidDirName=ļЧ -BadDirName32=ļƲַܰ%n%n%1 -DirExistsTitle=ļѴ -DirExists=ļУ%n%n%1%n%nѴڡȷҪװļ -DirDoesntExistTitle=ļв -DirDoesntExist=ļУ%n%n%1%n%nڡļ - -; *** "Select Components" wizard page -WizardSelectComponents=ѡ -SelectComponentsDesc=ҪװЩ -SelectComponentsLabel2=ѡҪװ㲻밲װ׼úһ -FullInstallation=װ -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=లװ -CustomInstallation=ưװ -NoUninstallWarningTitle=Ѵ -NoUninstallWarning=װ򵼷Ѿװ%n%n%1%n%nȡѡжЩ%n%nװ -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=ǰѡҪ [mb] MB ̿ռ䡣 - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=ѡ񸽼 -SelectTasksDesc=ҪִЩ -SelectTasksLabel2=ѡڰװ [name] ڼ䰲װҪִеĸȻһ - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=ѡʼ˵ļ -SelectStartMenuFolderDesc=ѳݷʽŵ -SelectStartMenuFolderLabel3=װ򵼽¿ʼ˵ļдݷʽ -SelectStartMenuFolderBrowseLabel=һһҪѡͬļУ -MustEnterGroupName=ļ -GroupNameTooLong=ļƻ·̫ -InvalidGroupName=ļЧ -BadGroupName=ļƲַܰ%n%n%1 -NoProgramGroupCheck2=ʼ˵ļ(&D) - -; *** "Ready to Install" wizard page -WizardReady=׼װ -ReadyLabel1=װ׼ʼװ [name] -ReadyLabel2a=װװҪ鿴߸һ -ReadyLabel2b=װװ -ReadyMemoUserInfo=ûϢ -ReadyMemoDir=Ŀλã -ReadyMemoType=װͣ -ReadyMemoComponents=ѡ -ReadyMemoGroup=ʼ˵ļУ -ReadyMemoTasks= - -; *** "Preparing to Install" wizard page -WizardPreparing=׼װ -PreparingDesc=װ׼װ [name] -PreviousInstallNotCompleted=ǰİװ/жδɡҪɰװ%n%n֮аװ [name] İװ -CannotContinue=װܼȡ˳ -ApplicationsFound=װҪ±ӦóռõļԶرЩӦó -ApplicationsFound2=װҪ±ӦóռõļԶرЩӦó򡣰װɺ󣬰װ򵼻᳢ЩӦó -CloseApplications=ԶرӦó(&A) -DontCloseApplications=ԶرӦó(&D) - -; *** "Installing" wizard page -WizardInstalling=ڰװ -InstallingLabel=ļаװ [name]Եȡ - -; *** "Setup Completed" wizard page -FinishedHeadingLabel= [name] װ -FinishedLabelNoIcons=װ [name] İװ -FinishedLabel=װ [name] İװͨѡѰװͼӦó -ClickFinish=ɡ˳װ -FinishedRestartLabel=Ϊ [name] İװװ򵼱ԡҪ -FinishedRestartMessage=Ϊ [name] İװװ򵼱ԡ%n%nҪ -ShowReadmeCheck=ǣҪ鿴ļ -YesRadio=ǣ(&Y) -NoRadio=Ժ(&N) -; used for example as 'Run MyProg.exe' -RunEntryExec= %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=鿴 %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=װҪһ -SelectDiskLabel2= %1 ȷ%n%nڳʾļļҲôϵļȷ· -PathLabel=·(&P) -FileNotInDir2=ļ%1ڡ%2СȷĴ̻ѡļС -SelectDirectoryLabel=ָһ̵λá - -; *** Installation phase messages -SetupAborted=װδɡ%n%nⲢаװ򵼡 -EntryAbortRetryIgnore=ԡ³ԣԡװֹȡװ - -; *** Installation status messages -StatusClosingApplications=ڹرӦó -StatusCreateDirs=ڴļС -StatusExtractFiles=ȡļ -StatusCreateIcons=ڴݷʽ -StatusCreateIniEntries=ڴ INI Ŀ -StatusCreateRegistryEntries=ڴעĿ -StatusRegisterFiles=עļ -StatusSavingUninstall=ڱжϢ -StatusRunProgram=ɰװ -StatusRestartingApplications=Ӧó -StatusRollback=ڻعġ - -; *** Misc. errors -ErrorInternal2=ڲ%1 -ErrorFunctionFailedNoCode=%1 ʧ -ErrorFunctionFailed=%1 ʧܡ %2 -ErrorFunctionFailedWithMessage=%1 ʧܡ %2%n%3 -ErrorExecutingProgram=޷ִļ%n%1 - -; *** Registry errors -ErrorRegOpenKey=עʱ%n%1\%2 -ErrorRegCreateKey=עʱ%n%1\%2 -ErrorRegWriteKey=дעʱ%n%1\%2 - -; *** INI errors -ErrorIniEntry=ļ%1д INI Ŀʱ - -; *** File copying errors -FileAbortRetryIgnore=ԡ³ԣԡļƼֹȡװ -FileAbortRetryIgnore2=ԡ³ԣԡװƼֹȡװ -SourceIsCorrupted=Դļ -SourceDoesntExist=Դļ%1 -ExistingFileReadOnly=ļΪֻ%n%nԡƳֻԲԣԡļֹȡװ -ErrorReadingExistingDest=ȡļʱ -FileExists=ļѴڡ%n%nҪ -ExistingFileNewer=ļȰװҪװĻ¡㱣ļ%n%nļ -ErrorChangingAttr=ļʱ -ErrorCreatingTemp=Ŀļдļʱ -ErrorReadingSource=ȡԴļʱ -ErrorCopying=ļʱ -ErrorReplacingExistingFile=滻ļʱ -ErrorRestartReplace=滻ʧܣ -ErrorRenamingTemp=Ŀļеļʱ -ErrorRegisterServer=޷ע DLL/OCX%1 -ErrorRegSvr32Failed=RegSvr32 ʧܡֵ%1 -ErrorRegisterTypeLib=޷עͿ⣺%1 - -; *** Post-installation errors -ErrorOpeningReadme=ļʱ -ErrorRestartingComputer=װ޷ԡֶ - -; *** Uninstaller messages -UninstallNotFound=ļ%1ڡжء -UninstallOpenError=ļ%1ܴ򿪡ж -UninstallUnsupportedVer=ж־ļ%1ĸʽܱ˰汾жʶ𡣲ж -UninstallUnknownEntry=ж־һδ֪Ŀ (%1) -ConfirmUninstall=ǷȷҪȫɾ %1 -UninstallOnlyOnWin64=˰װֻ 64 λ Windows жء -OnlyAdminCanUninstall=˰װֻɾ߱ԱȨ޵ûжء -UninstallStatusLabel=ɾ %1Եȡ -UninstalledAll=%1 ѳɹɾ -UninstalledMost=%1 жɡ%n%nijЩĿɾֶɾ -UninstalledAndNeedsRestart=Ҫ %1 жأԡ%n%nҪ -UninstallDataCorrupted=ļ%1𻵡ж - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=ɾļ -ConfirmDeleteSharedFile2=йļٱκγʹáҪɾùļ%n%nгʹøļѱɾЩ޷С㲻ȷѡ񡰷񡱡¸ļϵͳκΣ -SharedFileNameLabel=ļ -SharedFileLocationLabel=λã -WizardUninstalling=ж״̬ -StatusUninstalling=ж %1 - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=ڰװ %1 -ShutdownBlockReasonUninstallingApp=ж %1 - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 汾 %2 -AdditionalIcons=ͼ꣺ -CreateDesktopIcon=ͼ(&D) -CreateQuickLaunchIcon=ͼ(&Q) -ProgramOnTheWeb=%1 վ -UninstallProgram=ж %1 -LaunchProgram= %1 -AssocFileExtension= %1 %2 ļչ(&A) -AssocingFileExtension=ڽ %1 %2 ļչ -AutoStartProgramGroupDescription= -AutoStartProgram=Զ %1 -AddonHostProgramNotFound=ѡļҲ %1%n%nǷȻ diff --git a/Greenshot/tools/innosetup/Languages/Corsican.isl b/Greenshot/tools/innosetup/Languages/Corsican.isl deleted file mode 100644 index dd084b17a..000000000 --- a/Greenshot/tools/innosetup/Languages/Corsican.isl +++ /dev/null @@ -1,345 +0,0 @@ -; *** Inno Setup version 5.5.3+ Corsican messages *** -; -; To download user-contributed translations of this file, go to : -; http ://www.jrsoftware.org/files/istrans/ -; -; Note : When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Created and maintained by Patriccollu di Santa Maria Sich -; -; E-mail: Patrick.Santa-Maria@LaPoste.Net -; -; Changes : -; January 3, 2013 : update to version 5.5.3+ -; August 8, 2012 : update to version 5.5.0+ -; September 17, 2011 : creation for version 5.1.11 - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Corsu -LanguageID=$0483 -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Installazione -SetupWindowTitle=Installazione di %1 -UninstallAppTitle=Disinstallazione -UninstallAppFullTitle=Disinstallazione di %1 - -; *** Misc. common -InformationTitle=Infurmazione -ConfirmTitle=Cunfirm -ErrorTitle=Errore - -; *** SetupLdr messages -SetupLdrStartupMessage=Site prontu install %1 ? -LdrCannotCreateTemp=n h micca pussibule di cre unu schedariu timpurariu. Installazione cancellata -LdrCannotExecTemp=n h micca pussibule di eseguisce unu schedariu in lu cartulare timpurariu. Installazione cancellata - -; *** Startup error messages -LastErrorMessage=%1.%n%nErrore %2 : %3 -SetupFileMissing=U schedariu %1 n h micca in u cartulare di l'installazione. Ci vole curreghje stu prublemu o riceve una nova copia di u programmu. -SetupFileCorrupt=I schedarii di setup s alterati. Ci vole riceve una nova copia di u programmu. -SetupFileCorruptOrWrongVer=I schedarii di setup s alterati, o s incompatibili c sta versione di u prugrammu d'installazione. Ci vole curreghje stu prublemu o riceve una nova copia di u programmu. -InvalidParameter=Unu parametru micca validu h statu passatu nantu a linea di cumanda :%n%n%1 -SetupAlreadyRunning=U prucessu d'installazione h dighi in funzione. -WindowsVersionNotSupported=Stu prugrammu n supporta micca a versione di Windows installata nantu st'urdinatore. -WindowsServicePackRequired=Stu prugrammu richiede %1 Service Pack %2 o pi ricente. -NotOnThisPlatform=Stu prugrammu n funziona micca c %1. -OnlyOnThisPlatform=Stu prugrammu deve funzion c %1. -OnlyOnTheseArchitectures=Stu prugrammu p esse installatu solu nantu i versioni di Windows ch funzionanu c st'architetture di prucessore :%n%n%1 -MissingWOW64APIs=A versione di Windows uduprata n h micca i funzioni per f una installazione 64-bit. Per curreghje stu prublemu, ci vole install u Service Pack %1. -WinVersionTooLowError=Stu programmu richiede a versione %2 o pi recente di %1. -WinVersionTooHighError=Stu programmu n p micca esse installatu nantu a versione %2 o pi recente di %1. -AdminPrivilegesRequired=Ci vole esse amministratore per install stu prugrammu. -PowerUserPrivilegesRequired=Ci vole esse amministratore o membru di u gruppu di i "Power Users" per install stu prugrammu. -SetupAppRunningError=%1 h dighj in esecuzione.%n%nChjode av tutte l'istanze di stu prugrammu sciglite OK per continu, osinn Cancell per abbandun l'installazione. -UninstallAppRunningError=%1 h dighj in esecuzione.%n%nChjode av tutte l'istanze di stu prugrammu sciglite OK per continu, osinn Cancell per abbandun a disinstallazione. - -; *** Misc. errors -ErrorCreatingDir=Impussibule di cre u cartulare "%1" -ErrorTooManyFilesInDir=Impussibule di cre unu schedariu in u cartulare "%1" perch ci s dighj troppu di schedarii - -; *** Setup common messages -ExitSetupTitle=Esce di l'installazione -ExitSetupMessage=L'installazione n h micca compia. S' voi escite l'installazione av, u prugrammu n ser micca installatu.%n%nCi vuler ripigli l'installazione pi tardi per compiella.%n%nEsce di l'installazione ? -AboutSetupMenuItem=&Apprupositu di l'Assistente d'Installazione... -AboutSetupTitle=Apprupositu di l'Assistente d'Installazione -AboutSetupMessage=%1 versione %2%n%3%n%nPagina d'accolta %1 :%n%4 -AboutSetupNote= -TranslatorNote=Traduzzione corsa da Patriccollu di Santa Maria Sich - -; *** Buttons -ButtonBack=< &Antecedente -ButtonNext=&Seguente > -ButtonInstall=In&stall -ButtonOK=OK -ButtonCancel=Cancell -ButtonYes=&I -ButtonYesToAll=I per &tutti -ButtonNo=I&nn -ButtonNoToAll=Inn& per tutti -ButtonFinish=&Piant -ButtonBrowse=&Sfugli... -ButtonWizardBrowse=S&fugli... -ButtonNewFolder=&Cre novu cartulare - -; *** "Select Language" dialog messages -SelectLanguageTitle=Lingua di l'Assistente d'Installazione -SelectLanguageLabel=Sceglie a lingua adupr durante l'installazione : - -; *** Common wizard text -ClickNext=Sceglie Seguente per cuntinu, o Cancell per compie l'installazione. -BeveledLabel= -BrowseDialogTitle=Sfugli i cartulari -BrowseDialogLabel=Sceglite unu cartulare nantu a lista inghj, epp OK. -NewFolderName=Novu cartulare - -; *** "Welcome" wizard page -WelcomeLabel1=Benvenutu in l'Assistente d'Installazione di [name] -WelcomeLabel2=St'Assistente h prontu install [name/ver] nantu u vostru urdinatore.%n%nH ricummendatu di chjode tutti l'altri appiecazioni nanzu cuntinu. - -; *** "Password" wizard page -WizardPassword=Parolla d'intrata -PasswordLabel1=St'installazione h prutetta c una parolla d'intrata. -PasswordLabel3=Entrite a parolla d'intrata, epp sceglite Seguente per cuntinu. Fate casu di rispett e minuscule maiuscule in e parolle d'intrata. -PasswordEditLabel=&Parolla d'intrata : -IncorrectPassword=A parolla d'intrata h falsa. Pruvate un'altra volta. - -; *** "License Agreement" wizard page -WizardLicense=Cuntrattu d'Utilizazione -LicenseLabel=L'infurmazioni ch seguitanu s impurtentissimi. Ci vole leghjelli nanzu cuntinu. -LicenseLabel3=Per piac leghjite u Cuntrattu d'Utilizazione ch seguita. Ci vole esse d'accunsentu c tutti i vucabuli di stu cuntrattu per pud cuntinu l'installazione. -LicenseAccepted=Capiscu s d'&accunsentu c tutti i vucabuli di u cuntrattu -LicenseNotAccepted=n s &micca d'accunsentu c stu cuntrattu - -; *** "Information" wizard pages -WizardInfoBefore=Infurmazione -InfoBeforeLabel=L'infurmazioni ch seguitanu s impurtentissimi. Ci vole leghjelli nanzu cuntinu. -InfoBeforeClickLabel=Quandu site prontu cuntinu, sceglite Seguente. -WizardInfoAfter=Infurmazione -InfoAfterLabel=L'infurmazioni ch seguitanu s impurtentissimi. Ci vole leghjelli nanzu cuntinu. -InfoAfterClickLabel=Quandu site prontu cuntinu, sceglite Seguente. - -; *** "User Information" wizard page -WizardUserInfo=Infurmazione Utilizatore -UserInfoDesc=Entrite i vostri infurmazioni. -UserInfoName=&Nome di l'utilizatore : -UserInfoOrg=&Urganismu : -UserInfoSerial=Numeru di &seria : -UserInfoNameRequired=Ci vole entre unu nome. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Selezziun u cartulare d'installazione -SelectDirDesc=Induve ci vole install [name] ? -SelectDirLabel3=L'Assistente h da install [name] in stu cartulare. -SelectDirBrowseLabel=Per cuntinu, sceglite Seguente. S' voi preferite un'altru cartulare, sceglite Sfugli. -DiskSpaceMBLabel=U prugrammu h bisognu d'al menu [mb] Mo di spaziu liberu nantu u dischettu duru. -CannotInstallToNetworkDrive=n h micca pussibule di f l'installazione nantu unu dischettu di a reta. -CannotInstallToUNCPath=n h micca pussibule d'impieg unu caminu UNC. S' voi vulete install nantu a reta, ci vole cunnett, primu, u lettore di reta. -InvalidPath=Ci vole entre unu caminu cumplettu ; per indettu :%n%nC :\APP%n% micca unu caminu UNC di a forma :%n%n\\server\share -InvalidDrive=L'unit o u caminu UNC selezziunatu n esiste o n h micca dispunibule. Per piac, sceglite un'altru. -DiskSpaceWarningTitle=Spaziu nantu u dischettu duru n h micca abbastanza -DiskSpaceWarning=L'Assistente richiede almenu %1 Ko di spaziu liberu per l'installazione, ma l'unit selezziunata h solu %2 Ko dispunibule.%n%nVulete cuntinu quantunque ? -DirNameTooLong=U nome di u cartulare o u caminu h troppu longu. -InvalidDirName=U nome di u cartulare n h micca leghjittimu. -BadDirName32=U nome di u cartulare n p micca cuntene sti caratteri :%n%n%1 -DirExistsTitle=Cartulare esistente -DirExists=U cartulare :%n%n%1%n%nesiste dighj. Vulete install in stu cartulare quantunque ? -DirDoesntExistTitle=Cartulare inesistente -DirDoesntExist=U cartulare :%n%n%1%n%nn esiste micca. Vulete cre stu cartulare ? - -; *** "Select Components" wizard page -WizardSelectComponents=Selezziun i cumpunenti -SelectComponentsDesc=Ch cumpunenti vulete install ? -SelectComponentsLabel2=Selezziunate i cumpunenti ch ci vole install ; deselezziunate quelli ch'n ci vole micca install. Quandu site prontu cuntinu, sceglite Seguente. -FullInstallation=Installazione cumpleta -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Installazione strinta -CustomInstallation=Installazione persunalizata -NoUninstallWarningTitle=Cumpunenti esistenti -NoUninstallWarning=L'Assistente h trovu sti cumpunenti dighj installati nantu l'urdinatore :%n%n%1%n%nDeselezziun sti cumpunenti n i disinstaller micca.%n%nVulete cuntinu ? -ComponentSize1=%1 Ko -ComponentSize2=%1 Mo -ComponentsDiskSpaceMBLabel=A selezzione currente richiede al menu [mb] Mo di spaziu liberu nantu u dischettu duru. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Selezziun trattamenti addizziunali -SelectTasksDesc=Ch trattamenti addizziunali vulete f ? -SelectTasksLabel2=Selezziunate i trattamenti addizziunali ch l'Assistente h da f durante l'installazione di [name], epp sceglite Seguente. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Selezzione di u cartulare di u Menu Dmarrer (Start) -SelectStartMenuFolderDesc=Induve l'Assistente h da mette l'accurtatoghji di u prugrammu ? -SelectStartMenuFolderLabel3=L'Assistente h da mette l'accurtatoghji di u prugrammu in u Menu Dmarrer (Start). -SelectStartMenuFolderBrowseLabel=Per cuntinu, sceglite Seguente. S' voi preferite un'altru cartulare,sceglite Sfugli. -MustEnterGroupName=Ci vole entre unu nome di cartulare. -GroupNameTooLong=U nome di u cartulare o u caminu h troppu longu. -InvalidGroupName=U nome di u cartulare n h micca leghjittimu. -BadGroupName=U nome di u cartulare n p micca cuntene sti caratteri :%n%n%1 -NoProgramGroupCheck2=&n cre micca di cartulare in u Menu Dmarrer (Start) - -; *** "Ready to Install" wizard page -WizardReady=Prontu Install -ReadyLabel1=Av l'Assistente h prontu principi l'installazione di [name] nantu u vostru urdinatore. -ReadyLabel2a=Sceglite Install per cuntinu l'installazione, o sceglite Antecedente per rivede o cambi l'ozzioni. -ReadyLabel2b=Sceglite Install per cuntinu l'installazione. -ReadyMemoUserInfo=Infurmazione Utilizatore : -ReadyMemoDir=Cartulare d'installazione : -ReadyMemoType=Tipu d'installazione : -ReadyMemoComponents=Cumpunenti selezziunati : -ReadyMemoGroup=Cartulare di u Menu Dmarrer (Start) : -ReadyMemoTasks=Trattamenti addizziunali : - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparazione di l'installazione -PreparingDesc=L'Assistente appronta l'installazione di [name] nantu u vostru urdinatore. -PreviousInstallNotCompleted=L'installazione/suppressione precedente di u prugrammu n h micca compia b. Ci vuler dimarr torna l'urdinatore per cumpie st'installazione.%n%nDopu ci vuler rilanci l'Assistente per cumpie l'installazione di [name]. -CannotContinue=L'Assistente n p micca cuntinu. Sceglite Cancell per esce. -ApplicationsFound=St'applicazioni impieganu schedarii ch devenu esse mudificati da l'installazione. Seria pi faciule di permette u prucessu di chjode autumaticamente st'applicazioni. -ApplicationsFound2=St'applicazioni impieganu schedarii ch devenu esse mudificati da l'installazione. Seria pi faciule di permette u prucessu di chjode autumaticamente st'applicazioni. S' l'installazione si compie b, u prucessu pruver di rilanci l'applicazioni. -CloseApplications=Chjode &autumaticamente l'applicazioni -DontCloseApplications=&n chjode micca l'applicazioni -ErrorCloseApplications=L'Assistente n h micca pussutu chjode autumaticamente tutti l'applicazioni.H ricummandatu di chjode tutti l'applicazioni ch impieganu schedarii ch devenu esse mudificati da l'Assistente durante l'installazione nanzu cuntinu. - -; *** "Installing" wizard page -WizardInstalling=Installazione in corsu -InstallingLabel=Aspittate per piac mentre l'installazione di [name] nantu u vostru urdinatore. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Cunclusione di l'installazione di [name] -FinishedLabelNoIcons=L'Assistente h compiu l'installazione di [name] nantu u vostru urdinatore. -FinishedLabel=L'Assistente h compiu l'installazione di [name] nantu u vostru urdinatore. L'applicazione p esse lampata grazia l'icone installate. -ClickFinish=Sceglite Piant per compie l'Assistente. -FinishedRestartLabel=Per cumpie l'installazione di [name], l'Assistente h da dimarr torna u vostru urdinatore. Site d'accunsentu per fallu av ? -FinishedRestartMessage=Per cumpie l'installazione di [name], l'Assistente h da dimarr torna u vostru urdinatore.%n%nSite d'accunsentu per fallu av ? -ShowReadmeCheck=I, vogliu leghje u schedariu LISEZMOI o README -YesRadio=&I, dimarr l'urdinatore av -NoRadio=I&nn, preferiscu dimarr l'urdinatore pi tardi -; used for example as 'Run MyProg.exe' -RunEntryExec=Eseguisce %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Fighj %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=L'Assistente h bisogniu di u dischettu seguente -SelectDiskLabel2=Mittite u dischettu %1 sceglite OK.%n%nS' i schedarii di stu dischettu si trovanu in un'altru cartulare ch quellu indicatu inghj, intruducite u caminu currettu o sceglite Sfugli. -PathLabel=&Caminu : -FileNotInDir2=U schedariu "%1" n si truva micca in "%2". Mittite u dischettu curretu o sceglite un'altru cartulare. -SelectDirectoryLabel=Ci vole d induve si truva u dischettu seguente. - -; *** Installation phase messages -SetupAborted=L'installazione n h micca compia.%n%nCi vole curreghje u prublemu eseguisce l'installazione un'altra volta. -EntryAbortRetryIgnore=Sceglite Ressayer per pruv torna, Ignorer per cuntinu quantunque, o Abandonner per cancell l'installazione. - -; *** Installation status messages -StatusClosingApplications=Chjudendu l'applicazioni -StatusCreateDirs=Creazione di i cartulari... -StatusExtractFiles=Estrazzione di i schedarii... -StatusCreateIcons=Creazione di l'accurtatoghji... -StatusCreateIniEntries=Creazione di l'elementi INI... -StatusCreateRegistryEntries=Creazione di l'elementi di u registru... -StatusRegisterFiles=Arregistramentu di i schedarii... -StatusSavingUninstall=Cunservazione di l'informazioni di disinstallazione... -StatusRunProgram=Cumpiera di l'installazione... -StatusRestartingApplications=Relanciendu l'applicazioni... -StatusRollback=Annulazione di i mudificazioni... - -; *** Misc. errors -ErrorInternal2=Errore internu : %1 -ErrorFunctionFailedNoCode=Fiascu di %1 -ErrorFunctionFailed=Fiascu di %1 ; codice %2 -ErrorFunctionFailedWithMessage=Fiascu di %1 ; codice %2.%n%3 -ErrorExecutingProgram=Impussibule di eseguisce u schedariu :%n%1 - -; *** Registry errors -ErrorRegOpenKey=Errore durente l'apertura di a chjave di registru :%n%1\%2 -ErrorRegCreateKey=Errore durente a creazione di a chjave di registru :%n%1\%2 -ErrorRegWriteKey=Errore durente a scrittura di a chjave di registru :%n%1\%2 - -; *** INI errors -ErrorIniEntry=Errore durente a creazione di l'elementu INI in u schedariu "%1". - -; *** File copying errors -FileAbortRetryIgnore=Sceglite Ressayer per pruv torna, Ignorer per salt stu schedariu (scunsigliatu), o Abandonner per cancell l'installazione. -FileAbortRetryIgnore2=Sceglite Ressayer per pruv torna, Ignorer per cuntinu quantunque (scunsigliatu), o Abandonner per cancell l'installazione. -SourceIsCorrupted=U schedariu surghjente h alteratu -SourceDoesntExist=U schedariu surghjente "%1" n esista micca -ExistingFileReadOnly=U schedariu esistente h unu attributu di lettura-sola.%n%nSceglite Ressayer per cacci st'attributu pruv torna, Ignorer per salt stu schedariu, o Abandonner per cancell l'installazione. -ErrorReadingExistingDest=Un'errore h affacatu durante a lettura di u schedariu esistente : -FileExists=U schedariu esiste dighj.%n%nVulite ch l'Assistente u rimpiazza ? -ExistingFileNewer=U schedariu esistente h pi ricente ch quellu ch l'Assistente prova d'install. H ricummendatu di cunserv u schedariu esistente.%n%nVulite cunserv u schedariu esistente ? -ErrorChangingAttr=Un'errore h affacatu pruvendu di cambi l'attributi of u schedariu esistente : -ErrorCreatingTemp=Un'errore h affacatu pruvendu di cre unu schedariu in u cartelaru d'installazione : -ErrorReadingSource=Un'errore h affacatu pruvendu di leghje u schedariu surghjente : -ErrorCopying=Un'errore h affacatu pruvendu di cupi unu schedariu : -ErrorReplacingExistingFile=Un'errore h affacatu pruvendu di rimpiazz u schedariu esistente : -ErrorRestartReplace=Fiascu di Ridimarr/Rimpiazz : -ErrorRenamingTemp=Un'errore h affacatu pruvendu di cambi u nome di unu schedariu in u cartelaru d'installazione : -ErrorRegisterServer=Impussibule d'arregistr a bibliuteca DLL/OCX : %1 -ErrorRegSvr32Failed=Fiascu di RegSvr32 c u codice di uscita %1 -ErrorRegisterTypeLib=Impussibule d'arregistr a bibliuteca di tipu : %1 - -; *** Post-installation errors -ErrorOpeningReadme=Un'errore h affacatu pruvendu di leghje u schedariu LISEZMOI/README. -ErrorRestartingComputer=L'Assistente n p micca ridimarr l'urdinatore. Ci vole fallu manualmente. - -; *** Uninstaller messages -UninstallNotFound=U schedariu "%1" n esista micca. Impussibule di disinstall. -UninstallOpenError=U schedariu "%1" n p micca esse apertu. Impussibule di disinstall -UninstallUnsupportedVer=U schedariu ghjurnale 'log' "%1" si trova in una forma micca ricunnisciuta da sta versione di l'Assistente di disinstallazione. Impussibule di disinstall -UninstallUnknownEntry=Una infurmazione scunisciuta (%1) si trova in u schedariu ghjurnale 'log' di disinstallazione -ConfirmUninstall=Site sicuru di vul scacci tutalmente %1 tutti i so cumpunenti ? -UninstallOnlyOnWin64=A disinstallazione di stu prugrammu si p f solu c una versione 64-bit di Windows. -OnlyAdminCanUninstall=A disinstallazione di stu prugrammu si p f solu da unu utilisatore di u gruppu di l'Amministratori. -UninstallStatusLabel=Aspittate per piac fin' ch %1 h scacciatu da u vostru urdinatore. -UninstalledAll=%1 h statu scacciatu b da u vostru urdinatore. -UninstalledMost=A disinstallazione di %1 h compia.%n%nQualch elementu n p micca esse scacciatu. Ci vole scacciallu manualmente. -UninstalledAndNeedsRestart=Per cumpie a disinstallazione di %1, ci vole dimarr torna u vostru urdinatore.%n%nSite d'accunsentu per fallu av ? -UninstallDataCorrupted=U schedariu "%1" h alteratu. Impussibule di disinstall - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Scacci i schedarii cundivisi ? -ConfirmDeleteSharedFile2=U sistemu indica ch i schedarii cundivisi n s pi aduprati d'alcunu programmu. Vulite scacci i schedarii cundivisi ?%n%nS' qualch programmu sempre adupra sti schedarii quessi s scacciati, n puder funziun currettamente. Se n site micca sicuru, sceglite No. Lasci sti schedarii nantu u sistemu n p micca pruduce danni. -SharedFileNameLabel=Nome di u schedariu : -SharedFileLocationLabel=Lucalizazione : -WizardUninstalling=Statu di a disinstallazione -StatusUninstalling=Disinstallazione di %1 in corsu... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installazione di %1. -ShutdownBlockReasonUninstallingApp=Disinstallazione di %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versione %2 -AdditionalIcons=Addizziunale icone : -CreateDesktopIcon=Cre una icona nantu u &Scagnu (Bureau) -CreateQuickLaunchIcon=Cre una icona nantu a barra di &Lanciu rapidu -ProgramOnTheWeb=%1 nantu u Web -UninstallProgram=Desinstall %1 -LaunchProgram=Dimarr %1 -AssocFileExtension=&Assuci %1 c l'estensione di u schedariu %2 -AssocingFileExtension=Assuciazion di %1 c l'estensione di u schedariu %2... -AutoStartProgramGroupDescription=Relancia autumatica : -AutoStartProgram=Relanci automaticamente %1 -AddonHostProgramNotFound=Impussibule di truv %1 in u cartulare selezziunatu.%n%nVulete cuntinu l'installazione quantunque ? diff --git a/Greenshot/tools/innosetup/Languages/Czech.isl b/Greenshot/tools/innosetup/Languages/Czech.isl deleted file mode 100644 index d2b5a579f..000000000 --- a/Greenshot/tools/innosetup/Languages/Czech.isl +++ /dev/null @@ -1,337 +0,0 @@ -; ******************************************************* -; *** *** -; *** Inno Setup version 5.5.3+ Czech messages *** -; *** *** -; *** Original Author: *** -; *** *** -; *** Ivo Bauer (bauer@ozm.cz) *** -; *** *** -; *** Contributors: *** -; *** *** -; *** Lubos Stanek (lubek@users.sourceforge.net) *** -; *** Vitezslav Svejdar (vitezslav.svejdar@cuni.cz) *** -; *** *** -; ******************************************************* -; -; Copyright (C) 1997-2012 Jordan Russell. All rights reserved. -; Translations (C) 2002-2012 Original Author and Contributors. All rights reserved. -; -; The contents of this file are subject to the Inno Setup License (the "License"). -; You may obtain a copy of the License at http://www.jrsoftware.org/files/is/license.txt -; -; $jrsoftware: issrc/Files/Languages/Czech.isl,v 1.18 2007/02/27 18:22:41 jr Exp $ - -[LangOptions] -LanguageName=<010C>e<0161>tina -LanguageID=$0405 -LanguageCodePage=1250 - -[Messages] - -; *** Application titles -SetupAppTitle=Prvodce instalac -SetupWindowTitle=Prvodce instalac - %1 -UninstallAppTitle=Prvodce odinstalac -UninstallAppFullTitle=Prvodce odinstalac - %1 - -; *** Misc. common -InformationTitle=Informace -ConfirmTitle=Potvrzen -ErrorTitle=Chyba - -; *** SetupLdr messages -SetupLdrStartupMessage=Vt Vs prvodce instalac produktu %1. Chcete pokraovat? -LdrCannotCreateTemp=Nelze vytvoit doasn soubor. Prvodce instalac bude ukonen -LdrCannotExecTemp=Nelze spustit soubor v doasn sloce. Prvodce instalac bude ukonen - -; *** Startup error messages -LastErrorMessage=%1.%n%nChyba %2: %3 -SetupFileMissing=Instalan sloka neobsahuje soubor %1. Opravte prosm tuto chybu nebo si opatete novou kopii tohoto produktu. -SetupFileCorrupt=Soubory prvodce instalac jsou pokozeny. Opatete si prosm novou kopii tohoto produktu. -SetupFileCorruptOrWrongVer=Soubory prvodce instalac jsou pokozeny nebo se nesluuj s touto verz prvodce instalac. Opravte prosm tuto chybu nebo si opatete novou kopii tohoto produktu. -InvalidParameter=Pkazov dka obsahuje neplatn parametr:%n%n%1 -SetupAlreadyRunning=Prvodce instalac je ji sputn. -WindowsVersionNotSupported=Tento produkt nepodporuje verzi MS Windows, kter b na Vaem potai. -WindowsServicePackRequired=Tento produkt vyaduje %1 Service Pack %2 nebo vy. -NotOnThisPlatform=Tento produkt nelze spustit ve %1. -OnlyOnThisPlatform=Tento produkt mus bt sputn ve %1. -OnlyOnTheseArchitectures=Tento produkt lze nainstalovat pouze ve verzch MS Windows s podporou architektury procesor:%n%n%1 -MissingWOW64APIs=Aktuln verze MS Windows postrd funkce, kter vyaduje prvodce instalac pro 64-bitovou instalaci. Opravte prosm tuto chybu nainstalovnm aktualizace Service Pack %1. -WinVersionTooLowError=Tento produkt vyaduje %1 verzi %2 nebo vy. -WinVersionTooHighError=Tento produkt nelze nainstalovat ve %1 verzi %2 nebo vy. -AdminPrivilegesRequired=K instalaci tohoto produktu muste bt pihleni s prvy administrtora. -PowerUserPrivilegesRequired=K instalaci tohoto produktu muste bt pihleni s prvy administrtora nebo lena skupiny Power Users. -SetupAppRunningError=Prvodce instalac zjistil, e produkt %1 je nyn sputn.%n%nZavete prosm vechny instance tohoto produktu a pak pokraujte klepnutm na tlatko OK, nebo ukonete instalaci tlatkem Storno. -UninstallAppRunningError=Prvodce odinstalac zjistil, e produkt %1 je nyn sputn.%n%nZavete prosm vechny instance tohoto produktu a pak pokraujte klepnutm na tlatko OK, nebo ukonete odinstalaci tlatkem Storno. - -; *** Misc. errors -ErrorCreatingDir=Prvodci instalac se nepodailo vytvoit sloku "%1" -ErrorTooManyFilesInDir=Nelze vytvoit soubor ve sloce "%1", protoe tato sloka ji obsahuje pli mnoho soubor - -; *** Setup common messages -ExitSetupTitle=Ukonit prvodce instalac -ExitSetupMessage=Instalace nebyla zcela dokonena. Jestlie nyn prvodce instalac ukonte, produkt nebude nainstalovn.%n%nPrvodce instalac mete znovu spustit kdykoliv jindy a instalaci dokonit.%n%nChcete prvodce instalac ukonit? -AboutSetupMenuItem=&O prvodci instalac... -AboutSetupTitle=O prvodci instalac -AboutSetupMessage=%1 verze %2%n%3%n%n%1 domovsk strnka:%n%4 -AboutSetupNote= -TranslatorNote=Czech translation maintained by Ivo Bauer (bauer@ozm.cz), Lubos Stanek (lubek@users.sourceforge.net) and Vitezslav Svejdar (vitezslav.svejdar@cuni.cz) - -; *** Buttons -ButtonBack=< &Zpt -ButtonNext=&Dal > -ButtonInstall=&Instalovat -ButtonOK=OK -ButtonCancel=Storno -ButtonYes=&Ano -ButtonYesToAll=Ano &vem -ButtonNo=&Ne -ButtonNoToAll=N&e vem -ButtonFinish=&Dokonit -ButtonBrowse=&Prochzet... -ButtonWizardBrowse=&Prochzet... -ButtonNewFolder=&Vytvoit novou sloku - -; *** "Select Language" dialog messages -SelectLanguageTitle=Vbr jazyka prvodce instalac -SelectLanguageLabel=Zvolte jazyk, kter se m pout bhem instalace: - -; *** Common wizard text -ClickNext=Pokraujte klepnutm na tlatko Dal, nebo ukonete prvodce instalac tlatkem Storno. -BeveledLabel= -BrowseDialogTitle=Vyhledat sloku -BrowseDialogLabel=Z ne uvedenho seznamu vyberte sloku a klepnte na tlatko OK. -NewFolderName=Nov sloka - -; *** "Welcome" wizard page -WelcomeLabel1=Vt Vs prvodce instalac produktu [name]. -WelcomeLabel2=Produkt [name/ver] bude nainstalovn na V pota.%n%nDve ne budete pokraovat, doporuuje se zavt veker sputn aplikace. - -; *** "Password" wizard page -WizardPassword=Heslo -PasswordLabel1=Tato instalace je chrnna heslem. -PasswordLabel3=Zadejte prosm heslo a pokraujte klepnutm na tlatko Dal. Pi zadvn hesla rozliujte mal a velk psmena. -PasswordEditLabel=&Heslo: -IncorrectPassword=Zadan heslo nen sprvn. Zkuste to prosm znovu. - -; *** "License Agreement" wizard page -WizardLicense=Licenn smlouva -LicenseLabel=Dve ne budete pokraovat, pette si prosm pozorn nsledujc dleit informace. -LicenseLabel3=Pette si prosm tuto licenn smlouvu. Muste souhlasit s podmnkami tto smlouvy, aby instalace mohla pokraovat. -LicenseAccepted=&Souhlasm s podmnkami licenn smlouvy -LicenseNotAccepted=&Nesouhlasm s podmnkami licenn smlouvy - -; *** "Information" wizard pages -WizardInfoBefore=Informace -InfoBeforeLabel=Dve ne budete pokraovat, pette si prosm pozorn nsledujc dleit informace. -InfoBeforeClickLabel=Pokraujte v instalaci klepnutm na tlatko Dal. -WizardInfoAfter=Informace -InfoAfterLabel=Dve ne budete pokraovat, pette si prosm pozorn nsledujc dleit informace. -InfoAfterClickLabel=Pokraujte v instalaci klepnutm na tlatko Dal. - -; *** "User Information" wizard page -WizardUserInfo=Informace o uivateli -UserInfoDesc=Zadejte prosm poadovan daje. -UserInfoName=&Uivatelsk jmno: -UserInfoOrg=&Spolenost: -UserInfoSerial=S&riov slo: -UserInfoNameRequired=Muste zadat uivatelsk jmno. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Zvolte clov umstn -SelectDirDesc=Kam m bt produkt [name] nainstalovn? -SelectDirLabel3=Prvodce nainstaluje produkt [name] do nsledujc sloky. -SelectDirBrowseLabel=Pokraujte klepnutm na tlatko Dal. Chcete-li zvolit jinou sloku, klepnte na tlatko Prochzet. -DiskSpaceMBLabel=Instalace vyaduje nejmn [mb] MB volnho msta na disku. -CannotInstallToNetworkDrive=Prvodce instalac neme instalovat do sov jednotky. -CannotInstallToUNCPath=Prvodce instalac neme instalovat do cesty UNC. -InvalidPath=Muste zadat plnou cestu vetn psmene jednotky; napklad:%n%nC:\Aplikace%n%nnebo cestu UNC ve tvaru:%n%n\\server\sdlen sloka -InvalidDrive=Vmi zvolen jednotka nebo cesta UNC neexistuje nebo nen dostupn. Zvolte prosm jin umstn. -DiskSpaceWarningTitle=Nedostatek msta na disku -DiskSpaceWarning=Prvodce instalac vyaduje nejmn %1 KB volnho msta pro instalaci produktu, ale na zvolen jednotce je dostupnch pouze %2 KB.%n%nChcete pesto pokraovat? -DirNameTooLong=Nzev sloky nebo cesta jsou pli dlouh. -InvalidDirName=Nzev sloky nen platn. -BadDirName32=Nzev sloky neme obsahovat dn z nsledujcch znak:%n%n%1 -DirExistsTitle=Sloka existuje -DirExists=Sloka:%n%n%1%n%nji existuje. M se pesto instalovat do tto sloky? -DirDoesntExistTitle=Sloka neexistuje -DirDoesntExist=Sloka:%n%n%1%n%nneexistuje. M bt tato sloka vytvoena? - -; *** "Select Components" wizard page -WizardSelectComponents=Zvolte sousti -SelectComponentsDesc=Jak sousti maj bt nainstalovny? -SelectComponentsLabel2=Zakrtnte sousti, kter maj bt nainstalovny; sousti, kter se nemaj instalovat, ponechte nezakrtnut. Pokraujte klepnutm na tlatko Dal. -FullInstallation=pln instalace -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompaktn instalace -CustomInstallation=Voliteln instalace -NoUninstallWarningTitle=Sousti existuj -NoUninstallWarning=Prvodce instalac zjistil, e nsledujc sousti jsou ji na Vaem potai nainstalovny:%n%n%1%n%nNezahrnete-li tyto sousti do vbru, nebudou nyn odinstalovny.%n%nChcete pesto pokraovat? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Vybran sousti vyaduj nejmn [mb] MB msta na disku. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Zvolte dal lohy -SelectTasksDesc=Kter dal lohy maj bt provedeny? -SelectTasksLabel2=Zvolte dal lohy, kter maj bt provedeny v prbhu instalace produktu [name], a pak pokraujte klepnutm na tlatko Dal. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Vyberte sloku v nabdce Start -SelectStartMenuFolderDesc=Kam m prvodce instalac umstit zstupce aplikace? -SelectStartMenuFolderLabel3=Prvodce instalac vytvo zstupce aplikace v nsledujc sloce nabdky Start. -SelectStartMenuFolderBrowseLabel=Pokraujte klepnutm na tlatko Dal. Chcete-li zvolit jinou sloku, klepnte na tlatko Prochzet. -MustEnterGroupName=Muste zadat nzev sloky. -GroupNameTooLong=Nzev sloky nebo cesta jsou pli dlouh. -InvalidGroupName=Nzev sloky nen platn. -BadGroupName=Nzev sloky neme obsahovat dn z nsledujcch znak:%n%n%1 -NoProgramGroupCheck2=&Nevytvet sloku v nabdce Start - -; *** "Ready to Install" wizard page -WizardReady=Instalace je pipravena -ReadyLabel1=Prvodce instalac je nyn pipraven nainstalovat produkt [name] na V pota. -ReadyLabel2a=Pokraujte v instalaci klepnutm na tlatko Instalovat. Pejete-li si zmnit nkter nastaven instalace, klepnte na tlatko Zpt. -ReadyLabel2b=Pokraujte v instalaci klepnutm na tlatko Instalovat. -ReadyMemoUserInfo=Informace o uivateli: -ReadyMemoDir=Clov umstn: -ReadyMemoType=Typ instalace: -ReadyMemoComponents=Vybran sousti: -ReadyMemoGroup=Sloka v nabdce Start: -ReadyMemoTasks=Dal lohy: - -; *** "Preparing to Install" wizard page -WizardPreparing=Pprava k instalaci -PreparingDesc=Prvodce instalac pipravuje instalaci produktu [name] na V pota. -PreviousInstallNotCompleted=Instalace/odinstalace pedchozho produktu nebyla zcela dokonena. Aby mohla bt dokonena, muste restartovat V pota.%n%nPo restartovn Vaeho potae spuste znovu prvodce instalac, aby bylo mon dokonit instalaci produktu [name]. -CannotContinue=Prvodce instalac neme pokraovat. Ukonete prosm prvodce instalac klepnutm na tlatko Storno. -ApplicationsFound=Nsledujc aplikace pistupuj k souborm, kter je teba bhem instalace aktualizovat. Doporuuje se povolit prvodci instalac, aby tyto aplikace automaticky zavel. -ApplicationsFound2=Nsledujc aplikace pistupuj k souborm, kter je teba bhem instalace aktualizovat. Doporuuje se povolit prvodci instalac, aby tyto aplikace automaticky zavel. Po dokonen instalace se prvodce instalac pokus aplikace restartovat. -CloseApplications=&Zavt aplikace automaticky -DontCloseApplications=&Nezavrat aplikace -ErrorCloseApplications=Prvodci instalac se nepodailo automaticky zavt vechny aplikace. Dve ne budete pokraovat, doporuuje se zavt veker aplikace pistupujc k souborm, kter je teba bhem instalace aktualizovat. - -; *** "Installing" wizard page -WizardInstalling=Instalovn -InstallingLabel=ekejte prosm, dokud prvodce instalac nedokon instalaci produktu [name] na V pota. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Dokonuje se instalace produktu [name] -FinishedLabelNoIcons=Prvodce instalac dokonil instalaci produktu [name] na V pota. -FinishedLabel=Prvodce instalac dokonil instalaci produktu [name] na V pota. Produkt lze spustit pomoc nainstalovanch zstupc. -ClickFinish=Ukonete prvodce instalac klepnutm na tlatko Dokonit. -FinishedRestartLabel=K dokonen instalace produktu [name] je nezbytn, aby prvodce instalac restartoval V pota. Chcete jej nyn restartovat? -FinishedRestartMessage=K dokonen instalace produktu [name] je nezbytn, aby prvodce instalac restartoval V pota.%n%nChcete jej nyn restartovat? -ShowReadmeCheck=Ano, chci zobrazit dokument "TIMNE" -YesRadio=&Ano, chci nyn restartovat pota -NoRadio=&Ne, pota restartuji pozdji -; used for example as 'Run MyProg.exe' -RunEntryExec=Spustit %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Zobrazit %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Prvodce instalac vyaduje dal disk -SelectDiskLabel2=Vlote prosm disk %1 a klepnte na tlatko OK.%n%nPokud se soubory na tomto disku nachzej v jin sloce ne v t, kter je zobrazena ne, pak zadejte sprvnou cestu nebo ji zvolte klepnutm na tlatko Prochzet. -PathLabel=&Cesta: -FileNotInDir2=Soubor "%1" nelze najt v "%2". Vlote prosm sprvn disk nebo zvolte jinou sloku. -SelectDirectoryLabel=Specifikujte prosm umstn dalho disku. - -; *** Installation phase messages -SetupAborted=Instalace nebyla zcela dokonena.%n%nOpravte prosm chybu a spuste prvodce instalac znovu. -EntryAbortRetryIgnore=Akci zopakujete klepnutm na tlatko Opakovat. Tento krok vynechte klepnutm na tlatko Peskoit. Instalaci stornujete klepnutm na tlatko Peruit. - -; *** Installation status messages -StatusClosingApplications=Zavraj se aplikace... -StatusCreateDirs=Vytvej se sloky... -StatusExtractFiles=Extrahuj se soubory... -StatusCreateIcons=Vytvej se zstupci... -StatusCreateIniEntries=Vytvej se zznamy v inicializanch souborech... -StatusCreateRegistryEntries=Vytvej se zznamy v systmovm registru... -StatusRegisterFiles=Registruj se soubory... -StatusSavingUninstall=Ukldaj se informace pro odinstalaci produktu... -StatusRunProgram=Dokonuje se instalace... -StatusRestartingApplications=Restartuj se aplikace... -StatusRollback=Proveden zmny se vracej zpt... - -; *** Misc. errors -ErrorInternal2=Intern chyba: %1 -ErrorFunctionFailedNoCode=%1 selhala -ErrorFunctionFailed=%1 selhala; kd %2 -ErrorFunctionFailedWithMessage=%1 selhala; kd %2.%n%3 -ErrorExecutingProgram=Nelze spustit soubor:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Dolo k chyb pi otevrn kle systmovho registru:%n%1\%2 -ErrorRegCreateKey=Dolo k chyb pi vytven kle systmovho registru:%n%1\%2 -ErrorRegWriteKey=Dolo k chyb pi zpisu do kle systmovho registru:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Dolo k chyb pi vytven zznamu v inicializanm souboru "%1". - -; *** File copying errors -FileAbortRetryIgnore=Akci zopakujete klepnutm na tlatko Opakovat. Tento soubor peskote klepnutm na tlatko Peskoit (nedoporuuje se). Instalaci stornujete klepnutm na tlatko Peruit. -FileAbortRetryIgnore2=Akci zopakujete klepnutm na tlatko Opakovat. Pokraujete klepnutm na tlatko Peskoit (nedoporuuje se). Instalaci stornujete klepnutm na tlatko Peruit. -SourceIsCorrupted=Zdrojov soubor je pokozen -SourceDoesntExist=Zdrojov soubor "%1" neexistuje -ExistingFileReadOnly=Existujc soubor je uren pouze pro ten.%n%nAtribut "pouze pro ten" odstrante a akci zopakujete klepnutm na tlatko Opakovat. Tento soubor peskote klepnutm na tlatko Peskoit. Instalaci stornujete klepnutm na tlatko Peruit. -ErrorReadingExistingDest=Dolo k chyb pi pokusu o ten existujcho souboru: -FileExists=Soubor ji existuje.%n%nM bt prvodcem instalace pepsn? -ExistingFileNewer=Existujc soubor je novj ne ten, kter se prvodce instalac pokou nainstalovat. Doporuuje se ponechat existujc soubor.%n%nChcete jej ponechat? -ErrorChangingAttr=Dolo k chyb pi pokusu o zmnu atribut existujcho souboru: -ErrorCreatingTemp=Dolo k chyb pi pokusu o vytvoen souboru v clov sloce: -ErrorReadingSource=Dolo k chyb pi pokusu o ten zdrojovho souboru: -ErrorCopying=Dolo k chyb pi pokusu o zkoprovn souboru: -ErrorReplacingExistingFile=Dolo k chyb pi pokusu o nahrazen existujcho souboru: -ErrorRestartReplace=Funkce "RestartReplace" prvodce instalac selhala: -ErrorRenamingTemp=Dolo k chyb pi pokusu o pejmenovn souboru v clov sloce: -ErrorRegisterServer=Nelze zaregistrovat DLL/OCX: %1 -ErrorRegSvr32Failed=Voln RegSvr32 selhalo s nvratovm kdem %1 -ErrorRegisterTypeLib=Nelze zaregistrovat typovou knihovnu: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Dolo k chyb pi pokusu o oteven dokumentu "TIMNE". -ErrorRestartingComputer=Prvodci instalac se nepodailo restartovat V pota. Restartujte jej prosm run. - -; *** Uninstaller messages -UninstallNotFound=Soubor "%1" neexistuje. Produkt nelze odinstalovat. -UninstallOpenError=Soubor "%1" nelze otevt. Produkt nelze odinstalovat. -UninstallUnsupportedVer=Formt souboru se zznamy k odinstalaci produktu "%1" nebyl touto verz prvodce odinstalac rozpoznn. Produkt nelze odinstalovat -UninstallUnknownEntry=V souboru obsahujcm informace k odinstalaci produktu byla zjitna neznm poloka (%1) -ConfirmUninstall=Jste si opravdu jisti, e chcete produkt %1 a vechny jeho sousti odinstalovat? -UninstallOnlyOnWin64=Tento produkt lze odinstalovat pouze v 64-bitovch verzch MS Windows. -OnlyAdminCanUninstall=K odinstalaci tohoto produktu muste bt pihleni s prvy administrtora. -UninstallStatusLabel=ekejte prosm, dokud produkt %1 nebude odinstalovn z Vaeho potae. -UninstalledAll=Produkt %1 byl z Vaeho potae spn odinstalovn. -UninstalledMost=Produkt %1 byl odinstalovn.%n%nNkter jeho sousti se odinstalovat nepodailo. Mete je vak odstranit run. -UninstalledAndNeedsRestart=K dokonen odinstalace produktu %1 je nezbytn, aby prvodce odinstalac restartoval V pota.%n%nChcete jej nyn restartovat? -UninstallDataCorrupted=Soubor "%1" je pokozen. Produkt nelze odinstalovat - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Odebrat sdlen soubor? -ConfirmDeleteSharedFile2=Systm indikuje, e nsledujc sdlen soubor nen pouvn dnmi jinmi aplikacemi. M bt tento sdlen soubor prvodcem odinstalac odstrann?%n%nPokud nkter aplikace tento soubor pouvaj, pak po jeho odstrann nemusej pracovat sprvn. Pokud si nejste jisti, zvolte Ne. Ponechn tohoto souboru ve Vaem systmu nezpsob dnou kodu. -SharedFileNameLabel=Nzev souboru: -SharedFileLocationLabel=Umstn: -WizardUninstalling=Stav odinstalace -StatusUninstalling=Probh odinstalace produktu %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Probh instalace produktu %1. -ShutdownBlockReasonUninstallingApp=Probh odinstalace produktu %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 verze %2 -AdditionalIcons=Dal zstupci: -CreateDesktopIcon=Vytvoit zstupce na &ploe -CreateQuickLaunchIcon=Vytvoit zstupce na panelu &Snadn sputn -ProgramOnTheWeb=Aplikace %1 na internetu -UninstallProgram=Odinstalovat aplikaci %1 -LaunchProgram=Spustit aplikaci %1 -AssocFileExtension=Vytvoit &asociaci mezi soubory typu %2 a aplikac %1 -AssocingFileExtension=Vytv se asociace mezi soubory typu %2 a aplikac %1... -AutoStartProgramGroupDescription=Po sputn: -AutoStartProgram=Spoutt aplikaci %1 automaticky -AddonHostProgramNotFound=Aplikace %1 nebyla ve Vmi zvolen sloce nalezena.%n%nChcete pesto pokraovat? diff --git a/Greenshot/tools/innosetup/Languages/Danish.isl b/Greenshot/tools/innosetup/Languages/Danish.isl deleted file mode 100644 index 9009af804..000000000 --- a/Greenshot/tools/innosetup/Languages/Danish.isl +++ /dev/null @@ -1,334 +0,0 @@ -; Translation made with Translator 1.32 (http://www2.arnes.si/~sopjsimo/translator.html) -; $Translator:NL=%n:TB=%t -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; ID: Danish.isl,v 5.5.3+ 2012/12/14 Thomas Vedel, thomas@veco.dk - -[LangOptions] -LanguageName=Dansk -LanguageID=$0406 -LanguageCodePage=1252 - -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName=MS Shell Dlg -;DialogFontSize=8 -;DialogFontStandardHeight=13 -;TitleFontName=Arial -;TitleFontSize=29 -;WelcomeFontName=Arial -;WelcomeFontSize=12 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] -; *** Application titles -SetupAppTitle=Installationsguide -SetupWindowTitle=Installationsguide - %1 -UninstallAppTitle=Afinstaller -UninstallAppFullTitle=Afinstallerer %1 - -; *** Misc. common -InformationTitle=Information -ConfirmTitle=Bekrft -ErrorTitle=Fejl - -; *** SetupLdr messages -SetupLdrStartupMessage=Denne guide installerer %1. Fortst? -LdrCannotCreateTemp=Kan ikke danne en midlertidig fil. Installationen afbrydes -LdrCannotExecTemp=Kan ikke udfre et program i mappen til opbevaring af midlertidige filer. Installationen afbrydes - -; *** Startup error messages -LastErrorMessage=%1.%n%nFejl %2: %3 -SetupFileMissing=Filen %1 mangler i installations-mappen. Ret fejlen eller skaf en ny kopi af programmet. -SetupFileCorrupt=Installationsfilerne er delagt. Skaf en ny kopi af installationsprogrammet. -SetupFileCorruptOrWrongVer=Installationsfilerne er delagt, eller ogs passer de ikke til denne version af installationen. Ret fejlen eller skaf en ny kopi af installationsprogrammet. -InvalidParameter=En ugyldig parameter blev angivet p kommandolinjen:%n%n%1 -SetupAlreadyRunning=Installationsprogrammet krer allerede. -WindowsVersionNotSupported=Programmet kan ikke anvendes p den version af Windows som denne computer krer. -WindowsServicePackRequired=Dette program krver %1 med Service Pack %2 eller senere. -NotOnThisPlatform=Programmet kan ikke anvendes p %1. -OnlyOnThisPlatform=Programmet kan kun anvendes p %1. -OnlyOnTheseArchitectures=Dette program kan kun installeres p Windows-versioner som er designet til denne processortype:%n%n%1 -MissingWOW64APIs=Den anvendte Windows-version indeholder ikke funktioner som er ndvendige for at foretage en 64-bit installation. Du kan afhjlpe problemet ved at installere Service Pack %1. -WinVersionTooLowError=Programmet krver %1 version %2 eller nyere. -WinVersionTooHighError=Programmet kan ikke installeres p %1 version %2 eller nyere. -AdminPrivilegesRequired=Du skal vre logget p som administrator for at kunne installere dette program. -PowerUserPrivilegesRequired=Du skal vre logget p som administrator eller vre medlem af superbruger-gruppen for at kunne installere dette program. -SetupAppRunningError=Programmet %1 er aktivt.%n%nAfslut venligst frst programmet, og klik dernst OK for at fortstte, eller Annuller for at afbryde. -UninstallAppRunningError=Programmet %1 er aktivt.%n%nAfslut venligst frst programmet, og klik dernst OK for at fortstte, eller Annuller for at afbryde. - -; *** Misc. errors -ErrorCreatingDir=Installationen kunne ikke oprette mappen "%1" -ErrorTooManyFilesInDir=Det kan ikke lade sig gre at oprette en fil i mappen "%1" fordi mappen indeholder for mange filer - -; *** Setup common messages -ExitSetupTitle=Afbryd installationen -ExitSetupMessage=Installationen er ikke frdiggjort. Hvis der afbrydes nu, vil programmet ikke blive installeret.%n%nInstallationsguiden skal kres igen for at frdiggre installationen.%n%nAfbryd installationen? -AboutSetupMenuItem=&Om installationsguiden... -AboutSetupTitle=Om installationsguiden -AboutSetupMessage=%1 version %2%n%3%n%n%1 hjemmeside:%n%4 -AboutSetupNote= - -; *** Buttons -TranslatorNote= -ButtonBack=< &Tilbage -ButtonNext=N&ste > -ButtonInstall=&Installer -ButtonOK=&OK -ButtonCancel=&Afbryd -ButtonYes=&Ja -ButtonYesToAll=Ja til A&lle -ButtonNo=&Nej -ButtonNoToAll=Nej t&il Alle -ButtonFinish=&Frdig -ButtonBrowse=&Gennemse... -ButtonWizardBrowse=G&ennemse... -ButtonNewFolder=&Opret Ny Mappe - -; *** "Select Language" dialog messages -SelectLanguageTitle=Vlg installationssprog -SelectLanguageLabel=Vlg hvilket sprog der skal anvendes under installationen: - -; *** Common wizard text -ClickNext=Klik Nste for at fortstte, eller Afbryd for at afslutte. -BeveledLabel= -BrowseDialogTitle=Udvlg mappe -BrowseDialogLabel=Vlg en mappe fra nedenstende liste. Klik dernst OK. -NewFolderName=Ny Mappe - -; *** "Welcome" wizard page -WelcomeLabel1=Velkommen til [name] installationsguiden -WelcomeLabel2=Denne guide installerer [name/ver] p computeren.%n%nDet anbefales at alle andre programmer afsluttes fr der fortsttes. - -; *** "Password" wizard page -WizardPassword=Adgangskode -PasswordLabel1=Installationen er beskyttet med adgangskode. -PasswordLabel3=Indtast adgangskoden og klik Nste for at fortstte. Der skelnes mellem store og sm bogstaver. -PasswordEditLabel=&Adgangskode: -IncorrectPassword=Adgangskoden er ikke korrekt. Prv igen, og husk at der skelnes mellem store og sm bogstaver. - -; *** "License Agreement" wizard page -WizardLicense=Licensaftale -LicenseLabel=Ls venligst den flgende information, som er vigtig, inden du fortstter. -LicenseLabel3=Ls venligst licensaftalen. Du skal acceptere betingelserne i aftalen for at fortstte installationen. -LicenseAccepted=Jeg &accepterer aftalen -LicenseNotAccepted=Jeg accepterer &ikke aftalen - -; *** "Information" wizard pages -WizardInfoBefore=Information -InfoBeforeLabel=Ls flgende information inden du fortstter. -InfoBeforeClickLabel=Tryk p Nste, nr du er klar til at fortstte installationen. -WizardInfoAfter=Information -InfoAfterLabel=Ls flgende information inden du fortstter. -InfoAfterClickLabel=Tryk p Nste, nr du er klar til at fortstte installationen. - -; *** "User Information" wizard page -WizardUserInfo=Brugerinformation -UserInfoDesc=Indtast dine oplysninger. -UserInfoName=&Brugernavn: -UserInfoOrg=&Organisation: -UserInfoSerial=&Serienummer: -UserInfoNameRequired=Du skal indtaste et navn. - -; *** "Select Destination Directory" wizard page -WizardSelectDir=Vlg installationsmappe -SelectDirDesc=Hvor skal [name] installeres? -SelectDirLabel3=Guiden installerer [name] i flgende mappe. -SelectDirBrowseLabel=Klik Nste for at fortstte. Hvis du vil vlge en anden mappe skal du klikke Gennemse. -DiskSpaceMBLabel=Der skal vre mindst [mb] MB fri diskplads. -CannotInstallToNetworkDrive=Programmet kan ikke installeres p et netvrksdrev. -CannotInstallToUNCPath=Programmet kan ikke installeres til en UNC-sti. -InvalidPath=Du skal indtaste den komplette sti med drevangivelse; for eksempel:%n%nC:\APP%n%neller et UNC-stinavn p formen:%n%n\\server\share -InvalidDrive=Drevet eller UNC-stien du valgte eksisterer ikke. Vlg venligst noget andet. -DiskSpaceWarningTitle=Ikke nok fri diskplads. -DiskSpaceWarning=Guiden krver mindst %1 KB fri diskplads for at kunne foretage installationen, men det valgte drev har kun %2 KB diskplads tilgngelig.%n%nVil du installere alligevel? -DirNameTooLong=Mappens eller stiens navn er for langt. -InvalidDirName=Mappenavnet er ikke gyldigt. -BadDirName32=Navne p mapper m ikke indeholde nogen af flgende tegn:%n%n%1 -DirExistsTitle=Mappen eksisterer -DirExists=Mappen:%n%n%1%n%neksisterer allerede. nsker du at installere i denne mappe alligevel? -DirDoesntExistTitle=Mappen eksisterer ikke. -DirDoesntExist=Mappen:%n%n%1%n%neksisterer ikke. nsker du at oprette denne mappe? - -; *** "Select Components" wizard page -WizardSelectComponents=Vlg Komponenter -SelectComponentsDesc=Hvilke komponenter skal installeres? -SelectComponentsLabel2=Vlg de komponenter der skal installeres, og fjern markering fra dem der ikke skal installeres. Klik Nste for at fortstte. -FullInstallation=Komplet installation -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompakt installation -CustomInstallation=Tilpasset installation -NoUninstallWarningTitle=Komponenterne er installeret -NoUninstallWarning=Installationen har konstateret at flgende komponenter allerede er installeret p computeren:%n%n%1%n%nAt fravlge komponenterne vil ikke fjerne dem.%n%nFortst alligevel? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Det valgte krver mindst [mb] MB fri plads p harddisken. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Vlg ekstra opgaver -SelectTasksDesc=Hvilke andre opgaver skal udfres? -SelectTasksLabel2=Vlg hvilke ekstraopgaver der skal udfres under installationen af [name] og klik p Nste. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Vlg Start-menu mappe -SelectStartMenuFolderDesc=Hvor skal installationen oprette genveje til programmet? -SelectStartMenuFolderLabel3=Installationsguiden opretter genveje (ikoner) til programmet i flgende mappe i Start-menuen. -SelectStartMenuFolderBrowseLabel=Klik Nste for at fortstte. Hvis du vil vlge en anden mappe skal du klikke Gennemse. -MustEnterGroupName=Du skal angive et mappenavn. -GroupNameTooLong=Mappens eller stiens navn er for langt. -InvalidGroupName=Mappenavnet er ikke gyldigt. -BadGroupName=Tegnene %1 m ikke anvendes i navnet p en programgruppe. Angiv andet navn. -NoProgramGroupCheck2=Opret &ingen programgruppe i Start-menuen - -; *** "Ready to Install" wizard page -WizardReady=Klar til at installere -ReadyLabel1=Installationsguiden er nu klar til at installere [name] p computeren. -ReadyLabel2a=Tryk p Installer for at fortstte med installationen, eller tryk p Tilbage hvis du nsker at se eller ndre dine indstillinger. -ReadyLabel2b=Tryk p Installer for at fortstte med installationen. -ReadyMemoUserInfo=Oplysninger om brugeren: -ReadyMemoDir=Installationsmappe : -ReadyMemoType=Installationstype: -ReadyMemoComponents=Valgte komponenter: -ReadyMemoGroup=Start-menu mappe: -ReadyMemoTasks=Valgte ekstraopgaver: - -; *** "Preparing to Install" wizard page -WizardPreparing=Klargr installationen -PreparingDesc=Installationsguiden klargr installationen af [name] p din computer. -PreviousInstallNotCompleted=Den foregende installation eller fjernelse af et program er ikke afsluttet. Du skal genstarte computeren for at afslutte den foregende installation.%n%nEfter genstarten skal du kre installationsguiden igen for at fuldfre installationen af [name]. -CannotContinue=Installationsguiden kan ikke fortstte. Klik p Fortryd for at afslutte. -ApplicationsFound=Flgende programmer bruger filer som skal opdateres. Det anbefales at du giver installationsguiden lov til automatisk at lukke programmerne. -ApplicationsFound2=Flgende programmer bruger filer som skal opdateres. Det anbefales at du giver installationsguiden lov til automatisk at lukke programmerne. Installationsguiden vil forsge at genstarte programmerne nr installationen er afsluttet. -CloseApplications=&Luk programmerne automatisk -DontCloseApplications=Luk &ikke programmerne -ErrorCloseApplications=Installationsguiden kan ikke automatisk lukke alle programmerne. Det anbefales at du lukker alle programmer som bruger filer der skal opdateres, inden installationsguiden fortstter. - -; *** "Installing" wizard page -WizardInstalling=Installerer -InstallingLabel=Vent mens installationsguiden installerer [name] p din computer. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Afslutter installation af [name] -FinishedLabelNoIcons=Installationsguiden har installeret [name] p din computer. -FinishedLabel=Installationsguiden har installeret [name] p din computer. Programmet kan startes ved at vlge de oprettede genveje. -ClickFinish=Klik p Frdig for at afslutte installationsprogrammet. -FinishedRestartLabel=For at fuldfre installationen af [name], skal din computer genstartes. Vil du genstarte computeren nu? -FinishedRestartMessage=For at fuldfre installationen af [name], skal din computer genstartes.%n%nVil du genstarte computeren nu? -ShowReadmeCheck=Ja, jeg vil gerne lse README filen -YesRadio=&Ja, genstart computeren nu -NoRadio=&Nej, jeg genstarter selv computeren senere -; used for example as 'Run MyProg.exe' -RunEntryExec=Kr %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Ls %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Installationsprogrammet skal bruge den nste disk(ette) -SelectDiskLabel2=Indst disk nr. %1 og klik OK.%n%nHvis filerne findes i en anden mappe s indtast stien eller klik Gennemse. -PathLabel=&Stinavn: -FileNotInDir2=Filen "%1" findes ikke i "%2". Indst den rigtige disk eller vlg en anden mappe. -SelectDirectoryLabel=Angiv placeringen af den nste disk. - -; *** Installation phase messages -SetupAborted=Installationen blev ikke gennemfrt.%n%nInstaller igen, hent programmet p ny, eller kontakt producenten for hjlp. -EntryAbortRetryIgnore=Klik Gentag for at forsge igen, Ignorer for at fortstte alligevel, eller Afbryd for at annullere installationen. - -; *** Installation status messages -StatusClosingApplications=Lukker programmer... -StatusCreateDirs=Opretter mapper... -StatusExtractFiles=Udpakker filer... -StatusCreateIcons=Opretter program-genveje... -StatusCreateIniEntries=Opretter INI-filer... -StatusCreateRegistryEntries=Opdaterer registrerings-databasen... -StatusRegisterFiles=Registrerer filer... -StatusSavingUninstall=Gemmer information om afinstallation... -StatusRunProgram=Frdiggr installation... -StatusRestartingApplications=Genstarter programmer... -StatusRollback=Fjerner programmet igen... - -; *** Misc. errors -ErrorInternal2=Intern fejl: %1 -ErrorFunctionFailedNoCode=%1 fejlede -ErrorFunctionFailed=%1 fejlede; kode %2 -ErrorFunctionFailedWithMessage=%1 fejlede; kode %2.%n%3 -ErrorExecutingProgram=Kan ikke udfre filen:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Fejl ved bning af registreringsngle:%n%1\%2 -ErrorRegCreateKey=Fejl ved oprettelse af registreringsngle:%n%1\%2 -ErrorRegWriteKey=Fejl ved skrivning til registreringsngle:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Fejl ved oprettelse af variabel i INI-filen "%1". - -; *** File copying errors -FileAbortRetryIgnore=Klik Gentag for at prve igen, Ignorer for at springe filen over (kan normalt ikke anbefales) eller Afbryd for at afslutte installationen. -FileAbortRetryIgnore2=Klik Gentag for at prve igen, Ignorer for at fortstte alligevel (kan normalt ikke anbefales) eller Afbryd for at afslutte installationen. -SourceIsCorrupted=Kildefilen er beskadiget -SourceDoesntExist=Kildefilen "%1" findes ikke -ExistingFileReadOnly=Den eksisterende fil er markeret som skrivebeskyttet.%n%nKlik Gentag for at prve igen (efter at du har fjernet skrivebeskyttelsen), Ignorer for at springe filen over eller Afbryd for at afslutte installationen. -ErrorReadingExistingDest=Der opsted en fejl ved forsg p at lse den eksisterende fil: -FileExists=Filen eksisterer allerede.%n%nSkal Installationsguiden overskrive den? -ExistingFileNewer=Den eksisterende fil er nyere end den installation forsger at skrive. Det anbefales at beholde den eksisterende fil.%n%n Skal den eksisterende fil beholdes? -ErrorChangingAttr=Der opstod en fejl ved forsg p at ndre attributter for den eksisterende fil: -ErrorCreatingTemp=En fejl opstod ved forsg p at oprette en fil i mappen: -ErrorReadingSource=En fejl opstod ved forsg p at lse kildefilen: -ErrorCopying=En fejl opstod ved forsg p at kopiere en fil: -ErrorReplacingExistingFile=En fejl opstod ved forsg p at overskrive den eksisterende fil: -ErrorRestartReplace=Genstart/Erstat fejlede: -ErrorRenamingTemp=En fejl opstod ved forsg p at omdbe en fil i modtagemappen: -ErrorRegisterServer=Kan ikke registrere DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 fejlede med exit kode %1 -ErrorRegisterTypeLib=Kan ikke registrere typebiblioteket: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Der opstod en fejl ved forsg p at bne README filen. -ErrorRestartingComputer=Installationen kunne ikke genstarte computeren. Genstart venligst computeren manuelt. - -; *** Uninstaller messages -UninstallNotFound=Filen "%1" eksisterer ikke. Afinstallationen kan ikke fortstte. -UninstallOpenError=Filen "%1" kunne ikke bnes. Kan ikke afinstallere -UninstallUnsupportedVer=Afinstallations-logfilen "%1" er i et format der ikke kan genkendes af denne version af afinstallations-programmet. Afinstallationen afbrydes -UninstallUnknownEntry=Der er en ukendt kommando (%1) i afinstallings-logfilen. -ConfirmUninstall=Er du sikker p at %1 og alle tilhrende komponenter skal fjernes fra computeren? -UninstallOnlyOnWin64=Denne installation kan kun fjernes p 64-bit Windows-versioner -OnlyAdminCanUninstall=Programmet kan kun fjernes af en bruger med administrator-rettigheder. -UninstallStatusLabel=Vent venligst imens %1 fjernes. -UninstalledAll=%1 er fjernet uden fejl. -UninstalledMost=%1 Afinstallation er afsluttet.%n%nNogle filer kunne ikke fjernes. Fjern dem manuelt, hvis du ikke nsker de skal blive liggende. -UninstalledAndNeedsRestart=For at afslutte afinstallation af %1 skal computeren genstartes.%n%nVil du genstarte nu? -UninstallDataCorrupted="%1" er beskadiget. Afinstallation kan ikke foretages - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Fjern delt fil? -ConfirmDeleteSharedFile2=Systemet mener ikke lngere at flgende delte fil(er) benyttes. Skal den/de delte fil(er) fjernes under afinstallationen?%n%nHvis du er usikker s vlg Nej. Beholdes filen p maskinen, vil den ikke gre nogen skade, men hvis filen fjernes, selv om den stadig anvendes, bliver de programmer, der anvender filen, ustabile -SharedFileNameLabel=Filnavn: -SharedFileLocationLabel=Placering: -WizardUninstalling=Status for afinstallation -StatusUninstalling=Afinstallerer %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installerer %1. -ShutdownBlockReasonUninstallingApp=Afinstallerer %1. - -[CustomMessages] -NameAndVersion=%1 version %2 -AdditionalIcons=Ekstra ikoner: -CreateDesktopIcon=Lav ikon p skrive&bordet -CreateQuickLaunchIcon=Lav &hurtigstart-ikon -ProgramOnTheWeb=%1 p internettet -UninstallProgram=Afinstaller (fjern) %1 -LaunchProgram=&Kr %1 -AssocFileExtension=Sammen&kd %1 med filtypen %2 -AssocingFileExtension=Sammenkder %1 med filtypen %2... -AutoStartProgramGroupDescription=Start: -AutoStartProgram=Start automatisk %1 -AddonHostProgramNotFound=%1 blev ikke fundet i den mappe du angav.%n%nnsker du alligevel at fortstte? diff --git a/Greenshot/tools/innosetup/Languages/Dutch.isl b/Greenshot/tools/innosetup/Languages/Dutch.isl deleted file mode 100644 index 33d7ad82a..000000000 --- a/Greenshot/tools/innosetup/Languages/Dutch.isl +++ /dev/null @@ -1,314 +0,0 @@ -; *** Inno Setup version 5.5.3+ Dutch messages *** -; -; This file is based on user-contributed translations by various authors -; -; Maintained by Martijn Laan (mlaan@jrsoftware.org) - -[LangOptions] -LanguageName=Nederlands -LanguageID=$0413 -LanguageCodePage=1252 - -[Messages] - -; *** Application titles -SetupAppTitle=Setup -SetupWindowTitle=Setup - %1 -UninstallAppTitle=Verwijderen -UninstallAppFullTitle=%1 verwijderen - -; *** Misc. common -InformationTitle=Informatie -ConfirmTitle=Bevestigen -ErrorTitle=Fout - -; *** SetupLdr messages -SetupLdrStartupMessage=Hiermee wordt %1 genstalleerd. Wilt u doorgaan? -LdrCannotCreateTemp=Kan geen tijdelijk bestand maken. Setup wordt afgesloten -LdrCannotExecTemp=Kan een bestand in de tijdelijke map niet uitvoeren. Setup wordt afgesloten - -; *** Startup error messages -LastErrorMessage=%1.%n%nFout %2: %3 -SetupFileMissing=Het bestand %1 ontbreekt in de installatiemap. Corrigeer dit probleem of gebruik een andere kopie van het programma. -SetupFileCorrupt=De installatiebestanden zijn beschadigd. Gebruik een andere kopie van het programma. -SetupFileCorruptOrWrongVer=De installatiebestanden zijn beschadigd, of zijn niet compatibel met deze versie van Setup. Corrigeer dit probleem of gebruik een andere kopie van het programma. -InvalidParameter=Er werd een ongeldige schakeloptie opgegeven op de opdrachtregel:%n%n%1 -SetupAlreadyRunning=Setup is al gestart. -WindowsVersionNotSupported=Dit programma ondersteunt de versie van Windows die u gebruikt niet. -WindowsServicePackRequired=Dit programma vereist %1 Service Pack %2 of hoger. -NotOnThisPlatform=Dit programma kan niet worden uitgevoerd onder %1. -OnlyOnThisPlatform=Dit programma moet worden uitgevoerd onder %1. -OnlyOnTheseArchitectures=Dit programma kan alleen genstalleerd worden onder versies van Windows ontworpen voor de volgende processor architecturen:%n%n%1 -MissingWOW64APIs=De versie van Windows die u gebruikt bevat niet de door Setup benodige functionaliteit om een 64-bit installatie uit te voeren. Installeer Service Pack %1 om dit probleem te corrigeren. -WinVersionTooLowError=Dit programma vereist %1 versie %2 of hoger. -WinVersionTooHighError=Dit programma kan niet worden genstalleerd onder %1 versie %2 of hoger. -AdminPrivilegesRequired=U moet aangemeld zijn als een systeembeheerder om dit programma te kunnen installeren. -PowerUserPrivilegesRequired=U moet ingelogd zijn als systeembeheerder of als gebruiker met systeembeheerders rechten om dit programma te kunnen installeren. -SetupAppRunningError=Setup heeft vastgesteld dat %1 op dit moment actief is.%n%nSluit alle vensters van dit programma, en klik daarna op OK om verder te gaan, of op Annuleren om Setup af te sluiten. -UninstallAppRunningError=Het verwijderprogramma heeft vastgesteld dat %1 op dit moment actief is.%n%nSluit alle vensters van dit programma, en klik daarna op OK om verder te gaan, of op Annuleren om het verwijderen af te breken. - -; *** Misc. errors -ErrorCreatingDir=Setup kan de map "%1" niet maken -ErrorTooManyFilesInDir=Kan geen bestand maken in de map "%1" omdat deze te veel bestanden bevat - -; *** Setup common messages -ExitSetupTitle=Setup afsluiten -ExitSetupMessage=Setup is niet voltooid. Als u nu afsluit, wordt het programma niet genstalleerd.%n%nU kunt Setup later opnieuw uitvoeren om de installatie te voltooien.%n%nSetup afsluiten? -AboutSetupMenuItem=&Over Setup... -AboutSetupTitle=Over Setup -AboutSetupMessage=%1 versie %2%n%3%n%n%1-homepage:%n%4 -AboutSetupNote= -TranslatorNote=Dutch translation maintained by Martijn Laan (mlaan@jrsoftware.org) - -; *** Buttons -ButtonBack=< Vo&rige -ButtonNext=&Volgende > -ButtonInstall=&Installeren -ButtonOK=OK -ButtonCancel=Annuleren -ButtonYes=&Ja -ButtonYesToAll=Ja op &alles -ButtonNo=&Nee -ButtonNoToAll=N&ee op alles -ButtonFinish=&Voltooien -ButtonBrowse=&Bladeren... -ButtonWizardBrowse=B&laderen... -ButtonNewFolder=&Nieuwe map maken - -; *** "Select Language" dialog messages -SelectLanguageTitle=Taalkeuze voor Setup -SelectLanguageLabel=Selecteer de taal welke Setup gebruikt tijdens de installatie: - -; *** Common wizard text -ClickNext=Klik op Volgende om verder te gaan of op Annuleren om Setup af te sluiten. -BeveledLabel= -BrowseDialogTitle=Map Selecteren -BrowseDialogLabel=Selecteer een map in onderstaande lijst en klik daarna op OK. -NewFolderName=Nieuwe map - -; *** "Welcome" wizard page -WelcomeLabel1=Welkom bij het installatieprogramma van [name]. -WelcomeLabel2=Hiermee wordt [name/ver] genstalleerd op deze computer.%n%nU wordt aanbevolen alle actieve programma's af te sluiten voordat u verder gaat. - -; *** "Password" wizard page -WizardPassword=Wachtwoord -PasswordLabel1=Deze installatie is beveiligd met een wachtwoord. -PasswordLabel3=Voer het wachtwoord in en klik op Volgende om verder te gaan. Wachtwoorden zijn hoofdlettergevoelig. -PasswordEditLabel=&Wachtwoord: -IncorrectPassword=Het ingevoerde wachtwoord is niet correct. Probeer het opnieuw. - -; *** "License Agreement" wizard page -WizardLicense=Licentieovereenkomst -LicenseLabel=Lees de volgende belangrijke informatie voordat u verder gaat. -LicenseLabel3=Lees de volgende licentieovereenkomst. Gebruik de schuifbalk of druk op de knop Page Down om de rest van de overeenkomst te zien. -LicenseAccepted=Ik &accepteer de licentieovereenkomst -LicenseNotAccepted=Ik accepteer de licentieovereenkomst &niet - -; *** "Information" wizard pages -WizardInfoBefore=Informatie -InfoBeforeLabel=Lees de volgende belangrijke informatie voordat u verder gaat. -InfoBeforeClickLabel=Klik op Volgende als u gereed bent om verder te gaan met Setup. -WizardInfoAfter=Informatie -InfoAfterLabel=Lees de volgende belangrijke informatie voordat u verder gaat. -InfoAfterClickLabel=Klik op Volgende als u gereed bent om verder te gaan met Setup. - -; *** "User Information" wizard page -WizardUserInfo=Gebruikersinformatie -UserInfoDesc=Vul hier uw informatie in. -UserInfoName=&Gebruikersnaam: -UserInfoOrg=&Organisatie: -UserInfoSerial=&Serienummer: -UserInfoNameRequired=U moet een naam invullen. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Kies de doelmap -SelectDirDesc=Waar moet [name] genstalleerd worden? -SelectDirLabel3=Setup zal [name] in de volgende map installeren. -SelectDirBrowseLabel=Klik op Volgende om door te gaan. Klik op Bladeren om een andere map te kiezen. -DiskSpaceMBLabel=Er is ten minste [mb] MB vrije schijfruimte vereist. -CannotInstallToNetworkDrive=Setup kan niet installeren naar een netwerkstation. -CannotInstallToUNCPath=Setup kan niet installeren naar een UNC-pad. -InvalidPath=U moet een volledig pad met stationsletter invoeren; bijvoorbeeld:%nC:\APP%n%nof een UNC-pad zoals:%n%n\\server\share -InvalidDrive=Het geselecteerde station bestaat niet. Kies een ander station. -DiskSpaceWarningTitle=Onvoldoende schijfruimte -DiskSpaceWarning=Setup vereist ten minste %1 kB vrije schijfruimte voor het installeren, maar het geselecteerde station heeft slechts %2 kB beschikbaar.%n%nWilt u toch doorgaan? -DirNameTooLong=De mapnaam of het pad is te lang. -InvalidDirName=De mapnaam is ongeldig. -BadDirName32=Mapnamen mogen geen van de volgende tekens bevatten:%n%n%1 -DirExistsTitle=Map bestaat al -DirExists=De map:%n%n%1%n%nbestaat al. Wilt u toch naar die map installeren? -DirDoesntExistTitle=Map bestaat niet -DirDoesntExist=De map:%n%n%1%n%nbestaat niet. Wilt u de map aanmaken? - -; *** "Select Components" wizard page -WizardSelectComponents=Selecteer componenten -SelectComponentsDesc=Welke componenten moeten genstalleerd worden? -SelectComponentsLabel2=Selecteer de componenten die u wilt installeren. Klik op Volgende als u klaar bent om verder te gaan. -FullInstallation=Volledige installatie -CompactInstallation=Compacte installatie -CustomInstallation=Aangepaste installatie -NoUninstallWarningTitle=Component bestaat -NoUninstallWarning=Setup heeft gedetecteerd dat de volgende componenten al genstalleerd zijn op uw computer:%n%n%1%n%nAls u de selectie van deze componenten ongedaan maakt, worden ze niet verwijderd.%n%nWilt u toch doorgaan? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=De huidige selectie vereist ten minste [mb] MB vrije schijfruimte. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Selecteer extra taken -SelectTasksDesc=Welke extra taken moeten uitgevoerd worden? -SelectTasksLabel2=Selecteer de extra taken die u door Setup wilt laten uitvoeren bij het installeren van [name], en klik vervolgens op Volgende. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Selecteer menu Start map -SelectStartMenuFolderDesc=Waar moeten de snelkoppelingen van het programma geplaatst worden? -SelectStartMenuFolderLabel3=Setup plaatst de snelkoppelingen van het programma in de volgende menu Start map. -SelectStartMenuFolderBrowseLabel=Klik op Volgende om door te gaan. Klik op Bladeren om een andere map te kiezen. -MustEnterGroupName=U moet een mapnaam invoeren. -GroupNameTooLong=De mapnaam of het pad is te lang. -InvalidGroupName=De mapnaam is ongeldig. -BadGroupName=De mapnaam mag geen van de volgende tekens bevatten:%n%n%1 -NoProgramGroupCheck2=&Geen menu Start map maken - -; *** "Ready to Install" wizard page -WizardReady=Het voorbereiden van de installatie is gereed -ReadyLabel1=Setup is nu gereed om te beginnen met het installeren van [name] op deze computer. -ReadyLabel2a=Klik op Installeren om verder te gaan met installeren, of klik op Vorige als u instellingen wilt terugzien of veranderen. -ReadyLabel2b=Klik op Installeren om verder te gaan met installeren. -ReadyMemoUserInfo=Gebruikersinformatie: -ReadyMemoDir=Doelmap: -ReadyMemoType=Installatietype: -ReadyMemoComponents=Geselecteerde componenten: -ReadyMemoGroup=Menu Start map: -ReadyMemoTasks=Extra taken: - -; *** "Preparing to Install" wizard page -WizardPreparing=Bezig met het voorbereiden van de installatie -PreparingDesc=Setup is bezig met het voorbereiden van de installatie van [name]. -PreviousInstallNotCompleted=De installatie/verwijdering van een vorig programma is niet voltooid. U moet uw computer opnieuw opstarten om die installatie te voltooien.%n%nStart [name] Setup nogmaals als uw computer opnieuw is opgestart. -CannotContinue=Setup kan niet doorgaan. Klik op annuleren om af te sluiten. -ApplicationsFound=De volgende programma's gebruiken bestanden die moeten worden bijgewerkt door Setup. U wordt aanbevolen Setup toe te staan om automatisch deze programma's af te sluiten. -ApplicationsFound2=De volgende programma's gebruiken bestanden die moeten worden bijgewerkt door Setup. U wordt aanbevolen Setup toe te staan om automatisch deze programma's af te sluiten. Nadat de installatie is voltooid zal Setup proberen de applicaties opnieuw op te starten. -CloseApplications=&Programma's automatisch afsluiten -DontCloseApplications=Programma's &niet afsluiten -ErrorCloseApplications=Setup kon niet alle programma's automatisch afsluiten. U wordt aanbevolen alle programma's die bestanden gebruiken die moeten worden bijgewerkt door Setup af te sluiten voordat u verder gaat. - -; *** "Installing" wizard page -WizardInstalling=Bezig met installeren -InstallingLabel=Setup installeert [name] op uw computer. Een ogenblik geduld... - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Setup heeft het installeren van [name] op deze computer voltooid. -FinishedLabelNoIcons=Setup heeft het installeren van [name] op deze computer voltooid. -FinishedLabel=Setup heeft het installeren van [name] op deze computer voltooid. U kunt het programma uitvoeren met de genstalleerde snelkoppelingen. -ClickFinish=Klik op Voltooien om Setup te beindigen. -FinishedRestartLabel=Setup moet de computer opnieuw opstarten om de installatie van [name] te voltooien. Wilt u nu opnieuw opstarten? -FinishedRestartMessage=Setup moet uw computer opnieuw opstarten om de installatie van [name] te voltooien.%n%nWilt u nu opnieuw opstarten? -ShowReadmeCheck=Ja, ik wil het bestand Leesmij zien -YesRadio=&Ja, start de computer nu opnieuw op -NoRadio=&Nee, ik start de computer later opnieuw op -RunEntryExec=Start %1 -RunEntryShellExec=Bekijk %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Setup heeft de volgende diskette nodig -SelectDiskLabel2=Voer diskette %1 in en klik op OK.%n%nAls de bestanden op deze diskette in een andere map gevonden kunnen worden dan die hieronder wordt getoond, voer dan het juiste pad in of klik op Bladeren. -PathLabel=&Pad: -FileNotInDir2=Kan het bestand "%1" niet vinden in "%2". Voer de juiste diskette in of kies een andere map. -SelectDirectoryLabel=Geef de locatie van de volgende diskette. - -; *** Installation phase messages -SetupAborted=Setup is niet voltooid.%n%nCorrigeer het probleem en voer Setup opnieuw uit. -EntryAbortRetryIgnore=Klik op Opnieuw om het opnieuw te proberen, op Negeren om toch door te gaan, of op Afbreken om de installatie af te breken. - -; *** Installation status messages -StatusClosingApplications=Programma's afsluiten... -StatusCreateDirs=Mappen maken... -StatusExtractFiles=Bestanden uitpakken... -StatusCreateIcons=Snelkoppelingen maken... -StatusCreateIniEntries=INI-gegevens instellen... -StatusCreateRegistryEntries=Registergegevens instellen... -StatusRegisterFiles=Bestanden registreren... -StatusSavingUninstall=Verwijderingsinformatie opslaan... -StatusRunProgram=Installatie voltooien... -StatusRestartingApplications=Programma's opnieuw starten... -StatusRollback=Veranderingen ongedaan maken... - -; *** Misc. errors -ErrorInternal2=Interne fout: %1 -ErrorFunctionFailedNoCode=%1 mislukt -ErrorFunctionFailed=%1 mislukt; code %2 -ErrorFunctionFailedWithMessage=%1 mislukt; code %2.%n%3 -ErrorExecutingProgram=Kan bestand niet uitvoeren:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Fout bij het openen van registersleutel:%n%1\%2 -ErrorRegCreateKey=Fout bij het maken van registersleutel:%n%1\%2 -ErrorRegWriteKey=Fout bij het schrijven naar registersleutel:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Fout bij het maken van een INI-instelling in bestand "%1". - -; *** File copying errors -FileAbortRetryIgnore=Klik op Opnieuw om het opnieuw te proberen, op Negeren om toch door te gaan (niet aanbevolen), of op Afbreken om de installatie af te breken. -FileAbortRetryIgnore2=Klik op Opnieuw om het opnieuw te proberen, op Negeren om toch door te gaan (niet aanbevolen), of op Afbreken om de installatie af te breken. -SourceIsCorrupted=Het bronbestand is beschadigd -SourceDoesntExist=Het bronbestand "%1" bestaat niet -ExistingFileReadOnly=Het bestaande bestand is gemarkeerd als alleen-lezen.%n%nKlik op Opnieuw om het kenmerk alleen-lezen te verwijderen en opnieuw te proberen, op Negeren om dit bestand over te slaan, of op Afbreken om de installatie af te breken. -ErrorReadingExistingDest=Er is een fout opgetreden bij het lezen van het bestaande bestand: -FileExists=Het bestand bestaat al.%n%nWilt u dat Setup het overschrijft? -ExistingFileNewer=Het bestaande bestand is nieuwer dan het bestand dat Setup probeert te installeren. U wordt aanbevolen het bestaande bestand te behouden.%n%nWilt u het bestaande bestand behouden? -ErrorChangingAttr=Er is een fout opgetreden bij het wijzigen van de kenmerken van het bestaande bestand: -ErrorCreatingTemp=Er is een fout opgetreden bij het maken van een bestand in de doelmap: -ErrorReadingSource=Er is een fout opgetreden bij het lezen van het bronbestand: -ErrorCopying=Er is een fout opgetreden bij het kopiren van een bestand: -ErrorReplacingExistingFile=Er is een fout opgetreden bij het vervangen van het bestaande bestand: -ErrorRestartReplace=Vervangen na opnieuw starten is mislukt: -ErrorRenamingTemp=Er is een fout opgetreden bij het hernoemen van een bestand in de doelmap: -ErrorRegisterServer=Kan de DLL/OCX niet registreren: %1 -ErrorRegSvr32Failed=RegSvr32 mislukt met afsluitcode %1 -ErrorRegisterTypeLib=Kan de type library niet registreren: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Er is een fout opgetreden bij het openen van het Leesmij-bestand. -ErrorRestartingComputer=Setup kan de computer niet opnieuw opstarten. Doe dit handmatig. - -; *** Uninstaller messages -UninstallNotFound=Bestand "%1" bestaat niet. Kan het programma niet verwijderen. -UninstallUnsupportedVer=Het installatie-logbestand "%1" heeft een formaat dat niet herkend wordt door deze versie van het verwijderprogramma. Kan het programma niet verwijderen -UninstallUnknownEntry=Er is een onbekend gegeven (%1) aangetroffen in het installatie-logbestand -ConfirmUninstall=Weet u zeker dat u %1 en alle bijbehorende componenten wilt verwijderen? -UninstallOnlyOnWin64=Deze installatie kan alleen worden verwijderd onder 64-bit Windows. -OnlyAdminCanUninstall=Deze installatie kan alleen worden verwijderd door een gebruiker met administratieve rechten. -UninstallStatusLabel=%1 wordt verwijderd van uw computer. Een ogenblik geduld. -UninstallOpenError=Bestand "%1" kon niet worden geopend. Kan het verwijderen niet voltooien. -UninstalledAll=%1 is met succes van deze computer verwijderd. -UninstalledMost=Het verwijderen van %1 is voltooid.%n%nEnkele elementen konden niet verwijderd worden. Deze kunnen handmatig verwijderd worden. -UninstalledAndNeedsRestart=Om het verwijderen van %1 te voltooien, moet uw computer opnieuw worden opgestart.%n%nWilt u nu opnieuw opstarten? -UninstallDataCorrupted="%1" bestand is beschadigd. Kan verwijderen niet voltooien - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Gedeeld bestand verwijderen? -ConfirmDeleteSharedFile2=Het systeem geeft aan dat het volgende gedeelde bestand niet langer gebruikt wordt door enig programma. Wilt u dat dit gedeelde bestand verwijderd wordt?%n%nAls dit bestand toch nog gebruikt wordt door een programma en het verwijderd wordt, werkt dat programma misschien niet meer correct. Als u het niet zeker weet, kies dan Nee. Bewaren van het bestand op dit systeem is niet schadelijk. -SharedFileNameLabel=Bestandsnaam: -SharedFileLocationLabel=Locatie: -WizardUninstalling=Verwijderingsstatus -StatusUninstalling=Verwijderen van %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installeren van %1. -ShutdownBlockReasonUninstallingApp=Verwijderen van %1. - -[CustomMessages] - -NameAndVersion=%1 versie %2 -AdditionalIcons=Extra snelkoppelingen: -CreateDesktopIcon=Maak een snelkoppeling op het &bureaublad -CreateQuickLaunchIcon=Maak een snelkoppeling op de &Snel starten werkbalk -ProgramOnTheWeb=%1 op het Web -UninstallProgram=Verwijder %1 -LaunchProgram=&Start %1 -AssocFileExtension=&Koppel %1 aan de %2 bestandsextensie -AssocingFileExtension=Bezig met koppelen van %1 aan de %2 bestandsextensie... -AutoStartProgramGroupDescription=Opstarten: -AutoStartProgram=%1 automatisch starten -AddonHostProgramNotFound=%1 kon niet worden gevonden in de geselecteerde map.%n%nWilt u toch doorgaan? diff --git a/Greenshot/tools/innosetup/Languages/Finnish.isl b/Greenshot/tools/innosetup/Languages/Finnish.isl deleted file mode 100644 index dd02c2555..000000000 --- a/Greenshot/tools/innosetup/Languages/Finnish.isl +++ /dev/null @@ -1,314 +0,0 @@ -; *** Inno Setup version 5.5.3+ Finnish messages *** -; -; Finnish translation by Antti Karttunen -; E-mail: antti.j.karttunen@iki.fi -; Last modification date: 2012-12-15 - -[LangOptions] -LanguageName=Suomi -LanguageID=$040B -LanguageCodePage=1252 - -[Messages] - -; *** Application titles -SetupAppTitle=Asennus -SetupWindowTitle=%1 - Asennus -UninstallAppTitle=Asennuksen poisto -UninstallAppFullTitle=%1 - Asennuksen poisto - -; *** Misc. common -InformationTitle=Ilmoitus -ConfirmTitle=Varmistus -ErrorTitle=Virhe - -; *** SetupLdr messages -SetupLdrStartupMessage=Tll asennusohjelmalla asennetaan %1. Haluatko jatkaa? -LdrCannotCreateTemp=Vliaikaistiedostoa ei voitu luoda. Asennus keskeytettiin -LdrCannotExecTemp=Vliaikaisessa hakemistossa olevaa tiedostoa ei voitu suorittaa. Asennus keskeytettiin - -; *** Startup error messages -LastErrorMessage=%1.%n%nVirhe %2: %3 -SetupFileMissing=Tiedostoa %1 ei lydy asennushakemistosta. Korjaa ongelma tai hanki uusi kopio ohjelmasta. -SetupFileCorrupt=Asennustiedostot ovat vaurioituneet. Hanki uusi kopio ohjelmasta. -SetupFileCorruptOrWrongVer=Asennustiedostot ovat vaurioituneet tai ovat epyhteensopivia tmn Asennuksen version kanssa. Korjaa ongelma tai hanki uusi kopio ohjelmasta. -InvalidParameter=Virheellinen komentoriviparametri:%n%n%1 -SetupAlreadyRunning=Asennus on jo kynniss. -WindowsVersionNotSupported=Tm ohjelma ei tue kytss olevaa Windowsin versiota. -WindowsServicePackRequired=Tm ohjelma vaatii %1 Service Pack %2 -pivityksen tai myhemmn. -NotOnThisPlatform=Tm ohjelma ei toimi %1-kyttjrjestelmss. -OnlyOnThisPlatform=Tm ohjelma toimii vain %1-kyttjrjestelmss. -OnlyOnTheseArchitectures=Tm ohjelma voidaan asentaa vain niihin Windowsin versioihin, jotka on suunniteltu seuraaville prosessorityypeille:%n%n%1 -MissingWOW64APIs=Tm Windowsin versio ei sisll ominaisuuksia, joita Asennus tarvitsee suorittaakseen 64-bittisen asennuksen. Korjaa ongelma asentamalla Service Pack %1. -WinVersionTooLowError=Tm ohjelma vaatii version %2 tai myhemmn %1-kyttjrjestelmst. -WinVersionTooHighError=Tt ohjelmaa ei voi asentaa %1-kyttjrjestelmn versioon %2 tai myhempn. -AdminPrivilegesRequired=Sinun tytyy kirjautua sisn jrjestelmnvalvojana asentaaksesi tmn ohjelman. -PowerUserPrivilegesRequired=Sinun tytyy kirjautua sisn jrjestelmnvalvojana tai tehokyttjn asentaaksesi tmn ohjelman. -SetupAppRunningError=Asennus lysi kynniss olevan kopion ohjelmasta %1.%n%nSulje kaikki kynniss olevat kopiot ohjelmasta ja valitse OK jatkaaksesi, tai valitse Peruuta poistuaksesi. -UninstallAppRunningError=Asennuksen poisto lysi kynniss olevan kopion ohjelmasta %1.%n%nSulje kaikki kynniss olevat kopiot ohjelmasta ja valitse OK jatkaaksesi, tai valitse Peruuta poistuaksesi. - -; *** Misc. errors -ErrorCreatingDir=Asennus ei voinut luoda hakemistoa "%1" -ErrorTooManyFilesInDir=Tiedoston luominen hakemistoon "%1" eponnistui, koska se sislt liian monta tiedostoa - -; *** Setup common messages -ExitSetupTitle=Poistu Asennuksesta -ExitSetupMessage=Asennus ei ole valmis. Jos lopetat nyt, ohjelmaa ei asenneta.%n%nVoit ajaa Asennuksen toiste asentaaksesi ohjelman.%n%nLopetetaanko Asennus? -AboutSetupMenuItem=&Tietoja Asennuksesta... -AboutSetupTitle=Tietoja Asennuksesta -AboutSetupMessage=%1 versio %2%n%3%n%n%1 -ohjelman kotisivu:%n%4 -AboutSetupNote= -TranslatorNote=Suomenkielinen knns: Antti Karttunen (antti.karttunen@joensuu.fi) - -; *** Buttons -ButtonBack=< &Takaisin -ButtonNext=&Seuraava > -ButtonInstall=&Asenna -ButtonOK=OK -ButtonCancel=Peruuta -ButtonYes=&Kyll -ButtonYesToAll=Kyll k&aikkiin -ButtonNo=&Ei -ButtonNoToAll=E&i kaikkiin -ButtonFinish=&Lopeta -ButtonBrowse=S&elaa... -ButtonWizardBrowse=S&elaa... -ButtonNewFolder=&Luo uusi kansio - -; *** "Select Language" dialog messages -SelectLanguageTitle=Valitse Asennuksen kieli -SelectLanguageLabel=Valitse asentamisen aikana kytettv kieli: - -; *** Common wizard text -ClickNext=Valitse Seuraava jatkaaksesi tai Peruuta poistuaksesi. -BeveledLabel= -BrowseDialogTitle=Selaa kansioita -BrowseDialogLabel=Valitse kansio allaolevasta listasta ja valitse sitten OK jatkaaksesi. -NewFolderName=Uusi kansio - -; *** "Welcome" wizard page -WelcomeLabel1=Tervetuloa [name] -asennusohjelmaan. -WelcomeLabel2=Tll asennusohjelmalla koneellesi asennetaan [name/ver]. %n%nOn suositeltavaa, ett suljet kaikki muut kynniss olevat sovellukset ennen jatkamista. Tm auttaa vlttmn ristiriitatilanteita asennuksen aikana. - -; *** "Password" wizard page -WizardPassword=Salasana -PasswordLabel1=Tm asennusohjelma on suojattu salasanalla. -PasswordLabel3=Anna salasana ja valitse sitten Seuraava jatkaaksesi.%n%nIsot ja pienet kirjaimet ovat eriarvoisia. -PasswordEditLabel=&Salasana: -IncorrectPassword=Antamasi salasana oli virheellinen. Anna salasana uudelleen. - -; *** "License Agreement" wizard page -WizardLicense=Kyttoikeussopimus -LicenseLabel=Lue seuraava trke tiedotus ennen kuin jatkat. -LicenseLabel3=Lue seuraava kyttoikeussopimus tarkasti. Sinun tytyy hyvksy sopimus, jos haluat jatkaa asentamista. -LicenseAccepted=&Hyvksyn sopimuksen -LicenseNotAccepted=&En hyvksy sopimusta - -; *** "Information" wizard pages -WizardInfoBefore=Tiedotus -InfoBeforeLabel=Lue seuraava trke tiedotus ennen kuin jatkat. -InfoBeforeClickLabel=Kun olet valmis jatkamaan asentamista, valitse Seuraava. -WizardInfoAfter=Tiedotus -InfoAfterLabel=Lue seuraava trke tiedotus ennen kuin jatkat. -InfoAfterClickLabel=Kun olet valmis jatkamaan asentamista, valitse Seuraava. - -; *** "Select Destination Directory" wizard page -WizardUserInfo=Kyttjtiedot -UserInfoDesc=Anna pyydetyt tiedot. -UserInfoName=Kyttjn &nimi: -UserInfoOrg=&Yritys: -UserInfoSerial=&Tunnuskoodi: -UserInfoNameRequired=Sinun tytyy antaa nimi. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Valitse kohdekansio -SelectDirDesc=Mihin [name] asennetaan? -SelectDirLabel3=[name] asennetaan thn kansioon. -SelectDirBrowseLabel=Valitse Seuraava jatkaaksesi. Jos haluat vaihtaa kansiota, valitse Selaa. -DiskSpaceMBLabel=Vapaata levytilaa tarvitaan vhintn [mb] Mt. -CannotInstallToNetworkDrive=Asennus ei voi asentaa ohjelmaa verkkoasemalle. -CannotInstallToUNCPath=Asennus ei voi asentaa ohjelmaa UNC-polun alle. -InvalidPath=Anna tydellinen polku levyaseman kirjaimen kanssa. Esimerkiksi %nC:\OHJELMA%n%ntai UNC-polku muodossa %n%n\\palvelin\resurssi -InvalidDrive=Valitsemaasi asemaa tai UNC-polkua ei ole olemassa tai sit ei voi kytt. Valitse toinen asema tai UNC-polku. -DiskSpaceWarningTitle=Ei tarpeeksi vapaata levytilaa -DiskSpaceWarning=Asennus vaatii vhintn %1 kt vapaata levytilaa, mutta valitulla levyasemalla on vain %2 kt vapaata levytilaa.%n%nHaluatko jatkaa tst huolimatta? -DirNameTooLong=Kansion nimi tai polku on liian pitk. -InvalidDirName=Virheellinen kansion nimi. -BadDirName32=Kansion nimess ei saa olla seuraavia merkkej:%n%n%1 -DirExistsTitle=Kansio on olemassa -DirExists=Kansio:%n%n%1%n%non jo olemassa. Haluatko kuitenkin suorittaa asennuksen thn kansioon? -DirDoesntExistTitle=Kansiota ei ole olemassa -DirDoesntExist=Kansiota%n%n%1%n%nei ole olemassa. Luodaanko kansio? - -; *** "Select Components" wizard page -WizardSelectComponents=Valitse asennettavat osat -SelectComponentsDesc=Mitk osat asennetaan? -SelectComponentsLabel2=Valitse ne osat, jotka haluat asentaa, ja poista niiden osien valinta, joita et halua asentaa. Valitse Seuraava, kun olet valmis. -FullInstallation=Normaali asennus -CompactInstallation=Suppea asennus -CustomInstallation=Mukautettu asennus -NoUninstallWarningTitle=Asennettuja osia lydettiin -NoUninstallWarning=Seuraavat osat on jo asennettu koneelle:%n%n%1%n%nNiden osien valinnan poistaminen ei poista niit koneelta.%n%nHaluatko jatkaa tst huolimatta? -ComponentSize1=%1 kt -ComponentSize2=%1 Mt -ComponentsDiskSpaceMBLabel=Nykyiset valinnat vaativat vhintn [mb] Mt levytilaa. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Valitse muut toiminnot -SelectTasksDesc=Mit muita toimintoja suoritetaan? -SelectTasksLabel2=Valitse muut toiminnot, jotka haluat Asennuksen suorittavan samalla kun [name] asennetaan. Valitse Seuraava, kun olet valmis. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Valitse Kynnist-valikon kansio -SelectStartMenuFolderDesc=Mihin ohjelman pikakuvakkeet sijoitetaan? -SelectStartMenuFolderLabel3=Ohjelman pikakuvakkeet luodaan thn Kynnist-valikon kansioon. -SelectStartMenuFolderBrowseLabel=Valitse Seuraava jatkaaksesi. Jos haluat vaihtaa kansiota, valitse Selaa. -MustEnterGroupName=Kansiolle pit antaa nimi. -GroupNameTooLong=Kansion nimi tai polku on liian pitk. -InvalidGroupName=Virheellinen kansion nimi. -BadGroupName=Kansion nimess ei saa olla seuraavia merkkej:%n%n%1 -NoProgramGroupCheck2=l luo k&ansiota Kynnist-valikkoon - -; *** "Ready to Install" wizard page -WizardReady=Valmiina asennukseen -ReadyLabel1=[name] on nyt valmis asennettavaksi. -ReadyLabel2a=Valitse Asenna jatkaaksesi asentamista tai valitse Takaisin, jos haluat tarkastella tekemisi asetuksia tai muuttaa niit. -ReadyLabel2b=Valitse Asenna jatkaaksesi asentamista. -ReadyMemoUserInfo=Kyttjtiedot: -ReadyMemoDir=Kohdekansio: -ReadyMemoType=Asennustyyppi: -ReadyMemoComponents=Asennettavaksi valitut osat: -ReadyMemoGroup=Kynnist-valikon kansio: -ReadyMemoTasks=Muut toiminnot: - -; *** "Preparing to Install" wizard page -WizardPreparing=Valmistellaan asennusta -PreparingDesc=Valmistaudutaan asentamaan [name] koneellesi. -PreviousInstallNotCompleted=Edellisen ohjelman asennus tai asennuksen poisto ei ole valmis. Sinun tytyy kynnist kone uudelleen viimeistellksesi edellisen asennuksen.%n%nAja [name] -asennusohjelma uudestaan, kun olet kynnistnyt koneen uudelleen. -CannotContinue=Asennusta ei voida jatkaa. Valitse Peruuta poistuaksesi. -ApplicationsFound=Seuraavat sovellukset kyttvt tiedostoja, joita Asennuksen pit pivitt. On suositeltavaa, ett annat Asennuksen sulkea nm sovellukset automaattisesti. -ApplicationsFound2=Seuraavat sovellukset kyttvt tiedostoja, joita Asennuksen pit pivitt. On suositeltavaa, ett annat Asennuksen sulkea nm sovellukset automaattisesti. Valmistumisen jlkeen Asennus yritt uudelleenkynnist sovellukset. -CloseApplications=&Sulje sovellukset automaattisesti -DontCloseApplications=&l sulje sovelluksia -ErrorCloseApplications=Asennus ei pystynyt sulkemaan tarvittavia sovelluksia automaattisesti. On suositeltavaa, ett ennen jatkamista suljet sovellukset, jotka kyttvt asennuksen aikana pivitettvi tiedostoja. - -; *** "Installing" wizard page -WizardInstalling=Asennus kynniss -InstallingLabel=Odota, kun [name] asennetaan koneellesi. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=[name] - Asennuksen viimeistely -FinishedLabelNoIcons=[name] on nyt asennettu koneellesi. -FinishedLabel=[name] on nyt asennettu. Sovellus voidaan kynnist valitsemalla jokin asennetuista kuvakkeista. -ClickFinish=Valitse Lopeta poistuaksesi Asennuksesta. -FinishedRestartLabel=Jotta [name] saataisiin asennettua loppuun, pit kone kynnist uudelleen. Haluatko kynnist koneen uudelleen nyt? -FinishedRestartMessage=Jotta [name] saataisiin asennettua loppuun, pit kone kynnist uudelleen.%n%nHaluatko kynnist koneen uudelleen nyt? -ShowReadmeCheck=Kyll, haluan nhd LUEMINUT-tiedoston -YesRadio=&Kyll, kynnist kone uudelleen -NoRadio=&Ei, kynnistn koneen uudelleen myhemmin -RunEntryExec=Kynnist %1 -RunEntryShellExec=Nyt %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Asennus tarvitsee seuraavan levykkeen -SelectDiskLabel2=Aseta levyke %1 asemaan ja valitse OK. %n%nJos joku toinen kansio sislt levykkeen tiedostot, anna oikea polku tai valitse Selaa. -PathLabel=&Polku: -FileNotInDir2=Tiedostoa "%1" ei lytynyt lhteest "%2". Aseta oikea levyke asemaan tai valitse toinen kansio. -SelectDirectoryLabel=Mrit seuraavan levykkeen sislln sijainti. - -; *** Installation phase messages -SetupAborted=Asennusta ei suoritettu loppuun.%n%nKorjaa ongelma ja suorita Asennus uudelleen. -EntryAbortRetryIgnore=Valitse Uudelleen yrittksesi uudelleen, Ohita jatkaaksesi kaikesta huolimatta tai Hylk peruuttaaksesi asennuksen. - -; *** Installation status messages -StatusClosingApplications=Suljetaan sovellukset... -StatusCreateDirs=Luodaan hakemistoja... -StatusExtractFiles=Puretaan tiedostoja... -StatusCreateIcons=Luodaan pikakuvakkeita... -StatusCreateIniEntries=Luodaan INI-merkintj... -StatusCreateRegistryEntries=Luodaan rekisterimerkintj... -StatusRegisterFiles=Rekisteridn tiedostoja... -StatusSavingUninstall=Tallennetaan Asennuksen poiston tietoja... -StatusRunProgram=Viimeistelln asennusta... -StatusRestartingApplications=Uudelleenkynnistetn sovellukset... -StatusRollback=Peruutetaan tehdyt muutokset... - -; *** Misc. errors -ErrorInternal2=Sisinen virhe: %1 -ErrorFunctionFailedNoCode=%1 eponnistui -ErrorFunctionFailed=%1 eponnistui; virhekoodi %2 -ErrorFunctionFailedWithMessage=%1 eponnistui; virhekoodi %2.%n%3 -ErrorExecutingProgram=Virhe suoritettaessa tiedostoa%n%1 - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Asennetaan %1. -ShutdownBlockReasonUninstallingApp=Poistetaan %1. - -; *** Registry errors -ErrorRegOpenKey=Virhe avattaessa rekisteriavainta%n%1\%2 -ErrorRegCreateKey=Virhe luotaessa rekisteriavainta%n%1\%2 -ErrorRegWriteKey=Virhe kirjoitettaessa rekisteriavaimeen%n%1\%2 - -; *** INI errors -ErrorIniEntry=Virhe luotaessa INI-merkint tiedostoon "%1". - -; *** File copying errors -FileAbortRetryIgnore=Valitse Uudelleen yrittksesi uudelleen, Ohita ohittaaksesi tmn tiedoston (ei suositeltavaa) tai Hylk peruuttaaksesi asennuksen. -FileAbortRetryIgnore2=Valitse Uudelleen yrittksesi uudelleen, Ohita jatkaaksesi kaikesta huolimatta (ei suositeltavaa) tai Hylk peruuttaaksesi asennuksen. -SourceIsCorrupted=Lhdetiedosto on vaurioitunut -SourceDoesntExist=Lhdetiedostoa "%1" ei ole olemassa -ExistingFileReadOnly=Nykyinen tiedosto on Vain luku -tiedosto.%n%nValitse Uudelleen poistaaksesi Vain luku -mritteen uudelleenyrityst varten, Ohita ohittaaksesi tmn tiedoston tai Hylk peruuttaaksesi asennuksen. -ErrorReadingExistingDest=Virhe luettaessa nykyist tiedostoa: -FileExists=Tiedosto on jo olemassa.%n%nKorvataanko se? -ExistingFileNewer=Nykyinen tiedosto on uudempi kuin asennettava tiedosto. Nykyisen tiedoston silyttminen on suositeltavaa.n%nHaluatko silytt nykyisen tiedoston? -ErrorChangingAttr=Virhe vaihdettaessa nykyisen tiedoston mritteit: -ErrorCreatingTemp=Virhe luotaessa tiedostoa kohdehakemistoon: -ErrorReadingSource=Virhe luettaessa lhdetiedostoa: -ErrorCopying=Virhe kopioitaessa tiedostoa: -ErrorReplacingExistingFile=Virhe korvattaessa nykyist tiedostoa: -ErrorRestartReplace=RestartReplace-komento eponnistui: -ErrorRenamingTemp=Virhe uudelleennimettess tiedostoa kohdehakemistossa: -ErrorRegisterServer=DLL/OCX -laajennuksen rekisterinti eponnistui: %1 -ErrorRegSvr32Failed=RegSvr32-toiminto eponnistui. Virhekoodi: %1 -ErrorRegisterTypeLib=Tyyppikirjaston rekisteriminen eponnistui: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Virhe avattaessa LUEMINUT-tiedostoa. -ErrorRestartingComputer=Koneen uudelleenkynnistminen ei onnistunut. Suorita uudelleenkynnistys itse. - -; *** Uninstaller messages -UninstallNotFound=Tiedostoa "%1" ei lytynyt. Asennuksen poisto ei onnistu. -UninstallOpenError=Tiedostoa "%1" ei voitu avata. Asennuksen poisto ei onnistu. -UninstallUnsupportedVer=Tm versio Asennuksen poisto-ohjelmasta ei pysty lukemaan lokitiedostoa "%1". Asennuksen poisto ei onnistu -UninstallUnknownEntry=Asennuksen poisto-ohjelman lokitiedostosta lytyi tuntematon merkint (%1) -ConfirmUninstall=Poistetaanko %1 ja kaikki sen osat? -UninstallOnlyOnWin64=Tm ohjelma voidaan poistaa vain 64-bittisest Windowsista ksin. -OnlyAdminCanUninstall=Tmn asennuksen poistaminen vaatii jrjestelmnvalvojan oikeudet. -UninstallStatusLabel=Odota, kun %1 poistetaan koneeltasi. -UninstalledAll=%1 poistettiin onnistuneesti. -UninstalledMost=%1 poistettiin koneelta.%n%nJoitakin osia ei voitu poistaa. Voit poistaa osat itse. -UninstalledAndNeedsRestart=Kone tytyy kynnist uudelleen, jotta %1 voidaan poistaa kokonaan.%n%nHaluatko kynnist koneen uudeelleen nyt? -UninstallDataCorrupted=Tiedosto "%1" on vaurioitunut. Asennuksen poisto ei onnistu. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Poistetaanko jaettu tiedosto? -ConfirmDeleteSharedFile2=Jrjestelmn mukaan seuraava jaettu tiedosto ei ole en minkn muun sovelluksen kytss. Poistetaanko tiedosto?%n%nJos jotkut sovellukset kyttvt viel tt tiedostoa ja se poistetaan, ne eivt vlttmtt toimi en kunnolla. Jos olet epvarma, valitse Ei. Tiedoston jttminen koneelle ei aiheuta ongelmia. -SharedFileNameLabel=Tiedoston nimi: -SharedFileLocationLabel=Sijainti: -WizardUninstalling=Asennuksen poiston tila -StatusUninstalling=Poistetaan %1... - -[CustomMessages] - -NameAndVersion=%1 versio %2 -AdditionalIcons=Liskuvakkeet: -CreateDesktopIcon=Lu&o kuvake typydlle -CreateQuickLaunchIcon=Luo kuvake &pikakynnistyspalkkiin -ProgramOnTheWeb=%1 Internetiss -UninstallProgram=Poista %1 -LaunchProgram=&Kynnist %1 -AssocFileExtension=&Yhdist %1 tiedostoptteeseen %2 -AssocingFileExtension=Yhdistetn %1 tiedostoptteeseen %2 ... -AutoStartProgramGroupDescription=Kynnistys: -AutoStartProgram=Kynnist %1 automaattisesti -AddonHostProgramNotFound=%1 ei ole valitsemassasi kansiossa.%n%nHaluatko jatkaa tst huolimatta? diff --git a/Greenshot/tools/innosetup/Languages/French.isl b/Greenshot/tools/innosetup/Languages/French.isl deleted file mode 100644 index ca9f295ce..000000000 --- a/Greenshot/tools/innosetup/Languages/French.isl +++ /dev/null @@ -1,354 +0,0 @@ -; *** Inno Setup version 5.5.3+ French messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Maintained by Pierre Yager (pierre@levosgien.net) -; -; Contributors : Frdric Bonduelle, Francis Pallini, Lumina, Pascal Peyrot -; -; Changes : -; + Accents on uppercase letters -; http://www.academie-francaise.fr/langue/questions.html#accentuation (lumina) -; + Typography quotes [see ISBN: 978-2-7433-0482-9] -; http://fr.wikipedia.org/wiki/Guillemet (lumina) -; + Binary units (Kio, Mio) [IEC 80000-13:2008] -; http://fr.wikipedia.org/wiki/Octet (lumina) -; + Reverted to standard units (Ko, Mo) to follow Windows Explorer Standard -; http://blogs.msdn.com/b/oldnewthing/archive/2009/06/11/9725386.aspx -; + Use more standard verbs for click and retry -; "click": "Clicker" instead of "Appuyer" -; "retry": "Recommencer" au lieu de "Ressayer" - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Fran<00E7>ais -LanguageID=$040C -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Installation -SetupWindowTitle=Installation - %1 -UninstallAppTitle=Dsinstallation -UninstallAppFullTitle=Dsinstallation - %1 - -; *** Misc. common -InformationTitle=Information -ConfirmTitle=Confirmation -ErrorTitle=Erreur - -; *** SetupLdr messages -SetupLdrStartupMessage=Cet assistant va installer %1. Voulez-vous continuer ? -LdrCannotCreateTemp=Impossible de crer un fichier temporaire. Abandon de l'installation -LdrCannotExecTemp=Impossible d'excuter un fichier depuis le dossier temporaire. Abandon de l'installation - -; *** Startup error messages -LastErrorMessage=%1.%n%nErreur %2 : %3 -SetupFileMissing=Le fichier %1 est absent du dossier d'installation. Veuillez corriger le problme ou vous procurer une nouvelle copie du programme. -SetupFileCorrupt=Les fichiers d'installation sont altrs. Veuillez vous procurer une nouvelle copie du programme. -SetupFileCorruptOrWrongVer=Les fichiers d'installation sont altrs ou ne sont pas compatibles avec cette version de l'assistant d'installation. Veuillez corriger le problme ou vous procurer une nouvelle copie du programme. -InvalidParameter=Un paramtre non valide a t pass la ligne de commande :%n%n%1 -SetupAlreadyRunning=L'assistant d'installation est dj en cours d'excution. -WindowsVersionNotSupported=Ce programme n'est pas prvu pour fonctionner avec la version de Windows utilise sur votre ordinateur. -WindowsServicePackRequired=Ce programme a besoin de %1 Service Pack %2 ou d'une version plus rcente. -NotOnThisPlatform=Ce programme ne fonctionne pas sous %1. -OnlyOnThisPlatform=Ce programme ne peut fonctionner que sous %1. -OnlyOnTheseArchitectures=Ce programme ne peut tre install que sur des versions de Windows qui supportent ces architectures : %n%n%1 -MissingWOW64APIs=La version de Windows que vous utilisez ne dispose pas des fonctionnalits ncessaires pour que l'assistant puisse raliser une installation 64 bits. Pour corriger ce problme vous devez installer le Service Pack %1. -WinVersionTooLowError=Ce programme requiert la version %2 ou suprieure de %1. -WinVersionTooHighError=Ce programme ne peut pas tre install sous %1 version %2 ou suprieure. -AdminPrivilegesRequired=Vous devez disposer des droits d'administration de cet ordinateur pour installer ce programme. -PowerUserPrivilegesRequired=Vous devez disposer des droits d'administration ou faire partie du groupe Utilisateurs avec pouvoir de cet ordinateur pour installer ce programme. -SetupAppRunningError=L'assistant d'installation a dtect que %1 est actuellement en cours d'excution.%n%nVeuillez fermer toutes les instances de cette application puis cliquer sur OK pour continuer, ou bien cliquer sur Annuler pour abandonner l'installation. -UninstallAppRunningError=La procdure de dsinstallation a dtect que %1 est actuellement en cours d'excution.%n%nVeuillez fermer toutes les instances de cette application puis cliquer sur OK pour continuer, ou bien cliquer sur Annuler pour abandonner la dsinstallation. - -; *** Misc. errors -ErrorCreatingDir=L'assistant d'installation n'a pas pu crer le dossier "%1" -ErrorTooManyFilesInDir=L'assistant d'installation n'a pas pu crer un fichier dans le dossier "%1" car celui-ci contient trop de fichiers - -; *** Setup common messages -ExitSetupTitle=Quitter l'installation -ExitSetupMessage=L'installation n'est pas termine. Si vous abandonnez maintenant, le programme ne sera pas install.%n%nVous devrez relancer cet assistant pour finir l'installation.%n%nVoulez-vous quand mme quitter l'assistant d'installation ? -AboutSetupMenuItem=& propos... -AboutSetupTitle= Propos de l'assistant d'installation -AboutSetupMessage=%1 version %2%n%3%n%nPage d'accueil de %1 :%n%4 -AboutSetupNote= -TranslatorNote=Traduction franaise maintenue par Pierre Yager (pierre@levosgien.net) - -; *** Buttons -ButtonBack=< &Prcdent -ButtonNext=&Suivant > -ButtonInstall=&Installer -ButtonOK=OK -ButtonCancel=Annuler -ButtonYes=&Oui -ButtonYesToAll=Oui pour &tout -ButtonNo=&Non -ButtonNoToAll=N&on pour tout -ButtonFinish=&Terminer -ButtonBrowse=Pa&rcourir... -ButtonWizardBrowse=Pa&rcourir... -ButtonNewFolder=Nouveau &dossier - -; *** "Select Language" dialog messages -SelectLanguageTitle=Langue de l'assistant d'installation -SelectLanguageLabel=Veuillez slectionner la langue qui sera utilise par l'assistant d'installation : - -; *** Common wizard text -ClickNext=Cliquez sur Suivant pour continuer ou sur Annuler pour abandonner l'installation. -BeveledLabel= -BrowseDialogTitle=Parcourir les dossiers -BrowseDialogLabel=Veuillez choisir un dossier de destination, puis cliquez sur OK. -NewFolderName=Nouveau dossier - -; *** "Welcome" wizard page -WelcomeLabel1=Bienvenue dans l'assistant d'installation de [name] -WelcomeLabel2=Cet assistant va vous guider dans l'installation de [name/ver] sur votre ordinateur.%n%nIl est recommand de fermer toutes les applications actives avant de continuer. - -; *** "Password" wizard page -WizardPassword=Mot de passe -PasswordLabel1=Cette installation est protge par un mot de passe. -PasswordLabel3=Veuillez saisir le mot de passe (attention la distinction entre majuscules et minuscules) puis cliquez sur Suivant pour continuer. -PasswordEditLabel=&Mot de passe : -IncorrectPassword=Le mot de passe saisi n'est pas valide. Veuillez essayer nouveau. - -; *** "License Agreement" wizard page -WizardLicense=Accord de licence -LicenseLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. -LicenseLabel3=Veuillez lire le contrat de licence suivant. Vous devez en accepter tous les termes avant de continuer l'installation. -LicenseAccepted=Je comprends et j'&accepte les termes du contrat de licence -LicenseNotAccepted=Je &refuse les termes du contrat de licence - -; *** "Information" wizard pages -WizardInfoBefore=Information -InfoBeforeLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. -InfoBeforeClickLabel=Lorsque vous tes prt continuer, cliquez sur Suivant. -WizardInfoAfter=Information -InfoAfterLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. -InfoAfterClickLabel=Lorsque vous tes prt continuer, cliquez sur Suivant. - -; *** "User Information" wizard page -WizardUserInfo=Informations sur l'Utilisateur -UserInfoDesc=Veuillez saisir les informations qui vous concernent. -UserInfoName=&Nom d'utilisateur : -UserInfoOrg=&Organisation : -UserInfoSerial=Numro de &srie : -UserInfoNameRequired=Vous devez au moins saisir un nom. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Dossier de destination -SelectDirDesc=O [name] doit-il tre install ? -SelectDirLabel3=L'assistant va installer [name] dans le dossier suivant. -SelectDirBrowseLabel=Pour continuer, cliquez sur Suivant. Si vous souhaitez choisir un dossier diffrent, cliquez sur Parcourir. -DiskSpaceMBLabel=Le programme requiert au moins [mb] Mo d'espace disque disponible. -CannotInstallToNetworkDrive=L'assistant ne peut pas installer sur un disque rseau. -CannotInstallToUNCPath=L'assistant ne peut pas installer sur un chemin UNC. -InvalidPath=Vous devez saisir un chemin complet avec sa lettre de lecteur ; par exemple :%n%nC:\APP%n%nou un chemin rseau de la forme :%n%n\\serveur\partage -InvalidDrive=L'unit ou l'emplacement rseau que vous avez slectionn n'existe pas ou n'est pas accessible. Veuillez choisir une autre destination. -DiskSpaceWarningTitle=Espace disponible insuffisant -DiskSpaceWarning=L'assistant a besoin d'au moins %1 Ko d'espace disponible pour effectuer l'installation, mais l'unit que vous avez slectionne ne dispose que de %2 Ko d'espace disponible.%n%nSouhaitez-vous continuer malgr tout ? -DirNameTooLong=Le nom ou le chemin du dossier est trop long. -InvalidDirName=Le nom du dossier est invalide. -BadDirName32=Le nom du dossier ne doit contenir aucun des caractres suivants :%n%n%1 -DirExistsTitle=Dossier existant -DirExists=Le dossier :%n%n%1%n%nexiste dj. Souhaitez-vous installer dans ce dossier malgr tout ? -DirDoesntExistTitle=Le dossier n'existe pas -DirDoesntExist=Le dossier %n%n%1%n%nn'existe pas. Souhaitez-vous que ce dossier soit cr ? - -; *** "Select Components" wizard page -WizardSelectComponents=Composants installer -SelectComponentsDesc=Quels composants de l'application souhaitez-vous installer ? -SelectComponentsLabel2=Slectionnez les composants que vous dsirez installer ; dcochez les composants que vous ne dsirez pas installer. Cliquez ensuite sur Suivant pour continuer l'installation. -FullInstallation=Installation complte -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Installation compacte -CustomInstallation=Installation personnalise -NoUninstallWarningTitle=Composants existants -NoUninstallWarning=L'assistant d'installation a dtect que les composants suivants sont dj installs sur votre systme :%n%n%1%n%nDslectionner ces composants ne les dsinstallera pas pour autant.%n%nVoulez-vous continuer malgr tout ? -ComponentSize1=%1 Ko -ComponentSize2=%1 Mo -ComponentsDiskSpaceMBLabel=Les composants slectionns ncessitent au moins [mb] Mo d'espace disponible. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Tches supplmentaires -SelectTasksDesc=Quelles sont les tches supplmentaires qui doivent tre effectues ? -SelectTasksLabel2=Slectionnez les tches supplmentaires que l'assistant d'installation doit effectuer pendant l'installation de [name], puis cliquez sur Suivant. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Slection du dossier du menu Dmarrer -SelectStartMenuFolderDesc=O l'assistant d'installation doit-il placer les raccourcis du programme ? -SelectStartMenuFolderLabel3=L'assistant va crer les raccourcis du programme dans le dossier du menu Dmarrer indiqu ci-dessous. -SelectStartMenuFolderBrowseLabel=Cliquez sur Suivant pour continuer. Cliquez sur Parcourir si vous souhaitez slectionner un autre dossier du menu Dmarrer. -MustEnterGroupName=Vous devez saisir un nom de dossier du menu Dmarrer. -GroupNameTooLong=Le nom ou le chemin du dossier est trop long. -InvalidGroupName=Le nom du dossier n'est pas valide. -BadGroupName=Le nom du dossier ne doit contenir aucun des caractres suivants :%n%n%1 -NoProgramGroupCheck2=Ne pas crer de &dossier dans le menu Dmarrer - -; *** "Ready to Install" wizard page -WizardReady=Prt installer -ReadyLabel1=L'assistant dispose prsent de toutes les informations pour installer [name] sur votre ordinateur. -ReadyLabel2a=Cliquez sur Installer pour procder l'installation ou sur Prcdent pour revoir ou modifier une option d'installation. -ReadyLabel2b=Cliquez sur Installer pour procder l'installation. -ReadyMemoUserInfo=Informations sur l'utilisateur : -ReadyMemoDir=Dossier de destination : -ReadyMemoType=Type d'installation : -ReadyMemoComponents=Composants slectionns : -ReadyMemoGroup=Dossier du menu Dmarrer : -ReadyMemoTasks=Tches supplmentaires : - -; *** "Preparing to Install" wizard page -WizardPreparing=Prparation de l'installation -PreparingDesc=L'assistant d'installation prpare l'installation de [name] sur votre ordinateur. -PreviousInstallNotCompleted=L'installation ou la suppression d'un programme prcdent n'est pas totalement acheve. Veuillez redmarrer votre ordinateur pour achever cette installation ou suppression.%n%nUne fois votre ordinateur redmarr, veuillez relancer cet assistant pour reprendre l'installation de [name]. -CannotContinue=L'assistant ne peut pas continuer. Veuillez cliquer sur Annuler pour abandonner l'installation. -ApplicationsFound=Les applications suivantes utilisent des fichiers qui doivent tre mis jour par l'assistant. Il est recommand d'autoriser l'assistant fermer ces applications automatiquement. -ApplicationsFound2=Les applications suivantes utilisent des fichiers qui doivent tre mis jour par l'assistant. Il est recommand d'autoriser l'assistant fermer ces applications automatiquement. Une fois l'installation termine, l'assistant essaiera de relancer ces applications. -CloseApplications=&Arrter les applications automatiquement -DontCloseApplications=&Ne pas arrter les applications -ErrorCloseApplications=L'assistant d'installation n'a pas pu arrter toutes les applications automatiquement. Nous vous recommandons de fermer toutes les applications qui utilisent des fichiers devant tre mis jour par l'assistant d'installation avant de continuer. - -; *** "Installing" wizard page -WizardInstalling=Installation en cours -InstallingLabel=Veuillez patienter pendant que l'assistant installe [name] sur votre ordinateur. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Fin de l'installation de [name] -FinishedLabelNoIcons=L'assistant a termin l'installation de [name] sur votre ordinateur. -FinishedLabel=L'assistant a termin l'installation de [name] sur votre ordinateur. L'application peut tre lance l'aide des icnes cres sur le Bureau par l'installation. -ClickFinish=Veuillez cliquer sur Terminer pour quitter l'assistant d'installation. -FinishedRestartLabel=L'assistant doit redmarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redmarrer maintenant ? -FinishedRestartMessage=L'assistant doit redmarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redmarrer maintenant ? -ShowReadmeCheck=Oui, je souhaite lire le fichier LISEZMOI -YesRadio=&Oui, redmarrer mon ordinateur maintenant -NoRadio=&Non, je prfre redmarrer mon ordinateur plus tard -; used for example as 'Run MyProg.exe' -RunEntryExec=Excuter %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Voir %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=L'assistant a besoin du disque suivant -SelectDiskLabel2=Veuillez insrer le disque %1 et cliquer sur OK.%n%nSi les fichiers de ce disque se trouvent un emplacement diffrent de celui indiqu ci-dessous, veuillez saisir le chemin correspondant ou cliquez sur Parcourir. -PathLabel=&Chemin : -FileNotInDir2=Le fichier "%1" ne peut pas tre trouv dans "%2". Veuillez insrer le bon disque ou slectionner un autre dossier. -SelectDirectoryLabel=Veuillez indiquer l'emplacement du disque suivant. - -; *** Installation phase messages -SetupAborted=L'installation n'est pas termine.%n%nVeuillez corriger le problme et relancer l'installation. -EntryAbortRetryIgnore=Cliquez sur Recommencer pour essayer nouveau, Ignorer pour continuer malgr tout, ou Abandonner pour annuler l'installation. - -; *** Installation status messages -StatusClosingApplications=Ferme les applications... -StatusCreateDirs=Cration des dossiers... -StatusExtractFiles=Extraction des fichiers... -StatusCreateIcons=Cration des raccourcis... -StatusCreateIniEntries=Cration des entres du fichier INI... -StatusCreateRegistryEntries=Cration des entres de registre... -StatusRegisterFiles=Enregistrement des fichiers... -StatusSavingUninstall=Sauvegarde des informations de dsinstallation... -StatusRunProgram=Finalisation de l'installation... -StatusRestartingApplications=Relance les applications... -StatusRollback=Annulation des modifications... - -; *** Misc. errors -ErrorInternal2=Erreur interne : %1 -ErrorFunctionFailedNoCode=%1 a chou -ErrorFunctionFailed=%1 a chou ; code %2 -ErrorFunctionFailedWithMessage=%1 a chou ; code %2.%n%3 -ErrorExecutingProgram=Impossible d'excuter le fichier :%n%1 - -; *** Registry errors -ErrorRegOpenKey=Erreur lors de l'ouverture de la cl de registre :%n%1\%2 -ErrorRegCreateKey=Erreur lors de la cration de la cl de registre :%n%1\%2 -ErrorRegWriteKey=Erreur lors de l'criture de la cl de registre :%n%1\%2 - -; *** INI errors -ErrorIniEntry=Erreur d'criture d'une entre dans le fichier INI "%1". - -; *** File copying errors -FileAbortRetryIgnore=Cliquez sur Recommencer pour essayer nouveau, Ignorer pour passer ce fichier (dconseill), ou Abandonner pour annuler l'installation. -FileAbortRetryIgnore2=Cliquez sur Recommencer pour essayer nouveau, Ignorer pour continuer malgr tout (dconseill), ou Abandonner pour annuler l'installation. -SourceIsCorrupted=Le fichier source est altr -SourceDoesntExist=Le fichier source "%1" n'existe pas -ExistingFileReadOnly=Le fichier existant est protg en lecture seule.%n%nCliquez sur Recommencer pour enlever la protection et essayer nouveau, Ignorer pour passer ce fichier, ou Abandonner pour annuler l'installation. -ErrorReadingExistingDest=Une erreur s'est produite lors de la tentative de lecture du fichier existant : -FileExists=Le fichier existe dj.%n%nSouhaitez-vous que l'installation le remplace ? -ExistingFileNewer=Le fichier existant est plus rcent que celui que l'assistant essaie d'installer. Il est recommand de conserver le fichier existant.%n%nSouhaitez-vous conserver le fichier existant ? -ErrorChangingAttr=Une erreur est survenue en essayant de modifier les attributs du fichier existant : -ErrorCreatingTemp=Une erreur est survenue en essayant de crer un fichier dans le dossier de destination : -ErrorReadingSource=Une erreur est survenue lors de la lecture du fichier source : -ErrorCopying=Une erreur est survenue lors de la copie d'un fichier : -ErrorReplacingExistingFile=Une erreur est survenue lors du remplacement d'un fichier existant : -ErrorRestartReplace=Le marquage d'un fichier pour remplacement au redmarrage de l'ordinateur a chou : -ErrorRenamingTemp=Une erreur est survenue en essayant de renommer un fichier dans le dossier de destination : -ErrorRegisterServer=Impossible d'enregistrer la bibliothque DLL/OCX : %1 -ErrorRegSvr32Failed=RegSvr32 a chou et a retourn le code d'erreur %1 -ErrorRegisterTypeLib=Impossible d'enregistrer la bibliothque de type : %1 - -; *** Post-installation errors -ErrorOpeningReadme=Une erreur est survenue l'ouverture du fichier LISEZMOI. -ErrorRestartingComputer=L'installation n'a pas pu redmarrer l'ordinateur. Merci de bien vouloir le faire vous-mme. - -; *** Uninstaller messages -UninstallNotFound=Le fichier "%1" n'existe pas. Impossible de dsinstaller. -UninstallOpenError=Le fichier "%1" n'a pas pu tre ouvert. Impossible de dsinstaller -UninstallUnsupportedVer=Le format du fichier journal de dsinstallation "%1" n'est pas reconnu par cette version de la procdure de dsinstallation. Impossible de dsinstaller -UninstallUnknownEntry=Une entre inconnue (%1) a t rencontre dans le fichier journal de dsinstallation -ConfirmUninstall=Voulez-vous vraiment dsinstaller compltement %1 ainsi que tous ses composants ? -UninstallOnlyOnWin64=La dsinstallation de ce programme ne fonctionne qu'avec une version 64 bits de Windows. -OnlyAdminCanUninstall=Ce programme ne peut tre dsinstall que par un utilisateur disposant des droits d'administration. -UninstallStatusLabel=Veuillez patienter pendant que %1 est retir de votre ordinateur. -UninstalledAll=%1 a t correctement dsinstall de cet ordinateur. -UninstalledMost=La dsinstallation de %1 est termine.%n%nCertains lments n'ont pas pu tre supprims automatiquement. Vous pouvez les supprimer manuellement. -UninstalledAndNeedsRestart=Vous devez redmarrer l'ordinateur pour terminer la dsinstallation de %1.%n%nVoulez-vous redmarrer maintenant ? -UninstallDataCorrupted=Le ficher "%1" est altr. Impossible de dsinstaller - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Supprimer les fichiers partags ? -ConfirmDeleteSharedFile2=Le systme indique que le fichier partag suivant n'est plus utilis par aucun programme. Souhaitez-vous que la dsinstallation supprime ce fichier partag ?%n%nSi des programmes utilisent encore ce fichier et qu'il est supprim, ces programmes ne pourront plus fonctionner correctement. Si vous n'tes pas sr, choisissez Non. Laisser ce fichier dans votre systme ne posera pas de problme. -SharedFileNameLabel=Nom du fichier : -SharedFileLocationLabel=Emplacement : -WizardUninstalling=tat de la dsinstallation -StatusUninstalling=Dsinstallation de %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installe %1. -ShutdownBlockReasonUninstallingApp=Dsinstalle %1. - -; Les messages personnaliss suivants ne sont pas utilis par l'installation -; elle-mme, mais si vous les utilisez dans vos scripts, vous devez les -; traduire - -[CustomMessages] - -NameAndVersion=%1 version %2 -AdditionalIcons=Icnes supplmentaires : -CreateDesktopIcon=Crer une icne sur le &Bureau -CreateQuickLaunchIcon=Crer une icne dans la barre de &Lancement rapide -ProgramOnTheWeb=Page d'accueil de %1 -UninstallProgram=Dsinstaller %1 -LaunchProgram=Excuter %1 -AssocFileExtension=&Associer %1 avec l'extension de fichier %2 -AssocingFileExtension=Associe %1 avec l'extension de fichier %2... -AutoStartProgramGroupDescription=Dmarrage : -AutoStartProgram=Dmarrer automatiquement %1 -AddonHostProgramNotFound=%1 n'a pas t trouv dans le dossier que vous avez choisi.%n%nVoulez-vous continuer malgr tout ? diff --git a/Greenshot/tools/innosetup/Languages/German.isl b/Greenshot/tools/innosetup/Languages/German.isl deleted file mode 100644 index 5a41c936f..000000000 --- a/Greenshot/tools/innosetup/Languages/German.isl +++ /dev/null @@ -1,346 +0,0 @@ -; ****************************************************** -; *** *** -; *** Inno Setup version 5.5.3+ German messages *** -; *** *** -; *** Changes 5.5.3+ Author: *** -; *** *** -; *** Peter Stadler(Peter.Stadler@univie.ac.at) *** -; *** Original Author: *** -; *** *** -; *** Michael Reitz (innosetup@assimilate.de) *** -; *** *** -; *** Contributors: *** -; *** *** -; *** Roland Ruder (info@rr4u.de) *** -; *** Hans Sperber (Hans.Sperber@de.bosch.com) *** -; *** LaughingMan (puma.d@web.de) *** -; *** *** -; ****************************************************** -; -; Diese bersetzung hlt sich an die neue deutsche Rechtschreibung. - -[LangOptions] -LanguageName=Deutsch -LanguageID=$0407 -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Setup -SetupWindowTitle=Setup - %1 -UninstallAppTitle=Entfernen -UninstallAppFullTitle=%1 entfernen - -; *** Misc. common -InformationTitle=Information -ConfirmTitle=Besttigen -ErrorTitle=Fehler - -; *** SetupLdr messages -SetupLdrStartupMessage=%1 wird jetzt installiert. Mchten Sie fortfahren? -LdrCannotCreateTemp=Es konnte keine temporre Datei erstellt werden. Das Setup wurde abgebrochen -LdrCannotExecTemp=Die Datei konnte nicht im temporren Ordner ausgefhrt werden. Das Setup wurde abgebrochen - -; *** Startup error messages -LastErrorMessage=%1.%n%nFehler %2: %3 -SetupFileMissing=Die Datei %1 fehlt im Installations-Ordner. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms. -SetupFileCorrupt=Die Setup-Dateien sind beschdigt. Besorgen Sie sich bitte eine neue Kopie des Programms. -SetupFileCorruptOrWrongVer=Die Setup-Dateien sind beschdigt oder inkompatibel zu dieser Version des Setups. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms. -InvalidParameter=Ein ungltiger Paramter wurde auf der Kommandozeile bergeben:%n%n%1 -SetupAlreadyRunning=Setup luft bereits. -WindowsVersionNotSupported=Dieses Programm untersttzt die auf Ihrem Computer installierte Windows-Version nicht. -WindowsServicePackRequired=Dieses Programm bentigt %1 Service Pack %2 oder hher. -NotOnThisPlatform=Dieses Programm kann nicht unter %1 ausgefhrt werden. -OnlyOnThisPlatform=Dieses Programm muss unter %1 ausgefhrt werden. -OnlyOnTheseArchitectures=Dieses Programm kann nur auf Windows-Versionen installiert werden, die folgende Prozessor-Architekturen untersttzen:%n%n%1 -MissingWOW64APIs=Ihre Windows-Version enthlt nicht die Funktionen, die vom Setup fr eine 64-bit Installation bentigt werden. Installieren Sie bitte Service Pack %1, um dieses Problem zu beheben. -WinVersionTooLowError=Dieses Programm bentigt %1 Version %2 oder hher. -WinVersionTooHighError=Dieses Programm kann nicht unter %1 Version %2 oder hher installiert werden. -AdminPrivilegesRequired=Sie mssen als Administrator angemeldet sein, um dieses Programm installieren zu knnen. -PowerUserPrivilegesRequired=Sie mssen als Administrator oder als Mitglied der Hauptbenutzer-Gruppe angemeldet sein, um dieses Programm installieren zu knnen. -SetupAppRunningError=Das Setup hat entdeckt, dass %1 zur Zeit ausgefhrt wird.%n%nBitte schlieen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. -UninstallAppRunningError=Die Deinstallation hat entdeckt, dass %1 zur Zeit ausgefhrt wird.%n%nBitte schlieen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. - -; *** Misc. errors -ErrorCreatingDir=Das Setup konnte den Ordner "%1" nicht erstellen -ErrorTooManyFilesInDir=Das Setup konnte eine Datei im Ordner "%1" nicht erstellen, weil er zu viele Dateien enthlt - -; *** Setup common messages -ExitSetupTitle=Setup verlassen -ExitSetupMessage=Das Setup ist noch nicht abgeschlossen. Wenn Sie jetzt beenden, wird das Programm nicht installiert.%n%nSie knnen das Setup zu einem spteren Zeitpunkt nochmals ausfhren, um die Installation zu vervollstndigen.%n%nSetup verlassen? -AboutSetupMenuItem=&ber das Setup ... -AboutSetupTitle=ber das Setup -AboutSetupMessage=%1 Version %2%n%3%n%n%1 Internet-Seite:%n%4 -AboutSetupNote= -TranslatorNote=German translation maintained by Peter Stadler (Peter.Stadler@univie.ac.at) - -; *** Buttons -ButtonBack=< &Zurck -ButtonNext=&Weiter > -ButtonInstall=&Installieren -ButtonOK=OK -ButtonCancel=Abbrechen -ButtonYes=&Ja -ButtonYesToAll=J&a fr Alle -ButtonNo=&Nein -ButtonNoToAll=N&ein fr Alle -ButtonFinish=&Fertigstellen -ButtonBrowse=&Durchsuchen ... -ButtonWizardBrowse=Du&rchsuchen ... -ButtonNewFolder=&Neuen Ordner erstellen - -; *** "Select Language" dialog messages -SelectLanguageTitle=Setup-Sprache auswhlen -SelectLanguageLabel=Whlen Sie die Sprache aus, die whrend der Installation benutzt werden soll: - -; *** Common wizard text -ClickNext="Weiter" zum Fortfahren, "Abbrechen" zum Verlassen. -BeveledLabel= -BrowseDialogTitle=Ordner suchen -BrowseDialogLabel=Whlen Sie einen Ordner aus, und klicken Sie danach auf "OK". -NewFolderName=Neuer Ordner - -; *** "Welcome" wizard page -WelcomeLabel1=Willkommen zum [name] Setup-Assistenten -WelcomeLabel2=Dieser Assistent wird jetzt [name/ver] auf Ihrem Computer installieren.%n%nSie sollten alle anderen Anwendungen beenden, bevor Sie mit dem Setup fortfahren. - -; *** "Password" wizard page -WizardPassword=Passwort -PasswordLabel1=Diese Installation wird durch ein Passwort geschtzt. -PasswordLabel3=Bitte geben Sie das Passwort ein, und klicken Sie danach auf "Weiter". Achten Sie auf korrekte Gro-/Kleinschreibung. -PasswordEditLabel=&Passwort: -IncorrectPassword=Das eingegebene Passwort ist nicht korrekt. Bitte versuchen Sie es noch einmal. - -; *** "License Agreement" wizard page -WizardLicense=Lizenzvereinbarung -LicenseLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. -LicenseLabel3=Lesen Sie bitte die folgenden Lizenzvereinbarungen. Benutzen Sie bei Bedarf die Bildlaufleiste oder drcken Sie die "Bild Ab"-Taste. -LicenseAccepted=Ich &akzeptiere die Vereinbarung -LicenseNotAccepted=Ich &lehne die Vereinbarung ab - -; *** "Information" wizard pages -WizardInfoBefore=Information -InfoBeforeLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. -InfoBeforeClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren. -WizardInfoAfter=Information -InfoAfterLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren. -InfoAfterClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren. - -; *** "User Information" wizard page -WizardUserInfo=Benutzerinformationen -UserInfoDesc=Bitte tragen Sie Ihre Daten ein. -UserInfoName=&Name: -UserInfoOrg=&Organisation: -UserInfoSerial=&Seriennummer: -UserInfoNameRequired=Sie mssen einen Namen eintragen. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Ziel-Ordner whlen -SelectDirDesc=Wohin soll [name] installiert werden? -SelectDirLabel3=Das Setup wird [name] in den folgenden Ordner installieren. -SelectDirBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswhlen mchten. -DiskSpaceMBLabel=Mindestens [mb] MB freier Speicherplatz ist erforderlich. -CannotInstallToNetworkDrive=Das Setup kann nicht in einen Netzwerk-Pfad installieren. -CannotInstallToUNCPath=Das Setup kann nicht in einen UNC-Pfad installieren. Wenn Sie auf ein Netzlaufwerk installieren mchten, mssen Sie dem Netzwerkpfad einen Laufwerksbuchstaben zuordnen. -InvalidPath=Sie mssen einen vollstndigen Pfad mit einem Laufwerksbuchstaben angeben; z.B.:%n%nC:\Beispiel%n%noder einen UNC-Pfad in der Form:%n%n\\Server\Freigabe -InvalidDrive=Das angegebene Laufwerk bzw. der UNC-Pfad existiert nicht oder es kann nicht darauf zugegriffen werden. Whlen Sie bitte einen anderen Ordner. -DiskSpaceWarningTitle=Nicht genug freier Speicherplatz -DiskSpaceWarning=Das Setup bentigt mindestens %1 KB freien Speicherplatz zum Installieren, aber auf dem ausgewhlten Laufwerk sind nur %2 KB verfgbar.%n%nMchten Sie trotzdem fortfahren? -DirNameTooLong=Der Ordnername/Pfad ist zu lang. -InvalidDirName=Der Ordnername ist nicht gltig. -BadDirName32=Ordnernamen drfen keine der folgenden Zeichen enthalten:%n%n%1 -DirExistsTitle=Ordner existiert bereits -DirExists=Der Ordner:%n%n%1%n%n existiert bereits. Mchten Sie trotzdem in diesen Ordner installieren? -DirDoesntExistTitle=Ordner ist nicht vorhanden -DirDoesntExist=Der Ordner:%n%n%1%n%nist nicht vorhanden. Soll der Ordner erstellt werden? - -; *** "Select Components" wizard page -WizardSelectComponents=Komponenten auswhlen -SelectComponentsDesc=Welche Komponenten sollen installiert werden? -SelectComponentsLabel2=Whlen Sie die Komponenten aus, die Sie installieren mchten. Klicken Sie auf "Weiter", wenn sie bereit sind fortzufahren. -FullInstallation=Vollstndige Installation -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompakte Installation -CustomInstallation=Benutzerdefinierte Installation -NoUninstallWarningTitle=Komponenten vorhanden -NoUninstallWarning=Das Setup hat festgestellt, dass die folgenden Komponenten bereits auf Ihrem Computer installiert sind:%n%n%1%n%nDiese nicht mehr ausgewhlten Komponenten werden nicht vom Computer entfernt.%n%nMchten Sie trotzdem fortfahren? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Die aktuelle Auswahl erfordert min. [mb] MB Speicherplatz. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Zustzliche Aufgaben auswhlen -SelectTasksDesc=Welche zustzlichen Aufgaben sollen ausgefhrt werden? -SelectTasksLabel2=Whlen Sie die zustzlichen Aufgaben aus, die das Setup whrend der Installation von [name] ausfhren soll, und klicken Sie danach auf "Weiter". - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Startmen-Ordner auswhlen -SelectStartMenuFolderDesc=Wo soll das Setup die Programm-Verknpfungen erstellen? -SelectStartMenuFolderLabel3=Das Setup wird die Programm-Verknpfungen im folgenden Startmen-Ordner erstellen. -SelectStartMenuFolderBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswhlen mchten. -MustEnterGroupName=Sie mssen einen Ordnernamen eingeben. -GroupNameTooLong=Der Ordnername/Pfad ist zu lang. -InvalidGroupName=Der Ordnername ist nicht gltig. -BadGroupName=Der Ordnername darf keine der folgenden Zeichen enthalten:%n%n%1 -NoProgramGroupCheck2=&Keinen Ordner im Startmen erstellen - -; *** "Ready to Install" wizard page -WizardReady=Bereit zur Installation. -ReadyLabel1=Das Setup ist jetzt bereit, [name] auf Ihrem Computer zu installieren. -ReadyLabel2a=Klicken Sie auf "Installieren", um mit der Installation zu beginnen, oder auf "Zurck", um Ihre Einstellungen zu berprfen oder zu ndern. -ReadyLabel2b=Klicken Sie auf "Installieren", um mit der Installation zu beginnen. -ReadyMemoUserInfo=Benutzerinformationen: -ReadyMemoDir=Ziel-Ordner: -ReadyMemoType=Setup-Typ: -ReadyMemoComponents=Ausgewhlte Komponenten: -ReadyMemoGroup=Startmen-Ordner: -ReadyMemoTasks=Zustzliche Aufgaben: - -; *** "Preparing to Install" wizard page -WizardPreparing=Vorbereitung der Installation -PreparingDesc=Das Setup bereitet die Installation von [name] auf diesen Computer vor. -PreviousInstallNotCompleted=Eine vorherige Installation/Deinstallation eines Programms wurde nicht abgeschlossen. Der Computer muss neu gestartet werden, um die Installation/Deinstallation zu beenden.%n%nStarten Sie das Setup nach dem Neustart Ihres Computers erneut, um die Installation von [name] durchzufhren. -CannotContinue=Das Setup kann nicht fortfahren. Bitte klicken Sie auf "Abbrechen" zum Verlassen. -ApplicationsFound=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden mssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schlieen. -ApplicationsFound2=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden mssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schlieen. Nachdem die Installation fertiggestellt wurde, versucht Setup diese Anwendungen wieder zu starten. -CloseApplications=&Schliee automatisch die Anwendungen -DontCloseApplications=&Schliee die Anwendungen nicht -ErrorCloseApplications=Das Setup konnte nicht alle Anwendungen automatisch schlieen. Es wird empfohlen, alle Anwendungen zu schlieen, die Dateien benutzen, die vom Setup vor einer Fortsetzung aktualisiert werden mssen. - -; *** "Installing" wizard page -WizardInstalling=Installiere ... -InstallingLabel=Warten Sie bitte whrend [name] auf Ihrem Computer installiert wird. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Beenden des [name] Setup-Assistenten -FinishedLabelNoIcons=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. -FinishedLabel=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. Die Anwendung kann ber die installierten Programm-Verknpfungen gestartet werden. -ClickFinish=Klicken Sie auf "Fertigstellen", um das Setup zu beenden. -FinishedRestartLabel=Um die Installation von [name] abzuschlieen, muss das Setup Ihren Computer neu starten. Mchten Sie jetzt neu starten? -FinishedRestartMessage=Um die Installation von [name] abzuschlieen, muss das Setup Ihren Computer neu starten.%n%nMchten Sie jetzt neu starten? -ShowReadmeCheck=Ja, ich mchte die LIESMICH-Datei sehen -YesRadio=&Ja, Computer jetzt neu starten -NoRadio=&Nein, ich werde den Computer spter neu starten -; used for example as 'Run MyProg.exe' -RunEntryExec=%1 starten -; used for example as 'View Readme.txt' -RunEntryShellExec=%1 anzeigen - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Nchste Diskette einlegen -SelectDiskLabel2=Legen Sie bitte Diskette %1 ein, und klicken Sie auf "OK".%n%nWenn sich die Dateien von dieser Diskette in einem anderen als dem angezeigten Ordner befinden, dann geben Sie bitte den korrekten Pfad ein oder klicken auf "Durchsuchen". -PathLabel=&Pfad: -FileNotInDir2=Die Datei "%1" befindet sich nicht in "%2". Bitte Ordner ndern oder richtige Diskette einlegen. -SelectDirectoryLabel=Geben Sie bitte an, wo die nchste Diskette eingelegt wird. - -; *** Installation phase messages -SetupAborted=Das Setup konnte nicht abgeschlossen werden.%n%nBeheben Sie bitte das Problem, und starten Sie das Setup erneut. -EntryAbortRetryIgnore=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um trotzdem fortzufahren, oder "Abbrechen", um die Installation abzubrechen. - -; *** Installation status messages -StatusClosingApplications=Anwendungen werden geschlossen... -StatusCreateDirs=Ordner werden erstellt ... -StatusExtractFiles=Dateien werden entpackt ... -StatusCreateIcons=Verknpfungen werden erstellt ... -StatusCreateIniEntries=INI-Eintrge werden erstellt ... -StatusCreateRegistryEntries=Registry-Eintrge werden erstellt ... -StatusRegisterFiles=Dateien werden registriert ... -StatusSavingUninstall=Deinstallations-Informationen werden gespeichert ... -StatusRunProgram=Installation wird beendet ... -StatusRestartingApplications=Neustart der Anwendungen... -StatusRollback=nderungen werden rckgngig gemacht ... - -; *** Misc. errors -ErrorInternal2=Interner Fehler: %1 -ErrorFunctionFailedNoCode=%1 schlug fehl -ErrorFunctionFailed=%1 schlug fehl; Code %2 -ErrorFunctionFailedWithMessage=%1 schlug fehl; Code %2.%n%3 -ErrorExecutingProgram=Datei kann nicht ausgefhrt werden:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Registry-Schlssel konnte nicht geffnet werden:%n%1\%2 -ErrorRegCreateKey=Registry-Schlssel konnte nicht erstellt werden:%n%1\%2 -ErrorRegWriteKey=Fehler beim Schreiben des Registry-Schlssels:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Fehler beim Erstellen eines INI-Eintrages in der Datei "%1". - -; *** File copying errors -FileAbortRetryIgnore=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um diese Datei zu berspringen (nicht empfohlen), oder "Abbrechen", um die Installation abzubrechen. -FileAbortRetryIgnore2=Klicken Sie auf "Wiederholen" fr einen weiteren Versuch, "Ignorieren", um trotzdem fortzufahren (nicht empfohlen), oder "Abbrechen", um die Installation abzubrechen. -SourceIsCorrupted=Die Quelldatei ist beschdigt -SourceDoesntExist=Die Quelldatei "%1" existiert nicht -ExistingFileReadOnly=Die vorhandene Datei ist schreibgeschtzt.%n%nKlicken Sie auf "Wiederholen", um den Schreibschutz zu entfernen, "Ignorieren", um die Datei zu berspringen, oder "Abbrechen", um die Installation abzubrechen. -ErrorReadingExistingDest=Lesefehler in Datei: -FileExists=Die Datei ist bereits vorhanden.%n%nSoll sie berschrieben werden? -ExistingFileNewer=Die vorhandene Datei ist neuer als die Datei, die installiert werden soll. Es wird empfohlen die vorhandene Datei beizubehalten.%n%n Mchten Sie die vorhandene Datei beibehalten? -ErrorChangingAttr=Fehler beim ndern der Datei-Attribute: -ErrorCreatingTemp=Fehler beim Erstellen einer Datei im Ziel-Ordner: -ErrorReadingSource=Fehler beim Lesen der Quelldatei: -ErrorCopying=Fehler beim Kopieren einer Datei: -ErrorReplacingExistingFile=Fehler beim Ersetzen einer vorhandenen Datei: -ErrorRestartReplace="Ersetzen nach Neustart" fehlgeschlagen: -ErrorRenamingTemp=Fehler beim Umbenennen einer Datei im Ziel-Ordner: -ErrorRegisterServer=DLL/OCX konnte nicht registriert werden: %1 -ErrorRegSvr32Failed=RegSvr32-Aufruf scheiterte mit Exit-Code %1 -ErrorRegisterTypeLib=Typen-Bibliothek konnte nicht registriert werden: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Fehler beim ffnen der LIESMICH-Datei. -ErrorRestartingComputer=Das Setup konnte den Computer nicht neu starten. Bitte fhren Sie den Neustart manuell durch. - -; *** Uninstaller messages -UninstallNotFound=Die Datei "%1" existiert nicht. Entfernen der Anwendung fehlgeschlagen. -UninstallOpenError=Die Datei "%1" konnte nicht geffnet werden. Entfernen der Anwendung fehlgeschlagen. -UninstallUnsupportedVer=Das Format der Deinstallations-Datei "%1" konnte nicht erkannt werden. Entfernen der Anwendung fehlgeschlagen -UninstallUnknownEntry=In der Deinstallations-Datei wurde ein unbekannter Eintrag (%1) gefunden -ConfirmUninstall=Sind Sie sicher, dass Sie %1 und alle zugehrigen Komponenten entfernen mchten? -UninstallOnlyOnWin64=Diese Installation kann nur unter 64-bit Windows-Versionen entfernt werden. -OnlyAdminCanUninstall=Diese Installation kann nur von einem Benutzer mit Administrator-Rechten entfernt werden. -UninstallStatusLabel=Warten Sie bitte whrend %1 von Ihrem Computer entfernt wird. -UninstalledAll=%1 wurde erfolgreich von Ihrem Computer entfernt. -UninstalledMost=Entfernen von %1 beendet.%n%nEinige Komponenten konnten nicht entfernt werden. Diese knnen von Ihnen manuell gelscht werden. -UninstalledAndNeedsRestart=Um die Deinstallation von %1 abzuschlieen, muss Ihr Computer neu gestartet werden.%n%nMchten Sie jetzt neu starten? -UninstallDataCorrupted="%1"-Datei ist beschdigt. Entfernen der Anwendung fehlgeschlagen. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Gemeinsame Datei entfernen? -ConfirmDeleteSharedFile2=Das System zeigt an, dass die folgende gemeinsame Datei von keinem anderen Programm mehr benutzt wird. Mchten Sie diese Datei entfernen lassen?%nSollte es doch noch Programme geben, die diese Datei benutzen, und sie wird entfernt, funktionieren diese Programme vielleicht nicht mehr richtig. Wenn Sie unsicher sind, whlen Sie "Nein" um die Datei im System zu belassen. Es schadet Ihrem System nicht, wenn Sie die Datei behalten. -SharedFileNameLabel=Dateiname: -SharedFileLocationLabel=Ordner: -WizardUninstalling=Entfernen (Status) -StatusUninstalling=Entferne %1 ... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installation von %1. -ShutdownBlockReasonUninstallingApp=Deinstallation von %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 Version %2 -AdditionalIcons=Zustzliche Symbole: -CreateDesktopIcon=&Desktop-Symbol erstellen -CreateQuickLaunchIcon=Symbol in der Schnellstartleiste erstellen -ProgramOnTheWeb=%1 im Internet -UninstallProgram=%1 entfernen -LaunchProgram=%1 starten -AssocFileExtension=&Registriere %1 mit der %2-Dateierweiterung -AssocingFileExtension=%1 wird mit der %2-Dateierweiterung registriert... -AutoStartProgramGroupDescription=Beginn des Setups: -AutoStartProgram=Starte automatisch%1 -AddonHostProgramNotFound=%1 konnte im ausgwhlten Ordner nicht gefunden werden.%n%nMchten Sie dennoch fortfahren? - diff --git a/Greenshot/tools/innosetup/Languages/Greek.isl b/Greenshot/tools/innosetup/Languages/Greek.isl deleted file mode 100644 index 7a40a3ffd..000000000 --- a/Greenshot/tools/innosetup/Languages/Greek.isl +++ /dev/null @@ -1,337 +0,0 @@ -; *** Inno Setup version 5.5.3+ Greek messages *** -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Originally translated by Anastasis Chatzioglou, baldycom@hotmail.com -; Updated by XhmikosR [XhmikosR, my_nickname at yahoo dot com] -; - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=<0395><03BB><03BB><03B7><03BD><03B9><03BA><03AC> -LanguageID=$408 -LanguageCodePage=1253 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle= -SetupWindowTitle= - %1 -UninstallAppTitle= -UninstallAppFullTitle=%1 - -; *** Misc. common -InformationTitle= -ConfirmTitle= -ErrorTitle= - -; *** SetupLdr messages -SetupLdrStartupMessage= %1. ; -LdrCannotCreateTemp= . . -LdrCannotExecTemp= . . - -; *** Startup error messages -LastErrorMessage=%1.%n%n %2: %3 -SetupFileMissing= %1 . . -SetupFileCorrupt= . . -SetupFileCorruptOrWrongVer= . . -InvalidParameter= :%n%n%1 -SetupAlreadyRunning= . -WindowsVersionNotSupported= Windows . -WindowsServicePackRequired= %1 Service Pack %2 . -NotOnThisPlatform= %1. -OnlyOnThisPlatform= %1. -OnlyOnTheseArchitectures= Windows :%n%n%1 -MissingWOW64APIs= Windows 64-bit. Service Pack %1. -WinVersionTooLowError= %1 . -WinVersionTooHighError= %1 . -AdminPrivilegesRequired= . -PowerUserPrivilegesRequired= Power User . -SetupAppRunningError= %1.%n%n , . -UninstallAppRunningError= %1.%n%n , . - -; *** Misc. errors -ErrorCreatingDir= %1 -ErrorTooManyFilesInDir= "%1" - -; *** Setup common messages -ExitSetupTitle= -ExitSetupMessage= . , .%n%n .%n%n; -AboutSetupMenuItem=& ... -AboutSetupTitle= -AboutSetupMessage=%1 %2%n%3%n%n%1 %n%4 -AboutSetupNote= -TranslatorNote= Anastasis Chatzioglou.%n XhmikosR, my_nickname at yahoo dot com - -; *** Buttons -ButtonBack=< & -ButtonNext=& > -ButtonInstall=& -ButtonOK=& -ButtonCancel=& -ButtonYes=& -ButtonYesToAll= & -ButtonNo=& -ButtonNoToAll= & -ButtonFinish=& -ButtonBrowse=&... -ButtonWizardBrowse=&... -ButtonNewFolder=& - -; *** "Select Language" dialog messages -SelectLanguageTitle= -SelectLanguageLabel= : - -; *** Common wizard text -ClickNext= . -BeveledLabel= -BrowseDialogTitle= -BrowseDialogLabel= OK. -NewFolderName= - -; *** "Welcome" wizard page -WelcomeLabel1= [name] -WelcomeLabel2= [name/ver] .%n%n . - -; *** "Password" wizard page -WizardPassword= -PasswordLabel1= . -PasswordLabel3= . -PasswordEditLabel=&: -IncorrectPassword= . , . - -; *** "License Agreement" wizard page -WizardLicense= -LicenseLabel= . -LicenseLabel3= . . -LicenseAccepted=& -LicenseNotAccepted= & - -; *** "Information" wizard pages -WizardInfoBefore= -InfoBeforeLabel= . -InfoBeforeClickLabel= , . -WizardInfoAfter= -InfoAfterLabel= . -InfoAfterClickLabel= , . - -; *** "User Information" wizard page -WizardUserInfo= -UserInfoDesc= . -UserInfoName=& : -UserInfoOrg=&: -UserInfoSerial=& : -UserInfoNameRequired= . - -; *** "Select Destination Location" wizard page -WizardSelectDir= -SelectDirDesc= [name]; -SelectDirLabel3= [name] . -SelectDirBrowseLabel= . , . -DiskSpaceMBLabel= [mb] MB . -CannotInstallToNetworkDrive= . -CannotInstallToUNCPath= UNC. -InvalidPath= : .. %n%nC:\APP%n%n UNC :%n%n\\server\share -InvalidDrive= . . -DiskSpaceWarningTitle= -DiskSpaceWarning= %1 KB %2 KB.%n%n ; -DirNameTooLong= . -InvalidDirName= . -BadDirName32= :%n%n%1 -DirExistsTitle= -DirExists= :%n%n%1%n%n . ; -DirDoesntExistTitle= -DirDoesntExist= :%n%n%1%n%n . ; - -; *** "Select Components" wizard page -WizardSelectComponents= -SelectComponentsDesc= ; -SelectComponentsLabel2= . -FullInstallation= -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation= -CustomInstallation= -NoUninstallWarningTitle= -NoUninstallWarning= :%n%n%1%n%n .%n%n ; -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel= [mb] MB . - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks= -SelectTasksDesc= ; -SelectTasksLabel2= [name] . - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup= -SelectStartMenuFolderDesc= ; -SelectStartMenuFolderLabel3= . -SelectStartMenuFolderBrowseLabel= , . , . -MustEnterGroupName= . -GroupNameTooLong= . -InvalidGroupName= . -BadGroupName= :%n%n%1 -NoProgramGroupCheck2=& . - -; *** "Ready to Install" wizard page -WizardReady= -ReadyLabel1= [name] . -ReadyLabel2a= . -ReadyLabel2b= . -ReadyMemoUserInfo= : -ReadyMemoDir= : -ReadyMemoType= : -ReadyMemoComponents= : -ReadyMemoGroup= : -ReadyMemoTasks= : - -; *** "Preparing to Install" wizard page -WizardPreparing= -PreparingDesc= [name] . -PreviousInstallNotCompleted= / . .%n%n , [name]. -CannotContinue= . . -ApplicationsFound= . . -ApplicationsFound2= . . , . -CloseApplications=& -DontCloseApplications=& -ErrorCloseApplications= . . - -; *** "Installing" wizard page -WizardInstalling= -InstallingLabel= [name] . - -; *** "Setup Completed" wizard page -FinishedHeadingLabel= [name] -FinishedLabelNoIcons= [name] . -FinishedLabel= [name] . . -ClickFinish= . -FinishedRestartLabel= [name] . ; -FinishedRestartMessage= [name] .%n%n ; -ShowReadmeCheck=, -YesRadio=&, -NoRadio=&, -; used for example as 'Run MyProg.exe' -RunEntryExec= %1 -; used for example as 'View Readme.txt' -RunEntryShellExec= %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle= / -SelectDiskLabel2=, / %1 OK.%n%n / , . -PathLabel=&: -FileNotInDir2= "%1" "%2". / . -SelectDirectoryLabel= /. - -; *** Installation phase messages -SetupAborted= .%n%n, . -EntryAbortRetryIgnore= Retry , Ignore Abort . - -; *** Installation status messages -StatusClosingApplications= ... -StatusCreateDirs= ... -StatusExtractFiles= ... -StatusCreateIcons= ... -StatusCreateIniEntries= ... -StatusCreateRegistryEntries= ... -StatusRegisterFiles= ... -StatusSavingUninstall= ... -StatusRunProgram= ... -StatusRestartingApplications= ... -StatusRollback= ... - -; *** Misc. errors -ErrorInternal2= : %1 -ErrorFunctionFailedNoCode=%1 -ErrorFunctionFailed=%1 , %2 -ErrorFunctionFailedWithMessage=%1 , %2.%n%3 -ErrorExecutingProgram= :%n%1 - -; *** Registry errors -ErrorRegOpenKey= :%n%1\%2 -ErrorRegCreateKey= :%n%1\%2 -ErrorRegWriteKey= :%n%1\%2 - -; *** INI errors -ErrorIniEntry= "%1". - -; *** File copying errors -FileAbortRetryIgnore= Retry , Ignore ( ) Abort . -FileAbortRetryIgnore2= Retry , Ignore ( ) Abort . -SourceIsCorrupted= -SourceDoesntExist= "%1" -ExistingFileReadOnly= .%n%n Retry , Ignore Abort . -ErrorReadingExistingDest= : -FileExists= .%n%n ; -ExistingFileNewer= . .%n%n ; -ErrorChangingAttr= : -ErrorCreatingTemp= : -ErrorReadingSource= : -ErrorCopying= : -ErrorReplacingExistingFile= : -ErrorRestartReplace= : -ErrorRenamingTemp= : -ErrorRegisterServer= DLL/OCX: %1 -ErrorRegSvr32Failed= RegSvr32 %1 -ErrorRegisterTypeLib= : %1 - -; *** Post-installation errors -ErrorOpeningReadme= . -ErrorRestartingComputer= . . - -; *** Uninstaller messages -UninstallNotFound= "%1" . . -UninstallOpenError= "%1" . -UninstallUnsupportedVer= "%1" , -UninstallUnknownEntry= "%1" , -ConfirmUninstall= %1 ; -UninstallOnlyOnWin64= 64-bit Windows. -OnlyAdminCanUninstall= . -UninstallStatusLabel= %1 . -UninstalledAll= %1 . -UninstalledMost= %1 .%n%n . . -UninstalledAndNeedsRestart= %1, .%n%n ; -UninstallDataCorrupted="%1" . - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle= ; -ConfirmDeleteSharedFile2= . ;%n%n . , . . -SharedFileNameLabel= : -SharedFileLocationLabel=: -WizardUninstalling= -StatusUninstalling= %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp= %1. -ShutdownBlockReasonUninstallingApp= %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 %2 -AdditionalIcons= : -CreateDesktopIcon= & -CreateQuickLaunchIcon= & -ProgramOnTheWeb= %1 Internet -UninstallProgram= %1 -LaunchProgram= %1 -AssocFileExtension=& %1 %2 -AssocingFileExtension= %1 %2 ... -AutoStartProgramGroupDescription=: -AutoStartProgram= %1 -AddonHostProgramNotFound= %1 .%n%n ; diff --git a/Greenshot/tools/innosetup/Languages/Hebrew.isl b/Greenshot/tools/innosetup/Languages/Hebrew.isl deleted file mode 100644 index 3318b3174..000000000 --- a/Greenshot/tools/innosetup/Languages/Hebrew.isl +++ /dev/null @@ -1,331 +0,0 @@ -; *** Inno Setup version 5.5.3+ Hebrew messages (stilgar(at)divrei-tora.com) *** -; -; -; Translated by s_h (s_h(at)enativ.com) (c) 2005 -; - -[LangOptions] -LanguageName=<05E2><05D1><05E8><05D9><05EA> -LanguageID=$040D -LanguageCodePage=1255 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -WelcomeFontName=Tahoma -WelcomeFontSize=11 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 -RightToLeft=yes - -[Messages] - -; *** Application titles -SetupAppTitle= -SetupWindowTitle= - %1 -UninstallAppTitle= -UninstallAppFullTitle= %1 - -; *** Misc. common -InformationTitle= -ConfirmTitle= -ErrorTitle= - -; *** SetupLdr messages -SetupLdrStartupMessage= %1 . ? -LdrCannotCreateTemp= . -LdrCannotExecTemp= . - -; *** Startup error messages -LastErrorMessage=%1.%n%n %2: %3 -SetupFileMissing= %1 . . -SetupFileCorrupt= . . -SetupFileCorruptOrWrongVer= , . . -InvalidParameter= :%n%n%1 -SetupAlreadyRunning= . -WindowsVersionNotSupported= . -WindowsServicePackRequired= %1 %2 . -NotOnThisPlatform= %1. -OnlyOnThisPlatform= %1. -OnlyOnTheseArchitectures= '' :%n%n%1 -MissingWOW64APIs= '' 64-. , %1. -WinVersionTooLowError= %1 %2. -WinVersionTooHighError= %1 %2 -AdminPrivilegesRequired= . -PowerUserPrivilegesRequired= , ' ' . -SetupAppRunningError= %1 .%n%n , '' , '' . -UninstallAppRunningError= %1 .%n%n , '' , '' . - -; *** Misc. errors -ErrorCreatingDir= "%1" -ErrorTooManyFilesInDir= "%1" - -; *** Setup common messages -ExitSetupTitle= -ExitSetupMessage= . , .%n%n .%n%n ? -AboutSetupMenuItem=& ... -AboutSetupTitle= -AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< & -ButtonNext=& > -ButtonInstall=& -ButtonOK= -ButtonCancel= -ButtonYes=& -ButtonYesToAll= & -ButtonNo=& -ButtonNoToAll=& -ButtonFinish=& -ButtonBrowse=&... -ButtonWizardBrowse=... -ButtonNewFolder=& - -; *** "Select Language" dialog messages -SelectLanguageTitle= -SelectLanguageLabel= : - -; *** Common wizard text -ClickNext= '' , '' . -BeveledLabel= -BrowseDialogTitle= -BrowseDialogLabel= '' -NewFolderName= - -; *** "Welcome" wizard page -WelcomeLabel1= [name] -WelcomeLabel2= [name/ver] .%n%n . - -; *** "Password" wizard page -WizardPassword= -PasswordLabel1= . -PasswordLabel3= , '' . , . -PasswordEditLabel=&: -IncorrectPassword= . . - -; *** "License Agreement" wizard page -WizardLicense= -LicenseLabel= . -LicenseLabel3= . . -LicenseAccepted= & -LicenseNotAccepted= & - -; *** "Information" wizard pages -WizardInfoBefore= -InfoBeforeLabel= . -InfoBeforeClickLabel= , ''. -WizardInfoAfter= -InfoAfterLabel= -InfoAfterClickLabel= , ''. - -; *** "User Information" wizard page -WizardUserInfo= -UserInfoDesc= . -UserInfoName=& : -UserInfoOrg=&: -UserInfoSerial=& : -UserInfoNameRequired= . - -; *** "Select Destination Location" wizard page -WizardSelectDir= -SelectDirDesc= [name]? -SelectDirLabel3= [name] . -SelectDirBrowseLabel=, ''. , ''. -DiskSpaceMBLabel= [mb] MB . -CannotInstallToNetworkDrive= . -CannotInstallToUNCPath= UNC. -InvalidPath= ; :%n%nC:\APP%n%n UNC :%n%n\\server\share -InvalidDrive= -UNC . . -DiskSpaceWarningTitle= -DiskSpaceWarning= %1KB , %2KB . ? -DirNameTooLong= -InvalidDirName= . -BadDirName32= :%n%n%1 -DirExistsTitle= -DirExists=:%n%n%1%n%n . ? -DirDoesntExistTitle= -DirDoesntExist=:%n%n%1%n%n . ? - -; *** "Select Components" wizard page -WizardSelectComponents= -SelectComponentsDesc= ? -SelectComponentsLabel2= ; . '' . -FullInstallation= -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation= -CustomInstallation= -NoUninstallWarningTitle= -NoUninstallWarning= :%n%n%1%n .%n%n ? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel= [mb] MB . - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks= -SelectTasksDesc= ? -SelectTasksLabel2= [name], ''. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup= '' -SelectStartMenuFolderDesc= ? -SelectStartMenuFolderLabel3= ''. -SelectStartMenuFolderBrowseLabel=, ''. , ''. -MustEnterGroupName= . -GroupNameTooLong= -InvalidGroupName= -. -BadGroupName= :%n%n%1 -NoProgramGroupCheck2=& '' - -; *** "Ready to Install" wizard page -WizardReady= -ReadyLabel1= [name] . -ReadyLabel2a= '' , '' . -ReadyLabel2b= '' -ReadyMemoUserInfo= : -ReadyMemoDir= : -ReadyMemoType= : -ReadyMemoComponents= : -ReadyMemoGroup= '': -ReadyMemoTasks= : - -; *** "Preparing to Install" wizard page -WizardPreparing= -PreparingDesc= [name] . -PreviousInstallNotCompleted=/ . .%n%n , [name]. -CannotContinue= . '' . -ApplicationsFound= . . -ApplicationsFound2= . . , . -CloseApplications=& -DontCloseApplications=& -ErrorCloseApplications= . . - -; *** "Installing" wizard page -WizardInstalling= -InstallingLabel= [name] . - -; *** "Setup Completed" wizard page -FinishedHeadingLabel= [name] -FinishedLabelNoIcons= [name] . -FinishedLabel= [name] . . -ClickFinish= '' . -FinishedRestartLabel= [name], . ? -FinishedRestartMessage= [name], .%n%n ? -ShowReadmeCheck=, -' ' -YesRadio=&, -NoRadio=&, -; used for example as 'Run MyProg.exe' -RunEntryExec= %1 -; used for example as 'View Readme.txt' -RunEntryShellExec= %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle= -SelectDiskLabel2= ' %1 ''.%n%n , ''. -PathLabel=&: -FileNotInDir2= "%1" "%2". . -SelectDirectoryLabel= . - -; *** Installation phase messages -SetupAborted= .%n%n . -EntryAbortRetryIgnore= ' ' , '' '' . - -; *** Installation status messages -StatusClosingApplications= ... -StatusCreateDirs= ... -StatusExtractFiles= ... -StatusCreateIcons= ... -StatusCreateIniEntries= INI... -StatusCreateRegistryEntries= ... -StatusRegisterFiles= ... -StatusSavingUninstall= ... -StatusRunProgram= ... -StatusRestartingApplications= ... -StatusRollback= ... - -; *** Misc. errors -ErrorInternal2= : %1 -ErrorFunctionFailedNoCode=%1 -ErrorFunctionFailed=%1 ; %2 -ErrorFunctionFailedWithMessage=%1 ; %2.%n%3 -ErrorExecutingProgram= :%n%1 - -; *** Registry errors -ErrorRegOpenKey= :%n%1\%2 -ErrorRegCreateKey= :%n%1\%2 -ErrorRegWriteKey= :%n%1\%2 - -; *** INI errors -ErrorIniEntry= INI "%1". - -; *** File copying errors -FileAbortRetryIgnore= ' ' , '' ( ), '' . -FileAbortRetryIgnore2= ' ' , '' ( ), '' . -SourceIsCorrupted= -SourceDoesntExist= "%1" -ExistingFileReadOnly= .%n%n ' ' , '' , '' . -ErrorReadingExistingDest= : -FileExists= .%n%n ? -ExistingFileNewer= . .%n%n ? -ErrorChangingAttr= : -ErrorCreatingTemp= : -ErrorReadingSource= : -ErrorCopying= : -ErrorReplacingExistingFile= : -ErrorRestartReplace= -RestartReplace: -ErrorRenamingTemp= : -ErrorRegisterServer= DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 %1 -ErrorRegisterTypeLib= : %1 - -; *** Post-installation errors -ErrorOpeningReadme= ' '. -ErrorRestartingComputer= . . - -; *** Uninstaller messages -UninstallNotFound= "%1" . . -UninstallOpenError= "%1". . -UninstallUnsupportedVer= "%1" " . -UninstallUnknownEntry= (%1) . -ConfirmUninstall= %1 ? -UninstallOnlyOnWin64= '' 64-. -OnlyAdminCanUninstall= . -UninstallStatusLabel= %1 . -UninstalledAll=%1 . -UninstalledMost= %1 .%n%n " , . -UninstalledAndNeedsRestart= %1, .%n%n ? -UninstallDataCorrupted= "%1" . - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle= ? -ConfirmDeleteSharedFile2= . ?%n%n , . , ''. . -SharedFileNameLabel= : -SharedFileLocationLabel=: -WizardUninstalling= -StatusUninstalling= %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp= %1. -ShutdownBlockReasonUninstallingApp= %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 %2 -AdditionalIcons= : -CreateDesktopIcon= & -CreateQuickLaunchIcon= -ProgramOnTheWeb=%1 -UninstallProgram= %1 -LaunchProgram= %1 -AssocFileExtension=& %1 %2 -AssocingFileExtension= %1 %2 -AutoStartProgramGroupDescription= : -AutoStartProgram= %1 -AddonHostProgramNotFound=%1 .%n%n ? \ No newline at end of file diff --git a/Greenshot/tools/innosetup/Languages/Hungarian.isl b/Greenshot/tools/innosetup/Languages/Hungarian.isl deleted file mode 100644 index f9e5b9cca..000000000 --- a/Greenshot/tools/innosetup/Languages/Hungarian.isl +++ /dev/null @@ -1,358 +0,0 @@ -; *** Inno Setup version 5.5.3+ Hungarian messages with "a(z)" definite articles *** -; Copyright (C) 1999-2012 Kornl Pl -; All rights reserved. -; E-mail: kornelpal@gmail.com -; Hungarian Inno Setup translation home page: http://www.kornelpal.hu/ishu -; -; You can download the versions with "a" and "az" definite articles and read -; about the usage of different Hungarian definite articles on this page. -; -; For conditions of use and distribution see Readme.htm file contained in the -; Hungarian Inno Setup messages package available on the above home page. -; -; *** Inno Setup 5.1.11+ verzi magyar zenetek "a(z)" hatrozott nvelkkel *** -; Copyright (C) 1999-2012 Pl Kornl -; Minden jog fenntartva. -; E-mail: kornelpal@gmail.com -; Magyar Inno Setup oldal: http://www.palkornel.hu/innosetup -; -; Az oldalrl letlthet az "a" s az "az" nvelket tartalmaz vltozat, s -; olvashatsz a klnbz magyar hatrozott nvelk hasznlatrl is. -; -; A hasznlat s a tovbbads felttelei a fenti oldalrl letlthet Magyar -; Inno Setup zenetek csomagban tallhat Fontos.htm fjlban olvashatak. -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Magyar -LanguageID=$040E -LanguageCodePage=1250 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -TitleFontName=Arial CE -;TitleFontSize=29 -CopyrightFontName=Arial CE -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Telept -SetupWindowTitle=%1 Telept -UninstallAppTitle=Eltvolt -UninstallAppFullTitle=%1 Eltvolt - -; *** Misc. common -InformationTitle=Informcik -ConfirmTitle=Megersts -ErrorTitle=Hiba - -; *** SetupLdr messages -SetupLdrStartupMessage=A(z) %1 teleptsre fog kerlni. Kvnja folytatni a teleptst? -LdrCannotCreateTemp=Nem lehet tmeneti fjlt ltrehozni. A telepts megszakadt -LdrCannotExecTemp=Az tmeneti knyvtrban nem lehet fjlt vgrehajtani. A telepts megszakadt - -; *** Startup error messages -LastErrorMessage=%1.%n%nHiba %2: %3 -SetupFileMissing=A(z) %1 fjl hinyzik a telept knyvtrbl. Hrtsa el a hibt, vagy szerezzen be egy j msolatot a programrl. -SetupFileCorrupt=A teleptfjlok megsrltek. Szerezzen be egy j msolatot a programrl. -SetupFileCorruptOrWrongVer=A teleptfjlok megsrltek, vagy nem kompatibilisek a Telept jelen verzijval. Hrtsa el a hibt, vagy szerezzen be egy j msolatot a programrl. -InvalidParameter=Az egyik parancssorban tadott paramter rvnytelen:%n%n%1 -SetupAlreadyRunning=A Telept mr fut. -WindowsVersionNotSupported=A program nem tmogatja a Windows szmtgpn fut verzijt. -WindowsServicePackRequired=A program futtatshoz %1 Service Pack %2 vagy ksbbi verzi szksges. -NotOnThisPlatform=Ez a program nem futtathat %1 alatt. -OnlyOnThisPlatform=Ezt a programot %1 alatt kell futtatni. -OnlyOnTheseArchitectures=Ezt a programot csak a Windows kvetkez processzorarchitektrkhoz tervezett vltozataira lehet telepteni:%n%n%1 -MissingWOW64APIs=A Windows n ltal futtatott verzija nem tartalmazza a Telept ltal a 64-bites telepts elvgzshez ignyelt funkcionalitst. A hiba elhrtshoz a Service Pack %1 teleptse szksges. -WinVersionTooLowError=A program a %1 %2 vagy ksbbi verzijt ignyli. -WinVersionTooHighError=A programot nem lehet a %1 %2 vagy ksbbi verzijra telepteni. -AdminPrivilegesRequired=A program teleptshez rendszergazdaknt kell bejelentkezni. -PowerUserPrivilegesRequired=A program teleptshez rendszergazdaknt vagy a kiemelt felhasznlk csoport tagjaknt kell bejelentkezni. -SetupAppRunningError=A Telept megllaptotta, hogy a(z) %1 jelenleg fut.%n%nKrem, zrja be az sszes pldnyt, majd a folytatshoz kattintson az OK gombra, vagy a Mgse gombra a kilpshez. -UninstallAppRunningError=Az Eltvolt megllaptotta, hogy a(z) %1 jelenleg fut.%n%nKrem, zrja be az sszes pldnyt, majd a folytatshoz kattintson az OK gombra, vagy a Mgse gombra a kilpshez. - -; *** Misc. errors -ErrorCreatingDir=A Telept nem tudta ltrehozni a(z) "%1" knyvtrat -ErrorTooManyFilesInDir=Nem hozhat ltre fjl a(z) "%1" knyvtrban, mert az mr tl sok fjlt tartalmaz - -; *** Setup common messages -ExitSetupTitle=Kilps a Teleptbl -ExitSetupMessage=A telepts mg nem fejezdtt be. Ha most kilp, a program nem kerl teleptsre.%n%nA Teleptt ksbb is futtathatja a telepts befejezshez.%n%nKilp a Teleptbl? -AboutSetupMenuItem=&Nvjegy... -AboutSetupTitle=Telept nvjegye -AboutSetupMessage=%1 %2 verzi%n%3%n%nAz %1 honlapja:%n%4 -AboutSetupNote= -TranslatorNote=Magyar vltozat:%nCopyright (C) 1999-2012 Pl Kornl%nMinden jog fenntartva.%n%nMagyar Inno Setup oldal:%nhttp://www.palkornel.hu/innosetup - -; *** Buttons -ButtonBack=< &Vissza -ButtonNext=&Tovbb > -ButtonInstall=&Telepts -ButtonOK=OK -ButtonCancel=Mgse -ButtonYes=&Igen -ButtonYesToAll=Igen, &mindet -ButtonNo=&Nem -ButtonNoToAll=&Egyiket sem -ButtonFinish=&Befejezs -ButtonBrowse=&Tallzs... -ButtonWizardBrowse=T&allzs... -ButtonNewFolder=&j mappa - -; *** "Select Language" dialog messages -SelectLanguageTitle=Vlasszon teleptsi nyelvet -SelectLanguageLabel=Vlassza ki a telepts sorn hasznland nyelvet: - -; *** Common wizard text -ClickNext=A folytatshoz kattintson a Tovbb gombra, vagy a Mgse gombra a Teleptbl trtn kilpshez. -BeveledLabel= -BrowseDialogTitle=Tallzs a mappk kztt -BrowseDialogLabel=Vlasszon egy mappt az albbi listbl, majd kattintson az OK gombra. -NewFolderName=j mappa - -; *** "Welcome" wizard page -WelcomeLabel1=dvzli a(z) [name] Teleptvarzsl. -WelcomeLabel2=A(z) [name/ver] a szmtgpre fog kerlni.%n%nA telepts folytatsa eltt ajnlott minden ms fut alkalmazst bezrni. - -; *** "Password" wizard page -WizardPassword=Jelsz -PasswordLabel1=Ez a telepts jelszval van vdve. -PasswordLabel3=Adja meg a jelszt, majd a folytatshoz kattintson a Tovbb gombra. A jelszavakban a kis- s a nagybetk klnbznek szmtanak. -PasswordEditLabel=&Jelsz: -IncorrectPassword=A megadott jelsz helytelen. Prblja jra. - -; *** "License Agreement" wizard page -WizardLicense=Licencszerzds -LicenseLabel=Olvassa el a kvetkez fontos informcikat a folytats eltt. -LicenseLabel3=Krem, olvassa el az albbi licencszerzdst. El kell fogadnia a szerzds feltteleit a telepts folytatsa eltt. -LicenseAccepted=&Elfogadom a szerzdst -LicenseNotAccepted=&Nem fogadom el a szerzdst - -; *** "Information" wizard pages -WizardInfoBefore=Informcik -InfoBeforeLabel=Olvassa el a kvetkez fontos informcikat a folytats eltt. -InfoBeforeClickLabel=Ha felkszlt a telepts folytatsra, kattintson a Tovbb gombra. -WizardInfoAfter=Informcik -InfoAfterLabel=Olvassa el a kvetkez fontos informcikat a folytats eltt. -InfoAfterClickLabel=Ha felkszlt a telepts folytatsra, kattintson a Tovbb gombra. - -; *** "User Information" wizard page -WizardUserInfo=Felhasznl adatai -UserInfoDesc=Krem, adja meg az adatait. -UserInfoName=&Felhasznlnv: -UserInfoOrg=&Szervezet: -UserInfoSerial=&Sorozatszm: -UserInfoNameRequired=Meg kell adnia egy nevet. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Vlasszon teleptsi helyet -SelectDirDesc=Hova kerljn teleptsre a(z) [name]? -SelectDirLabel3=A Telept a(z) [name] alkalmazst a kvetkez mappba fogja telepteni. -SelectDirBrowseLabel=A folytatshoz kattintson a Tovbb gombra. Msik mappa kivlasztshoz kattintson a Tallzs gombra. -DiskSpaceMBLabel=Legalbb [mb] MB szabad lemezterletre van szksg. -CannotInstallToNetworkDrive=A Telept nem tud hlzati meghajtra telepteni. -CannotInstallToUNCPath=A Telept nem tud hlzati UNC elrsi tra telepteni. -InvalidPath=Teljes tvonalat rjon be a meghajt betjelvel; pldul:%n%nC:\Alkalmazs%n%nvagy egy hlzati tvonalat a kvetkez alakban:%n%n\\kiszolgl\megoszts -InvalidDrive=A kivlasztott meghajt vagy hlzati megoszts nem ltezik vagy nem rhet el. Vlasszon msikat. -DiskSpaceWarningTitle=Nincs elg szabad lemezterlet a meghajtn -DiskSpaceWarning=A Teleptnek legalbb %1 KB szabad lemezterletre van szksge, de a kivlasztott meghajtn csak %2 KB ll rendelkezsre.%n%nMindenkppen folytatni kvnja? -DirNameTooLong=A mappanv vagy az tvonal tl hossz. -InvalidDirName=A mappanv rvnytelen. -BadDirName32=A mappanevekben nem szerepelhetnek a kvetkez karakterek:%n%n%1 -DirExistsTitle=A mappa mr ltezik -DirExists=A kvetkez mappa mr ltezik:%n%n%1 %n%nEbbe a mappba kvnja telepteni a programot? -DirDoesntExistTitle=A mappa nem ltezik -DirDoesntExist= A kvetkez mappa nem ltezik:%n%n%1%n%nLtre kvnja hozni a mappt? - -; *** "Select Components" wizard page -WizardSelectComponents=sszetevk kivlasztsa -SelectComponentsDesc=Mely sszetevk kerljenek teleptsre? -SelectComponentsLabel2=Vlassza ki a teleptend sszetevket; trlje a telepteni nem kvnt sszetevket. Kattintson a Tovbb gombra, ha kszen ll a folytatsra. -FullInstallation=Teljes telepts -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Szoksos telepts -CustomInstallation=Egyni telepts -NoUninstallWarningTitle=Ltez sszetev -NoUninstallWarning=A Telept megllaptotta, hogy a kvetkez sszetevk mr teleptve vannak a szmtgpre:%n%n%1%n%nEzen sszetevk kijellsnek trlse nem tvoltja el azokat a szmtgprl.%n%nMindenkppen folytatja? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=A jelenlegi kijells legalbb [mb] MB lemezterletet ignyel. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Jelljn ki kiegszt feladatokat -SelectTasksDesc=Mely kiegszt feladatok kerljenek vgrehajtsra? -SelectTasksLabel2=Jellje ki, mely kiegszt feladatokat hajtsa vgre a Telept a(z) [name] teleptse sorn, majd kattintson a Tovbb gombra. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Vlasszon mappt a Start menben -SelectStartMenuFolderDesc=Hova helyezze a Telept a program parancsikonjait? -SelectStartMenuFolderLabel3=A Telept a program parancsikonjait a Start men kvetkez mappjban fogja ltrehozni. -SelectStartMenuFolderBrowseLabel=A folytatshoz kattintson a Tovbb gombra. Msik mappa kivlasztshoz kattintson a Tallzs gombra. -MustEnterGroupName=Meg kell adnia egy mappanevet. -GroupNameTooLong=A mappanv vagy az tvonal tl hossz. -InvalidGroupName=A mappanv rvnytelen. -BadGroupName=A mappa nevben nem szerepelhetnek a kvetkez karakterek:%n%n%1 -NoProgramGroupCheck2=&Ne hozzon ltre mappt a Start menben - -; *** "Ready to Install" wizard page -WizardReady=A Telept felkszlt -ReadyLabel1=A Telept felkszlt a(z) [name] szmtgpre trtn teleptsre. -ReadyLabel2a=Kattintson a Telepts gombra a folytatshoz, vagy a Vissza gombra a belltsok ttekintshez, megvltoztatshoz. -ReadyLabel2b=Kattintson a Telepts gombra a folytatshoz. -ReadyMemoUserInfo=Felhasznl adatai: -ReadyMemoDir=Telepts helye: -ReadyMemoType=Telepts tpusa: -ReadyMemoComponents=Vlasztott sszetevk: -ReadyMemoGroup=Start men mappja: -ReadyMemoTasks=Kiegszt feladatok: - -; *** "Preparing to Install" wizard page -WizardPreparing=Felkszls a teleptsre -PreparingDesc=A Telept felkszl a(z) [name] szmtgpre trtn teleptsre. -PreviousInstallNotCompleted=Egy korbbi program teleptse/eltvoltsa nem fejezdtt be. jra kell indtania a szmtgpt a msik telepts befejezshez.%n%nA szmtgpe jraindtsa utn ismt futtassa a Teleptt a(z) [name] teleptsnek befejezshez. -CannotContinue=A telepts nem folytathat. A kilpshez kattintson a Mgse gombra. -ApplicationsFound=A kvetkez alkalmazsok olyan fjlokat hasznlnak, amelyeket a Teleptnek frissteni kell. Ajnlott, hogy engedlyezze a Teleptnek ezen alkalmazsok automatikus bezrst. -ApplicationsFound2=A kvetkez alkalmazsok olyan fjlokat hasznlnak, amelyeket a Teleptnek frissteni kell. Ajnlott, hogy engedlyezze a Teleptnek ezen alkalmazsok automatikus bezrst. A telepts befejezse utn a Telept megksrli az alkalmazsok jraindtst. -CloseApplications=&Alkalmazsok automatikus bezrsa -DontCloseApplications=&Ne zrja be az alkalmazsokat -ErrorCloseApplications=A Telept nem tudott minden alkalmazst automatikusan bezrni. A folytats eltt ajnlott minden, a Telept ltal frisstend fjlokat hasznl alkalmazst bezrni. - -; *** "Installing" wizard page -WizardInstalling=Telepts llapota -InstallingLabel=Legyen trelemmel, amg a(z) [name] szmtgpre trtn teleptse folyik. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=A(z) [name] Teleptvarzsl befejezse -FinishedLabelNoIcons=A(z) [name] teleptse befejezdtt. -FinishedLabel=A(z) [name] teleptse befejezdtt. Az alkalmazst a ltrehozott ikonok kivlasztsval indthatja. -ClickFinish=Kattintson a Befejezs gombra a Teleptbl trtn kilpshez. -FinishedRestartLabel=A(z) [name] teleptsnek befejezshez jra kell indtani a szmtgpet. jraindtja most? -FinishedRestartMessage=A(z) [name] teleptsnek befejezshez jra kell indtani a szmtgpet.%n%njraindtja most? -ShowReadmeCheck=Igen, szeretnm elolvasni a FONTOS fjlt -YesRadio=&Igen, jraindtom -NoRadio=&Nem, ksbb indtom jra -; used for example as 'Run MyProg.exe' -RunEntryExec=%1 futtatsa -; used for example as 'View Readme.txt' -RunEntryShellExec=%1 megtekintse - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=A Teleptnek szksge van a kvetkez lemezre -SelectDiskLabel2=Helyezze be a(z) %1. lemezt s kattintson az OK gombra.%n%nHa a fjlok a lemez egy a megjelentettl klnbz mappjban tallhatk, rja be a helyes tvonalat vagy kattintson a Tallzs gombra. -PathLabel=&tvonal: -FileNotInDir2=A(z) "%1" fjl nem tallhat a kvetkez helyen: "%2". Helyezze be a megfelel lemezt vagy vlasszon egy msik mappt. -SelectDirectoryLabel=Adja meg a kvetkez lemez helyt. - -; *** Installation phase messages -SetupAborted=A telepts nem fejezdtt be.%n%nHrtsa el a hibt, s futtassa jra a Teleptt. -EntryAbortRetryIgnore=Kilps: megszakts, Ismt: megismtls, Tovbb: folytats - -; *** Installation status messages -StatusClosingApplications=Alkalmazsok bezrsa... -StatusCreateDirs=Knyvtrak ltrehozsa... -StatusExtractFiles=Fjlok kibontsa... -StatusCreateIcons=Parancsikonok ltrehozsa... -StatusCreateIniEntries=INI bejegyzsek ltrehozsa... -StatusCreateRegistryEntries=Rendszerler bejegyzsek ltrehozsa... -StatusRegisterFiles=Fjlok regisztrlsa... -StatusSavingUninstall=Eltvolt informcik mentse... -StatusRunProgram=Telepts befejezse... -StatusRestartingApplications=Alkalmazsok jraindtsa... -StatusRollback=Vltoztatsok visszavonsa... - -; *** Misc. errors -ErrorInternal2=Bels hiba: %1 -ErrorFunctionFailedNoCode=Sikertelen %1 -ErrorFunctionFailed=Sikertelen %1; kd: %2 -ErrorFunctionFailedWithMessage=Sikertelen %1; kd: %2.%n%3 -ErrorExecutingProgram=Nem hajthat vgre a fjl:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Nem nyithat meg a rendszerler kulcs:%n%1\%2 -ErrorRegCreateKey=Nem hozhat ltre a rendszerler kulcs:%n%1\%2 -ErrorRegWriteKey=Nem mdosthat a rendszerler kulcs:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Hiba az INI bejegyzs ltrehozsa kzben a(z) "%1" fjlban. - -; *** File copying errors -FileAbortRetryIgnore=Kilps: megszakts, Ismt: megismtls, Tovbb: a fjl tlpse (nem ajnlott) -FileAbortRetryIgnore2=Kilps: megszakts, Ismt: megismtls, Tovbb: folytats (nem ajnlott) -SourceIsCorrupted=A forrsfjl megsrlt -SourceDoesntExist=A(z) "%1" forrsfjl nem ltezik -ExistingFileReadOnly=A fjl csak olvashatknt van jellve.%n%nKilps: megszakts, Ismt: csak olvashat jells megszntetse, s megismtls, Tovbb: a fjl tlpse (nem ajnlott) -ErrorReadingExistingDest=Hiba lpett fel a fjl olvassa kzben: -FileExists=A fjl mr ltezik.%n%nFell kvnja rni? -ExistingFileNewer=A ltez fjl jabb a teleptsre kerlnl. Ajnlott a ltez fjl megtartsa.%n%nMeg kvnja tartani a ltez fjlt? -ErrorChangingAttr=Hiba lpett fel a fjl attribtumnak mdostsa kzben: -ErrorCreatingTemp=Hiba lpett fel a fjl teleptsi knyvtrban trtn ltrehozsa kzben: -ErrorReadingSource=Hiba lpett fel a forrsfjl olvassa kzben: -ErrorCopying=Hiba lpett fel a fjl msolsa kzben: -ErrorReplacingExistingFile=Hiba lpett fel a ltez fjl cserje kzben: -ErrorRestartReplace=A fjl cserje az jraindts utn sikertelen volt: -ErrorRenamingTemp=Hiba lpett fel fjl teleptsi knyvtrban trtn tnevezse kzben: -ErrorRegisterServer=Nem lehet regisztrlni a DLL-t/OCX-et: %1 -ErrorRegSvr32Failed=Sikertelen RegSvr32. A visszaadott kd: %1 -ErrorRegisterTypeLib=Nem lehet regisztrlni a tpustrat: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Hiba lpett fel a FONTOS fjl megnyitsa kzben. -ErrorRestartingComputer=A Telept nem tudta jraindtani a szmtgpet. Indtsa jra kzileg. - -; *** Uninstaller messages -UninstallNotFound=A(z) "%1" fjl nem ltezik. Nem tvolthat el. -UninstallOpenError=A(z) "%1" fjl nem nyithat meg. Nem tvolthat el -UninstallUnsupportedVer=A(z) "%1" eltvoltsi naplfjl formtumt nem tudja felismerni az eltvolt jelen verzija. Az eltvolts nem folytathat -UninstallUnknownEntry=Egy ismeretlen bejegyzs (%1) tallhat az eltvoltsi naplfjlban -ConfirmUninstall=Biztosan el kvnja tvoltani a(z) %1 programot s minden sszetevjt? -UninstallOnlyOnWin64=Ezt a teleptst csak 64-bites Windowson lehet eltvoltani. -OnlyAdminCanUninstall=Ezt a teleptst csak adminisztrcis jogokkal rendelkez felhasznl tvolthatja el. -UninstallStatusLabel=Legyen trelemmel, amg a(z) %1 szmtgprl trtn eltvoltsa befejezdik. -UninstalledAll=A(z) %1 sikeresen el lett tvoltva a szmtgprl. -UninstalledMost=A(z) %1 eltvoltsa befejezdtt.%n%nNhny elemet nem lehetetett eltvoltani. Trlje kzileg. -UninstalledAndNeedsRestart=A(z) %1 eltvoltsnak befejezshez jra kell indtania a szmtgpt.%n%njraindtja most? -UninstallDataCorrupted=A(z) "%1" fjl srlt. Nem tvolthat el. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Trli a megosztott fjlt? -ConfirmDeleteSharedFile2=A rendszer azt jelzi, hogy a kvetkez megosztott fjlra mr nincs szksge egyetlen programnak sem. Eltvoltja a megosztott fjlt?%n%nHa ms programok mg mindig hasznljk a megosztott fjlt, akkor az eltvoltsa utn lehet, hogy nem fognak megfelelen mkdni. Ha bizonytalan, vlassza a Nemet. A fjl megtartsa nem okoz problmt a rendszerben. -SharedFileNameLabel=Fjlnv: -SharedFileLocationLabel=Helye: -WizardUninstalling=Eltvolts llapota -StatusUninstalling=%1 eltvoltsa... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=%1 teleptse. -ShutdownBlockReasonUninstallingApp=%1 eltvoltsa. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 %2 verzi -AdditionalIcons=Tovbbi ikonok: -CreateDesktopIcon=Ikon ltrehozsa az &Asztalon -CreateQuickLaunchIcon=Ikon ltrehozsa a &Gyorsindts eszkztron -ProgramOnTheWeb=%1 a weben -UninstallProgram=%1 eltvoltsa -LaunchProgram=%1 elindtsa -AssocFileExtension=A(z) %1 &trstsa a(z) %2 fjlkiterjesztssel -AssocingFileExtension=A(z) %1 trstsa a(z) %2 fjlkiterjesztssel... -AutoStartProgramGroupDescription=Indtpult: -AutoStartProgram=%1 automatikus indtsa -AddonHostProgramNotFound=A(z) %1 nem tallhat a kivlasztott mappban.%n%nMindenkppen folytatni kvnja? diff --git a/Greenshot/tools/innosetup/Languages/Italian.isl b/Greenshot/tools/innosetup/Languages/Italian.isl deleted file mode 100644 index 25f62fa9a..000000000 --- a/Greenshot/tools/innosetup/Languages/Italian.isl +++ /dev/null @@ -1,341 +0,0 @@ -; *** Inno Setup version 5.5.3+ Italian messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Italian.isl - Last Update December 15, 2012 (based on ale5000 5.1.11+ translation) -; -; Translator name: Rinaldo M. aka Whiteshark -; Translator e-mail: dad428(X)hotmail.com (replace (X) with @ ) -; -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Italiano -LanguageID=$0410 -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Installazione -SetupWindowTitle=Installazione di %1 -UninstallAppTitle=Disinstallazione -UninstallAppFullTitle=Disinstallazione di %1 - -; *** Misc. common -InformationTitle=Informazioni -ConfirmTitle=Conferma -ErrorTitle=Errore - -; *** SetupLdr messages -SetupLdrStartupMessage=Questa l'installazione di %1. Si desidera continuare? -LdrCannotCreateTemp=Impossibile creare un file temporaneo. Installazione annullata -LdrCannotExecTemp=Impossibile eseguire un file nella cartella temporanea. Installazione annullata - -; *** Startup error messages -LastErrorMessage=%1.%n%nErrore %2: %3 -SetupFileMissing=File %1 non trovato nella cartella di installazione. Correggere il problema o richiedere una nuova copia del software. -SetupFileCorrupt=I file di installazione sono danneggiati. Richiedere una nuova copia del software. -SetupFileCorruptOrWrongVer=I file di installazione sono danneggiati, o sono incompatibili con questa versione del programma di installazione. Correggere il problema o richiedere una nuova copia del software. -InvalidParameter=Un parametro non valido stato immesso sulla riga di comando:%n%n%1 -SetupAlreadyRunning=Il processo di installazione gi in funzione. -WindowsVersionNotSupported=Questo programma non supporta la versione di Windows installata sul computer. -WindowsServicePackRequired=Questo programma richiede %1 Service Pack %2 o successivo. -NotOnThisPlatform=Questo programma non compatibile con %1. -OnlyOnThisPlatform=Questo programma richiede %1. -OnlyOnTheseArchitectures=Questo programma pu essere installato solo su versioni di Windows progettate per le seguenti architetture del processore:%n%n%1 -MissingWOW64APIs=La versione di Windows utilizzata non include la funzionalit richiesta dal programma di installazione per realizzare un'installazione a 64-bit. Per correggere questo problema, installare il Service Pack %1. -WinVersionTooLowError=Questo programma richiede %1 versione %2 o successiva. -WinVersionTooHighError=Questo programma non pu essere installato su %1 versione %2 o successiva. -AdminPrivilegesRequired=Sono richiesti privilegi di amministratore per installare questo programma. -PowerUserPrivilegesRequired=Sono richiesti privilegi di amministratore o di Power Users per poter installare questo programma. -SetupAppRunningError=%1 attualmente in esecuzione.%n%nChiudere adesso tutte le istanze del programma e poi premere OK, oppure premere Annulla per uscire. -UninstallAppRunningError=%1 attualmente in esecuzione.%n%nChiudere adesso tutte le istanze del programma e poi premere OK, oppure premere Annulla per uscire. - -; *** Misc. errors -ErrorCreatingDir=Impossibile creare la cartella "%1" -ErrorTooManyFilesInDir=Impossibile creare i file nella cartella "%1" perch contiene troppi file - -; *** Setup common messages -ExitSetupTitle=Uscita dall'installazione -ExitSetupMessage=L'installazione non completa. Uscendo dall'installazione in questo momento, il programma non sar installato.%n%n possibile eseguire l'installazione in un secondo tempo.%n%nUscire dall'installazione? -AboutSetupMenuItem=&Informazioni sull'installazione... -AboutSetupTitle=Informazioni sull'installazione -AboutSetupMessage=%1 versione %2%n%3%n%n%1 sito web:%n%4 -AboutSetupNote= -TranslatorNote=Traduzione italiana a cura di Rinaldo M. aka Whiteshark - -; *** Buttons -ButtonBack=< &Indietro -ButtonNext=&Avanti > -ButtonInstall=Inst&alla -ButtonOK=OK -ButtonCancel=Annulla -ButtonYes=&Si -ButtonYesToAll=Si a &tutto -ButtonNo=&No -ButtonNoToAll=N&o a tutto -ButtonFinish=&Fine -ButtonBrowse=&Sfoglia... -ButtonWizardBrowse=S&foglia... -ButtonNewFolder=&Crea nuova cartella - -; *** "Select Language" dialog messages -SelectLanguageTitle=Selezionare la lingua dell'installazione -SelectLanguageLabel=Selezionare la lingua da utilizzare durante l'installazione: - -; *** Common wizard text -ClickNext=Premere Avanti per continuare, o Annulla per uscire. -BeveledLabel= -BrowseDialogTitle=Sfoglia per cartelle -BrowseDialogLabel=Selezionare una cartella dalla lista, poi premere OK. -NewFolderName=Nuova cartella - -; *** "Welcome" wizard page -WelcomeLabel1=Benvenuti nel programma di installazione di [name] -WelcomeLabel2=[name/ver] sar installato sul computer.%n%nSi consiglia di chiudere tutte le applicazioni attive prima di procedere. - -; *** "Password" wizard page -WizardPassword=Password -PasswordLabel1=Questa installazione protetta da password. -PasswordLabel3=Inserire la password, poi premere Avanti per continuare. Le password sono sensibili alle maiuscole/minuscole. -PasswordEditLabel=&Password: -IncorrectPassword=La password inserita non corretta, riprovare. - -; *** "License Agreement" wizard page -WizardLicense=Contratto di licenza -LicenseLabel=Leggere con attenzione le informazioni che seguono prima di procedere. -LicenseLabel3=Leggere il seguente contratto di licenza. necessario accettare tutti i termini del contratto per procedere con l'installazione. -LicenseAccepted=Accetto i termini del &contratto di licenza -LicenseNotAccepted=&Non accetto i termini del contratto di licenza - -; *** "Information" wizard pages -WizardInfoBefore=Informazioni -InfoBeforeLabel=Leggere le importanti informazioni che seguono prima di procedere. -InfoBeforeClickLabel=Quando si pronti per proseguire, premere Avanti. -WizardInfoAfter=Informazioni -InfoAfterLabel=Leggere le importanti informazioni che seguono prima di procedere. -InfoAfterClickLabel=Quando si pronti per proseguire, premere Avanti. - -; *** "User Information" wizard page -WizardUserInfo=Informazioni utente -UserInfoDesc=Inserire le seguenti informazioni. -UserInfoName=&Nome: -UserInfoOrg=&Societ: -UserInfoSerial=&Numero di serie: -UserInfoNameRequired= necessario inserire un nome. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Selezione della cartella di installazione -SelectDirDesc=Dove si vuole installare [name]? -SelectDirLabel3=[name] sar installato nella seguente cartella. -SelectDirBrowseLabel=Per continuare, premere Avanti. Per scegliere un'altra cartella, premere Sfoglia. -DiskSpaceMBLabel=Sono richiesti almeno [mb] MB di spazio sul disco. -CannotInstallToNetworkDrive=Non possibile effettuare l'installazione su un drive in rete. -CannotInstallToUNCPath=Non possibile effettuare l'installazione su un percorso UNC. -InvalidPath=Si deve inserire un percorso completo di lettera di unit; per esempio:%n%nC:\APP%n%no un percorso di rete nella forma:%n%n\\server\condivisione -InvalidDrive=L'unit o il percorso di rete selezionato non esiste o non accessibile. Selezionarne un'altro. -DiskSpaceWarningTitle=Spazio su disco insufficiente -DiskSpaceWarning=L'installazione richiede almeno %1 KB di spazio libero per eseguire l'installazione, ma l'unit selezionata ha solo %2 KB disponibili.%n%nSi desidera continuare comunque? -DirNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. -InvalidDirName=Il nome della cartella non valido. -BadDirName32=Il nome della cartella non pu includere nessuno dei caratteri seguenti:%n%n%1 -DirExistsTitle=Cartella gi esistente -DirExists=La cartella:%n%n%1 esiste gi.%n%nSi desidera utilizzarla comunque? -DirDoesntExistTitle=Cartella inesistente -DirDoesntExist=La cartella:%n%n%1 non esiste.%n%nSi desidera crearla? - -; *** "Select Components" wizard page -WizardSelectComponents=Selezione componenti -SelectComponentsDesc=Quali componenti devono essere installati? -SelectComponentsLabel2=Selezionare i componenti da installare, deselezionare quelli che non si desidera installare. Premere Avanti per continuare. -FullInstallation=Installazione completa -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Installazione compatta -CustomInstallation=Installazione personalizzata -NoUninstallWarningTitle=Componente esistente -NoUninstallWarning=I seguenti componenti sono gi installati sul computer:%n%n%1%n%nDeselezionando questi componenti essi non verranno rimossi.%n%nSi desidera continuare comunque? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=La selezione corrente richiede almeno [mb] MB di spazio su disco. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Selezione processi addizionali -SelectTasksDesc=Quali processi aggiuntivi si vogliono avviare? -SelectTasksLabel2=Selezionare i processi aggiuntivi che verranno eseguiti durante l'installazione di [name], poi premere Avanti. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Selezione della cartella nel Menu Avvio/Start -SelectStartMenuFolderDesc=Dove si vuole inserire i collegamenti al programma? -SelectStartMenuFolderLabel3=Saranno creati i collegamenti al programma nella seguente cartella del Menu Avvio/Start. -SelectStartMenuFolderBrowseLabel=Per continuare, premere Avanti. Per selezionare un'altra cartella, premere Sfoglia. -MustEnterGroupName=Si deve inserire il nome della cartella. -GroupNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. -InvalidGroupName=Il nome della cartella non valido. -BadGroupName=Il nome della cartella non pu includere nessuno dei caratteri seguenti:%n%n%1 -NoProgramGroupCheck2=&Non creare una cartella nel Menu Avvio/Start - -; *** "Ready to Install" wizard page -WizardReady=Pronto per l'installazione -ReadyLabel1=Il programma di installazione pronto per iniziare l'installazione di [name] sul computer. -ReadyLabel2a=Premere Installa per continuare con l'installazione, o Indietro per rivedere o modificare le impostazioni. -ReadyLabel2b=Premere Installa per procedere con l'installazione. -ReadyMemoUserInfo=Informazioni utente: -ReadyMemoDir=Cartella di installazione: -ReadyMemoType=Tipo di installazione: -ReadyMemoComponents=Componenti selezionati: -ReadyMemoGroup=Cartella del menu Avvio/Start: -ReadyMemoTasks=Processi addizionali: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparazione all'installazione -PreparingDesc=Preparazione all'installazione di [name] sul computer. -PreviousInstallNotCompleted=L'installazione/rimozione precedente del programma non stata completata. necessario riavviare il sistema per completare l'installazione.%n%nDopo il riavvio del sistema eseguire di nuovo l'installazione di [name]. -CannotContinue=L'installazione non pu continuare. Premere Annulla per uscire. -ApplicationsFound=Le seguenti applicazioni stanno usando file che devono essere aggiornati dall'installazione. Si consiglia di permettere al processo di chiudere automaticamente queste applicazioni. -ApplicationsFound2=Le seguenti applicazioni stanno usando file che devono essere aggiornati dall'installazione. Si consiglia di permettere al processo di chiudere automaticamente queste applicazioni. Al completamento dell'installazione, il processo tenter di riavviare le applicazioni. -CloseApplications=Chiudi &automaticamente le applicazioni -DontCloseApplications=&Non chiudere le applicazioni -ErrorCloseApplications=L'installazione non riuscita a chiudere automaticamente tutte le applicazioni.Si raccomanda di chiuderetutte le applicazioni che usano file che devono essere aggiornatidurante l'installazione prima di proseguire. - -; *** "Installing" wizard page -WizardInstalling=Installazione in corso -InstallingLabel=Attendere il completamento dell'installazione di [name] sul computer. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Completamento dell'installazione di [name] -FinishedLabelNoIcons=L'installazione di [name] stata completata con successo. -FinishedLabel=L'installazione di [name] stata completata con successo. L'applicazione pu essere eseguita selezionando le relative icone. -ClickFinish=Premere Fine per uscire dall'installazione. -FinishedRestartLabel=Per completare l'installazione di [name], necessario riavviare il sistema. Si desidera riavviare adesso? -FinishedRestartMessage=Per completare l'installazione di [name], necessario riavviare il sistema.%n%nSi desidera riavviare adesso? -ShowReadmeCheck=Si, desidero vedere il file LEGGIMI adesso -YesRadio=&Si, riavvia il sistema adesso -NoRadio=&No, riavvia il sistema pi tardi -; used for example as 'Run MyProg.exe' -RunEntryExec=Avvia %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Visualizza %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=L'installazione necessita del disco successivo -SelectDiskLabel2=Inserire il disco %1 e premere OK.%n%nSe i file su questo disco si trovano in una cartella diversa da quella visualizzata sotto, inserire il percorso corretto o premere Sfoglia. -PathLabel=&Percorso: -FileNotInDir2=Il file "%1" non stato trovato in "%2". Inserire il disco corretto o selezionare un'altra cartella. -SelectDirectoryLabel=Specificare il percorso del prossimo disco. - -; *** Installation phase messages -SetupAborted=L'installazione non stata completata.%n%nCorreggere il problema e rieseguire nuovamente l'installazione. -EntryAbortRetryIgnore=Premere Riprova per ritentare nuovamente, Ignora per procedere in ogni caso, o Interrompi per terminare l'installazione. - -; *** Installation status messages -StatusClosingApplications=Chiusura applicazioni... -StatusCreateDirs=Creazione cartelle... -StatusExtractFiles=Estrazione file... -StatusCreateIcons=Creazione icone... -StatusCreateIniEntries=Creazione voci nei file INI... -StatusCreateRegistryEntries=Creazione voci di registro... -StatusRegisterFiles=Registrazione file... -StatusSavingUninstall=Salvataggio delle informazioni di disinstallazione... -StatusRunProgram=Termine dell'installazione... -StatusRestartingApplications=Riavvio applicazioni... -StatusRollback=Recupero delle modifiche... - -; *** Misc. errors -ErrorInternal2=Errore Interno %1 -ErrorFunctionFailedNoCode=%1 fallito -ErrorFunctionFailed=%1 fallito; codice %2 -ErrorFunctionFailedWithMessage=%1 fallito; codice %2.%n%3 -ErrorExecutingProgram=Impossibile eseguire il file:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Errore di apertura della chiave di registro:%n%1\%2 -ErrorRegCreateKey=Errore di creazione della chiave di registro:%n%1\%2 -ErrorRegWriteKey=Errore di scrittura della chiave di registro:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Errore nella creazione delle voci INI nel file "%1". - -; *** File copying errors -FileAbortRetryIgnore=Premere Riprova per tentare di nuovo, Ignora per saltare questo file (sconsigliato), o Interrompi per terminare l'installazione. -FileAbortRetryIgnore2=Premere Riprova per tentare di nuovo, Ignora per proseguire comunque (sconsigliato), o Interrompi per terminare l'installazione. -SourceIsCorrupted=Il file sorgente danneggiato -SourceDoesntExist=Il file sorgente "%1" non esiste -ExistingFileReadOnly=Il file esistente ha l'attributo di sola lettura.%n%nPremere Riprova per rimuovere l'attributo di sola lettura e ritentare, Ignora per saltare questo file, o Interrompi per terminare l'installazione. -ErrorReadingExistingDest=Si verificato un errore durante la lettura del file esistente: -FileExists=Il file esiste gi.%n%nDesideri sovrascriverlo? -ExistingFileNewer=Il file esistente pi recente di quello che si st installando. Si raccomanda di mantenere il file esistente.%n%nSi desidera mantenere il file esistente? -ErrorChangingAttr=Si verificato un errore durante il tentativo di modifica dell'attributo del file esistente: -ErrorCreatingTemp=Si verificato un errore durante la creazione di un file nella cartella di installazione: -ErrorReadingSource=Si verificato un errore durante la lettura del file sorgente: -ErrorCopying=Si verificato un errore durante la copia di un file: -ErrorReplacingExistingFile=Si verificato un errore durante la sovrascrittura del file esistente: -ErrorRestartReplace=Errore durante Riavvio-Sostituzione: -ErrorRenamingTemp=Si verificato un errore durante il tentativo di rinominare un file nella cartella di installazione: -ErrorRegisterServer=Impossibile registrare la DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 fallito con codice di uscita %1 -ErrorRegisterTypeLib=Impossibile registrare la libreria di tipo: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Si verificato un errore durante l'apertura del file LEGGIMI. -ErrorRestartingComputer=Impossibile riavviare il sistema. Riavviare manualmente. - -; *** Uninstaller messages -UninstallNotFound=Il file "%1" non esiste. Impossibile disinstallare. -UninstallOpenError=Il file "%1" non pu essere aperto. Impossibile disinstallare -UninstallUnsupportedVer=Il file log di disinstallazione "%1" in un formato non riconosciuto da questa versione del programma di disinstallazione. Impossibile disinstallare -UninstallUnknownEntry=Trovata una voce sconosciuta (%1) nel file log di disinstallazione -ConfirmUninstall=Si desidera rimuovere completamente %1 e tutti i suoi componenti? -UninstallOnlyOnWin64=Questa applicazione pu essere disinstallata solo su Windows a 64-bit. -OnlyAdminCanUninstall=Questa applicazione pu essere disinstallata solo da un utente con privilegi di amministratore. -UninstallStatusLabel=Attendere fino a che %1 stato rimosso dal computer. -UninstalledAll=%1 stato rimosso con successo dal computer. -UninstalledMost=Disinstallazione di %1 completata.%n%nAlcuni elementi non possono essere rimossi. Dovranno essere rimossi manualmente. -UninstalledAndNeedsRestart=Per completare la disinstallazione di %1, necessario riavviare il sistema.%n%nSi desidera riavviare adesso? -UninstallDataCorrupted=Il file "%1" danneggiato. Impossibile disinstallare - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Rimuovere il file condiviso? -ConfirmDeleteSharedFile2=Il sistema indica che il seguente file condiviso non pi usato da nessun programma. Rimuovere questo file condiviso?%n%nSe qualche programma usasse questo file, potrebbe non funzionare pi correttamente. Se non si sicuri, scegliere No. Lasciare il file nel sistema non pu causare danni. -SharedFileNameLabel=Nome del file: -SharedFileLocationLabel=Percorso: -WizardUninstalling=Stato della disinstallazione -StatusUninstalling=Disinstallazione di %1 in corso... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installazione di %1. -ShutdownBlockReasonUninstallingApp=Disinstallazione di %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versione %2 -AdditionalIcons=Icone aggiuntive: -CreateDesktopIcon=Crea un'icona sul &desktop -CreateQuickLaunchIcon=Crea un'icona nella &barra Avvio veloce -ProgramOnTheWeb=%1 sul Web -UninstallProgram=Disinstalla %1 -LaunchProgram=Avvia %1 -AssocFileExtension=&Associa l'estensione %2 a %1 -AssocingFileExtension=Associazione dell'estensione %2 a %1 in corso... -AutoStartProgramGroupDescription=Avvio automatico: -AutoStartProgram=Avvia automaticamente %1 -AddonHostProgramNotFound=Impossibile individuare %1 nella cartella selezionata.%n%nProseguire ugualmente? \ No newline at end of file diff --git a/Greenshot/tools/innosetup/Languages/Japanese.isl b/Greenshot/tools/innosetup/Languages/Japanese.isl deleted file mode 100644 index 53520e7a2..000000000 --- a/Greenshot/tools/innosetup/Languages/Japanese.isl +++ /dev/null @@ -1,322 +0,0 @@ -; *** Inno Setup version 5.5.3+ Japanese messages *** -; -; Maintained by Koichi Shirasuka (shirasuka@eugrid.co.jp) -; -; Translation based on Ryou Minakami (ryou32jp@yahoo.co.jp) -; -; $jrsoftware: issrc/Files/Languages/Japanese.isl,v 1.6 2010/03/08 07:50:01 mlaan Exp $ - -[LangOptions] -LanguageName=<65E5><672C><8A9E> -LanguageID=$0411 -LanguageCodePage=932 - -[Messages] - -; *** Application titles -SetupAppTitle=ZbgAbv -SetupWindowTitle=%1 ZbgAbv -UninstallAppTitle=ACXg[ -UninstallAppFullTitle=%1 ACXg[ - -; *** Misc. common -InformationTitle= -ConfirmTitle=mF -ErrorTitle=G[ - -; *** SetupLdr messages -SetupLdrStartupMessage=%1 CXg[܂Bs܂H -LdrCannotCreateTemp=ꎞt@C쐬ł܂BZbgAbv𒆎~܂B -LdrCannotExecTemp=ꎞtH_̃t@Csł܂BZbgAbv𒆎~܂B - -; *** Startup error messages -LastErrorMessage=%1.%n%nG[ %2: %3 -SetupFileMissing=t@C %1 ‚܂B邩VZbgAbvvO肵ĂB -SetupFileCorrupt=ZbgAbvt@CĂ܂BVZbgAbvvO肵ĂB -SetupFileCorruptOrWrongVer=ZbgAbvt@CĂ邩Ão[W̃ZbgAbvƌ݊܂B邩VZbgAbvvO肵ĂB -InvalidParameter=R}hCɕsȃp[^[n܂:%n%n%1 -SetupAlreadyRunning=ZbgAbv͊ɎsłB -WindowsVersionNotSupported=̃vO͂g̃o[W Windows T|[gĂ܂B -WindowsServicePackRequired=̃vO̎sɂ %1 Service Pack %2 ȍ~KvłB -NotOnThisPlatform=̃vO %1 ł͓삵܂B -OnlyOnThisPlatform=̃vO̎sɂ %1 KvłB -OnlyOnTheseArchitectures=̃vO%n%n%1vZbT[ Windows ɂCXg[ł܂B -MissingWOW64APIs=gp 64-bit Windows ɂ͂̃vOCXg[A삳ׂɕKvȋ@\܂܂Ă܂B̖Cׂɂ̓T[rXpbN %1 CXg[ĂB -WinVersionTooLowError=̃vO̎sɂ %1 %2 ȍ~KvłB -WinVersionTooHighError=̃vO %1 %2 ȍ~ł͓삵܂B -AdminPrivilegesRequired=̃vOCXg[邽߂ɂ͊Ǘ҂ƂăOCKv܂B -PowerUserPrivilegesRequired=̃vOCXg[邽߂ɂ͊Ǘ҂܂̓p[[U[ƂăOCKv܂B -SetupAppRunningError=ZbgAbv͎s %1 o܂B%n%nJĂAvP[Vׂĕ‚ĂuOKvNbNĂBuLZvNbNƁAZbgAbvI܂B -UninstallAppRunningError=ACXg[͎s %1 o܂B%n%nJĂAvP[Vׂĕ‚ĂuOKvNbNĂBuLZvNbNƁAZbgAbvI܂B - -; *** Misc. errors -ErrorCreatingDir=fBNg %1 쐬ɃG[܂B -ErrorTooManyFilesInDir=fBNg %1 Ƀt@C쐬ɃG[܂Bt@C̐܂B - -; *** Setup common messages -ExitSetupTitle=ZbgAbvI -ExitSetupMessage=ZbgAbvƂ͊Ă܂BŃZbgAbv𒆎~ƃvO̓CXg[܂B%n%n߂ăCXg[ꍇ́AxZbgAbvsĂB%n%nZbgAbvI܂H -AboutSetupMenuItem=ZbgAbvɂ‚(&A)... -AboutSetupTitle=ZbgAbvɂ‚ -AboutSetupMessage=%1 %2%n%3%n%n%1 z[y[W:%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< ߂(&B) -ButtonNext=(&N) > -ButtonInstall=CXg[(&I) -ButtonOK=OK -ButtonCancel=LZ -ButtonYes=͂(&Y) -ButtonYesToAll=ׂĂ͂(&A) -ButtonNo=(&N) -ButtonNoToAll=ׂĂ(&O) -ButtonFinish=(&F) -ButtonBrowse=Q(&B)... -ButtonWizardBrowse=Q(&R) -ButtonNewFolder=VtH_[(&M) - -; *** "Select Language" dialog messages -SelectLanguageTitle=ZbgAbvɎgp錾̑I -SelectLanguageLabel=CXg[ɗp錾Ił: - -; *** Common wizard text -ClickNext=sɂ́uցvAZbgAbvIɂ́uLZvNbNĂB -BeveledLabel= -BrowseDialogTitle=tH_[Q -BrowseDialogLabel=XgtH_[I OK ĂB -NewFolderName=VtH_[ - -; *** "Welcome" wizard page -WelcomeLabel1=[name] ZbgAbvEBU[h̊Jn -WelcomeLabel2=̃vO͂gp̃Rs[^[ [name/ver] CXg[܂B%n%nsOɑ̃AvP[VׂďIĂB - -; *** "Password" wizard page -WizardPassword=pX[h -PasswordLabel1=̃CXg[vO̓pX[hɂĕی삳Ă܂B -PasswordLabel3=pX[h͂āuցvNbNĂBpX[h͑啶Əʂ܂B -PasswordEditLabel=pX[h(&P): -IncorrectPassword=͂ꂽpX[h܂Bx͂ȂĂB - -; *** "License Agreement" wizard page -WizardLicense=gp_񏑂̓ -LicenseLabel=sOɈȉ̏dvȏǂ݂B -LicenseLabel3=ȉ̎gp_񏑂ǂ݂BCXg[𑱍sɂ͂̌_񏑂ɓӂKv܂B -LicenseAccepted=ӂ(&A) -LicenseNotAccepted=ӂȂ(&D) - -; *** "Information" wizard pages -WizardInfoBefore= -InfoBeforeLabel=sOɈȉ̏dvȏǂ݂B -InfoBeforeClickLabel=ZbgAbv𑱍sɂ́uցvNbNĂB -WizardInfoAfter= -InfoAfterLabel=sOɈȉ̏dvȏǂ݂B -InfoAfterClickLabel=ZbgAbv𑱍sɂ́uցvNbNĂB - -; *** "User Information" wizard page -WizardUserInfo=[U[ -UserInfoDesc=[U[͂ĂB -UserInfoName=[U[(&U): -UserInfoOrg=gD(&O): -UserInfoSerial=VAԍ(&S): -UserInfoNameRequired=[U[͂ĂB - -; *** "Select Destination Location" wizard page -WizardSelectDir=CXg[̎w -SelectDirDesc=[name] ̃CXg[w肵ĂB -SelectDirLabel3=[name] CXg[tH_w肵āAuցvNbNĂB -SelectDirBrowseLabel=ɂ́uցvNbNĂBʂ̃tH_[Iɂ́uQƁvNbNĂB -DiskSpaceMBLabel=̃vO͍Œ [mb] MB ̃fBXN󂫗̈KvƂ܂B -CannotInstallToNetworkDrive=lbg[NhCuɃCXg[邱Ƃ͂ł܂B -CannotInstallToUNCPath=UNC pXɃCXg[邱Ƃ͂ł܂B -InvalidPath=hCu܂ފSȃpX͂ĂB%n%nFC:\APP%n%n܂ UNC `̃pX͂ĂB%n%nF\\server\share -InvalidDrive=w肵hCu܂ UNC pX‚ȂANZXł܂Bʂ̃pXw肵ĂB -DiskSpaceWarningTitle=fBXN󂫗̈̕s -DiskSpaceWarning=CXg[ɂ͍Œ %1 KB ̃fBXN󂫗̈悪KvłAw肳ꂽhCuɂ %2 KB ̋󂫗̈悵܂B%n%n̂܂ܑs܂H -DirNameTooLong=hCu܂̓pX߂܂B -InvalidDirName=tH_[łB -BadDirName32=ȉ̕܂ރtH_[͎wł܂B:%n%n%1 -DirExistsTitle=̃tH_[ -DirExists=tH_[ %n%n%1%n%nɑ݂܂B̂܂܂̃tH_[փCXg[܂H -DirDoesntExistTitle=tH_[‚܂B -DirDoesntExist=tH_[ %n%n%1%n%n‚܂BVtH_[쐬܂H - -; *** "Select Components" wizard page -WizardSelectComponents=R|[lg̑I -SelectComponentsDesc=CXg[R|[lgIĂB -SelectComponentsLabel2=CXg[R|[lgIĂBCXg[Kv̂ȂR|[lg̓`FbNOĂBsɂ́uցvNbNĂB -FullInstallation=tCXg[ -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=RpNgCXg[ -CustomInstallation=JX^CXg[ -NoUninstallWarningTitle=̃R|[lg -NoUninstallWarning=ZbgAbv͈ȉ̃R|[lgɃCXg[Ă邱Ƃo܂B%n%n%1%n%ñR|[lg̑IĂACXg[͂܂B%n%n̂܂ܑs܂H -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=݂̑I͍Œ [mb] MB ̃fBXN󂫗̈KvƂ܂B - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=lj^XN̑I -SelectTasksDesc=slj^XNIĂB -SelectTasksLabel2=[name] CXg[Ɏslj^XNIāAuցvNbNĂB - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=vOO[v̎w -SelectStartMenuFolderDesc=vOACR쐬ꏊw肵ĂB -SelectStartMenuFolderLabel3=ZbgAbv̓X^[gj[ɃvÕV[gJbg쐬܂B -SelectStartMenuFolderBrowseLabel=ɂ́uցvNbNĂBႤfBNgIɂ́uQƁvNbNĂB -MustEnterGroupName=O[vw肵ĂB -GroupNameTooLong=tH_[܂̓pX߂܂B -InvalidGroupName=O[vłB -BadGroupName=ȉ̕܂ރO[v͎wł܂B:%n%n%1 -NoProgramGroupCheck2=vOO[v쐬Ȃ(&D) - -; *** "Ready to Install" wizard page -WizardReady=CXg[ -ReadyLabel1=gp̃Rs[^ [name] CXg[鏀ł܂B -ReadyLabel2a=CXg[𑱍sɂ́uCXg[vAݒ̊mFύXsɂ́u߂vNbNĂB -ReadyLabel2b=CXg[𑱍sɂ́uCXg[vNbNĂB -ReadyMemoUserInfo=[U[: -ReadyMemoDir=CXg[: -ReadyMemoType=ZbgAbv̎: -ReadyMemoComponents=IR|[lg: -ReadyMemoGroup=vOO[v: -ReadyMemoTasks=lj^XNꗗ: - -; *** "Preparing to Install" wizard page -WizardPreparing=CXg[ -PreparingDesc=gp̃Rs[^[ [name] CXg[鏀Ă܂B -PreviousInstallNotCompleted=OsAvP[ṼCXg[܂͍폜Ă܂Bɂ̓Rs[^[ċNKv܂B%n%n[name] ̃CXg[邽߂ɂ́AċNɂxZbgAbvsĂB -CannotContinue=ZbgAbv𑱍sł܂BuLZvNbNăZbgAbvIĂB -ApplicationsFound=ȉ̃AvP[VZbgAbvɕKvȃt@CgpĂ܂BZbgAbvɎIɃAvP[VI邱Ƃ𐄏܂B -ApplicationsFound2=ȉ̃AvP[VZbgAbvɕKvȃt@CgpĂ܂BZbgAbvɎIɃAvP[VI邱Ƃ𐄏܂BCXg[̊AZbgAbv̓AvP[V̍ċN݂܂B -CloseApplications=IɃAvP[VI(&A) -DontCloseApplications=AvP[VIȂ(&D) -ErrorCloseApplications=ZbgAbvׂ͂ẴAvP[VIɏI邱Ƃł܂łBZbgAbv𑱍sOɁAXV̕Kvȃt@CgpĂ邷ׂẴAvP[VI邱Ƃ𐄏܂B - -; *** "Installing" wizard page -WizardInstalling=CXg[ -InstallingLabel=gp̃Rs[^[ [name] CXg[Ă܂B΂炭҂B - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=[name] ZbgAbvEBU[h̊ -FinishedLabelNoIcons=gp̃Rs[^[ [name] ZbgAbv܂B -FinishedLabel=gp̃Rs[^[ [name] ZbgAbv܂BAvP[Vsɂ̓CXg[ꂽACRIĂB -ClickFinish=ZbgAbvIɂ́uvNbNĂB -FinishedRestartLabel=[name] ̃CXg[邽߂ɂ́ARs[^[ċNKv܂BɍċN܂H -FinishedRestartMessage=[name] ̃CXg[邽߂ɂ́ARs[^[ċNKv܂B%n%nɍċN܂H -ShowReadmeCheck=README t@C\B -YesRadio=ɍċN(&Y) -NoRadio=Ŏ蓮ōċN(&N) -; used for example as 'Run MyProg.exe' -RunEntryExec=%1 ̎s -; used for example as 'View Readme.txt' -RunEntryShellExec=%1 ̕\ - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=fBXN̑} -SelectDiskLabel2=fBXN %1 }AuOKvNbNĂB%n%ñfBXÑt@Cɕ\ĂtH_[ȊȌꏊɂꍇ́ApX͂邩uQƁv{^NbNĂB -PathLabel=pX(&P): -FileNotInDir2=t@C %1 %2 Ɍ‚܂BfBXN}邩Aʂ̃tH_[w肵ĂB -SelectDirectoryLabel=̃fBXN̂ꏊw肵ĂB - -; *** Installation phase messages -SetupAborted=ZbgAbv͊Ă܂B%n%nĂAxZbgAbvsĂB -EntryAbortRetryIgnore=xȂɂ́uĎsvAG[𖳎đsɂ́uvACXg[𒆎~ɂ́u~vNbNĂB - -; *** Installation status messages -StatusClosingApplications=AvP[VIĂ܂... -StatusCreateDirs=tH_[쐬Ă܂... -StatusExtractFiles=t@CWJĂ܂... -StatusCreateIcons=V|gJbg쐬Ă܂... -StatusCreateIniEntries=INIt@Cݒ肵Ă܂... -StatusCreateRegistryEntries=WXgݒ肵Ă܂... -StatusRegisterFiles=t@Co^Ă܂... -StatusSavingUninstall=ACXg[ۑĂ܂... -StatusRunProgram=CXg[Ă܂... -StatusRestartingApplications=AvP[VċNĂ܂... -StatusRollback=ύXɖ߂Ă܂... - -; *** Misc. errors -ErrorInternal2=G[: %1 -ErrorFunctionFailedNoCode=%1 G[ -ErrorFunctionFailed=%1 G[: R[h %2 -ErrorFunctionFailedWithMessage=%1 G[: R[h %2.%n%3 -ErrorExecutingProgram=t@CsG[:%n%1 - -; *** Registry errors -ErrorRegOpenKey=WXgL[I[vG[:%n%1\%2 -ErrorRegCreateKey=WXgL[쐬G[:%n%1\%2 -ErrorRegWriteKey=WXgL[݃G[:%n%1\%2 - -; *** INI errors -ErrorIniEntry=INIt@CGg쐬G[: t@C %1 - -; *** File copying errors -FileAbortRetryIgnore=xȂɂ́uĎsvÃt@CXLbvđsɂ́uvi܂jACXg[𒆎~ɂ́u~vNbNĂB -FileAbortRetryIgnore2=xȂɂ́uĎsvÃt@CXLbvđsɂ́uvi܂jACXg[𒆎~ɂ́u~vNbNĂB -SourceIsCorrupted=Rs[̃t@CĂ܂B -SourceDoesntExist=Rs[̃t@C %1 ‚܂B -ExistingFileReadOnly=̃t@C͓ǂݎpłB%n%nǂݎpĂxȂɂ́uĎsvÃt@CXLbvđsɂ́uvACXg[𒆎~ɂ́u~vNbNĂB -ErrorReadingExistingDest=̃t@CǂݍݒɃG[܂B: -FileExists=t@C͊ɑ݂܂B%n%n㏑܂H -ExistingFileNewer=CXg[悤ƂĂt@CVt@C݂܂B̃t@CcƂ߂܂B%n%ñt@Cc܂B -ErrorChangingAttr=t@C̑ύXɃG[܂B: -ErrorCreatingTemp=Rs[̃tH_Ƀt@C쐬ɃG[܂B: -ErrorReadingSource=Rs[̃t@CǂݍݒɃG[܂B: -ErrorCopying=t@CRs[ɃG[܂B: -ErrorReplacingExistingFile=t@CuɃG[܂B: -ErrorRestartReplace=uĊJɃG[܂B: -ErrorRenamingTemp=Rs[tH_̃t@CύXɃG[܂B: -ErrorRegisterServer=DLL/OCX̓o^Ɏs܂B: %1 -ErrorRegSvr32Failed=RegSvr32̓G[R[h %1 ɂ莸s܂B -ErrorRegisterTypeLib=^CvCuւ̓o^Ɏs܂B: %1 - -; *** Post-installation errors -ErrorOpeningReadme=README t@C̃I[vɎs܂B -ErrorRestartingComputer=Rs[^[̍ċNɎs܂B蓮ōċNĂB - -; *** Uninstaller messages -UninstallNotFound=t@C %1 ‚܂BACXg[sł܂B -UninstallOpenError=t@C %1 J邱Ƃł܂BACXg[sł܂B -UninstallUnsupportedVer=ACXg[Ot@C %1 ́Ão[W̃ACXg[vOFłȂ`łBACXg[sł܂B -UninstallUnknownEntry=ACXg[Oɕs̃Gg %1 ‚܂B -ConfirmUninstall=%1 Ƃ̊֘AR|[lgׂč폜܂B낵łH -UninstallOnlyOnWin64=̃vO64-bitWindowsł̂݃ACXg[邱Ƃł܂B -OnlyAdminCanUninstall=ACXg[邽߂ɂ͊ǗҌKvłB -UninstallStatusLabel=gp̃Rs[^[ %1 폜Ă܂B΂炭҂B -UninstalledAll=%1 ͂gp̃Rs[^[琳ɍ폜܂B -UninstalledMost=%1 ̃ACXg[܂B%n%n‚̍ڂ폜ł܂łB蓮ō폜ĂB -UninstalledAndNeedsRestart=%1 ̍폜邽߂ɂ́ARs[^[ċNKv܂BɍċN܂H -UninstallDataCorrupted=t@C "%1" Ă܂BACXg[sł܂B - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Lt@C̍폜 -ConfirmDeleteSharedFile2=VXeŁA̋Lt@C͂ǂ̃vOłgpĂ܂B̋Lt@C폜܂H%n%ñvO܂̃t@CgpꍇA폜ƃvO삵ȂȂ鋰ꂪ܂B܂młȂꍇ́uvIĂBVXeɃt@CcĂNƂ͂܂B -SharedFileNameLabel=t@C: -SharedFileLocationLabel=ꏊ: -WizardUninstalling=ACXg[ -StatusUninstalling=%1 ACXg[Ă܂... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=%1 CXg[łB -ShutdownBlockReasonUninstallingApp=%1 ACXg[łB - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 o[W %2 -AdditionalIcons=ACRlj: -CreateDesktopIcon=fXNgbvɃACR쐬(&D) -CreateQuickLaunchIcon=NCbNNACR쐬(&Q) -ProgramOnTheWeb=%1 on the Web -UninstallProgram=%1 ACXg[ -LaunchProgram=%1 s -AssocFileExtension=t@Cgq %2 %1 ֘At܂B -AssocingFileExtension=t@Cgq %2 %1 ֘AtĂ܂... -AutoStartProgramGroupDescription=X^[gAbv: -AutoStartProgram=%1 IɊJn -AddonHostProgramNotFound=IꂽtH_[ %1 ‚܂łB%n%n̂܂ܑs܂H \ No newline at end of file diff --git a/Greenshot/tools/innosetup/Languages/Latvian.isl b/Greenshot/tools/innosetup/Languages/Latvian.isl deleted file mode 100644 index cd99b34cf..000000000 --- a/Greenshot/tools/innosetup/Languages/Latvian.isl +++ /dev/null @@ -1,346 +0,0 @@ -;Agris Ausejs -;****************************************************** -; *** *** -; *** Inno Setup version 5.5.1+ Latvian messages *** -; *** *** -; *** Original Author: *** -; *** *** -; *** Agris Ausejs (oby2005@gmail.com) *** -; *** *** -; *** 02/22/2008 *** -; ****************************************************** -; -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/is3rdparty.php -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Latviski -LanguageID=$0426 -LanguageCodePage=1257 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Uzstdana -SetupWindowTitle=Uzstdana - %1 -UninstallAppTitle=Atinstalcija -UninstallAppFullTitle=%1 Atinstalcija - -; *** Misc. common -InformationTitle=Informcija -ConfirmTitle=Apstiprint -ErrorTitle=Kda - -; *** SetupLdr messages -SetupLdrStartupMessage=Tiks uzstdta programma %1. Vai vlaties turpint? -LdrCannotCreateTemp=Neiespjami izveidot pagaidu datnes. Uzstdana prtraukta -LdrCannotExecTemp=Neiespjami palaist datni no pagaidu mapes. Uzstdana prtraukta - -; *** Startup error messages -LastErrorMessage=%1.%n%nKda %2: %3 -SetupFileMissing=Datne %1 nav atrodama instalcijas map. Ldzu, izlabojiet kdu vai iegdjieties jaunu programmas kopiju. -SetupFileCorrupt=Uzstdms datnes ir sabojtas. Ldzu, iegdjieties jaunu programmas kopiju. -SetupFileCorruptOrWrongVer=Uzstdms datnes ir bojtas vai nav savienojamas ar o Uzstdanas programmu. Ldzu, izlabojiet o kdu vai iegdjieties jaunu programmas kopiju. -InvalidParameter=Nedergs parametrs tika pieemts uz komandrindas:%n%n%1 -SetupAlreadyRunning=Uzstdana jau darbojas. -WindowsVersionNotSupported= programma neatbalsta Windows versiju dator darbojas. -WindowsServicePackRequired= programma pieprasa %1 servisa pakotnes %2 vai jaunka. -NotOnThisPlatform=o programmu nevar palaist uz %1. -OnlyOnThisPlatform= programma darbojas uz %1. -OnlyOnTheseArchitectures=o programmu var uzstdt tikai uz dm Windows versijm:%n%n%1 -MissingWOW64APIs=Palaik palaist Windows versija neatbalsta 64-bitu instalciju. Lai izlabotu o kdu, uzinstaljiet Service Pack %1. -WinVersionTooLowError= programma pieprasa %1 versiju %2 vai jaunku. -WinVersionTooHighError=o programmu nevar uzstdt uz %1 versijas %2 vai jaunkas. -AdminPrivilegesRequired=Jums ir jbt adminstratoram, lai vartu uzskt instalciju. -PowerUserPrivilegesRequired=Jums ir jbt administratoram vai pilnvarotam lietotjam, lai uzstdtu o programmu. -SetupAppRunningError=Uzstdana ir atkljusi, ka %1 palaik darbojas.%n%nLdzu, aizveriet visas programmas un spiediet "Ok" vai "Atcelt", lai izietu. -UninstallAppRunningError=Atinstalcija ir atkljusi ka %1 palaik darbojas.%n%nLdzu, aizveriet visas programmas un spiediet "Ok", lai turpintu, vai "Atcelt", lai izietu. - -; *** Misc. errors -ErrorCreatingDir=Uzstdan ir neiespjami izveidot mapi "%1" -ErrorTooManyFilesInDir=Neiespjami izveidot datnes map "%1", jo t satur prk daudz datu - -; *** Setup common messages -ExitSetupTitle=Iziet no Uzstdanas -ExitSetupMessage=Uzstdana nav pabeigta. Ja Js tagad iziesiet, tad programma netiks uzinstalta.%n%nJums bs atkal jpalai Uzstdana, lai pabeigtu programmas instalciju.%n%nIziet no Uzstdanas? -AboutSetupMenuItem=&Par Uzstdanu... -AboutSetupTitle=Par Uzstdanu -AboutSetupMessage=%1 versija %2%n%3%n%n%1 mjas lapa:%n%4 -AboutSetupNote= -TranslatorNote= - -; *** Buttons -ButtonBack=< &Atpaka -ButtonNext=&Tlk > -ButtonInstall=&Uzstdt -ButtonOK=OK -ButtonCancel=Atcelt -ButtonYes=&J -ButtonYesToAll=J &Visam -ButtonNo=&N -ButtonNoToAll=N V&isam -ButtonFinish=&Pabeigt -ButtonBrowse=P&rlkot... -ButtonWizardBrowse=Prl&kot... -ButtonNewFolder=I&zveidot jaunu mapi - -; *** "Select Language" dialog messages -SelectLanguageTitle=Izvlieties Uzstdanas valodu -SelectLanguageLabel=Izvlieties valodu, kur notiks Uzstdana: - -; *** Common wizard text -ClickNext=Spiediet "Tlk", lai turpintu, vai "Atcelt", lai izietu no Uzstdanas. -BeveledLabel= -BrowseDialogTitle=Prlkot mapi -BrowseDialogLabel=Izvlieties mapi no saraksta, tad spiediet "Ok". -NewFolderName=Jauna mape - -; *** "Welcome" wizard page -WelcomeLabel1=Laipni ldzam [name] Uzstdan -WelcomeLabel2=is uzstds [name/ver] uz Jsu datora.%n%nVlams aizvrt visas programmas pirms turpinanas. - -; *** "Password" wizard page -WizardPassword=Parole -PasswordLabel1= instalcija ir aizsargta ar paroli. -PasswordLabel3=Ldzu, ievadiet paroli, tad spiediet "Tlk", lai turpintu. Parole ir reistrjutga. -PasswordEditLabel=&Parole: -IncorrectPassword=Parole, ko Js ievadjt, ir nepareiza. Ldzu, miniet vlreiz. - -; *** "License Agreement" wizard page -WizardLicense=Lgums -LicenseLabel=Ldzu, izlasiet sekojoo informciju, pirms turpint. -LicenseLabel3=Ldzu, izlasiet Lgumu. Jums ir japstiprina Lgums, lai turpintu instalciju. -LicenseAccepted=Es &piekrtu lgumam -LicenseNotAccepted=Es &nepiekrtu lgumam - -; *** "Information" wizard pages -WizardInfoBefore=Informcija -InfoBeforeLabel=Ldzu, izlasiet o informciju. -InfoBeforeClickLabel=Kad esat gatavs turpint instalciju, spiediet "Tlk". -WizardInfoAfter=Informcija -InfoAfterLabel=Ldzu izlasiet sekojoo informciju. -InfoAfterClickLabel=Kad esat gatavs turpint instalciju, spiediet "Tlk". - -; *** "User Information" wizard page -WizardUserInfo=Lietotja informcija -UserInfoDesc=Ldzu, ievadiet savu informciju. -UserInfoName=&Lietotja vrds: -UserInfoOrg=&Organizcija: -UserInfoSerial=&Serilais numurs: -UserInfoNameRequired=Jums ir jievada savs vrds. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Izvlieties mapi, uz kuru tiks stti dati -SelectDirDesc=Kur [name] tiks instalts? -SelectDirLabel3=[name] datnes tiks instaltas nordtaj map. -SelectDirBrowseLabel=Lai turpintu, spiediet "Tlk". Ja vlaties nordt citu mapi, spiediet "Prlkot". -DiskSpaceMBLabel=Ir nepiecieami brvi [mb] MB uz ciet diska. -CannotInstallToNetworkDrive=Iestatana nevar instalt ar tkla disku. -CannotInstallToUNCPath=Iestatana nevar uzstdt uz UNC ceu. -InvalidPath=Jums ir jnorda pilna instalcijas adrese, piemrs:%n%nC:\APP%n%nvai UNC adrese:%n%n\\server\share -InvalidDrive=Ierce UNC, kuru Js izvljties, nepastv vai ar nav pieejama. Ldzu, izvlieties citu. -DiskSpaceWarningTitle=Nepietiek vietas uz diska -DiskSpaceWarning=Instalcijai ir nepiecieami vismaz %1 KB brvs vietas uz diska, bet pieejami ir tikai %2 KB.%n%nVai vlaties turpint? -DirNameTooLong=Mapes nosaukums vai adrese ir prk gara. -InvalidDirName=Mapes nosaukums nav dergs. -BadDirName32=Mapes nosaukum nedrkst bt di simboli:%n%n%1 -DirExistsTitle=Mape jau pastv -DirExists=Mape:%n%n%1%n%njau pastv. Vai vienalga vlaties turpint? -DirDoesntExistTitle=Mape nepastv -DirDoesntExist=Mape:%n%n%1%n%ndoes nepastv. Vai vlaties izveidot mapi? - -; *** "Select Components" wizard page -WizardSelectComponents=Izvlieties sastvdaas -SelectComponentsDesc=Kurus komponentus vlaties uzstdt? -SelectComponentsLabel2=Izvlieties komponentus, kurus vlaties uzstdt. Spiediet "Tlk", lai turpintu. -FullInstallation=Pilna Uzstdana -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompakta Uzstdana -CustomInstallation=Izveidot Uzstdanu -NoUninstallWarningTitle=Komponenti jau pastv -NoUninstallWarning=Uzstdana ir atkljusi ka di faili jau ir uzstdti:%n%n%1%n%nAtiestatiet os komponentus.%n%nVai vlaties turpint? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Palaik izvltie komponenti aizem [mb] MB uz ciet diska. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Papilduzdevumu izvlne -SelectTasksDesc=Kurus papilduzdevumus vajadztu veikt? -SelectTasksLabel2=Izvlieties, kdi papilduzdevumi tiks veikti [name] Uzstdanas laik, tad spiediet "Tlk". - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Izvlieties Start Menu mapi -SelectStartMenuFolderDesc=Kur Uzstdanas programmai vajadztu likt sinjumikonas? -SelectStartMenuFolderLabel3=Uzstdana izveidos sinjumikonas Start Menu map. -SelectStartMenuFolderBrowseLabel=Lai turpintu, spiediet "Tlk". Ja vlaties nordt citu mapi, spiediet "Prlkot". -MustEnterGroupName=Jums ir jnorda mape. -GroupNameTooLong=Mapes nosaukums ir prk gar. -InvalidGroupName=Mape nav derga. -BadGroupName=Mapes nosaukums satur kdu no iem simboliem:%n%n%1 -NoProgramGroupCheck2=&Neizveidot Start Menu mapi - -; *** "Ready to Install" wizard page -WizardReady=Gatavs instalcijai -ReadyLabel1=Uzstdana ir gatava instalt [name] uz Jsu datora. -ReadyLabel2a=Spiediet "Uzstdt", lai sktu instalciju, vai spiediet Atpaka, lai izmaintu parametrus. -ReadyLabel2b=Spiediet "Uzstdt", lai sktu instalciju. -ReadyMemoUserInfo=Lietotja informcija: -ReadyMemoDir=Galamris: -ReadyMemoType=Uzstdanas tips: -ReadyMemoComponents=Izvltie komponenti: -ReadyMemoGroup=Start Menu mape: -ReadyMemoTasks=Papilduzdevumi: - -; *** "Preparing to Install" wizard page -WizardPreparing=Gatavoties instalcijai -PreparingDesc=Uzstdana ir gatava instalt [name] uz Jsu datora. -PreviousInstallNotCompleted=Instalcija/noemana iepriekjai programmai nav pabeigta. Jums ir jprstart dators, lai pabeigtu instalciju.%n%nPc prstartanas palaidiet uzstdanu no jauna, lai pabeigtu uzstdt [name]. -CannotContinue=Uzstdanu nevar turpint. Ldzu, spiediet "Atcelt", lai izietu. -ApplicationsFound=das lietojumprogrammas izmanto failus, kas ir jatjaunina ar Setup. Tas ir ieteicams, ka js aujat Setup automtiski aizvrt os pieteikumus. -ApplicationsFound2=das lietojumprogrammas izmanto failus, kas ir jatjaunina ar Setup. Tas ir ieteicams, ka js aujat Setup automtiski aizvrt os pieteikumus. Pc uzstdana ir pabeigta, Setup mins atskt pieteikumus. -CloseApplications=&Automtiski aizvrtu programmas -DontCloseApplications=&Nav aizvrtu programmas - -; *** "Installing" wizard page -WizardInstalling=Instalcija -InstallingLabel=Ldzu, uzgaidiet, kamr [name] tiks uzstdts uz Jsu datora. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Pabeigta [name] Uzstdana -FinishedLabelNoIcons=Uzstdana pabeigta. -FinishedLabel=Uzstdana pabeigta. Programmu var palaist, uzklikinot uz izveidotajm ikonm. -ClickFinish=Spiediet "Pabeigt", lai aizvrtu Uzstdanu. -FinishedRestartLabel=Lai pabeigtu [name] uzstdanu, nepiecieams prstartt Jsu datoru. Vai vlaties to dart tagad? -FinishedRestartMessage=Lai pabeigtu [name] uzstdanu, nepiecieams prstartt Jsu datoru.%n%nVai vlaties to dart tagad? -ShowReadmeCheck=J, vlos apskatt README failu -YesRadio=&J, prstartt datoru tagad -NoRadio=&N, datoru prstartu vlk -; used for example as 'Run MyProg.exe' -RunEntryExec=Run %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=View %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Uzstdanai ir nepiecieams nkamais disks -SelectDiskLabel2=Ldzu, ielieciet %1 disku un spiediet "Ok".%n%nJa datne ir atrodama uz paa diska kd cit map, nordiet ts atraans vietu vai spiediet "Prlkot", lai to nordtu. -PathLabel=&Ce: -FileNotInDir2=Datne "%1" neatrodas "%2". Ldzu, ielieciet pareizo disku vai nordiet pareizo mapi. -SelectDirectoryLabel=Ldzu, nordiet nkam diska atraans vietu. - -; *** Installation phase messages -SetupAborted=Uzstdana netika pabeigta.%n%nLdzu, izlabojiet kdu un palaidiet Uzstdanu no jauna. -EntryAbortRetryIgnore=Spiediet "Atkrtot", lai mintu vlreiz, vai "Ignort", lai turpintu, vai "Prtraukt", lai beigtu instalciju. - -; *** Installation status messages -StatusClosingApplications=Noslguma pieteikumi... -StatusCreateDirs=Mapju izveidoana... -StatusExtractFiles=Datu kopana... -StatusCreateIcons=sinjumikonu izveidoana... -StatusCreateIniEntries=Izveido INI ierakstu... -StatusCreateRegistryEntries=Izveido reistra ierakstus... -StatusRegisterFiles=Reistr datnes... -StatusSavingUninstall=Saglab atinstalanas datus... -StatusRunProgram=Pabeidz instalciju... -StatusRestartingApplications=Restartana pieteikumi... -StatusRollback=Izveido izmaias... - -; *** Misc. errors -ErrorInternal2=Iekja kda: %1 -ErrorFunctionFailedNoCode=%1 cieta neveiksmi -ErrorFunctionFailed=%1 cieta neveiksmi; kods %2 -ErrorFunctionFailedWithMessage=%1 cieta neveiksmi; kods %2.%n%3 -ErrorExecutingProgram=Neiespjami palaist failu:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Kda, atverot reistra atslgu:%n%1\%2 -ErrorRegCreateKey=Kda, izveidojot reistra atslgu:%n%1\%2 -ErrorRegWriteKey=Kda, rakstot reistra atslgu:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Kda, izveidojot INI ieraksta datni "%1". - -; *** File copying errors -FileAbortRetryIgnore=Spiediet "Atkrtot", lai mintu vlreiz, "Ignort", lai izlaistu datni (nav ieteicams), vai "Prtraukt", lai beigtu instalciju. -FileAbortRetryIgnore2=Spiediet "Atkrtot", lai mintu vlreiz, "Ignort", lai turpintu (nav ieteicams), vai "Prtraukt", lai beigtu instalciju. -SourceIsCorrupted=Datnes avots ir bojts -SourceDoesntExist=Datnes avots "%1" nepastv -ExistingFileReadOnly=Pastvo datne ir izveidota k read-only.%n%nSpiediet "Atkrtot", lai noemtu read-only pabu un mintu vlreiz, "Ignort", lai izlaistu datni, vai "Prtraukt", lai beigtu instalciju. -ErrorReadingExistingDest=Kda, nolasot pastvoo datni: -FileExists=Datne jau pastv.%n%nVai vlaties, lai Uzstdana to prraksta? -ExistingFileNewer=Pastvo datne ir jaunka par to, kuru nepiecieams uzstdt. Vlams atstt jau pastvoo datni.%n%nVai vlaties to paturt? -ErrorChangingAttr=Radusies kda, minot nomaint datnes pabu: -ErrorCreatingTemp=Radusies kda, izveidojot datni galamra map: -ErrorReadingSource=Radusies kda, nolasot datni: -ErrorCopying=Radusies kda, prkopjot datni: -ErrorReplacingExistingFile=Radusies kda, prrakstot jau pastvoo datni: -ErrorRestartReplace=Atkrtota aizstana cietusi neveiksmi: -ErrorRenamingTemp=Radusies kda, nomainot nosaukumu datnei galamra map: -ErrorRegisterServer=Neiespjami reistrt DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 neizdevs ar izejas kodu %1 -ErrorRegisterTypeLib=Neiespjami reistrt tipa bibliotku: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Radusies kda, atverot README datni. -ErrorRestartingComputer=Uzstdana nevar prstartt datoru. Ldzu, izdariet to manuli. - -; *** Uninstaller messages -UninstallNotFound=Datne "%1" nepastv. Nevar atinstalt. -UninstallOpenError=Datni "%1" nevar atvrt. Nevar atinstalt -UninstallUnsupportedVer=Atinstalanas datne "%1" nav atpazstama ai atinstalanas programmai. Nevar atinstalt -UninstallUnknownEntry=Nezinms ieraksts (%1) izveidoja sadursmi ar atinstalciju -ConfirmUninstall=Vai esat prliecints, ka vlaties pilnb noemt %1 un visus t komponentus? -UninstallOnlyOnWin64=o instalciju var noemt tikai ar 64-bitu Windows. -OnlyAdminCanUninstall=Atinstalciju var veikt tikai lietotjs ar Adminstratora privilijm. -UninstallStatusLabel=Ldzu uzgaidiet, kamr %1 tiek noemts no Jsu datora. -UninstalledAll=%1 tika veiksmgi noemts no Jsu datora. -UninstalledMost=%1 atinstalcija pabeigta.%n%nDaus elementus nevarja noemt. Tos var noemt manuli. -UninstalledAndNeedsRestart=Lai pabeigtu atinstalciju %1, Jsu dators jprstart.%n%nVai vlaties to dart tagad? -UninstallDataCorrupted="%1" datne ir bojta. Nevar atinstalt - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Noemt kopgs datnes? -ConfirmDeleteSharedFile2=Sistma ir secinjusi, ka s koplietoanas datnes vairs netiks lietotas. Vai vlaties ts noemt?%n%nJa kda cita programma izmanto s datnes, tad programma var strdt nekorekti. Ja neesat dros, izvlieties "N". Atstjot s datnes, Jsu datoram netiks nodarti nekdi bojjumi. -SharedFileNameLabel=Faila nosaukums: -SharedFileLocationLabel=Atraans vieta: -WizardUninstalling=Atinstalanas Statuss -StatusUninstalling=Atinstal %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Instalana %1. -ShutdownBlockReasonUninstallingApp=Atinstal %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versija %2 -AdditionalIcons=Papildu ikonas: -CreateDesktopIcon=Izveidot &darbvisrmas ikonu -CreateQuickLaunchIcon=Izveidot &Quick Launch ikonu -ProgramOnTheWeb=%1 Internt -UninstallProgram=Atinstalt %1 -LaunchProgram=Palaist %1 -AssocFileExtension=&Apvienot %1 ar %2 faila paplainjumu -AssocingFileExtension=Apvienoana %1 ar %2 faila paplainjumu... -AutoStartProgramGroupDescription=starta: -AutoStartProgram=Automtiski skt %1 -AddonHostProgramNotFound=%1 nevar atrasties map js izvljties.%n%nVai vlaties turpint? diff --git a/Greenshot/tools/innosetup/Languages/Nepali.islu b/Greenshot/tools/innosetup/Languages/Nepali.islu deleted file mode 100644 index 34d823654..000000000 --- a/Greenshot/tools/innosetup/Languages/Nepali.islu +++ /dev/null @@ -1,337 +0,0 @@ -; *** Inno Setup version 5.5.3+ Nepali messages *** -; Translated by Him Prasad Gautam [ drishtibachak@gmail.com ] -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. - -LanguageName=<0928><0947><092a><093e><0932><0940> -LanguageID=$0461 -LanguageCodePage=0 - -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -DialogFontSize=10 -;WelcomeFontName= -WelcomeFontSize=15 -;TitleFontName= -TitleFontSize=35 -;CopyrightFontName= -CopyrightFontSize=9 - -[Messages] - -; *** Application titles -SetupAppTitle=मैतालुको प्रवेश -SetupWindowTitle=मैतालु - %1 -UninstallAppTitle=निष्कासन -UninstallAppFullTitle=%1 को निष्कासन - -; *** Misc. common -InformationTitle=सूचना -ConfirmTitle=यकिन -ErrorTitle=त्रुटि - -; *** SetupLdr messages -SetupLdrStartupMessage=यसले %1लाई यो कल्पयन्त्रमा भित्र्याउँछ । के तपाइ यसलाई निरन्तरता दिन चाहनु हुन्छ? -LdrCannotCreateTemp=अस्ताइ फाइल सिर्जना गर्न नसकि एकोले स्थापकले भित्र्याउने कार्य गर्न सकेन । -LdrCannotExecTemp=अस्ताइ घर्रामा फाइललाई कार्यान्वयन गर्न नसकि एकोले स्थापकले भित्र्याउने कार्य गर्न सकेन । - -; *** Startup error messages -LastErrorMessage=%1.%n %n त्रुटि %2: %3 -SetupFileMissing=भित्रिने घर्राबाट फाइल %1 हरायो । कृपया समस्या हल गर्नु होस् वा कार्यक्रमबाटै नया फाइल हासिल गर्नु होला । -SetupFileCorrupt=स्थापक फाइल भ्रष्ट भयो । कृपया कार्यक्रमबाट नयाँ प्रति हासिल गर्नु होला । -SetupFileCorruptOrWrongVer=स्थापक फाइल भ्रष्ट भयो, अथवा यो हाल प्रयोगमा रहेको गृहको संस्करण सित मिल्न सकेन । कृपया समस्या हल गर्नु होस् अथवा अर्कै प्रति स्थापकको चाँजोपाँजो मिलाउनु होस् । -InvalidParameter=आदेश रेखामा अमान्य Parameter पठाइयो :%n %n %1 -SetupAlreadyRunning=स्थापकले भित्र्याउने कार्य पहिले देखि नै गर्दै छ । -WindowsVersionNotSupported=यो कार्यक्रमले तपाइको कल्पयन्त्रमा हाल भित्रिएको विन्डोज संस्करण सित मिलेर काम गर्न सक्दैन । -WindowsServicePackRequired=यो कार्यक्रमलाई %1 Service Pack %2 अथवा यस पछिका संस्करण चाहिन्छ । -NotOnThisPlatform=यो कार्यक्रम %1 मा चल्दैन । -OnlyOnThisPlatform=यो कार्यक्रम %1 मा मात्रै चल्छ । -OnlyOnTheseArchitectures=यो कार्यक्रम केवल निम्न उल्लिखित विन्डोज वास्तुकला नमुना संस्करणमा मात्रै भित्रिन सक्छ:%n %n %1 -MissingWOW64APIs=तपाइले हाल चलाएको विन्डोजमा 64-bit को कार्यक्रम भित्र्याउन स्थापकलाई चाहिने आवश्यक कार्यदक्षता समावेश भएको छैन । यो समस्या हल गर्न Service Pack %1 भित्र्याउनु होस् । -WinVersionTooLowError=यो कार्यक्रमलाई %1 संस्करण %2 अथवा यसभन्दा पछिल्लो संस्करण चाहिन्छ । -WinVersionTooHighError=यो कार्यक्रम %1 संस्करण %2 अथवा यस पछिका संस्करणमा भित्र्याउन सकिँदैन । -AdminPrivilegesRequired=यो कार्यक्रमलाई भित्र्याउन तपाइले प्रशासनिक हैसियत प्रयोग गरी विन्डो शुभारम्भ गर्नु पर्छ । -PowerUserPrivilegesRequired=यो कार्यक्रम भित्र्याउन तपाइले प्रशासक अथवा अधिकार प्राप्त सदस्यको हैसियतमा विन्डोज खोल्नु पर्ने हुन्छ । -SetupAppRunningError=स्थापकले %1 चालू रहेको पता लगायो । %n %n कृपया सबैलाई बन्द गर्नु होस् । कार्य जारी राख्ने भए 'ठीक' टाँक र बहिर्गमन गर्ने भए 'रद्द गर' भन्ने टाँकलाई दबाउनु होला । -UninstallAppRunningError=निष्कासकले %1 चालू रहेको पता लगायो । %n %n कृपया सबैलाई बन्द गर्नु होस् । कार्य जारी राख्ने भए 'ठीक' टाँक र बहिर्गमन गर्ने भए 'रद्द गर' भन्ने टाँकलाई दबाउनु होला । - -; *** Misc. errors -ErrorCreatingDir=स्थापकले "%1" घर्रा सिर्जना गर्न सकेन । -ErrorTooManyFilesInDir=धेरै फाइल भएकोले "%1" घर्रामा फाइल सिर्जना गर्न सकिएन । - -; *** Setup common messages -ExitSetupTitle=स्थापकको बहिर्गमन -ExitSetupMessage=स्थापकले भित्र्याउने कार्य सकेको छैन । यदि बहिर्गमन गरेमा यो कार्यक्रम भित्रिने छैन । %n %n पछि अर्को समयमा तपाई भित्र्याउने कार्य गर्न सक्नु हुन्छ । %n स्थापकले अहिले सम्म गरेको काम त उल्टिन्छ नि!%n %n के मैतालु प्रवेशको कार्य स्थगित नै गर्ने हो? -AboutSetupMenuItem=&स्थापक सामाग्रीको बारेमा -AboutSetupTitle=स्थापकको बारेमा -AboutSetupMessage=%1 संस्करण %2%n %3%n %n %1 गृह पृष्ट:%n %4 -AboutSetupNote=यो स्थापक हिम प्रसाद गौतमले तयार पारेको हो । -TranslatorNote=नेपाली भाषामा पहिलो अनुवादको कार्य हिम प्रसाद गौतम < drishtibachak@gmail.com > ले गर्नु भएको हो र यसमा निरन्तरता पनि जारी राख्नु भएको छ । - -; *** Buttons -ButtonBack=&पछाडि फर्क -ButtonNext=&अगाडि जाउ -ButtonInstall=&भित्र्याउ -ButtonOK=ठीक -ButtonCancel=रद्द गर -ButtonYes=&हो -ButtonYesToAll=&सबैमा हो -ButtonNo=&होइन -ButtonNoToAll=&सबैमा होइन -ButtonFinish=&समाप्त -ButtonBrowse=&ऊ घार... -ButtonWizardBrowse=ऊ&घार त... -ButtonNewFolder=&नया थैली - -; *** "Select Language" dialog messages -SelectLanguageTitle=स्थापकको भाषाको चयन -SelectLanguageLabel=स्थापकले भित्र्याउँदा प्रयोग गरिने भाषा चयन गर्नु होस्: - -; *** Common wizard text -ClickNext=%n स्थापकले मैतालुलाई भित्र्याउनु पर्ने भए 'अगाडि जाउ' भन्ने टाँकलाई र भित्र्याउनु नपर्ने भए 'रद्द गर' भन्ने टाँकलाई दबाउनु होस् -BeveledLabel=%n समर्पण: मेरा श्रद्धेय बुबा स्वर्गीय इन्द्र प्रसाद गौतम प्रति सादर समर्पित । %n सौजन्य: हिम प्रसाद गौतम < drishtibachak@gmail.com > -BrowseDialogTitle=उघारने कार्य -BrowseDialogLabel=निम्न सूचीबाट थैली चयन गर्नु होस् र 'ठीक' भन्ने टाँकलाई दबाउनु होस् । -NewFolderName=नयाँ थैली - -; *** "Welcome" wizard page -WelcomeLabel1=%n [name] मैतालुको रूपमा भित्रिने समारोहमा तपाइलाई स्वागत छ । -WelcomeLabel2=%n यो स्थापकले [name/ver] लाई तपाइको कल्पयन्त्रमा भित्र्याउने छ । %n %n भित्र्याउने कार्य जारी राख्नु भन्दा पहिले खोलिएका सबै अनुप्रयोगहरूलाई बन्द गर्न सुझाव दिइन्छ । - -; *** "Password" wizard page -WizardPassword=पाल्सी शब्द -PasswordLabel1=यो स्थापकमा पाल्सी शब्द राखिएको छ । -PasswordLabel3=कार्य जारी राख्न पाल्सी शब्द उपलब्ध गराएर 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होला । पाल्सी शब्द वर्ण संवेदन सिल छ । -PasswordEditLabel=&गोप्यशब्द -IncorrectPassword=तपाइले लेखेको पाल्सी शब्द मिलेन । कृपया फेरी कोसिस गर्नु होस् । - -; *** "License Agreement" wizard page -WizardLicense=इजाजत मञ्जु रिनामा -LicenseLabel=कार्य निरन्तर राख्न कृपया तलको महत्त्वपूर्ण सूचना पढ्नु होस् । -LicenseLabel3=कृपया निम्न इजाजत राम्ररी पढ्नु होस् । स्थापकले भित्र्याउने कार्य सुरु गर्नु पूर्व तपाइले सम्झौताका सबै सर्तहरू अनिवार्य रूपमा मन्जुर गर्नु पर्ने नै हुन्छ । -LicenseAccepted=म उपरोक्त सम्झौता &मन्जुर गर्छु -LicenseNotAccepted=म उपरोक्त सम्झौता मन्जुर गर्दि&न - -; *** "Information" wizard pages -WizardInfoBefore=सूचना -InfoBeforeLabel=कार्य निरन्तर राख्न कृपया निम्न महत्त्वपूर्ण सूचना पढ्नु होस् ।%n -InfoBeforeClickLabel=स्थापकले भित्र्याउने कार्य तयार पारे पछि 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होस् । -WizardInfoAfter=सूचना -InfoAfterLabel=कृपया कार्य निरन्तर राख्नु अघि निम्न महत्त्वपूर्ण सूचना पढ्नु होस् । -InfoAfterClickLabel=स्थापकले भित्र्याउने कार्य तयार पारे पछि 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होस् । - -; *** "User Information" wizard page -WizardUserInfo=तपाइको चिनारी -UserInfoDesc=तपाइको बारेमा लेख्नु होस् । -UserInfoName=&तपाइको नाम -UserInfoOrg=&सङ्गठन -UserInfoSerial=&सङ्केत सङ्ख्या: -UserInfoNameRequired=यहाँ तपाइले आफ्नो नाम उल्लेख गर्नु पर्ने नै हुन्छ । - -; *** "Select Destination Location" wizard page -WizardSelectDir=वासस्थानको चयन गर्नु होस् -SelectDirDesc=[name] लाई कहाँ भित्र्याउने हो? -SelectDirLabel3=स्थापकले [name] लाई निम्न थैली मा भित्र्याई दिने छ । -SelectDirBrowseLabel=मैतालु प्रवेशको कार्य निरन्तरता राख्न 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होस् । यदि तपाइ भिन्दै थैलीको चयन गर्न चाहनु हुन्छ भने 'उघार' भन्ने टाँकलाई दबाउनु होला । -DiskSpaceMBLabel=कम्तीमा [mb] MB क्षमताको भकारी चाहिन्छ । -CannotInstallToNetworkDrive=सञ्जाल भकारीमा स्थापकले भित्र्याउन सकेन । -CannotInstallToUNCPath=स्थापकले UNC path मा भित्र्याउन सक्दैन । -InvalidPath=तपाइले भकारी अक्षर सहित पूरा बाटो लेख्नु नै पर्छ । जस्तै:%n %n C:\APP%n %n अथवा UNC बाटो %n %n \\server\share बनोटमा -InvalidDrive=तपाइले चयन गरेको भकारी छदै छैन अथवा यसमा केही राख्न मिल्दैन । कृपया अर्कै चयन गर्नु होस् । -DiskSpaceWarningTitle=भकारीमा चाहिने जति ठाउँ खाली छैन । -DiskSpaceWarning=स्थापकलाई कम्तीमा %1 KB खुल्ला ठाउँ चाहिन्छ । तर चयन गरिएको भकारीमा केवल %2 KB मात्र खालि ठाउँ छ । %n %n जे भए पनि कार्य जारी राख्ने हो? -DirNameTooLong=थैलीको नाम अथवा बाटो धेरै लाम भयो । -InvalidDirName=थैलीको नाम अमान्य छ । -BadDirName32=थैली का कुनै पनि नामहरू समावेश गर्न सकिँदैन । %n %n %1 -DirExistsTitle=थैली छ । -DirExists=थैली:%n %n %1%n %n पहिले देखिने छ । के तपाइ यही थैलीमा जसरी भए पनि भित्र्याउने चाहना राख्नु हुन्छ ? -DirDoesntExistTitle=थैली छदै छैन । -DirDoesntExist=थैली:%n %n %1%n %n छदै छैन । के तपाइ यो नाम गरेको नयाँ थैलीको सिर्जना गर्न चाहनु हुन्छ? - -; *** "Select Components" wizard page -WizardSelectComponents=सहकर्मीहरूको चयन गर्नु होस् । -SelectComponentsDesc=कुन चाही सहकर्मीलाई पनि भित्र्याउने हो? -SelectComponentsLabel2=भित्र्याउन चाहेको सहकर्मीलाई चयन गर्नु होस्, भित्र्याउन नचाहेको सहकर्मीलाई मेटाइ दिनु होस् । काम जारी राख्न तयार भए पछि 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होला । -FullInstallation=सर्वस्व भित्र्याउने -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=यथेष्ट भित्र्याउने -CustomInstallation=चाहे जति भित्र्याउने -NoUninstallWarningTitle=सहकर्मीहरू रहेछन् । -NoUninstallWarning=निम्न अनुसारका सहकर्मीहरू तपाइको कल्पयन्त्रमा पहिले नै भित्रिएको कुरा स्थापकले पता लगायो । %n %n %1%n %n यी सहकर्मीहरूलाई चयन नगरी निष्कासनको कार्य हुन सक्दैनन् । %n %n जे भए पनि तपाई कार्य जारी राख्न चाहनु हुन्छ? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=हालको चयनलाई कम्तीमा [mb] MB खालि स्थान चाहिन्छ । - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=अतिरिक्त कार्यको चयन गर्नु होस् -SelectTasksDesc=मैले कुन चाही अतिरिक्त कार्य सम्पादन गर्नु पर्ने हो? -SelectTasksLabel2=स्थापकले [name], लाई भित्र्याउने क्रममा यो कार्य पनि गरोस् भनि तपाइले इच्छा राखेको अतिरिक्त कार्यको चयन गरी 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होला । - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=सुरुवात सूची थैलीको चयन गर्नु होस् । -SelectStartMenuFolderDesc=स्थापकले छोटो बाटो कहाँ लेख्नु पर्ने हो? -SelectStartMenuFolderLabel3=स्थापकले कार्यक्रमको छोटो बाटो निम्न सुरुवात सूची थैलीमा गरेको छ । -SelectStartMenuFolderBrowseLabel=निरन्तरता राख्न 'अगाडि जाउ' भन्ने टाँकलाई दबाउनु होस्, यदी तपाइ अर्कै थैलीमा राख्न चाहनु हुन्छ भने, 'उघार' भन्ने टाँकलाई दबाउनु होला । -MustEnterGroupName=थैलीको नाम लेख्न अनिवार्य गरिएको छ । -GroupNameTooLong=थैलीको नाम अथवा बाटो धेरै नै लामो भयो । -InvalidGroupName=थैलीको नाम अमान्य छ । -BadGroupName=थैलीको नाममा निम्न वर्णहरू समावेश हुन सक्दैनन्:%n %n %1 -NoProgramGroupCheck2=&सुरुवात सूची थैली सिर्जना नगर है । - -; *** "Ready to Install" wizard page -WizardReady=अब भित्रिन तयार -ReadyLabel1=अब तपाइको कल्पयन्त्रमा [name] लाई भित्र्याउने कार्य सुरु गर्न स्थापक तयार छ । -ReadyLabel2a=यदि तपाइ तलको अनुकूलतामा समीक्षा वा परिवर्तन गर्न चाहनु हुन्छ भने 'पछाडि फर्क' भन्ने टाँक लाई दबाउनु होला । यही अनुकूलता ठीक छ जस्तो लाग्छ भने 'भित्र्याउ' भन्ने टाँकलाई दबाउनु होस् । -ReadyLabel2b=भित्रिने कार्य जारी राख्न 'भित्र्याउ' भन्ने टाँकलाई दबाउनु होस् -ReadyMemoUserInfo=उपभोक्ताको जानकारी: -ReadyMemoDir=गन्तव्य थैली: -ReadyMemoType=भित्रिने किसिम: -ReadyMemoComponents=चयन गरिएका सहकर्मीहरू: -ReadyMemoGroup=सुरुवात सूची थैली: -ReadyMemoTasks=अतिरिक्त कार्य: - -; *** "Preparing to Install" wizard page -WizardPreparing=भित्रिने कार्यको तयारी हुँदै छ । -PreparingDesc=स्थापक तपाइको कल्पयन्त्रमा [name] लाई भित्र्याउन तयारी गर्दै छ । -PreviousInstallNotCompleted=अघिल्लो कार्यक्रमको भित्रिने/निष्कासन को कार्य सकिएको थिएन । थालिएको काम समाप्त गर्न तपाइले आफ्नो कल्पयन्त्रलाई पुनः सुरुवात गर्नु पर्ने हुन्छ । %n %n तपाइको कल्पयन्त्र पुनः सुरुवात भए पछि फेरी स्थापकलाई [name] भित्र्याउने आदेश दिनु होला । -CannotContinue=स्थापकले कार्य जारी राख्न सकेन, बहिर्गमन गर्न 'रद्द गर' टाँक दबाउनु होला । -ApplicationsFound=स्थापकलाई अद्यावधिक गर्न चाहिने फाइल निम्न अनुप्रयोगले प्रयोगमा ल्याएको पाइयो । स्थापकलाई यी अनुप्रयोगहरू स्वतः बन्द गर्ने अनुमति प्रदान गर्न सुझाव दिइन्छ । -ApplicationsFound2=स्थापकलाई अद्यावधिक गर्न चाहिने फाइल निम्न अनुप्रयोगले प्रयोगमा ल्याएको पाइयो । स्थापकलाई यी अनुप्रयोगहरू स्वतः बन्द गर्ने अनुमति प्रदान गर्न सुझाव दिइन्छ । भित्र्याउने कार्य सम्पन्न भए पछि स्थापकले यी अनुप्रयोगहरूलाई पुनर् स्थापित गर्न कोसिस गर्ने छ । -CloseApplications=&अनुप्रयोगहरूलाई स्वतः बन्द गरि देउ -DontCloseApplications=अनुप्रयोगलाई बन्द &नगरी देउ - -; *** "Installing" wizard page -WizardInstalling=भित्र्याउने कार्य गर्दै छु -InstallingLabel=कृपया स्थापकले तपाइको कल्पयन्त्रमा [name] लाई भित्र्याउन् जेल सम्म धैर्य गर्नु होला - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=स्थापकले [name]लाई भीत्र्याउने कार्यक्रमको समापन हुदैछ । -FinishedLabelNoIcons=Setup has finished installing [name] on your computer. -FinishedLabel=मैले तपाइको कल्पयन्त्रमा [name] भित्र्याउने कार्य पुरा गरेँ । यो अनुप्रयोग स्थापित प्रतिमालाई चयन गरेर सक्रिय गराउन सकिन्छ -ClickFinish=भित्र्याउने कार्यक्रम समापन गर्न 'समाप्त' भन्ने टाँकलाई दबाउनु होस् । -FinishedRestartLabel=[name] भीत्रिए पनि कार्य सम्पादन सुरु गर्न यो कल्पयन्त्रलाई पुनः सुरुवात गर्नु पर्छ । के अहिले नै सुरुवात गरी हाल्ने हो? -FinishedRestartMessage=[name] भीत्रिए पनि कार्य सम्पादन सुरू गर्न स्थापकले तपाइको कल्पयन्त्रलाई पुनः सुरुवात गर्नु पर्छ । %n %n के अहिले नै सुरुवात गरि हाल्ने हो? -ShowReadmeCheck=हो, म 'मलाई पढ्नु होस् ' फाइल हेर्न चाहन्छु । -YesRadio=&हो, कल्पयन्त्र अहिले नै पुनः सुरुवात होस् -NoRadio=&होइन, म आफै कल्पयन्त्रलाई पछि पुनः सुरुवात गरौंला -; used for example as 'Run MyProg.exe' -RunEntryExec=%1 लाई सक्रिय गराउ -; used for example as 'View Readme.txt' -RunEntryShellExec=%1 लाई देखाउ - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=स्थापकलाई अर्को भकारी चाहिन्छ । -SelectDiskLabel2=कृपया %1 भकारीलाई घुसाएर 'ठीक' भन्ने टाँकलाई दबाउनु होस् । %n %n यदि तल देखाइएका बाहेक अन्य कुनै भकारी भित्रको थैली मा फाइल पाइन्छ बने सही बाटो लेख्नु होला अथवा 'उघार' भन्ने टाँकलाई दबाउनु होस् । -PathLabel=&बाटो: -FileNotInDir2=फाइल "%1" त "%2" मा फेला पार्न सकिएन । कृपया सही भकारी घुसाउनु होस् अथवा अर्को थैलीको चयन गर्नु होस् । -SelectDirectoryLabel=कृपया अर्को भकारीको स्थान किटानी गर्नु होस् । - -; *** Installation phase messages -SetupAborted=स्थापनाको काम पुरा भएन । %n %n कृपया समस्या हल गर्नु होस् र स्थापकलाई फेरी काममा लगाउनु होस् । -EntryAbortRetryIgnore=कृपया फेरी कोसिस गर्न 'अर्को प्रयास' भन्ने टाँकलाई, जे भए पनि कार्य जारी राख्न 'बेवास्ता' भन्ने टाँकलाई अथवा स्थापनाको कार्य रद्द गर्न 'परित्याग' भन्ने टाँकलाई दबाउनु होस् - -; *** Installation status messages -StatusClosingApplications=अनुप्रयोग बन्द गर्दै छु । -StatusCreateDirs=घर्राको सिर्जना गर्दै छु... -StatusExtractFiles=फाइलहरूलाई झिक्दै छु... -StatusCreateIcons=छोटो बाटो सिर्जना गर्दै छु... -StatusCreateIniEntries=INI प्रविष्टि सिर्जना गर्दै छु । -StatusCreateRegistryEntries=Registry प्रविष्टिको सिर्जना गर्दै छु । -StatusRegisterFiles=फाइलको दर्ता गर्दै छु । -StatusSavingUninstall=भित्रिन नसकेको सूचना बचत गर्दै छु । -StatusRunProgram=भित्रिने कार्यको समाप्ति गर्दै छु । -StatusRestartingApplications=अनुप्रयोग पुनः सुरुवात हुँदै छ । -StatusRollback=परिवर्तनहरूलाई उल्टाउँदै छु । - -; *** Misc. errors -ErrorInternal2=आन्तरिक त्रुटि: %1 -ErrorFunctionFailedNoCode=%1 असफल भयो । -ErrorFunctionFailed=%1 असफल भयो; कोड %2 हो । -ErrorFunctionFailedWithMessage=%1 असफल भयो; कोड %2 %n %3 -ErrorExecutingProgram=%1%n फाइल कार्यान्वयन गर्न सकिएन । - -; *** Registry errors -ErrorRegOpenKey=Registry कुञ्जी खोल्ने कार्यमा त्रुटि:%n %1\%2 -ErrorRegCreateKey=Registry कुञ्जी सिर्जनामा त्रुटि:%n %1\%2 -ErrorRegWriteKey=Registry कुञ्जी लेखाइमा त्रुटि:%n %1\%2 - -; *** INI errors -ErrorIniEntry=फाइल "%1" मा INI प्रविष्टिको त्रुटि भयो । - -; *** File copying errors -FileAbortRetryIgnore=फेरि कोसिस गर्न 'अर्को प्रयास' भन्ने टाँकलाई, यो फाइल छोडी दिन (यसो नगर्न सुझाव दिइन्छ), 'बेवास्ता' भन्ने टाँकलाई अथवा स्थापना रद्द गर्न 'परित्याग' भन्ने टाँकलाई दबाउनु होला । -FileAbortRetryIgnore2=फेरि कोसिस गर्न 'अर्को प्रयास' भन्ने टाँकलाई, जे भए पनि कार्य जारी राख्न (यसो नगर्न सुझाव दिइन्छ), 'बेवास्ता' भन्ने टाँकलाई अथवा स्थापना रद्द गर्न 'परित्याग' भन्ने टाँकलाई दबाउनु होला । -SourceIsCorrupted=श्रोत फाइल भ्रष्ट भएको रहेछ । -SourceDoesntExist=श्रोत फाइल "%1" छदै छैन । -ExistingFileReadOnly=विद्यमान फाइल त 'पढ्न मात्रै मिल्ने' प्रकृतिको रहेछ । %n %n 'पढ्न मात्रै मिल्ने' प्रकृति हटाएर फेरि कोसिस गर्न 'अर्को प्रयास' भन्ने टाँकलाई, यो फाइल छोडी दिन 'बेवास्ता' भन्ने टाँकलाई अथवा स्थापना रद्द गर्न 'परित्याग' भन्ने टाँकलाई दबाउनु होला । -ErrorReadingExistingDest=विद्यमान फाइल पढ्दा खेरी त्रुटि हुन पुग्यो । : -FileExists=यो फाइल त पहिले नै भित्रिएको छ । %n %n के तपाइ स्थापकलाई यसलाई मेटाएर नया भित्र्याउने आदेश दिनु हुन्छ? -ExistingFileNewer=स्थापकले भित्र्याउन लागेको भन्दा नयाँ फाइल पहिले नै भित्रिएको रहेछ । विद्यमान फाइललाई यथावत् राख्न सल्लाह दिइन्छ । %n %n के तपाइ विद्यमान फाइललाई नै कायम राख्न चाहनु हुन्छ? -ErrorChangingAttr=पूर्व स्थापित फाइलको परिचायकहरूलाई परिवर्तन गर्दा गल्ती भयो: -ErrorCreatingTemp=गन्तव्य घर्रामा फाइलको सिर्जना गर्दा गल्ती भयो: -ErrorReadingSource=श्रोत फाइल पढ्ने क्रममा गल्ती भयो: -ErrorCopying=फाइलको नक्कल उतार्ने क्रममा गल्ती भयो: -ErrorReplacingExistingFile=विद्यमान फाइललाई प्रतिस्थापन गर्दा गल्ती भयो: -ErrorRestartReplace=पुनः प्रतिस्थापन असफल भयो: -ErrorRenamingTemp=गन्तव्य घर्राको फाइलको नाम परिवर्तन गर्ने कोसिस गर्दा गल्ती भयो: -ErrorRegisterServer=DLL/OCX दर्ता गर्न सकिएन: %1 -ErrorRegSvr32Failed=RegSvr32 असफल भयो (गल्ती कोड %1) । -ErrorRegisterTypeLib=%1किसिमको पुस्तकालय दर्ता गर्न सकिएन । - -; *** Post-installation errors -ErrorOpeningReadme='मलाई पढ्नु होस्' भन्ने फाइल पल्टाउने कोसिस गर्दा गल्ती भयो । -ErrorRestartingComputer=स्थापकले कल्पयन्त्रलाई पुनः सुरुवात गराउन सकेन । कृपया तपाइ आफैँले यसलाई पुनः सुरु गराउनु होस् । - -; *** Uninstaller messages -UninstallNotFound=फाइल "%1" छदै छैन, निष्कासन गर्ने कुरै भएन... । -UninstallOpenError=फाइल "%1" खोल्न नसकेको ले निष्कासन गर्न सकिँदैन । -UninstallUnsupportedVer=निष्कासन अभिलेख खाता "%1" निष्कासन कर्ताको संस्करणको बनोट सित मिल्दैन । त्यसैले निष्कासन गर्न सकिँदैन । -UninstallUnknownEntry=निष्कासन अभिलेख खातामा अज्ञात प्रविष्टि (%1) सित जम्का भेट भयो । -ConfirmUninstall=के तपाइ %1 र यसका सबै हिस्साहरू हटाउने नै हो भन्ने कुरामा विश्वस्त हुनु हुन्छ? -UninstallOnlyOnWin64=यो मैतालुलाई 64-bit विन्डोजबाट मात्रै निष्कासित गर्न सकिन्छ । -OnlyAdminCanUninstall=प्रशासकीय अधिकार प्राप्त उपभोक्ताले मात्रै यो मैतालुलाई निष्कासित गर्न सक्छ । -UninstallStatusLabel=कृपया, तपाइको कल्पयन्त्रबाट %1 लाई हटाउने कार्य समाप्त हुँदासम्म धैर्य गर्नु होस् । -UninstalledAll=तपाइको कल्पयन्त्रबाट %1 लाई सफलतापूर्वक हटाइयो । -UninstalledMost=%1 लाई पुरै निष्कासित गरियो । %n %n केही तत्त्वलाई हटाउन सकिएन । यीनैहरूलाई आफैँले मेटाउनु पर्ने हुन्छ । -UninstalledAndNeedsRestart=%1को निष्कासनलाई पूर्णता दिन तपाइको कल्पयन्त्र पुनः सुरुवात हुनु पर्छ । %n %n के अहिले नै पुनः सुरुवात गरि हाल्ने हो? -UninstallDataCorrupted=%1 फाइल त भ्रष्ट पो भए छ । निष्कासन गर्न सकिएन । - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=के साझा फाइलहरू पनि हटाउने हो? -ConfirmDeleteSharedFile2=यो प्रणालीले जनाए अनुसार निम्न साझा फाइलहरू अब कुनै कार्यक्रमले प्रयोगमा ल्याउँदैनन् । के तपाइ यी साझा फाइललाई पनि यसै क्रममा निष्कासित गर्न चाहनु हुन्छ?%n %n यदि कुनै कार्यक्रमले अझै पनि यी फाइलको उपयोग गर्दछ भने यीनैहरूलाई हटाएको खण्डमा त्यो कार्यक्रम राम्ररी चल्न सक्दैन । यदि तपाइ यकिन गर्न सक्नु हुन्न भने 'होइन' विकल्प रोज्नु होस् । यी फाइलहरूलाई तपाइको कल्पयन्त्रमा नै राखी राख्दा कुनै हानि नोक्सान हुने छैन । -SharedFileNameLabel=फाइलको नाम: -SharedFileLocationLabel=स्थान: -WizardUninstalling=निष्कासनको अवस्था -StatusUninstalling=%1 निष्कासित हुँदै छ । - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=%1 भित्र्याउने कार्य हुँदै छ । -ShutdownBlockReasonUninstallingApp=%1 निष्कासित हुँदै छ । - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 संस्करण %2 -AdditionalIcons=अतिरिक्त प्रतिमा: -CreateDesktopIcon=&डेस्कटपमा प्रतिमाको सिर्जना होस् -CreateQuickLaunchIcon=&तुरुन्तै सक्रिय प्रतिमाको सिर्जना गर । -ProgramOnTheWeb=वेभमा %1 -UninstallProgram=%1 लाई निष्कासन गरि देउ -LaunchProgram=%1 लाई सक्रिय बनाउ -AssocFileExtension=%1 लाई %2 फाइलको विस्तार सित &आबद्ध गरी देउ । -AssocingFileExtension=%1 लाई %2 फाइलको विस्तार सित आबद्धता दिँदै छु । -AutoStartProgramGroupDescription=सुरुवात: -AutoStartProgram=%1 स्वचालित रूपले सुरु होस् । -AddonHostProgramNotFound=तपाइले चयन गर्नु भएको थैली मा %1 लाई फेला पार्न सकिएन । %n %n के जसरी पनि कार्य निरन्तर राख्ने हो? diff --git a/Greenshot/tools/innosetup/Languages/Norwegian.isl b/Greenshot/tools/innosetup/Languages/Norwegian.isl deleted file mode 100644 index 5a4ebfef1..000000000 --- a/Greenshot/tools/innosetup/Languages/Norwegian.isl +++ /dev/null @@ -1,330 +0,0 @@ -; *** Inno Setup version 5.5.3+ Norwegian (bokml) messages *** -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Norwegian translation by Eivind Bakkestuen -; E-mail: eivind@nexusdb.com -; Many thanks to the following people for language improvements and comments: -; -; Harald Habberstad, Frode Weum, Morten Johnsen, -; Tore Ottinsen, Kristian Hyllestad, Thomas Kelso, Jostein Christoffer Andersen -; -; $jrsoftware: issrc/Files/Languages/Norwegian.isl,v 1.15 2007/04/23 15:03:35 josander+ Exp $ - -[LangOptions] -LanguageName=Norsk -LanguageID=$0414 -LanguageCodePage=1252 - -[Messages] - -; *** Application titles -SetupAppTitle=Installasjon -SetupWindowTitle=Installere - %1 -UninstallAppTitle=Avinstaller -UninstallAppFullTitle=%1 Avinstallere - -; *** Misc. common -InformationTitle=Informasjon -ConfirmTitle=Bekreft -ErrorTitle=Feil - -; *** SetupLdr messages -SetupLdrStartupMessage=Dette vil installere %1. Vil du fortsette? -LdrCannotCreateTemp=Kan ikke lage midlertidig fil, installasjonen er avbrutt -LdrCannotExecTemp=Kan ikke kjre fil i den midlertidige mappen, installasjonen er avbrutt - -; *** Startup error messages -LastErrorMessage=%1.%n%nFeil %2: %3 -SetupFileMissing=Filen %1 mangler i installasjonskatalogen. Vennligst korriger problemet eller skaff deg en ny kopi av programmet. -SetupFileCorrupt=Installasjonsfilene er delagte. Vennligst skaff deg en ny kopi av programmet. -SetupFileCorruptOrWrongVer=Installasjonsfilene er delagte eller ikke kompatible med dette installasjonsprogrammet. Vennligst korriger problemet eller skaff deg en ny kopi av programmet. -InvalidParameter=Kommandolinjen hadde en ugyldig parameter:%n%n%1 -SetupAlreadyRunning=Dette programmet kjrer allerede. -WindowsVersionNotSupported=Dette programmet sttter ikke Windows-versjonen p denne maskinen. -WindowsServicePackRequired=Dette programmet krever %1 Service Pack %2 eller nyere. -NotOnThisPlatform=Dette programmet kjrer ikke p %1. -OnlyOnThisPlatform=Dette programmet kjrer kun p %1. -OnlyOnTheseArchitectures=Dette programmet kan kun installeres i Windows-versjoner som er beregnet p flgende prossessorarkitekturer:%n%n%1 -MissingWOW64APIs=Din Windows-versjon mangler funksjonalitet for at installasjonsprogrammet skal gjre en 64-bits-installasjon. Installer Service Pack %1 for rette p dette. -WinVersionTooLowError=Dette programmet krever %1 versjon %2 eller senere. -WinVersionTooHighError=Dette programmet kan ikke installeres p %1 versjon %2 eller senere. -AdminPrivilegesRequired=Administrator-rettigheter kreves for installere dette programmet. -PowerUserPrivilegesRequired=Du m vre logget inn som administrator eller ha administrator-rettigheter nr du installerer dette programmet. -SetupAppRunningError=Installasjonsprogrammet har funnet ut at %1 kjrer.%n%nVennligst avslutt det n og klikk deretter OK for fortsette, eller Avbryt for avslutte. -UninstallAppRunningError=Avinstallasjonsprogrammet har funnet ut at %1 kjrer.%n%nVennligst avslutt det n og klikk deretter OK for fortsette, eller Avbryt for avslutte. - -; *** Misc. errors -ErrorCreatingDir=Installasjonsprogrammet kunne ikke lage mappen "%1" -ErrorTooManyFilesInDir=Kunne ikke lage en fil i mappen "%1" fordi den inneholder for mange filer - -; *** Setup common messages -ExitSetupTitle=Avslutt installasjonen -ExitSetupMessage=Installasjonen er ikke ferdig. Programmet installeres ikke hvis du avslutter n.%n%nDu kan installere programmet igjen senere hvis du vil.%n%nVil du avslutte? -AboutSetupMenuItem=&Om installasjonsprogrammet... -AboutSetupTitle=Om installasjonsprogrammet -AboutSetupMessage=%1 versjon %2%n%3%n%n%1 hjemmeside:%n%4 -AboutSetupNote= -TranslatorNote=Norwegian translation maintained by Eivind Bakkestuen (eivind@nexusdb.com) - -; *** Buttons -ButtonBack=< &Tilbake -ButtonNext=&Neste > -ButtonInstall=&Installer -ButtonOK=OK -ButtonCancel=Avbryt -ButtonYes=&Ja -ButtonYesToAll=Ja til &alle -ButtonNo=&Nei -ButtonNoToAll=N&ei til alle -ButtonFinish=&Ferdig -ButtonBrowse=&Bla gjennom... -ButtonWizardBrowse=&Bla gjennom... -ButtonNewFolder=&Lag ny mappe - -; *** "Select Language" dialog messages -SelectLanguageTitle=Velg installasjonssprk -SelectLanguageLabel=Velg sprket som skal brukes under installasjonen: - -; *** Common wizard text -ClickNext=Klikk p Neste for fortsette, eller Avbryt for avslutte installasjonen. -BeveledLabel= -BrowseDialogTitle=Bla etter mappe -BrowseDialogLabel=Velg en mappe fra listen nedenfor, klikk deretter OK. -NewFolderName=Ny mappe - -; *** "Welcome" wizard page -WelcomeLabel1=Velkommen til installasjonsprogrammet for [name]. -WelcomeLabel2=Dette vil installere [name/ver] p din maskin.%n%nDet anbefales at du avslutter alle programmer som kjrer fr du fortsetter. - -; *** "Password" wizard page -WizardPassword=Passord -PasswordLabel1=Denne installasjonen er passordbeskyttet. -PasswordLabel3=Vennligst oppgi ditt passord og klikk p Neste for fortsette. Sm og store bokstaver behandles ulikt. -PasswordEditLabel=&Passord: -IncorrectPassword=Det angitte passordet er feil, vennligst prv igjen. - -; *** "License Agreement" wizard page -WizardLicense=Lisensbetingelser -LicenseLabel=Vennligst les flgende viktig informasjon fr du fortsetter. -LicenseLabel3=Vennligst les flgende lisensbetingelser. Du m godta innholdet i lisensbetingelsene fr du fortsetter med installasjonen. -LicenseAccepted=Jeg &aksepterer lisensbetingelsene -LicenseNotAccepted=Jeg aksepterer &ikke lisensbetingelsene - -; *** "Information" wizard pages -WizardInfoBefore=Informasjon -InfoBeforeLabel=Vennligst les flgende viktige informasjon fr du fortsetter. -InfoBeforeClickLabel=Klikk p Neste nr du er klar til fortsette. -WizardInfoAfter=Informasjon -InfoAfterLabel=Vennligst les flgende viktige informasjon fr du fortsetter. -InfoAfterClickLabel=Klikk p Neste nr du er klar til fortsette. - -; *** "User Information" wizard page -WizardUserInfo=Brukerinformasjon -UserInfoDesc=Vennligst angi informasjon. -UserInfoName=&Brukernavn: -UserInfoOrg=&Organisasjon: -UserInfoSerial=&Serienummer: -UserInfoNameRequired=Du m angi et navn. - -; *** "Select Destination Directory" wizard page -WizardSelectDir=Velg mappen hvor filene skal installeres: -SelectDirDesc=Hvor skal [name] installeres? -SelectDirLabel3=Installasjonsprogrammet vil installere [name] i flgende mappe. -SelectDirBrowseLabel=Klikk p Neste for fortsette. Klikk p Bla gjennom hvis du vil velge en annen mappe. -DiskSpaceMBLabel=Programmet krever minst [mb] MB med diskplass. -CannotInstallToNetworkDrive=Kan ikke installere p en nettverksstasjon. -CannotInstallToUNCPath=Kan ikke installere p en UNC-bane. Du m tilordne nettverksstasjonen hvis du vil installere i et nettverk. -InvalidPath=Du m angi en full bane med stasjonsbokstav, for eksempel:%n%nC:\APP%n%Du kan ikke bruke formen:%n%n\\server\share -InvalidDrive=Den valgte stasjonen eller UNC-delingen finnes ikke, eller er ikke tilgjengelig. Vennligst velg en annen -DiskSpaceWarningTitle=For lite diskplass -DiskSpaceWarning=Installasjonprogrammet krever minst %1 KB med ledig diskplass, men det er bare %2 KB ledig p den valgte stasjonen.%n%nvil du fortsette likevel? -DirNameTooLong=Det er for langt navn p mappen eller banen. -InvalidDirName=Navnet p mappen er ugyldig. -BadDirName32=Mappenavn m ikke inneholde noen av flgende tegn:%n%n%1 -DirExistsTitle=Eksisterende mappe -DirExists=Mappen:%n%n%1%n%nfinnes allerede. Vil du likevel installere der? -DirDoesntExistTitle=Mappen eksisterer ikke -DirDoesntExist=Mappen:%n%n%1%n%nfinnes ikke. Vil du at den skal lages? - -; *** "Select Components" wizard page -WizardSelectComponents=Velg komponenter -SelectComponentsDesc=Hvilke komponenter skal installeres? -SelectComponentsLabel2=Velg komponentene du vil installere; velg bort de komponentene du ikke vil installere. Nr du er klar, klikker du p Neste for fortsette. -FullInstallation=Full installasjon -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompakt installasjon -CustomInstallation=Egendefinert installasjon -NoUninstallWarningTitle=Komponenter eksisterer -NoUninstallWarning=Installasjonsprogrammet har funnet ut at flgende komponenter allerede er p din maskin:%n%n%1%n%nDisse komponentene avinstalleres ikke selv om du ikke velger dem.%n%nVil du likevel fortsette? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Valgte alternativer krever minst [mb] MB med diskplass. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Velg tilleggsoppgaver -SelectTasksDesc=Hvilke tilleggsoppgaver skal utfres? -SelectTasksLabel2=Velg tilleggsoppgavene som skal utfres mens [name] installeres, klikk deretter p Neste. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Velg mappe p start-menyen -SelectStartMenuFolderDesc=Hvor skal installasjonsprogrammet plassere snarveiene? -SelectStartMenuFolderLabel3=Installasjonsprogrammet vil opprette snarveier p flgende startmeny-mappe. -SelectStartMenuFolderBrowseLabel=Klikk p Neste for fortsette. Klikk p Bla igjennom hvis du vil velge en annen mappe. -MustEnterGroupName=Du m skrive inn et mappenavn. -GroupNameTooLong=Det er for langt navn p mappen eller banen. -InvalidGroupName=Navnet p mappen er ugyldig. -BadGroupName=Mappenavnet m ikke inneholde flgende tegn:%n%n%1 -NoProgramGroupCheck2=&Ikke legg til mappe p start-menyen - -; *** "Ready to Install" wizard page -WizardReady=Klar til installere -ReadyLabel1=Installasjonsprogrammet er n klar til installere [name] p din maskin. -ReadyLabel2a=Klikk Installer for fortsette, eller Tilbake for se p eller forandre instillingene. -ReadyLabel2b=Klikk Installer for fortsette. -ReadyMemoUserInfo=Brukerinformasjon: -ReadyMemoDir=Installer i mappen: -ReadyMemoType=Installasjonstype: -ReadyMemoComponents=Valgte komponenter: -ReadyMemoGroup=Programgruppe: -ReadyMemoTasks=Tilleggsoppgaver: - -; *** "Preparing to Install" wizard page -WizardPreparing=Forbereder installasjonen -PreparingDesc=Installasjonsprogrammet forbereder installasjon av [name] p den maskin. -PreviousInstallNotCompleted=Installasjonen/fjerningen av et tidligere program ble ikke ferdig. Du m starte maskinen p nytt.%n%nEtter omstarten m du kjre installasjonsprogrammet p nytt for fullfre installasjonen av [name]. -CannotContinue=Installasjonsprogrammet kan ikke fortsette. Klikk p Avbryt for avslutte. -ApplicationsFound=Disse applikasjonene bruker filer som vil oppdateres av installasjonen. Det anbefales la installasjonen automatisk avslutte disse applikasjonene. -ApplicationsFound2=Disse applikasjonene bruker filer som vil oppdateres av installasjonen. Det anbefales la installasjonen automatisk avslutte disse applikasjonene. Installasjonen vil prve starte applikasjonene p nytt etter at installasjonen er avsluttet. -CloseApplications=Lukk applikasjonene &automatisk -DontCloseApplications=&Ikke lukk applikasjonene -ErrorCloseApplications=Installasjonsprogrammet kunne ikke lukke alle applikasjonene &automatisk. Det anbefales lukke alle applikasjoner som bruker filer som installasjonsprogrammet trenger oppdatere fr du fortsetter installasjonen. - -; *** "Installing" wizard page -WizardInstalling=Installerer -InstallingLabel=Vennligst vent mens [name] installeres p din maskin. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Fullfrer installasjonsprogrammet for [name] -FinishedLabelNoIcons=[name] er installert p din maskin. -FinishedLabel=[name] er installert p din maskin. Programmet kan kjres ved at du klikker p ett av de installerte ikonene. -ClickFinish=Klikk Ferdig for avslutte installasjonen. -FinishedRestartLabel=Maskinen m startes p nytt for at installasjonen skal fullfres. Vil du starte p nytt n? -FinishedRestartMessage=Maskinen m startes p nytt for at installasjonen skal fullfres.%n%nVil du starte p nytt n? -ShowReadmeCheck=Ja, jeg vil se p LESMEG-filen -YesRadio=&Ja, start maskinen p nytt n -NoRadio=&Nei, jeg vil starte maskinen p nytt senere -; used for example as 'Run MyProg.exe' -RunEntryExec=Kjr %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Se p %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Trenger neste diskett -SelectDiskLabel2=Vennligst sett inn diskett %1 og klikk OK.%n%nHvis filene p finnes et annet sted enn det som er angitt nedenfor, kan du skrive inn korrekt bane eller klikke p Bla Gjennom. -PathLabel=&Bane: -FileNotInDir2=Finner ikke filen "%1" i "%2". Vennligst sett inn riktig diskett eller velg en annen mappe. -SelectDirectoryLabel=Vennligst angi hvor den neste disketten er. - -; *** Installation phase messages -SetupAborted=Installasjonen ble avbrutt.%n%nVennligst korriger problemet og prv igjen. -EntryAbortRetryIgnore=Klikk Prv igjen for forske p nytt, Ignorer for fortsette eller Avslutt for avslutte installasjonen. - -; *** Installation status messages -StatusClosingApplications=Lukker applikasjoner... -StatusCreateDirs=Lager mapper... -StatusExtractFiles=Pakker ut filer... -StatusCreateIcons=Lager programikoner... -StatusCreateIniEntries=Lager INI-instillinger... -StatusCreateRegistryEntries=Lager innstillinger i registeret... -StatusRegisterFiles=Registrerer filer... -StatusSavingUninstall=Lagrer info for avinstallering... -StatusRunProgram=Gjr ferdig installasjonen... -StatusRestartingApplications=Restarter applikasjoner... -StatusRollback=Tilbakestiller forandringer... - -; *** Misc. errors -ErrorInternal2=Intern feil %1 -ErrorFunctionFailedNoCode=%1 gikk galt -ErrorFunctionFailed=%1 gikk galt; kode %2 -ErrorFunctionFailedWithMessage=%1 gikk galt; kode %2.%n%3 -ErrorExecutingProgram=Kan ikke kjre filen:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Feil under pning av registernkkel:%n%1\%2 -ErrorRegCreateKey=Feil under laging av registernkkel:%n%1\%2 -ErrorRegWriteKey=Feil under skriving til registernkkel:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Feil under laging av innstilling i filen "%1". - -; *** File copying errors -FileAbortRetryIgnore=Klikk Prv igjen for forske p nytt, Ignorer for overse denne filen (anbefales ikke) eller Avslutt for stoppe installasjonen. -FileAbortRetryIgnore2=Klikk Prv igjen for forske p nytt, Ignorer for fortsette uansett (anbefales ikke) eller Avslutt for stoppe installasjonen. -SourceIsCorrupted=Kildefilen er delagt -SourceDoesntExist=Kildefilen "%1" finnes ikke -ExistingFileReadOnly=Den eksisterende filen er skrivebeskyttet.%n%nKlikk Prv igjen for fjerne skrivebeskyttelsen og prve p nytt, Ignorer for hoppe over denne filen, eller Avslutt for stoppe installasjonen. -ErrorReadingExistingDest=En feil oppsto under lesing av den eksisterende filen: -FileExists=Filen eksisterer allerede.%n%nVil du overskrive den? -ExistingFileNewer=Den eksisterende filen er nyere enn den som blir forskt installert. Det anbefales at du beholder den eksisterende filen.%n%nVil du beholde den eksisterende filen? -ErrorChangingAttr=En feil oppsto da attributtene ble forskt forandret p den eksisterende filen: -ErrorCreatingTemp=En feil oppsto under forsket p lage en fil i ml-mappen: -ErrorReadingSource=En feil oppsto under forsket p lese kildefilen: -ErrorCopying=En feil oppsto under forsk p kopiere en fil: -ErrorReplacingExistingFile=En feil oppsto under forsket p erstatte den eksisterende filen: -ErrorRestartReplace=RestartReplace gikk galt: -ErrorRenamingTemp=En feil oppsto under omdping av fil i ml-mappen: -ErrorRegisterServer=Kan ikke registrere DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 gikk galt med avslutte kode %1 -ErrorRegisterTypeLib=Kan ikke registrere typebiblioteket: %1 - -; *** Post-installation errors -ErrorOpeningReadme=En feil oppsto under forsket p pne LESMEG-filen. -ErrorRestartingComputer=Installasjonsprogrammet kunne ikke starte maskinen p nytt. Vennligst gjr dette manuelt. - -; *** Uninstaller messages -UninstallNotFound=Filen "%1" finnes ikke. Kan ikke avinstallere. -UninstallOpenError=Filen "%1" kunne ikke pnes. Kan ikke avinstallere. -UninstallUnsupportedVer=Kan ikke avinstallere. Avinstallasjons-loggfilen "%1" har et format som ikke gjenkjennes av denne versjonen av avinstallasjons-programmet -UninstallUnknownEntry=Et ukjent parameter (%1) ble funnet i Avinstallasjons-loggfilen -ConfirmUninstall=Er du sikker p at du helt vil fjerne %1 og alle tilhrende komponenter? -UninstallOnlyOnWin64=Denne installasjonen kan bare ufres p 64-bit Windows. -OnlyAdminCanUninstall=Denne installasjonen kan bare avinstalleres av en bruker med Administrator-rettigheter. -UninstallStatusLabel=Vennligst vent mens %1 fjernes fra maskinen. -UninstalledAll=Avinstallasjonen av %1 var vellykket -UninstalledMost=Avinstallasjonen av %1 er ferdig.%n%nEnkelte elementer kunne ikke fjernes. Disse kan fjernes manuelt. -UninstalledAndNeedsRestart=Du m starte maskinen p nytt for fullfre installasjonen av %1.%n%nVil du starte p nytt n? -UninstallDataCorrupted="%1"-filen er delagt. Kan ikke avinstallere. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Fjerne delte filer? -ConfirmDeleteSharedFile2=Systemet indikerer at den flgende filen ikke lengre brukes av andre programmer. Vil du at avinstalleringsprogrammet skal fjerne den delte filen?%n%nHvis andre programmer bruker denne filen, kan du risikere at de ikke lengre vil virke som de skal. Velg Nei hvis du er usikker. Det vil ikke gjre noen skade hvis denne filen ligger p din maskin. -SharedFileNameLabel=Filnavn: -SharedFileLocationLabel=Plassering: -WizardUninstalling=Avinstallerings-status: -StatusUninstalling=Avinstallerer %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installerer %1. -ShutdownBlockReasonUninstallingApp=Avinstallerer %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versjon %2 -AdditionalIcons=Ekstra-ikoner: -CreateDesktopIcon=Lag ikon p &skrivebordet -CreateQuickLaunchIcon=Lag et &Hurtigstarts-ikon -ProgramOnTheWeb=%1 p nettet -UninstallProgram=Avinstaller %1 -LaunchProgram=Kjr %1 -AssocFileExtension=&Koble %1 med filetternavnet %2 -AssocingFileExtension=Kobler %1 med filetternavnet %2... -AutoStartProgramGroupDescription=Oppstart: -AutoStartProgram=Start %1 automatisk -AddonHostProgramNotFound=%1 ble ikke funnet i katalogen du valgte.%n%nVil du fortsette likevel? \ No newline at end of file diff --git a/Greenshot/tools/innosetup/Languages/NorwegianNynorsk.isl b/Greenshot/tools/innosetup/Languages/NorwegianNynorsk.isl deleted file mode 100644 index 325c5a2b8..000000000 --- a/Greenshot/tools/innosetup/Languages/NorwegianNynorsk.isl +++ /dev/null @@ -1,301 +0,0 @@ -; *** Inno Setup version 4.0.5+ Norsk, nynorsk messages *** -; -; Translated by/omsett av: Magnar Myrtveit -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/is3rdparty.php -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; $jrsoftware: issrc/Files/Default.isl,v 1.32 2003/06/18 19:24:07 jr Exp $ - -[LangOptions] -LanguageName=Norsk, nynorsk -LanguageID=$0409 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName=MS Shell Dlg -;DialogFontSize=8 -;DialogFontStandardHeight=13 -;TitleFontName=Arial -;TitleFontSize=29 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -DialogFontName=MS Shell Dlg -DialogFontSize=8 -DialogFontStandardHeight=13 -TitleFontName=Arial -TitleFontSize=29 -WelcomeFontName=Verdana -WelcomeFontSize=12 -CopyrightFontName=Arial -CopyrightFontSize=8 -[Messages] - -; *** Application titles -SetupAppTitle=Installasjon -SetupWindowTitle=Installering - %1 -UninstallAppTitle=Avinstallasjon -UninstallAppFullTitle=Avinstallering - %1 - -; *** Misc. common -InformationTitle=Informasjon -ConfirmTitle=Godta -ErrorTitle=Feil - -; *** SetupLdr messages -SetupLdrStartupMessage=Dette vil installera %1. Vil du halda fram? -LdrCannotCreateTemp=Kan ikkje laga midlertidig fil. Installasjonen er avbroten -LdrCannotExecTemp=Kan ikkje kyra fila i den midlertidige katalogen. Installasjonen er avbroten - -; *** Startup error messages -LastErrorMessage=%1.%n%nFeil %2: %3 -SetupFileMissing=Fila %1 finst ikkje i installasjonskatalogen. Ver venleg og fiks problemet eller f tak i ein ny kopi av programmet. -SetupFileCorrupt=Installasjonsfila er ydelagt. Ver venleg og f tak i ein ny kopi av programmet. -SetupFileCorruptOrWrongVer=Installasjonsfilane er ydelagde, eller ikkje kompatible med dette installasjonsprogrammet.Ver venleg og fiks problemet eller f tak i ein ny kopi av programmet. -NotOnThisPlatform=Dette programmet kyrer ikkje p %1. -OnlyOnThisPlatform=Dette programmet kyrer berre p %1. -WinVersionTooLowError=Dette programmet krev %1 versjon %2 eller nyare. -WinVersionTooHighError=Dette programmet kan ikkje bli installert p %1 versjon %2 eller nyare. -AdminPrivilegesRequired=Du m vera logga inn som administrator nr du installerer dette programmet. -PowerUserPrivilegesRequired=Du m vera logga inn som administrator eller ha administrator-rettar nr du installerer dette programmet. -SetupAppRunningError=Installasjonen har oppdaga at %1 kyrer.%n%nVer venleg og lukk det no, og trykk OK for halda fram, eller Avbryt for avslutta. -UninstallAppRunningError=Avinstallasjonen har oppdaga at %1 kyrer.%n%nVer venleg og lukk det no, og trykk OK for halda fram, eller Avbryt for avslutta. - -; *** Misc. errors -ErrorCreatingDir=Installasjonsprogrammet kunne ikkje laga katalogen "%1" -ErrorTooManyFilesInDir=Kunne ikkje laga ei fil i mappa "%1" fordi den inneheld for mange filar - -; *** Setup common messages -ExitSetupTitle=Avslutt installasjonen -ExitSetupMessage=Installasjonen er ikkje ferdig. Viss du avsluttar no, vil ikkje programmet bli installert.%n%nDu kan kyra installasjonen p nytt seinare for fullfra installsajonen.%n%nVil du avslutta installasjonen? -AboutSetupMenuItem=&Om installasjonsprogrammet... -AboutSetupTitle=Om installasjonsprogrammet -AboutSetupMessage=%1 versjon %2%n%3%n%n%1 heimeside:%n%4 -AboutSetupNote= - -; *** Buttons -ButtonBack=< &Tilbake -ButtonNext=&Neste > -ButtonInstall=&Installer -ButtonOK=OK -ButtonCancel=Avbryt -ButtonYes=&Ja -ButtonYesToAll=Ja til &alle -ButtonNo=&Nei -ButtonNoToAll=N&ei til alle -ButtonFinish=&Ferdig -ButtonBrowse=&Bla gjennom... - -; *** "Select Language" dialog messages -SelectLanguageTitle=Vel installasjonssprk -SelectLanguageLabel=Vel sprket som skal brukast under installasjonen: - -; *** Common wizard text -ClickNext=Trykk Neste for halda fram, eller Avbryt for avslutta installasjonen. -BeveledLabel= - -; *** "Welcome" wizard page -WelcomeLabel1=Velkomen til installasjonen av [name] -WelcomeLabel2=Dette vil installera [name/ver] p di datamaskin.%n%nDet er anbefalt at du lukkar alle andre program fr du fortset. - -; *** "Password" wizard page -WizardPassword=Passord -PasswordLabel1=Denne installasjonen er passordbeskytta. -PasswordLabel3=Ver venleg og skriv inn passordet, og trykk Neste for halda fram. Store og sm bokstavar blir behandla ulikt. -PasswordEditLabel=&Passord: -IncorrectPassword=Passordet du skreiv inn er feil. Ver venleg og prv igjen. - -; *** "License Agreement" wizard page -WizardLicense=Lisensvilkr -LicenseLabel=Ver venleg og les den fylgjande viktige informasjonen fr du fortset. -LicenseLabel3=Ver venleg og les dei fylgjande lisensvilkra. Du m godta innehaldet i denne avtalen fr du fortset installasjonen. -LicenseAccepted=Eg &godtar avtalen -LicenseNotAccepted=Eg godtar &ikkje avtalen - -; *** "Information" wizard pages -WizardInfoBefore=Informasjon -InfoBeforeLabel=Ver venleg og les den fylgjande viktige informasjonen fr du fortset. -InfoBeforeClickLabel=Nr du er klar til halda fram med installasjonen, trykk Neste. -WizardInfoAfter=Informasjon -InfoAfterLabel=Ver venleg og les den fylgjande viktige informasjonen fr du fortset. -InfoAfterClickLabel=Nr du er klar til fullfra installasjonen, trykk Neste. - -; *** "User Information" wizard page -WizardUserInfo=Brukarinformasjon -UserInfoDesc=Ver venleg og skriv inn din informasjon. -UserInfoName=&Brukarnamn: -UserInfoOrg=&Organisasjon: -UserInfoSerial=&Serienummer: -UserInfoNameRequired=Du m skriva inn eit namn. - -; *** "Select Destination Directory" wizard page -WizardSelectDir=Vel mlmappe -SelectDirDesc=Kvar skal [name] bli installert? -SelectDirLabel=Vel mappa der du vil at [name] skal bli installert, og trykk Neste. -DiskSpaceMBLabel=Programmet krev minst [mb] MB diskplass. -ToUNCPathname=Kan ikkje installera til ei UNC-bane. Viss du prver installera i eit nettverk, m du skriva inn nettverksmlstasjonen. -InvalidPath=Du m skriva inn ei full bane med stasjonsbokstav; for eksempel:%n%nC:\APP%n%neller ei UNC-bane som:%n%n\\server\share -InvalidDrive=Den valte stasjonen eller UNC-delinga finst ikkje, eller er ikkje tilgjengeleg. Ver venleg og vel ein annan. -DiskSpaceWarningTitle=Ikkje nok diskplass -DiskSpaceWarning=Installasjonsprogrammet krev minst %1 KB ledig plass for installera, men den valte stasjonen har berre %2 KB ledig.%n%nVil du halda fram likevel? -BadDirName32=Katalognamn kan ikkje innehalda nokon av dei fylgjande teikna:%n%n%1 -DirExistsTitle=Katalogen finst -DirExists=Katalogen:%n%n%1%n%nfinst allereie. Vil du installera til denne katalogen likevel? -DirDoesntExistTitle=Katalogen finst ikkje -DirDoesntExist=Katalogen:%n%n%1%n%nfinst ikkje. Vil du at katalogen skal bli laga? - -; *** "Select Components" wizard page -WizardSelectComponents=Vel komponentar -SelectComponentsDesc=Kva komponentar skal installerast? -SelectComponentsLabel2=Vel dei komponentane du vil installera; vel vekk dei komponentane du ikkje vil installera. Trykk Neste nr du er klar til halda fram. -FullInstallation=Full installasjon -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompakt installasjon -CustomInstallation=Eigendefinert installasjon -NoUninstallWarningTitle=Komponentane finst -NoUninstallWarning=Installasjonen har oppdaga at desse komponentane allereie er installerte p datamaskina:%n%n%1%n%nDesse komponentane blir ikkje avinstallerte sjlv om du vel dei vekk.%n%nVil du halda fram likevel? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Valte alternativ krev minst [mb] MB ledig diskplass. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Vel tilleggsoppgver -SelectTasksDesc=Kva tilleggsoppgver skal utfrast? -SelectTasksLabel2=Vel dei tilleggsoppgvene som skal utfrast mens [name] blir installert, trykk deretter Neste. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Vel mappe i Start-menyen -SelectStartMenuFolderDesc=Kvar skal snarvegane plasserast? -SelectStartMenuFolderLabel=Vel mappa i Start-menyen der du vil at snarvegane skal bli plasserte. Trykk deretter Neste. -NoIconsCheck=&Ikkje lag ikon -MustEnterGroupName=Du m skriva inn eit katalognamn. -BadGroupName=Katalognamn kan ikkje innehalda nokon av dei fylgjande teikna:%n%n%1 -NoProgramGroupCheck2=&Ikkje lag mappe i Start-menyen - -; *** "Ready to Install" wizard page -WizardReady=Klar til installera -ReadyLabel1=Installasjonsprogrammet er no klart til starta installasjonen av [name] p di datamaskin. -ReadyLabel2a=Trykk Installer for halda fram med installasjonen, eller trykk Tilbake viss du vil sj p eller endra instillingane. -ReadyLabel2b=Trykk Installer for halda fram med installasjonen. -ReadyMemoUserInfo=Brukarinformasjon: -ReadyMemoDir=Mlmappe: -ReadyMemoType=Installasjonstype: -ReadyMemoComponents=Valte komponentar: -ReadyMemoGroup=Mappe i Start-menyen: -ReadyMemoTasks=Tilleggsoppgver: - -; *** "Preparing to Install" wizard page -WizardPreparing=Frebur installasjonen -PreparingDesc=Installasjonsprogrammet frebur installasjonen av [name] p di datamaskin. -PreviousInstallNotCompleted=Installasjonen/fjerninga av eit tidlegare program blei ikkje fullfrt. Du m starta maskina p nytt for fullfra den installasjonen.%n%nEtter omstarten m du kyra installasjonsprogrammet p nytt for fullfra installasjonen av [name]. -CannotContinue=Installasjonsprogrammet kan ikkje halda fram. Ver venleg og trykk Avbryt for avslutta. - -; *** "Installing" wizard page -WizardInstalling=Installerer -InstallingLabel=Ver venleg og vent mens [name] blir installert p di datamaskin. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Fullfrer installasjonsvegvisaren for [name] -FinishedLabelNoIcons=Installasjonen av [name] er fullfrt. -FinishedLabel=Installasjonen av [name] er fullfrt. Du kan starta programmet ved trykka p eit av dei installerte ikona. -ClickFinish=Trykk Ferdig for avslutta installasjonen. -FinishedRestartLabel=For fullfra installasjonen av [name], m maskina bli starta p nytt. Vil du starta p nytt no? -FinishedRestartMessage=For fullfra installasjonen av [name], m maskina bli starta p nytt.%n%nVil du starta p nytt no? -ShowReadmeCheck=Ja, eg vil sj LESMEG-fila -YesRadio=&Ja, start maskina p nytt no -NoRadio=&Nei, eg vil starta p nytt seinare -; used for example as 'Run MyProg.exe' -RunEntryExec=Kyr %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Vis %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Installasjonen treng den neste disketten -SelectDirectory=Vel katalog -SelectDiskLabel2=Ver venleg og set inn diskett %1 og trykk OK.%n%nViss filane finst i ein annan katalog enn den vist nedom, skriv inn riktig bane eller trykk Bla gjennom... -PathLabel=&Bane: -FileNotInDir2=Finn ikkje fila "%1" i "%2". Ver venleg og set inn riktig diskett eller vel ein annan katalog. -SelectDirectoryLabel=Ver venleg og skriv inn plasseringa til den neste disketten. - -; *** Installation phase messages -SetupAborted=Installasjonen blei ikkje fullfrt.%n%nVer venleg og fiks problemet og kyr installasjonen p nytt. -EntryAbortRetryIgnore=Tykkk Prv p nytt for prva p nytt, Ignorr for halda fram, eller Avbryt for avslutta installasjonen. - -; *** Installation status messages -StatusCreateDirs=Oppretter katalogar... -StatusExtractFiles=Pakkar ut filar... -StatusCreateIcons=Oppretter program-ikon... -StatusCreateIniEntries=Oppretter INI-instillingar... -StatusCreateRegistryEntries=Opprettter register-instillingar... -StatusRegisterFiles=Registrerer filar... -StatusSavingUninstall=Lagrar avinstallasjonsinformasjon... -StatusRunProgram=Fullfrer installasjonen... -StatusRollback=Tilbakestiller endringar... - -; *** Misc. errors -ErrorInternal2=Intern feil: %1 -ErrorFunctionFailedNoCode=%1 gjekk gale -ErrorFunctionFailed=%1 gjekk gale; kode %2 -ErrorFunctionFailedWithMessage=%1 gjekk gale; kode %2.%n%3 -ErrorExecutingProgram=Kunne ikkje kyre fila:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Feil under opning av registernkkel:%n%1\%2 -ErrorRegCreateKey=Feil under oppretting av registernkkel:%n%1\%2 -ErrorRegWriteKey=Feil under skriving til registernkkel:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Feil under oppretting av innstillingar i fila "%1". - -; *** File copying errors -FileAbortRetryIgnore=Trykk Prv p nytt for prva p nytt, Ignorr for hoppa over denne fila (ikkje anbefalt), eller Avbryt for avslutta installasjonen. -FileAbortRetryIgnore2=Trykk Prv p nytt for prva p nytt, Ignorr for halda fram (ikkje anbefalt), eller Avbryt for avslutta installasjonen. -SourceIsCorrupted=Kjeldefila er ydelagt -SourceDoesntExist=Kjeldefila "%1" finst ikkje -ExistingFileReadOnly=Den eksisterande fila er skrivebeskytta.%n%nTrykk Prv p nytt for fjerna skrivebeskyttinga og prva p nytt, Ignorr for hoppa over denne fila, eller Avbryt for avslutta installasjonen. -ErrorReadingExistingDest=Ein feil oppstod under lesing av den eksisterande fila: -FileExists=Fila finst allereie.%n%nVil du at installasjonsprogrammet skal skriva over den? -ExistingFileNewer=Den eksisterande fila er nyare enn den installasjonen prver installera. Det er anbefalt at du beheld den eksisterande fila.%n%nVil du behalda den eksisterande fila? -ErrorChangingAttr=Ein feil oppstod under forsk p endra attributtar i den eksisterande fila: -ErrorCreatingTemp=Ein feil oppstod under forsk p oppretta ei fil i mlmappa: -ErrorReadingSource=Ein feil oppstod under forsk p lesa kjeldefila: -ErrorCopying=Ein feil oppstod under forsk p kopiera fila: -ErrorReplacingExistingFile=Ein feil oppstod under forsk p erstatta den eksisterande fila: -ErrorRestartReplace=RestartReplace gjekk gale: -ErrorRenamingTemp=Ein feil oppstod under forsk p gje nytt namnt til ei fil i mlmappa: -ErrorRegisterServer=Kunne ikkje registrera DLL/OCX: %1 -ErrorRegisterServerMissingExport=DllRegisterServer-eksportering blei ikkje funne -ErrorRegisterTypeLib=Kunne ikkje registrera typebiblioteket: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Ein feil oppstod under forsk p opna LESMEG-fila. -ErrorRestartingComputer=Installasjonsprogrammet kunne ikkje starta maskina p nytt. Ver venleg og gjer dette manuelt. - -; *** Uninstaller messages -UninstallNotFound=Kan ikkje avinstallera. Fila "%1" finst ikkje. -UninstallOpenError=Kan ikkje avinstallera. Fila "%1" kunne ikkje opnast. -UninstallUnsupportedVer=Kan ikkje avinstallera. Avinstallasjonsloggfila "%1" er i eit format som denne versjonen av avinstallasjonsprogrammet ikkje forstr -UninstallUnknownEntry=Ein ukjend parameter (%1) blei funne i avinstallasjonsloggen -ConfirmUninstall=Er du sikker p at du vil fjerna %1 og alle tilhyrande komponentar? -OnlyAdminCanUninstall=Denne installasjonen kan berre avinstallerast av ein brukar med administrator-rettar. -UninstallStatusLabel=Ver venleg og vent mens %1 blir fjerna fr di datamaskin. -UninstalledAll=Fjerninga av %1 var vellukka. -UninstalledMost=Avinstalleringa av %1 er fullfrt.%n%nNokre element kunne ikkje bli sletta. Desse kan slettast manuelt. -UninstalledAndNeedsRestart=For fullfra avinstallasjonen av %1, m datamaskina startast p nytt.%n%nVil du starta p nytt no? -UninstallDataCorrupted=Kan ikkje avinstallera. "%1"-fila er ydelagd. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Fjerna delt fil? -ConfirmDeleteSharedFile2=Systemet indikerer at den fylgjande delte fila ikkje blir brukt av nokon program. Vil du at avinstallasjonsprogrammet skal fjerna denne delte fila?%n%nViss nokre program framleis brukar denne fila, og den blir fjerna, kan du risikere at dei ikkje verkar som dei skal. Viss du er usikker, vel Nei. la denne fila vera p systemet vil ikkje gjera nokon skade. -SharedFileNameLabel=Filnamn: -SharedFileLocationLabel=Plassering: -WizardUninstalling=Avinstallasjons-status -StatusUninstalling=Avinstallerer %1... - diff --git a/Greenshot/tools/innosetup/Languages/Polish.isl b/Greenshot/tools/innosetup/Languages/Polish.isl deleted file mode 100644 index af2fd55f2..000000000 --- a/Greenshot/tools/innosetup/Languages/Polish.isl +++ /dev/null @@ -1,327 +0,0 @@ -; *** Inno Setup version 5.5.3+ Polish messages *** -; Krzysztof Cynarski <krzysztof at cynarski.net> -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/is3rdparty.php -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; $jrsoftware: issrc/Files/Languages/Polish.isl,v 1.16 2007/03/09 16:56:52 jr Exp $ - -[LangOptions] -LanguageName=Polski -LanguageID=$0415 -LanguageCodePage=1250 - -[Messages] - -; *** Application titles -SetupAppTitle=Instalator -SetupWindowTitle=Instalacja - %1 -UninstallAppTitle=Deinstalacja -UninstallAppFullTitle=Odinstaluj %1 - -; *** Misc. common -InformationTitle=Informacja -ConfirmTitle=Potwierd -ErrorTitle=Bd - -; *** SetupLdr messages -SetupLdrStartupMessage=Ten program zainstaluje aplikacj %1. Czy chcesz kontynuowa? -LdrCannotCreateTemp=Nie mona utworzy pliku tymczasowego. Instalacja przerwana -LdrCannotExecTemp=Nie mona uruchomi pliku w folderze tymczasowym. Instalacja przerwana - -; *** Startup error messages -LastErrorMessage=%1.%n%nBd %2: %3 -SetupFileMissing=W folderze instalacyjnym brak pliku %1.%nProsz usun problem lub uzyska now kopi programu instalacyjnego. -SetupFileCorrupt=Pliki skadowe Instalatora s uszkodzone. Prosz uzyska now kopi Instalatora od producenta. -SetupFileCorruptOrWrongVer=Pliki skadowe instalatora s uszkodzone lub niezgodne z t wersj Instalatora. Prosz rozwiza ten problem lub uzyska now kopi Instalatora od producenta. -InvalidParameter=W lini komend zosta przekazany nieprawidowy parametr:%n%n%1 -SetupAlreadyRunning=Instalator jest ju uruchomiony. -WindowsVersionNotSupported=Ten program nie wspiera aktualnie uruchomionej na Twoim komputerze wersji Windows. -WindowsServicePackRequired=Ten program wymaga %1 z dodatkiem Service Pack %2 lub pniejszym. -NotOnThisPlatform=Tego programu nie mona uruchomi w systemie %1. -OnlyOnThisPlatform=Ten program wymaga systemu %1. -OnlyOnTheseArchitectures=Ten program moe by uruchomiony tylko w systemie Windows zaprojektowanym na procesory o architekturach:%n%n%1 -MissingWOW64APIs=Ta wersja systemu Windows nie zawiera komponentw niezbdnych do przeprowadzenia 64 bitowej instalacji. Aby usun ten problem, prosz zainstalowa Service Pack %1. -WinVersionTooLowError=Ten program wymaga %1 w wersji %2 lub pniejszej. -WinVersionTooHighError=Ten program nie moe by zainstalowany w wersji %2 lub pniejszej systemu %1. -AdminPrivilegesRequired=Aby przeprowadzi instalacj tego programu, Uytkownik musi by zalogowany z uprawnieniami administratora. -PowerUserPrivilegesRequired=Aby przeprowadzi instalacj tego programu, Uytkownik musi by zalogowany z uprawnieniami administratora lub uytkownika zaawansowanego. -SetupAppRunningError=Instalator wykry, e %1 jest aktualnie uruchomiony.%n%nZamknij wszystkie okienka tej aplikacji, a potem wybierz przycisk OK, aby kontynuowa, lub Anuluj, aby przerwa instalacj. -UninstallAppRunningError=Deinstalator wykry, e %1 jest aktualnie uruchomiony.%n%nZamknij teraz wszystkie okna tej aplikacji, a nastpnie wybierz przycisk OK, aby kontynuowa, lub Anuluj, aby przerwa deinstalacje. - -; *** Misc. errors -ErrorCreatingDir=Instalator nie mg utworzy foldera "%1" -ErrorTooManyFilesInDir=Nie mona utworzy pliku w folderze %1, poniewa zawiera on za duo plikw - -; *** Setup common messages -ExitSetupTitle=Zakocz instalacj -ExitSetupMessage=Instalacja nie jest zakoczona. Jeeli przerwiesz j teraz, program nie zostanie zainstalowany. Mona ponowi instalacj pniej, uruchamiajc pakiet Instalatora.%n%nCzy chcesz przerwa instalacj ? -AboutSetupMenuItem=&O Instalatorze... -AboutSetupTitle=O Instalatorze -AboutSetupMessage=%1 wersja %2%n%3%n%n Strona domowa %1:%n%4 -AboutSetupNote= -TranslatorNote=Wersja Polska: Krzysztof Cynarski%n<krzysztof at cynarski.net> - -; *** Buttons -ButtonBack=< &Wstecz -ButtonNext=&Dalej > -ButtonInstall=&Instaluj -ButtonOK=OK -ButtonCancel=Anuluj -ButtonYes=&Tak -ButtonYesToAll=Tak na &wszystkie -ButtonNo=&Nie -ButtonNoToAll=N&ie na wszystkie -ButtonFinish=&Zakocz -ButtonBrowse=&Przegldaj... -ButtonWizardBrowse=P&rzegldaj... -ButtonNewFolder=&Utwrz nowy folder - -; *** "Select Language" dialog messages -SelectLanguageTitle=Wybierz jzyk instalacji -SelectLanguageLabel=Wybierz jzyk uywany podczas instalacji: - -; *** Common wizard text -ClickNext=Wybierz przycisk Dalej, aby kontynuowa, lub Anuluj, aby zakoczy instalacj. -BeveledLabel= -BrowseDialogTitle=Wska folder -BrowseDialogLabel=Wybierz folder z poniszej listy, a nastpnie wybierz przycisk OK. -NewFolderName=Nowy folder - -; *** "Welcome" wizard page -WelcomeLabel1=Witamy w Kreatorze instalacji programu [name]. -WelcomeLabel2=Instalator zainstaluje teraz program [name/ver] na Twoim komputerze.%n%nZalecane jest zamknicie wszystkich innych uruchomionych programw przed rozpoczciem procesu instalacji. - -; *** "Password" wizard page -WizardPassword=Haso -PasswordLabel1=Ta instalacja jest zabezpieczona hasem. -PasswordLabel3=Podaj haso, potem wybierz przycisk Dalej, aby kontynuowa. W hasach rozrniane s due i mae litery. -PasswordEditLabel=&Haso: -IncorrectPassword=Wprowadzone haso nie jest poprawne. Sprbuj ponownie. - -; *** "License Agreement" wizard page -WizardLicense=Umowa Licencyjna -LicenseLabel=Przed kontynuacj prosz przeczyta ponisze wane informacje. -LicenseLabel3=Prosz przeczyta tekst Umowy Licencyjnej. Musisz zgodzi si na warunki tej umowy przed kontynuacj instalacji. -LicenseAccepted=&Akceptuj warunki umowy -LicenseNotAccepted=&Nie akceptuj warunkw umowy - -; *** "Information" wizard pages -WizardInfoBefore=Informacja -InfoBeforeLabel=Przed przejciem do dalszego etapu instalacji, prosz przeczyta ponisz informacj. -InfoBeforeClickLabel=Kiedy bdziesz gotowy do instalacji, kliknij przycisk Dalej. -WizardInfoAfter=Informacja -InfoAfterLabel=Przed przejciem do dalszego etapu instalacji, prosz przeczyta ponisz informacj. -InfoAfterClickLabel=Gdy bdziesz gotowy do zakoczenia instalacji, kliknij przycisk Dalej. - -; *** "User Information" wizard page -WizardUserInfo=Dane Uytkownika -UserInfoDesc=Prosz poda swoje dane. -UserInfoName=&Nazwisko: -UserInfoOrg=&Organizacja: -UserInfoSerial=Numer &seryjny: -UserInfoNameRequired=Musisz poda nazwisko. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Wybierz docelow lokalizacj -SelectDirDesc=Gdzie ma by zainstalowany program [name]? -SelectDirLabel3=Instalator zainstaluje program [name] do poniszego folderu. -SelectDirBrowseLabel=Kliknij przycisk Dalej, aby kontynuowa. Jeli chcesz okreli inny folder, kliknij przycisk Przegldaj. -DiskSpaceMBLabel=Potrzeba przynajmniej [mb] MB wolnego miejsca na dysku. -CannotInstallToNetworkDrive=Instalator nie moe zainstalowa programu na dysku sieciowym. -CannotInstallToUNCPath=Instalator nie moe zainstalowa programu w ciece UNC. -InvalidPath=Musisz wprowadzi pen ciek wraz z liter dysku, np.:%n%nC:\PROGRAM%n%nlub sciek sieciow (UNC) w formacie:%n%n\\serwer\udzia -InvalidDrive=Wybrany dysk lub udostpniony folder sieciowy nie istnieje. Prosz wybra inny. -DiskSpaceWarningTitle=Niewystarczajca ilo wolnego miejsca na dysku -DiskSpaceWarning=Instalator wymaga co najmniej %1 KB wolnego miejsca na dysku. Wybrany dysk posiada tylko %2 KB dostpnego miejsca.%n%nCzy pomimo to chcesz kontynuowa? -DirNameTooLong=Nazwa folderu lub cieki jest za duga. -InvalidDirName=Niepoprawna nazwa folderu. -BadDirName32=Nazwa folderu nie moe zawiera adnego z nastpujcych znakw:%n%n%1 -DirExistsTitle=Ten folder ju istnieje -DirExists=Folder%n%n%1%n%nju istnieje. Czy pomimo to chcesz zainstalowa program w tym folderze? -DirDoesntExistTitle=Nie ma takiego folderu -DirDoesntExist=Folder:%n%n%1%n%nnie istnieje. Czy chcesz, aby zosta utworzony? - -; *** "Select Components" wizard page -WizardSelectComponents=Zaznacz komponenty -SelectComponentsDesc=Ktre komponenty maj by zainstalowane? -SelectComponentsLabel2=Zaznacz komponenty, ktre chcesz zainstalowa, odznacz te, ktrych nie chcesz zainstalowa. Kliknij przycisk Dalej, aby kontynuowa. -FullInstallation=Instalacja pena -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Instalacja podstawowa -CustomInstallation=Instalacja uytkownika -NoUninstallWarningTitle=Zainstalowane komponenty -NoUninstallWarning=Instalator wykry, e w twoim komputerze s ju zainstalowane nastpujce komponenty:%n%n%1%n%nOdznaczenie ktregokolwiek z nich nie spowoduje ich deinstalacji.%n%nCzy pomimo tego chcesz kontynuowa? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Wybrane komponenty wymagaj co najmniej [mb] MB na dysku. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Zaznacz dodatkowe zadania -SelectTasksDesc=Ktre dodatkowe zadania maj by wykonane? -SelectTasksLabel2=Zaznacz dodatkowe zadania, ktre Instalator ma wykona podczas instalacji programu [name], a nastpnie kliknij przycisk Dalej, aby kontynuowa. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Wybierz folder Menu Start -SelectStartMenuFolderDesc=Gdzie maj by umieszczone skrty do programu? -SelectStartMenuFolderLabel3=Instalator stworzy skrty do programu w poniszym folderze Menu Start. -SelectStartMenuFolderBrowseLabel=Kliknij przycisk Dalej, aby kontynuowa. Jeli chcesz okreli inny folder, kliknij przycisk Przegldaj. -MustEnterGroupName=Musisz wprowadzi nazw folderu. -GroupNameTooLong=Nazwa folderu lub cieki jest za duga. -InvalidGroupName=Niepoprawna nazwa folderu. -BadGroupName=Nazwa folderu nie moe zawiera adnego z nastpujcych znakw:%n%n%1 -NoProgramGroupCheck2=Nie twrz folderu w &Menu Start - -; *** "Ready to Install" wizard page -WizardReady=Gotowy do rozpoczcia instalacji -ReadyLabel1=Instalator jest ju gotowy do rozpoczcia instalacji programu [name] na twoim komputerze. -ReadyLabel2a=Kliknij przycisk Instaluj, aby rozpocz instalacj lub Wstecz, jeli chcesz przejrze lub zmieni ustawienia. -ReadyLabel2b=Kliknij przycisk Instaluj, aby kontynuowa instalacj. -ReadyMemoUserInfo=Informacje uytkownika: -ReadyMemoDir=Lokalizacja docelowa: -ReadyMemoType=Rodzaj instalacji: -ReadyMemoComponents=Wybrane komponenty: -ReadyMemoGroup=Folder w Menu Start: -ReadyMemoTasks=Dodatkowe zadania: - -; *** "Preparing to Install" wizard page -WizardPreparing=Przygotowanie do instalacji -PreparingDesc=Instalator przygotowuje instalacj programu [name] na Twoim komputerze. -PreviousInstallNotCompleted=Instalacja (usunicie) poprzedniej wersji programu nie zostaa zakoczona. Bdziesz musia ponownie uruchomi komputer, aby zakoczy instalacj. %n%nPo ponownym uruchomieniu komputera uruchom ponownie instalatora, aby zakoczy instalacj aplikacji [name]. -CannotContinue=Instalator nie moe kontynuowa. Kliknij przycisk Anuluj, aby przerwa instalacj. -ApplicationsFound=Ponisze aplikacje uywaj plikw, ktre musz by uaktualnione przez Instalator. Zalecane jest aby pozwoli Instalatorowi automatycznie zamkn te aplikacje. -ApplicationsFound2=Ponisze aplikacje uywaj plikw, ktre musz by uaktualnione przez Instalator. Zalecane jest aby pozwoli Instalatorowi automatycznie zamkn te aplikacje. Po zakoczonej instalacji Instalator podejmie prb ich ponownego uruchomienia. -CloseApplications=&Automatycznie zamknij aplikacje -DontCloseApplications=&Nie zamykaj aplikacji -ErrorCloseApplications=Instalator nie by w stanie zamkn automatycznie wszystkich aplikacji. Zalecane jest zamknicie wszystkich tych aplikacji, ktre akualnie uywaj uakutalnianych przez Instalator plikw. - -; *** "Installing" wizard page -WizardInstalling=Instalacja -InstallingLabel=Poczekaj, a instalator zainstaluje aplikacj [name] na Twoim komputerze. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Zakoczono instalacj programu [name] -FinishedLabelNoIcons=Instalator zakoczy instalacj programu [name] na Twoim komputerze. -FinishedLabel=Instalator zakoczy instalacj programu [name] na Twoim komputerze. Aplikacja moe by uruchomiona poprzez uycie zainstalowanych skrtw. -ClickFinish=Kliknij przycisk Zakocz, aby zakoczy instalacj. -FinishedRestartLabel=Aby zakoczy instalacj programu [name], Instalator musi ponownie uruchomi Twj komputer. Czy chcesz teraz wykona restart komputera? -FinishedRestartMessage=Aby zakoczy instalacj programu [name], Instalator musi ponownie uruchomi Twj komputer.%n%nCzy chcesz teraz wykona restart komputera? -ShowReadmeCheck=Tak, chc przeczyta dodatkowe informacje -YesRadio=&Tak, teraz uruchom ponownie -NoRadio=&Nie, sam zrestartuj pniej -; used for example as 'Run MyProg.exe' -RunEntryExec=Uruchom %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Poka %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Instalator potrzebuje nastpnej dyskietki -SelectDiskLabel2=Prosz woy dyskietk %1 i klikn przycisk OK.%n%nJeli pokazany poniej folder nie okrela pooenia plikw z tej dyskietki, wprowad poprawn ciek lub kliknij przycisk Przegldaj. -PathLabel=&cieka: -FileNotInDir2=Plik "%1" nie zosta znaleziony na dyskietce "%2". Prosz woy waciw dyskietk lub wybra inny folder. -SelectDirectoryLabel=Prosz okreli lokalizacj nastpnej dyskietki. - -; *** Installation phase messages -SetupAborted=Instalacja nie zostaa zakoczona.%n%nProsz rozwiza problem i ponownie rozpocz instalacj. -EntryAbortRetryIgnore=Moesz ponowi nieudan czynno, zignorowa j (nie zalecane) lub przerwa instalacj. - -; *** Installation status messages -StatusClosingApplications=Zamykanie aplikacji... -StatusCreateDirs=Tworzenie folderw... -StatusExtractFiles=Dekompresja plikw... -StatusCreateIcons=Tworzenie ikon aplikacji... -StatusCreateIniEntries=Tworzenie zapisw w plikach INI... -StatusCreateRegistryEntries=Tworzenie zapisw w rejestrze... -StatusRegisterFiles=Rejestracja plikw... -StatusSavingUninstall=Zachowanie informacji deinstalatora... -StatusRunProgram=Koczenie instalacji... -StatusRestartingApplications=Ponowne uruchamianie aplikacji... -StatusRollback=Cofanie zmian... - -; *** Misc. errors -ErrorInternal2=Wewntrzny bd: %1 -ErrorFunctionFailedNoCode=Bd podczas wykonywania %1 -ErrorFunctionFailed=Bd podczas wykonywania %1; kod %2 -ErrorFunctionFailedWithMessage=Bd podczas wykonywania %1; code %2.%n%3 -ErrorExecutingProgram=Nie mona uruchomi:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Bd podczas otwierania klucza rejestru:%n%1\%2 -ErrorRegCreateKey=Bd podczas tworzenia klucza rejestru:%n%1\%2 -ErrorRegWriteKey=Bd podczas zapisu do klucza rejestru:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Bd podczas tworzenia pozycji w pliku INI: "%1". - -; *** File copying errors -FileAbortRetryIgnore=Moesz ponowi nieudan czynno, zignorowa j, aby omin ten plik (nie zalecane), lub przerwa instalacj. -FileAbortRetryIgnore2=Moesz ponowi nieudan czynno, zignorowa j (nie zalecane) lub przerwa instalacj. -SourceIsCorrupted=Plik rdowy jest uszkodzony -SourceDoesntExist=Plik rdowy "%1" nie istnieje -ExistingFileReadOnly=Istniejcy plik jest oznaczony jako tylko-do-odczytu.%n%nMoesz ponowi (aby usun oznaczenie) zignorowa (aby omin ten plik) lub przerwa instalacj. -ErrorReadingExistingDest=Wystpi bd podczas prby odczytu istniejcego pliku: -FileExists=Plik ju istnieje.%n%nCzy chcesz, aby Instalator zamieni go na nowy? -ExistingFileNewer=Istniejcy plik jest nowszy ni ten, ktry Instalator prbuje skopiowa. Zalecanym jest zachowanie istniejcego pliku.%n%nCzy chcesz zachowa istniejcy plik? -ErrorChangingAttr=Wystpi bd podczas prby zmiany atrybutw docelowego pliku: -ErrorCreatingTemp=Wystpi bd podczas prby utworzenia pliku w folderze docelowym: -ErrorReadingSource=Wystpi bd podczas prby odczytu pliku rdowego: -ErrorCopying=Wystpi bd podczas prby kopiowania pliku: -ErrorReplacingExistingFile=Wystpi bd podczas prby zamiany istniejcego pliku: -ErrorRestartReplace=Prba zastpienia plikw podczas restartu komputera nie powioda si. -ErrorRenamingTemp=Wystpi bd podczas prby zmiany nazwy pliku w folderze docelowym: -ErrorRegisterServer=Nie mona zarejestrowa DLL/OCX: %1 -ErrorRegSvr32Failed=Funkcja RegSvr32 zakoczya sie z kodem bdu %1 -ErrorRegisterTypeLib=Nie mog zarejestrowa biblioteki typw: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Wystpi bd podczas prby otwarcia pliku README. -ErrorRestartingComputer=Instalator nie mg zrestartowa tego komputera. Prosz zrobi to samodzielnie. - -; *** Uninstaller messages -UninstallNotFound=Plik "%1" nie istnieje. Nie mona go odinstalowa. -UninstallOpenError=Plik "%1" nie mg by otwarty. Nie mona odinstalowa -UninstallUnsupportedVer=Ta wersja programu deinstalacyjnego nie rozpoznaje formatu logu deinstalacji. Nie mona odinstalowa -UninstallUnknownEntry=W logu deinstalacji wystpia nieznana pozycja (%1) -ConfirmUninstall=Czy na pewno chcesz usun program %1 i wszystkie jego skadniki? -UninstallOnlyOnWin64=Ten program moze by odinstalowany tylo w 64 bitowej wersji systemu Windows. -OnlyAdminCanUninstall=Ta instalacja moe by odinstalowana tylko przez uytkownika z prawami administratora. -UninstallStatusLabel=Poczekaj a program %1 zostanie usunity z Twojego komputera. -UninstalledAll=%1 zosta usunity z Twojego komputera. -UninstalledMost=Odinstalowywanie programu %1 zakoczone.%n%nNiektre elementy nie mogy by usunite. Moesz je usun rcznie. -UninstalledAndNeedsRestart=Twj komputer musi by ponownie uruchomiony, aby zakoczy odinstalowywanie %1.%n%nCzy chcesz teraz ponownie uruchomi komputer? -UninstallDataCorrupted=Plik "%1" jest uszkodzony. Nie mona odinstalowa - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Usun plik wspdzielony? -ConfirmDeleteSharedFile2=System wykry, e nastpujcy plik nie jest ju uywany przez aden program. Czy chcesz odinstalowa ten plik wspdzielony?%n%nJeli inne programy nadal uywaj tego pliku, a zostanie on usunity, mog one przesta dziaa prawidowo. Jeli nie jeste pewny, wybierz przycisk Nie. Pozostawienie tego pliku w Twoim systemie nie spowoduje adnych szkd. -SharedFileNameLabel=Nazwa pliku: -SharedFileLocationLabel=Pooenie: -WizardUninstalling=Stan deinstalacji -StatusUninstalling=Deinstalacja %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Intstalacja %1. -ShutdownBlockReasonUninstallingApp=Dezinstalacja %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 wersja %2 -AdditionalIcons=Dodatkowe ikony: -CreateDesktopIcon=Utwrz ikon na &pulpicie -CreateQuickLaunchIcon=Utwrz ikon na pasku &szybkiego uruchamiania -ProgramOnTheWeb=Strona WWW programu %1 -UninstallProgram=Deinstalacja programu %1 -LaunchProgram=Uruchom program %1 -AssocFileExtension=&Przypisz program %1 do rozszerzenia pliku %2 -AssocingFileExtension=Przypisywanie programu %1 do rozszerzenia pliku %2... -AutoStartProgramGroupDescription=Autostart: -AutoStartProgram=Automatycznie uruchamiaj %1 -AddonHostProgramNotFound=%1 nie zosta znaleziony we wskazanym przez Ciebie folderze.%n%nCzy pomimo tego chcesz kontynuowa? diff --git a/Greenshot/tools/innosetup/Languages/Portuguese.isl b/Greenshot/tools/innosetup/Languages/Portuguese.isl deleted file mode 100644 index 3384ca9e8..000000000 --- a/Greenshot/tools/innosetup/Languages/Portuguese.isl +++ /dev/null @@ -1,318 +0,0 @@ -; *** Inno Setup version 5.5.3+ Portuguese (Portugal) messages *** -; -; Maintained by Nuno Silva (nars AT gmx.net) - -[LangOptions] -LanguageName=Portugu<00EA>s (Portugal) -LanguageID=$0816 -LanguageCodePage=1252 - -[Messages] - -; *** Application titles -SetupAppTitle=Instalao -SetupWindowTitle=%1 - Instalao -UninstallAppTitle=Desinstalao -UninstallAppFullTitle=%1 - Desinstalao - -; *** Misc. common -InformationTitle=Informao -ConfirmTitle=Confirmao -ErrorTitle=Erro - -; *** SetupLdr messages -SetupLdrStartupMessage=Ir ser instalado o %1. Deseja continuar? -LdrCannotCreateTemp=No foi possvel criar um ficheiro temporrio. Instalao cancelada -LdrCannotExecTemp=No foi possvel executar um ficheiro na directoria temporria. Instalao cancelada - -; *** Startup error messages -LastErrorMessage=%1.%n%nErro %2: %3 -SetupFileMissing=O ficheiro %1 no foi encontrado na pasta de instalao. Corrija o problema ou obtenha uma nova cpia do programa. -SetupFileCorrupt=Os ficheiros de instalao esto corrompidos. Obtenha uma nova cpia do programa. -SetupFileCorruptOrWrongVer=Os ficheiros de instalao esto corrompidos, ou so incompatveis com esta verso do Assistente de Instalao. Corrija o problema ou obtenha uma nova cpia do programa. -InvalidParameter=Foi especificado um parmetro invlido na linha de comando:%n%n%1 -SetupAlreadyRunning=A instalao j est em execuo. -WindowsVersionNotSupported=Este programa no suporta a verso do Windows que est a utilizar. -WindowsServicePackRequired=Este programa necessita de %1 Service Pack %2 ou mais recente. -NotOnThisPlatform=Este programa no pode ser executado no %1. -OnlyOnThisPlatform=Este programa deve ser executado no %1. -OnlyOnTheseArchitectures=Este programa s pode ser instalado em verses do Windows preparadas para as seguintes arquitecturas:%n%n%1 -MissingWOW64APIs=A verso do Windows que est a utilizar no dispe das funcionalidades necessrias para o Assistente de Instalao poder realizar uma instalao de 64-bit's. Para corrigir este problema, por favor instale o Service Pack %1. -WinVersionTooLowError=Este programa necessita do %1 verso %2 ou mais recente. -WinVersionTooHighError=Este programa no pode ser instalado no %1 verso %2 ou mais recente. -AdminPrivilegesRequired=Deve iniciar sesso como administrador para instalar este programa. -PowerUserPrivilegesRequired=Deve iniciar sesso como administrador ou membro do grupo de Super Utilizadores para instalar este programa. -SetupAppRunningError=O Assistente de Instalao detectou que o %1 est em execuo. Feche-o e de seguida clique em OK para continuar, ou clique em Cancelar para cancelar a instalao. -UninstallAppRunningError=O Assistente de Desinstalao detectou que o %1 est em execuo. Feche-o e de seguida clique em OK para continuar, ou clique em Cancelar para cancelar a desinstalao. - -; *** Misc. errors -ErrorCreatingDir=O Assistente de Instalao no consegue criar a directoria "%1" -ErrorTooManyFilesInDir=No possvel criar um ficheiro na directoria "%1" porque esta contm demasiados ficheiros - -; *** Setup common messages -ExitSetupTitle=Terminar a instalao -ExitSetupMessage=A instalao no est completa. Se terminar agora, o programa no ser instalado.%n%nMais tarde poder executar novamente este Assistente de Instalao e concluir a instalao.%n%nDeseja terminar a instalao? -AboutSetupMenuItem=&Acerca de... -AboutSetupTitle=Acerca do Assistente de Instalao -AboutSetupMessage=%1 verso %2%n%3%n%n%1 home page:%n%4 -AboutSetupNote= -TranslatorNote=Portuguese translation maintained by NARS (nars@gmx.net) - -; *** Buttons -ButtonBack=< &Anterior -ButtonNext=&Seguinte > -ButtonInstall=&Instalar -ButtonOK=OK -ButtonCancel=Cancelar -ButtonYes=&Sim -ButtonYesToAll=Sim para &todos -ButtonNo=&No -ButtonNoToAll=N&o para todos -ButtonFinish=&Concluir -ButtonBrowse=&Procurar... -ButtonWizardBrowse=P&rocurar... -ButtonNewFolder=&Criar Nova Pasta - -; *** "Select Language" dialog messages -SelectLanguageTitle=Seleccione o Idioma do Assistente de Instalao -SelectLanguageLabel=Seleccione o idioma para usar durante a Instalao: - -; *** Common wizard text -ClickNext=Clique em Seguinte para continuar ou em Cancelar para cancelar a instalao. -BeveledLabel= -BrowseDialogTitle=Procurar Pasta -BrowseDialogLabel=Seleccione uma pasta na lista abaixo e clique em OK. -NewFolderName=Nova Pasta - -; *** "Welcome" wizard page -WelcomeLabel1=Bem-vindo ao Assistente de Instalao do [name] -WelcomeLabel2=O Assistente de Instalao ir instalar o [name/ver] no seu computador.%n%n recomendado que feche todas as outras aplicaes antes de continuar. - -; *** "Password" wizard page -WizardPassword=Palavra-passe -PasswordLabel1=Esta instalao est protegida por palavra-passe. -PasswordLabel3=Insira a palavra-passe e de seguida clique em Seguinte para continuar. Na palavra-passe existe diferena entre maisculas e minsculas. -PasswordEditLabel=&Palavra-passe: -IncorrectPassword=A palavra-passe que introduziu no est correcta. Tente novamente. - -; *** "License Agreement" wizard page -WizardLicense=Contrato de licena -LicenseLabel= importante que leia as seguintes informaes antes de continuar. -LicenseLabel3=Leia atentamente o seguinte contrato de licena. Deve aceitar os termos do contrato antes de continuar a instalao. -LicenseAccepted=A&ceito o contrato -LicenseNotAccepted=&No aceito o contrato - -; *** "Information" wizard pages -WizardInfoBefore=Informao -InfoBeforeLabel= importante que leia as seguintes informaes antes de continuar. -InfoBeforeClickLabel=Quando estiver pronto para continuar clique em Seguinte. -WizardInfoAfter=Informao -InfoAfterLabel= importante que leia as seguintes informaes antes de continuar. -InfoAfterClickLabel=Quando estiver pronto para continuar clique em Seguinte. - -; *** "User Information" wizard page -WizardUserInfo=Informaes do utilizador -UserInfoDesc=Introduza as suas informaes. -UserInfoName=Nome do &utilizador: -UserInfoOrg=&Organizao: -UserInfoSerial=&Nmero de srie: -UserInfoNameRequired=Deve introduzir um nome. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Seleccione a localizao de destino -SelectDirDesc=Onde dever ser instalado o [name]? -SelectDirLabel3=O [name] ser instalado na seguinte pasta. -SelectDirBrowseLabel=Para continuar, clique em Seguinte. Se desejar seleccionar uma pasta diferente, clique em Procurar. -DiskSpaceMBLabel= necessrio pelo menos [mb] MB de espao livre em disco. -CannotInstallToNetworkDrive=O Assistente de Instalao no pode instalar numa unidade de rede. -CannotInstallToUNCPath=O Assistente de Instalao no pode instalar num caminho UNC. -InvalidPath= necessrio indicar o caminho completo com a letra de unidade; por exemplo:%n%nC:\APP%n%nou um caminho UNC no formato:%n%n\\servidor\partilha -InvalidDrive=A unidade ou partilha UNC seleccionada no existe ou no est acessvel. Seleccione outra. -DiskSpaceWarningTitle=No h espao suficiente no disco -DiskSpaceWarning=O Assistente de Instalao necessita de pelo menos %1 KB de espao livre, mas a unidade seleccionada tem apenas %2 KB disponveis.%n%nDeseja continuar de qualquer forma? -DirNameTooLong=O nome ou caminho para a pasta demasiado longo. -InvalidDirName=O nome da pasta no vlido. -BadDirName32=O nome da pasta no pode conter nenhum dos seguintes caracteres:%n%n%1 -DirExistsTitle=A pasta j existe -DirExists=A pasta:%n%n%1%n%nj existe. Pretende instalar nesta pasta? -DirDoesntExistTitle=A pasta no existe -DirDoesntExist=A pasta:%n%n%1%n%nno existe. Pretende que esta pasta seja criada? - -; *** "Select Components" wizard page -WizardSelectComponents=Seleccione os componentes -SelectComponentsDesc=Que componentes devero ser instalados? -SelectComponentsLabel2=Seleccione os componentes que quer instalar e desseleccione os componentes que no quer instalar. Clique em Seguinte quando estiver pronto para continuar. -FullInstallation=Instalao Completa -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Instalao Compacta -CustomInstallation=Instalao Personalizada -NoUninstallWarningTitle=Componentes Encontrados -NoUninstallWarning=O Assistente de Instalao detectou que os seguintes componentes esto instalados no seu computador:%n%n%1%n%nSe desseleccionar estes componentes eles no sero desinstalados.%n%nDeseja continuar? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=A seleco actual necessita de pelo menos [mb] MB de espao em disco. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Seleccione tarefas adicionais -SelectTasksDesc=Que tarefas adicionais devero ser executadas? -SelectTasksLabel2=Seleccione as tarefas adicionais que deseja que o Assistente de Instalao execute na instalao do [name] e em seguida clique em Seguinte. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Seleccione a pasta do Menu Iniciar -SelectStartMenuFolderDesc=Onde devero ser colocados os cones de atalho do programa? -SelectStartMenuFolderLabel3=Os cones de atalho do programa sero criados na seguinte pasta do Menu Iniciar. -SelectStartMenuFolderBrowseLabel=Para continuar, clique em Seguinte. Se desejar seleccionar uma pasta diferente, clique em Procurar. -MustEnterGroupName= necessrio introduzir um nome para a pasta. -GroupNameTooLong=O nome ou caminho para a pasta demasiado longo. -InvalidGroupName=O nome da pasta no vlido. -BadGroupName=O nome da pasta no pode conter nenhum dos seguintes caracteres:%n%n%1 -NoProgramGroupCheck2=&No criar nenhuma pasta no Menu Iniciar - -; *** "Ready to Install" wizard page -WizardReady=Pronto para Instalar -ReadyLabel1=O Assistente de Instalao est pronto para instalar o [name] no seu computador. -ReadyLabel2a=Clique em Instalar para continuar a instalao, ou clique em Anterior se desejar rever ou alterar alguma das configuraes. -ReadyLabel2b=Clique em Instalar para continuar a instalao. -ReadyMemoUserInfo=Informaes do utilizador: -ReadyMemoDir=Localizao de destino: -ReadyMemoType=Tipo de instalao: -ReadyMemoComponents=Componentes seleccionados: -ReadyMemoGroup=Pasta do Menu Iniciar: -ReadyMemoTasks=Tarefas adicionais: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparando-se para instalar -PreparingDesc=Preparando-se para instalar o [name] no seu computador. -PreviousInstallNotCompleted=A instalao/remoo de um programa anterior no foi completada. Necessitar de reiniciar o computador para completar essa instalao.%n%nDepois de reiniciar o computador, execute novamente este Assistente de Instalao para completar a instalao do [name]. -CannotContinue=A instalao no pode continuar. Clique em Cancelar para sair. -ApplicationsFound=As seguintes aplicaes esto a utilizar ficheiros que necessitam ser actualizados pelo Assistente de Instalao. recomendado que permita que o Assistente de Instalao feche estas aplicaes. -ApplicationsFound2=As seguintes aplicaes esto a utilizar ficheiros que necessitam ser actualizados pelo Assistente de Instalao. recomendado que permita que o Assistente de Instalao feche estas aplicaes. Depois de completar a instalao, o Assistente de Instalao tentar reiniciar as aplicaes. -CloseApplications=&Fechar as aplicaes automaticamente -DontCloseApplications=&No fechar as aplicaes -ErrorCloseApplications=O Assistente de Instalao no conseguiu fechar todas as aplicaes automaticamente. Antes de continuar recomendado que feche todas as aplicaes que utilizem ficheiros que necessitem de ser actualizados pelo Assistente de Instalao. - -; *** "Installing" wizard page -WizardInstalling=A instalar -InstallingLabel=Aguarde enquanto o Assistente de Instalao instala o [name] no seu computador. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Instalao do [name] concluda -FinishedLabelNoIcons=O Assistente de Instalao concluiu a instalao do [name] no seu computador. -FinishedLabel=O Assistente de Instalao concluiu a instalao do [name] no seu computador. A aplicao pode ser iniciada atravs dos cones instalados. -ClickFinish=Clique em Concluir para finalizar o Assistente de Instalao. -FinishedRestartLabel=Para completar a instalao do [name], o Assistente de Instalao dever reiniciar o seu computador. Deseja reiniciar agora? -FinishedRestartMessage=Para completar a instalao do [name], o Assistente de Instalao dever reiniciar o seu computador.%n%nDeseja reiniciar agora? -ShowReadmeCheck=Sim, desejo ver o ficheiro LEIAME -YesRadio=&Sim, desejo reiniciar o computador agora -NoRadio=&No, desejo reiniciar o computador mais tarde -; used for example as 'Run MyProg.exe' -RunEntryExec=Executar %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Visualizar %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=O Assistente de Instalao precisa do disco seguinte -SelectDiskLabel2=Introduza o disco %1 e clique em OK.%n%nSe os ficheiros deste disco estiverem num local diferente do mostrado abaixo, indique o caminho correcto ou clique em Procurar. -PathLabel=&Caminho: -FileNotInDir2=O ficheiro "%1" no foi encontrado em "%2". Introduza o disco correcto ou seleccione outra pasta. -SelectDirectoryLabel=Indique a localizao do disco seguinte. - -; *** Installation phase messages -SetupAborted=A instalao no est completa.%n%nCorrija o problema e execute o Assistente de Instalao novamente. -EntryAbortRetryIgnore=Clique em Repetir para tentar novamente, Ignorar para continuar de qualquer forma, ou Abortar para cancelar a instalao. - -; *** Installation status messages -StatusClosingApplications=A fechar aplicaes... -StatusCreateDirs=A criar directorias... -StatusExtractFiles=A extrair ficheiros... -StatusCreateIcons=A criar atalhos... -StatusCreateIniEntries=A criar entradas em INI... -StatusCreateRegistryEntries=A criar entradas no registo... -StatusRegisterFiles=A registar ficheiros... -StatusSavingUninstall=A guardar informaes para desinstalao... -StatusRunProgram=A concluir a instalao... -StatusRestartingApplications=A reiniciar aplicaes... -StatusRollback=A anular as alteraes... - -; *** Misc. errors -ErrorInternal2=Erro interno: %1 -ErrorFunctionFailedNoCode=%1 falhou -ErrorFunctionFailed=%1 falhou; cdigo %2 -ErrorFunctionFailedWithMessage=%1 falhou; cdigo %2.%n%3 -ErrorExecutingProgram=No possvel executar o ficheiro:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Erro ao abrir a chave de registo:%n%1\%2 -ErrorRegCreateKey=Erro ao criar a chave de registo:%n%1\%2 -ErrorRegWriteKey=Erro ao escrever na chave de registo:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Erro ao criar entradas em INI no ficheiro "%1". - -; *** File copying errors -FileAbortRetryIgnore=Clique em Repetir para tentar novamente, Ignorar para ignorar este ficheiro (no recomendado), ou Abortar para cancelar a instalao. -FileAbortRetryIgnore2=Clique em Repetir para tentar novamente, Ignorar para continuar de qualquer forma (no recomendado), ou Abortar para cancelar a instalao. -SourceIsCorrupted=O ficheiro de origem est corrompido -SourceDoesntExist=O ficheiro de origem "%1" no existe -ExistingFileReadOnly=O ficheiro existente tem o atributo "s de leitura".%n%nClique em Repetir para remover o atributo "s de leitura" e tentar novamente, Ignorar para ignorar este ficheiro, ou Abortar para cancelar a instalao. -ErrorReadingExistingDest=Ocorreu um erro ao tentar ler o ficheiro existente: -FileExists=O ficheiro j existe.%n%nDeseja substitu-lo? -ExistingFileNewer=O ficheiro existente mais recente que o que est a ser instalado. recomendado que mantenha o ficheiro existente.%n%nDeseja manter o ficheiro existente? -ErrorChangingAttr=Ocorreu um erro ao tentar alterar os atributos do ficheiro existente: -ErrorCreatingTemp=Ocorreu um erro ao tentar criar um ficheiro na directoria de destino: -ErrorReadingSource=Ocorreu um erro ao tentar ler o ficheiro de origem: -ErrorCopying=Ocorreu um erro ao tentar copiar um ficheiro: -ErrorReplacingExistingFile=Ocorreu um erro ao tentar substituir o ficheiro existente: -ErrorRestartReplace=RestartReplace falhou: -ErrorRenamingTemp=Ocorreu um erro ao tentar mudar o nome de um ficheiro na directoria de destino: -ErrorRegisterServer=No possvel registar o DLL/OCX: %1 -ErrorRegSvr32Failed=O RegSvr32 falhou com o cdigo de sada %1 -ErrorRegisterTypeLib=No foi possvel registar a livraria de tipos: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Ocorreu um erro ao tentar abrir o ficheiro LEIAME. -ErrorRestartingComputer=O Assistente de Instalao no consegue reiniciar o computador. Por favor reinicie manualmente. - -; *** Uninstaller messages -UninstallNotFound=O ficheiro "%1" no existe. No possvel desinstalar. -UninstallOpenError=No foi possvel abrir o ficheiro "%1". No possvel desinstalar. -UninstallUnsupportedVer=O ficheiro log de desinstalao "%1" est num formato que no reconhecido por esta verso do desinstalador. No possvel desinstalar -UninstallUnknownEntry=Foi encontrada uma entrada desconhecida (%1) no ficheiro log de desinstalao -ConfirmUninstall=Tem a certeza que deseja remover completamente o %1 e todos os seus componentes? -UninstallOnlyOnWin64=Esta desinstalao s pode ser realizada na verso de 64-bit's do Windows. -OnlyAdminCanUninstall=Esta desinstalao s pode ser realizada por um utilizador com privilgios administrativos. -UninstallStatusLabel=Por favor aguarde enquanto o %1 est a ser removido do seu computador. -UninstalledAll=O %1 foi removido do seu computador com sucesso. -UninstalledMost=A desinstalao do %1 est concluda.%n%nAlguns elementos no puderam ser removidos. Estes elementos podem ser removidos manualmente. -UninstalledAndNeedsRestart=Para completar a desinstalao do %1, o computador deve ser reiniciado.%n%nDeseja reiniciar agora? -UninstallDataCorrupted=O ficheiro "%1" est corrompido. No possvel desinstalar - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Remover ficheiro partilhado? -ConfirmDeleteSharedFile2=O sistema indica que o seguinte ficheiro partilhado j no est a ser utilizado por nenhum programa. Deseja remov-lo?%n%nSe algum programa ainda necessitar deste ficheiro, poder no funcionar correctamente depois de o remover. Se no tiver a certeza, seleccione No. Manter o ficheiro no causar nenhum problema. -SharedFileNameLabel=Nome do ficheiro: -SharedFileLocationLabel=Localizao: -WizardUninstalling=Estado da desinstalao -StatusUninstalling=A desinstalar o %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=A instalar %1. -ShutdownBlockReasonUninstallingApp=A desinstalar %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 verso %2 -AdditionalIcons=cones adicionais: -CreateDesktopIcon=Criar cone no Ambiente de &Trabalho -CreateQuickLaunchIcon=&Criar cone na barra de Iniciao Rpida -ProgramOnTheWeb=%1 na Web -UninstallProgram=Desinstalar o %1 -LaunchProgram=Executar o %1 -AssocFileExtension=Associa&r o %1 aos ficheiros com a extenso %2 -AssocingFileExtension=A associar o %1 aos ficheiros com a extenso %2... -AutoStartProgramGroupDescription=Inicializao Automtica: -AutoStartProgram=Iniciar %1 automaticamente -AddonHostProgramNotFound=No foi possvel localizar %1 na pasta seleccionada.%n%nDeseja continuar de qualquer forma? diff --git a/Greenshot/tools/innosetup/Languages/Russian.isl b/Greenshot/tools/innosetup/Languages/Russian.isl deleted file mode 100644 index 373603770..000000000 --- a/Greenshot/tools/innosetup/Languages/Russian.isl +++ /dev/null @@ -1,324 +0,0 @@ -; *** Inno Setup version 5.5.3+ Russian messages *** -; -; Translated from English by Dmitry Kann, http://yktoo.com/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -LanguageName=<0420><0443><0441><0441><043A><0438><0439> -LanguageID=$0419 -LanguageCodePage=1251 - -[Messages] - -; *** Application titles -SetupAppTitle= -SetupWindowTitle= %1 -UninstallAppTitle= -UninstallAppFullTitle= %1 - -; *** Misc. common -InformationTitle= -ConfirmTitle= -ErrorTitle= - -; *** SetupLdr messages -SetupLdrStartupMessage= %1 , ? -LdrCannotCreateTemp= . -LdrCannotExecTemp= . - -; *** Startup error messages -LastErrorMessage=%1.%n%n %2: %3 -SetupFileMissing= %1 . , . -SetupFileCorrupt= . , . -SetupFileCorruptOrWrongVer= . , . -InvalidParameter= :%n%n%1 -SetupAlreadyRunning= . -WindowsVersionNotSupported= Windows, . -WindowsServicePackRequired= %1 Service Pack %2 . -NotOnThisPlatform= %1. -OnlyOnThisPlatform= %1. -OnlyOnTheseArchitectures= Windows :%n%n%1 -MissingWOW64APIs= Windows, , , 64- . , (Service Pack) %1. -WinVersionTooLowError= %1 %2 . -WinVersionTooHighError= %1 %2 . -AdminPrivilegesRequired= , . -PowerUserPrivilegesRequired= , (Power Users). -SetupAppRunningError= %1.%n%n, , OK, , , . -UninstallAppRunningError= %1.%n%n, , OK, , , . - -; *** Misc. errors -ErrorCreatingDir= "%1" -ErrorTooManyFilesInDir= "%1", - -; *** Setup common messages -ExitSetupTitle= -ExitSetupMessage= . , .%n%n , .%n%n ? -AboutSetupMenuItem=& ... -AboutSetupTitle= -AboutSetupMessage=%1, %2%n%3%n%n %1:%n%4 -AboutSetupNote= -TranslatorNote=Russian translation by Dmitry Kann, http://www.dk-soft.org/ - -; *** Buttons -ButtonBack=< & -ButtonNext=& > -ButtonInstall=& -ButtonOK=OK -ButtonCancel= -ButtonYes=& -ButtonYesToAll= & -ButtonNo=& -ButtonNoToAll=& -ButtonFinish=& -ButtonBrowse=&... -ButtonWizardBrowse=&... -ButtonNewFolder=& - -; *** "Select Language" dialog messages -SelectLanguageTitle= -SelectLanguageLabel= , : - -; *** Common wizard text -ClickNext= , , , . -BeveledLabel= -BrowseDialogTitle= -BrowseDialogLabel= ʻ. -NewFolderName= - -; *** "Welcome" wizard page -WelcomeLabel1= [name] -WelcomeLabel2= [name/ver] .%n%n , . - -; *** "Password" wizard page -WizardPassword= -PasswordLabel1= . -PasswordLabel3=, , . . -PasswordEditLabel=&: -IncorrectPassword= . , . - -; *** "License Agreement" wizard page -WizardLicense= -LicenseLabel=, , . -LicenseLabel3=, . , . -LicenseAccepted= & -LicenseNotAccepted= & - -; *** "Information" wizard pages -WizardInfoBefore= -InfoBeforeLabel=, , . -InfoBeforeClickLabel= , . -WizardInfoAfter= -InfoAfterLabel=, , . -InfoAfterClickLabel= , . - -; *** "User Information" wizard page -WizardUserInfo= -UserInfoDesc=, . -UserInfoName=& : -UserInfoOrg=&: -UserInfoSerial=& : -UserInfoNameRequired= . - -; *** "Select Destination Location" wizard page -WizardSelectDir= -SelectDirDesc= [name]? -SelectDirLabel3= [name] . -SelectDirBrowseLabel= , . , . -DiskSpaceMBLabel= [mb] . -CannotInstallToNetworkDrive= . -CannotInstallToUNCPath= UNC-. -InvalidPath= ; :%n%nC:\APP%n%n UNC:%n%n\\_\_ -InvalidDrive= . , . -DiskSpaceWarningTitle= -DiskSpaceWarning= %1 , %2 .%n%n ? -DirNameTooLong= . -InvalidDirName= . -BadDirName32= : %n%n%1 -DirExistsTitle= -DirExists=%n%n%1%n%n . ? -DirDoesntExistTitle= -DirDoesntExist=%n%n%1%n%n . ? - -; *** "Select Components" wizard page -WizardSelectComponents= -SelectComponentsDesc= ? -SelectComponentsLabel2= , ; , . , . -FullInstallation= -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation= -CustomInstallation= -NoUninstallWarningTitle= -NoUninstallWarning= , :%n%n%1%n%n .%n%n? -ComponentSize1=%1 -ComponentSize2=%1 -ComponentsDiskSpaceMBLabel= [mb] . - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks= -SelectTasksDesc= ? -SelectTasksLabel2= , [name], : - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup= -SelectStartMenuFolderDesc= ? -SelectStartMenuFolderLabel3= . -SelectStartMenuFolderBrowseLabel= , . , . -MustEnterGroupName= . -GroupNameTooLong= . -InvalidGroupName= . -BadGroupName= :%n%n%1 -NoProgramGroupCheck2=& - -; *** "Ready to Install" wizard page -WizardReady= -ReadyLabel1= [name] . -ReadyLabel2a= , , , . -ReadyLabel2b= , . -ReadyMemoUserInfo= : -ReadyMemoDir= : -ReadyMemoType= : -ReadyMemoComponents= : -ReadyMemoGroup= : -ReadyMemoTasks= : - -; *** "Preparing to Install" wizard page -WizardPreparing= -PreparingDesc= [name] . -PreviousInstallNotCompleted= . , .%n%n , [name]. -CannotContinue= . . -ApplicationsFound= , . . -ApplicationsFound2= , . . , . -CloseApplications=& -DontCloseApplications=& -ErrorCloseApplications= . , , . - -; *** "Installing" wizard page -WizardInstalling=... -InstallingLabel=, , [name] . - -; *** "Setup Completed" wizard page -FinishedHeadingLabel= [name] -FinishedLabelNoIcons= [name] . -FinishedLabel= [name] . . -ClickFinish= , . -FinishedRestartLabel= [name] . ? -FinishedRestartMessage= [name] .%n%n ? -ShowReadmeCheck= README -YesRadio=&, -NoRadio=&, -; used for example as 'Run MyProg.exe' -RunEntryExec= %1 -; used for example as 'View Readme.txt' -RunEntryShellExec= %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle= -SelectDiskLabel2=, %1 OK.%n%n , , . -PathLabel=&: -FileNotInDir2= "%1" "%2". , . -SelectDirectoryLabel=, . - -; *** Installation phase messages -SetupAborted= .%n%n, . -EntryAbortRetryIgnore= , , , , . - -; *** Installation status messages -StatusClosingApplications= ... -StatusCreateDirs= ... -StatusExtractFiles= ... -StatusCreateIcons= ... -StatusCreateIniEntries= INI-... -StatusCreateRegistryEntries= ... -StatusRegisterFiles= ... -StatusSavingUninstall= ... -StatusRunProgram= ... -StatusRestartingApplications= ... -StatusRollback= ... - -; *** Misc. errors -ErrorInternal2= : %1 -ErrorFunctionFailedNoCode=%1: -ErrorFunctionFailed=%1: ; %2 -ErrorFunctionFailedWithMessage=%1: ; %2.%n%3 -ErrorExecutingProgram= :%n%1 - -; *** Registry errors -ErrorRegOpenKey= :%n%1\%2 -ErrorRegCreateKey= :%n%1\%2 -ErrorRegWriteKey= :%n%1\%2 - -; *** INI errors -ErrorIniEntry= INI- "%1". - -; *** File copying errors -FileAbortRetryIgnore= , , , ( ) . -FileAbortRetryIgnore2= , , , ( ) . -SourceIsCorrupted= -SourceDoesntExist= "%1" -ExistingFileReadOnly= .%n%n , , . -ErrorReadingExistingDest= : -FileExists= .%n%n ? -ExistingFileNewer= , . .%n%n ? -ErrorChangingAttr= : -ErrorCreatingTemp= : -ErrorReadingSource= : -ErrorCopying= : -ErrorReplacingExistingFile= : -ErrorRestartReplace= RestartReplace: -ErrorRenamingTemp= : -ErrorRegisterServer= DLL/OCX: %1 -ErrorRegSvr32Failed= RegSvr32, %1 -ErrorRegisterTypeLib= (Type Library): %1 - -; *** Post-installation errors -ErrorOpeningReadme= README. -ErrorRestartingComputer= . , . - -; *** Uninstaller messages -UninstallNotFound= "%1" , . -UninstallOpenError= "%1". -UninstallUnsupportedVer= "%1" -. -UninstallUnknownEntry= (%1) -ConfirmUninstall= %1 ? -UninstallOnlyOnWin64= 64- Windows. -OnlyAdminCanUninstall= . -UninstallStatusLabel=, , %1 . -UninstalledAll= %1 . -UninstalledMost= %1 .%n%n . . -UninstalledAndNeedsRestart= %1 .%n%n ? -UninstallDataCorrupted= "%1" . - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle= ? -ConfirmDeleteSharedFile2= , . ?%n%n - , , . , . . -SharedFileNameLabel= : -SharedFileLocationLabel=: -WizardUninstalling= -StatusUninstalling= %1... - - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp= %1. -ShutdownBlockReasonUninstallingApp= %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1, %2 -AdditionalIcons= : -CreateDesktopIcon= & -CreateQuickLaunchIcon= & -ProgramOnTheWeb= %1 -UninstallProgram= %1 -LaunchProgram= %1 -AssocFileExtension=& %1 , %2 -AssocingFileExtension= %1 %2... -AutoStartProgramGroupDescription=: -AutoStartProgram= %1 -AddonHostProgramNotFound=%1 .%n%n ? diff --git a/Greenshot/tools/innosetup/Languages/SerbianCyrillic.isl b/Greenshot/tools/innosetup/Languages/SerbianCyrillic.isl deleted file mode 100644 index 0ea72f5e0..000000000 --- a/Greenshot/tools/innosetup/Languages/SerbianCyrillic.isl +++ /dev/null @@ -1,338 +0,0 @@ -; *** Inno Setup version 5.5.3+ Serbian (Cyrillic) messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Translated by Rancher (theranchcowboy@gmail.com). -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=<0421><0440><043F><0441><043A><0438> -LanguageID=$0C1A -LanguageCodePage=1251 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle= -SetupWindowTitle= %1 -UninstallAppTitle= -UninstallAppFullTitle= %1 - -; *** Misc. common -InformationTitle= -ConfirmTitle= -ErrorTitle= - -; *** SetupLdr messages -SetupLdrStartupMessage= %1. ? -LdrCannotCreateTemp= . . -LdrCannotExecTemp= . . - -; *** Startup error messages -LastErrorMessage=%1.%n%n %2: %3 -SetupFileMissing= %1 . . -SetupFileCorrupt= . . -SetupFileCorruptOrWrongVer= . . -InvalidParameter= : %n%n%1 -SetupAlreadyRunning= . -WindowsVersionNotSupported= . -WindowsServicePackRequired= %1 %2 . -NotOnThisPlatform= %1. -OnlyOnThisPlatform= %1. -OnlyOnTheseArchitectures= :%n%n%1 -MissingWOW64APIs= 64- . %1 . -WinVersionTooLowError= %1, %2 . -WinVersionTooHighError= %1 %2 . -AdminPrivilegesRequired= . -PowerUserPrivilegesRequired= . -SetupAppRunningError= %1 .%n%n . -UninstallAppRunningError= %1 .%n%n . - -; *** Misc. errors -ErrorCreatingDir= %1. -ErrorTooManyFilesInDir= %1 . - -; *** Setup common messages -ExitSetupTitle= -ExitSetupMessage= . , .%n%n .%n%n ? -AboutSetupMenuItem=& -AboutSetupTitle= -AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4 -AboutSetupNote= -TranslatorNote=Serbian translation by Rancher. - -; *** Buttons -ButtonBack=< & -ButtonNext=& > -ButtonInstall=& -ButtonOK=& -ButtonCancel=& -ButtonYes=& -ButtonYesToAll=& -ButtonNo=& -ButtonNoToAll=& -ButtonFinish=& -ButtonBrowse=& -ButtonWizardBrowse=& -ButtonNewFolder=& - -; *** "Select Language" dialog messages -SelectLanguageTitle= -SelectLanguageLabel= : - -; *** Common wizard text -ClickNext= . -BeveledLabel= -BrowseDialogTitle= -BrowseDialogLabel= . -NewFolderName= - -; *** "Welcome" wizard page -WelcomeLabel1= [name] -WelcomeLabel2= [name/ver] .%n%n , . - -; *** "Password" wizard page -WizardPassword= -PasswordLabel1= . -PasswordLabel3= . . -PasswordEditLabel=&: -IncorrectPassword= . . - -; *** "License Agreement" wizard -WizardLicense= -LicenseLabel= . -LicenseLabel3= . . -LicenseAccepted=& -LicenseNotAccepted=& - -; *** "Information" wizard pages -WizardInfoBefore= -InfoBeforeLabel= . -InfoBeforeClickLabel= , . -WizardInfoAfter= -InfoAfterLabel= . -InfoAfterClickLabel= , . - -; *** "User Information" wizard page -WizardUserInfo= -UserInfoDesc= . -UserInfoName=&: -UserInfoOrg=&: -UserInfoSerial=& : -UserInfoNameRequired= . - -; *** "Select Destination Location" wizard page -WizardSelectDir= -SelectDirDesc= [name]. -SelectDirLabel3= [name] . -SelectDirBrowseLabel= . , 腓. -DiskSpaceMBLabel= [mb] MB . -CannotInstallToNetworkDrive= . -CannotInstallToUNCPath= UNC . -InvalidPath= (.%n%nC:\APP%n%n %n%n\\server\shre) -InvalidDrive= . . -DiskSpaceWarningTitle= -DiskSpaceWarning= %1 kB , %2 kB.%n%n ? -DirNameTooLong= . -InvalidDirName= . -BadDirName32= :%n%n%1 -DirExistsTitle= -DirExists=:%n%n%1%n%n . ? -DirDoesntExistTitle= -DirDoesntExist=:%n%n%1%n%n . ? - -; *** "Select Components" wizard page -WizardSelectComponents= -SelectComponentsDesc= ? -SelectComponentsLabel2= , . . -FullInstallation= -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation= -CustomInstallation= -NoUninstallWarningTitle= -NoUninstallWarning= :%n%n%1%n%n .%n%n ? -ComponentSize1=%1 kB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel= [mb] MB . - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks= -SelectTasksDesc= . -SelectTasksLabel2= [name] . - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup= -SelectStartMenuFolderDesc= . -SelectStartMenuFolderLabel3= . -SelectStartMenuFolderBrowseLabel= . , 腓. -MustEnterGroupName= . -GroupNameTooLong= . -InvalidGroupName= . -BadGroupName= :%n%n%1 -NoProgramGroupCheck2=& - -; *** "Ready to Install" wizard page -WizardReady= -ReadyLabel1= [name] . -ReadyLabel2a= ༓ . -ReadyLabel2b= ༓ . -ReadyMemoUserInfo= : -ReadyMemoDir= : -ReadyMemoType= : -ReadyMemoComponents= : -ReadyMemoGroup= : -ReadyMemoTasks= : - -; *** "Preparing to Install" wizard page -WizardPreparing= -PreparingDesc= [name] . -PreviousInstallNotCompleted= . .%n%n , [name]. -CannotContinue= . . -ApplicationsFound= . . -ApplicationsFound2= . . , . -CloseApplications=& -DontCloseApplications=& -ErrorCloseApplications= . , . - -; *** "Installing" wizard page -WizardInstalling= -InstallingLabel= [name] . - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=[name] -FinishedLabelNoIcons= [name] . -FinishedLabel= [name] . . -ClickFinish= . -FinishedRestartLabel= . ? -FinishedRestartMessage= .%n%n ? -ShowReadmeCheck=, -YesRadio=&, -NoRadio=&, -; used for example as 'Run MyProg.exe' -RunEntryExec=& %1 -; used for example as 'View Readme.txt' -RunEntryShellExec= %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle= -SelectDiskLabel2= %1 .%n%n , 腓. -PathLabel=&: -FileNotInDir2= %1 %2. . -SelectDirectoryLabel= . - -; *** Installation phase messages -SetupAborted= .%n%n . -EntryAbortRetryIgnore= , . - -; *** Installation status messages -StatusClosingApplications= -StatusCreateDirs= -StatusExtractFiles= -StatusCreateIcons= -StatusCreateIniEntries= INI -StatusCreateRegistryEntries= -StatusRegisterFiles= -StatusSavingUninstall= -StatusRunProgram= -StatusRestartingApplications= -StatusRollback= - -; *** Misc. errors -ErrorInternal2= : %1 -ErrorFunctionFailedNoCode=%1 -ErrorFunctionFailed=%1 ; %2 -ErrorFunctionFailedWithMessage=%1 ; %2.%n%3 -ErrorExecutingProgram= :%n%1 - -; *** Registry errors -ErrorRegOpenKey= :%n%1\%2 -ErrorRegCreateKey= :%n%1\%2 -ErrorRegWriteKey= :%n%1\%2 - -; *** INI errors -ErrorIniEntry= INI %1. - -; *** File copying errors -FileAbortRetryIgnore= , ( ) . -FileAbortRetryIgnore2= , ( ) . -SourceIsCorrupted= -SourceDoesntExist= %1 -ExistingFileReadOnly= .%n%n , . -ErrorReadingExistingDest= : -FileExists= .%n%n ? -ExistingFileNewer= . .%n%n ? -ErrorChangingAttr= : -ErrorCreatingTemp= : -ErrorReadingSource= : -ErrorCopying= : -ErrorReplacingExistingFile= : -ErrorRestartReplace= : -ErrorRenamingTemp= : -ErrorRegisterServer= DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 . %1 -ErrorRegisterTypeLib= : %1 - -; *** Post-installation errors -ErrorOpeningReadme= . -ErrorRestartingComputer= . . - -; *** Uninstaller messages -UninstallNotFound= %1 . . -UninstallOpenError= %1 . . -UninstallUnsupportedVer= %1 . . -UninstallUnknownEntry= (%1) . -ConfirmUninstall= %1 ? -UninstallOnlyOnWin64= 64- . -OnlyAdminCanUninstall= . -UninstallStatusLabel= %1 . -UninstalledAll=%1 . -UninstalledMost=%1 .%n%n . -UninstalledAndNeedsRestart= .%n%n ? -UninstallDataCorrupted= %1 . . - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle= -ConfirmDeleteSharedFile2= . ?%n%n , . , . . -SharedFileNameLabel= : -SharedFileLocationLabel=: -WizardUninstalling= -StatusUninstalling= %1 - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp= %1. -ShutdownBlockReasonUninstallingApp= %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 %2 -AdditionalIcons= : -CreateDesktopIcon=& -CreateQuickLaunchIcon=& -ProgramOnTheWeb=%1 -UninstallProgram= %1 -LaunchProgram= %1 -AssocFileExtension=& %1 %2 -AssocingFileExtension= %1 %2 -AutoStartProgramGroupDescription=: -AutoStartProgram= %1 -AddonHostProgramNotFound=%1 .%n%n ? diff --git a/Greenshot/tools/innosetup/Languages/SerbianLatin.isl b/Greenshot/tools/innosetup/Languages/SerbianLatin.isl deleted file mode 100644 index 4c28549d7..000000000 --- a/Greenshot/tools/innosetup/Languages/SerbianLatin.isl +++ /dev/null @@ -1,338 +0,0 @@ -; *** Inno Setup version 5.5.3+ Serbian (Latin) messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Translated by Rancher (theranchcowboy@gmail.com). -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Srpski -LanguageID=$081a -LanguageCodePage=1250 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Instalacija -SetupWindowTitle=Instalacija %1 -UninstallAppTitle=Deinstalacija -UninstallAppFullTitle=Deinstalacija programa %1 - -; *** Misc. common -InformationTitle=Podaci -ConfirmTitle=Potvrda -ErrorTitle=Greka - -; *** SetupLdr messages -SetupLdrStartupMessage=Instaliraete %1. elite li da nastavite? -LdrCannotCreateTemp=Ne mogu da napravim privremenu datoteku. Instalacija je prekinuta. -LdrCannotExecTemp=Ne mogu da pokrenem datoteku u privremenoj fascikli. Instalacija je prekinuta. - -; *** Startup error messages -LastErrorMessage=%1.%n%nGreka %2: %3 -SetupFileMissing=Datoteka %1 nedostaje u instalacionoj fascikli. Ispravite problem ili nabavite novi primerak programa. -SetupFileCorrupt=Instalacione datoteke su oteene. Nabavite novi primerak programa. -SetupFileCorruptOrWrongVer=Instalacione datoteke su oteene ili nisu saglasne s ovom verzijom instalacije. Ispravite problem ili nabavite novi primerak programa. -InvalidParameter=Neispravan parametar je prenet na komandnu liniju: %n%n%1 -SetupAlreadyRunning=Instalacija je ve pokrenuta. -WindowsVersionNotSupported=Program ne podrava izdanje vindousa koje koristite. -WindowsServicePackRequired=Program zahteva %1 servisni paket %2 ili noviji. -NotOnThisPlatform=Program nee raditi na %1. -OnlyOnThisPlatform=Program e raditi na %1. -OnlyOnTheseArchitectures=Program se moe instalirati samo na izdanjima vindousa koji rade na sledeim arhitekturama procesora:%n%n%1 -MissingWOW64APIs=Izdanje vindousa koje koristite ne sadri funkcionalnost potrebnu za izvravanje 64-bitnih instalacija. Instalirajte servisni paket %1 da biste reili ovaj problem. -WinVersionTooLowError=Program zahteva %1, izdanje %2 ili novije. -WinVersionTooHighError=Program ne moete instalirati na %1 izdanju %2 ili novijem. -AdminPrivilegesRequired=Morate biti prijavljeni kao administrator da biste instalirali program. -PowerUserPrivilegesRequired=Morate biti prijavljeni kao administrator ili ovlaeni korisnik da biste instalirali program. -SetupAppRunningError=Program %1 je trenutno pokrenut.%n%nZatvorite ga i kliknite na dugme U redu da nastavite ili Otkai da napustite instalaciju. -UninstallAppRunningError=Program %1 je trenutno pokrenut.%n%nZatvorite ga i kliknite na dugme U redu da nastavite ili Otkai da napustite instalaciju. - -; *** Misc. errors -ErrorCreatingDir=Ne mogu da napravim fasciklu %1. -ErrorTooManyFilesInDir=Ne mogu da napravim datoteku u fascikli %1 jer sadri previe datoteka. - -; *** Setup common messages -ExitSetupTitle=Naputanje instalacije -ExitSetupMessage=Instalacija nije zavrena. Ako sada izaete, program nee biti instaliran.%n%nInstalaciju moete pokrenuti i dovriti nekom dugom prilikom.%n%nelite li da je zatvorite? -AboutSetupMenuItem=&O programu -AboutSetupTitle=Podaci o programu -AboutSetupMessage=%1 verzija %2%n%3%n%n%1 matina stranica:%n%4 -AboutSetupNote= -TranslatorNote=Serbian translation by Rancher. - -; *** Buttons -ButtonBack=< &Nazad -ButtonNext=&Dalje > -ButtonInstall=&Instaliraj -ButtonOK=&U redu -ButtonCancel=&Otkai -ButtonYes=&Da -ButtonYesToAll=D&a za sve -ButtonNo=&Ne -ButtonNoToAll=N&e za sve -ButtonFinish=&Zavri -ButtonBrowse=&Potrai -ButtonWizardBrowse=&Potrai -ButtonNewFolder=&Napravi fasciklu - -; *** "Select Language" dialog messages -SelectLanguageTitle=Odabir jezika -SelectLanguageLabel=Izaberite jezik tokom instalacije: - -; *** Common wizard text -ClickNext=Kliknite na Dalje da nastavite ili Otkai da napustite instalaciju. -BeveledLabel= -BrowseDialogTitle=Odabir fascikle -BrowseDialogLabel=Izaberite fasciklu sa spiska i kliknite na U redu. -NewFolderName=Nova fascikla - -; *** "Welcome" wizard page -WelcomeLabel1=Dobro doli na instalaciju programa [name] -WelcomeLabel2=Instaliraete [name/ver] na raunar.%n%nPre nego to nastavite, preporuujemo vam da zatvorite sve druge programe. - -; *** "Password" wizard page -WizardPassword=Lozinka -PasswordLabel1=Instalacija je zatiena lozinkom. -PasswordLabel3=Unesite lozinku i kliknite na Dalje da nastavite. Imajte na umu da je lozinka osetljiva na mala i velika slova. -PasswordEditLabel=&Lozinka: -IncorrectPassword=Navedena lozinka nije ispravna. Pokuajte ponovo. - -; *** "License Agreement" wizard -WizardLicense=Ugovor o licenci -LicenseLabel=Paljivo proitajte sledee pre nego to nastavite. -LicenseLabel3=Proitajte Ugovor o licenci koji se nalazi ispod. Morate prihvatiti uslove ovog ugovora pre nego to nastavite. -LicenseAccepted=&Prihvatam ugovor -LicenseNotAccepted=&Ne prihvatam ugovor - -; *** "Information" wizard pages -WizardInfoBefore=Informacije -InfoBeforeLabel=Paljivo proitajte sledee pre nego to nastavite. -InfoBeforeClickLabel=Kada budete spremni da nastavite instalaciju, kliknite na Dalje. -WizardInfoAfter=Informacije -InfoAfterLabel=Paljivo proitajte sledee pre nego to nastavite. -InfoAfterClickLabel=Kada budete spremni da nastavite instalaciju, kliknite na Dalje. - -; *** "User Information" wizard page -WizardUserInfo=Korisniki podaci -UserInfoDesc=Unesite svoje podatke. -UserInfoName=&Korisnik: -UserInfoOrg=&Organizacija: -UserInfoSerial=&Serijski broj: -UserInfoNameRequired=Morate navesti ime. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Odabir odredine fascikle -SelectDirDesc=Izaberite mesto na kom elite da instalirate [name]. -SelectDirLabel3=Program e instalirati [name] u sledeu fasciklu. -SelectDirBrowseLabel=Kliknite na Dalje da nastavite. Ako elite da izaberete drugu fasciklu, kliknite na Potrai. -DiskSpaceMBLabel=Potrebno je najmanje [mb] MB slobodnog prostora na disku. -CannotInstallToNetworkDrive=Ne mogu da instaliram na mrenu jedinicu. -CannotInstallToUNCPath=Ne mogu da instaliram na UNC putanju. -InvalidPath=Morate navesti punu putanju s obelejem diska (npr.%n%nC:\APP%n%nili putanja u obliku%n%n\\server\share) -InvalidDrive=Disk koji ste izabrali ne postoji ili nije dostupan. Izaberite neki drugi. -DiskSpaceWarningTitle=Nedovoljno prostora na disku -DiskSpaceWarning=Program zahteva najmanje %1 kB slobodnog prostora, a izabrani disk na raspolaganju ima samo %2 kB.%n%nelite li ipak da nastavite? -DirNameTooLong=Naziv fascikle ili putanja je predugaka. -InvalidDirName=Naziv fascikle nije ispravan. -BadDirName32=Naziv fascikle ne sme sadrati nita od sledeeg:%n%n%1 -DirExistsTitle=Fascikla ve postoji -DirExists=Fascikla:%n%n%1%n%nve postoji. elite li ipak da instalirate program u nju? -DirDoesntExistTitle=Fascikla ne postoji -DirDoesntExist=Fascikla:%n%n%1%n%nne postoji. elite li da je napravite? - -; *** "Select Components" wizard page -WizardSelectComponents=Odabir komponenata -SelectComponentsDesc=Koje komponente elite da instalirate? -SelectComponentsLabel2=Izaberite komponente koje elite da instalirate, a oistite one koje ne elite. Kliknite na Dalje da nastavite. -FullInstallation=Puna instalacija -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Podrazumevana instalacija -CustomInstallation=Prilagoena instalacija -NoUninstallWarningTitle=Komponente ve postoje -NoUninstallWarning=Sledee komponente ve postoje na raunaru:%n%n%1%n%nDetrikliranje ovih komponenti ih nee ukloniti.%n%nelite li da nastavite? -ComponentSize1=%1 kB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Izabrane stavke zahtevaju najmanje [mb] MB slobodnog prostora. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Odabir dodatnih zadataka -SelectTasksDesc=Izaberite neke dodatne zadatke. -SelectTasksLabel2=Izaberite dodatne zadatke koje elite da izvrite pri instaliranju programa [name] i kliknite na Dalje. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Odabir fascikle u meniju Start -SelectStartMenuFolderDesc=Izaberite mesto na kom elite da postavite preice. -SelectStartMenuFolderLabel3=Instalacija e postaviti preice programa u sledeoj fascikli u meniju Start. -SelectStartMenuFolderBrowseLabel=Kliknite na Dalje da nastavite. Ako elite da izaberete drugu fasciklu, kliknite na Potrai. -MustEnterGroupName=Morate navesti naziv fascikle. -GroupNameTooLong=Naziv fascikle ili putanja je predugaka. -InvalidGroupName=Naziv fascikle nije ispravan. -BadGroupName=Naziv fascikle ne sme sadrati nita od sledeeg:%n%n%1 -NoProgramGroupCheck2=N&e pravi fasciklu u meniju Start - -; *** "Ready to Install" wizard page -WizardReady=Instalacija je spremna -ReadyLabel1=Program je spreman da instalira [name] na raunar. -ReadyLabel2a=Kliknite na Instaliraj da zaponete instalaciju ili Nazad da ponovo pregledate i promenite pojedine postavke. -ReadyLabel2b=Kliknite na Instaliraj da zaponete instalaciju. -ReadyMemoUserInfo=Korisniki podaci: -ReadyMemoDir=Odredina fascikla: -ReadyMemoType=Vrsta instalacije: -ReadyMemoComponents=Izabrane komponente: -ReadyMemoGroup=Fascikla u meniju Start: -ReadyMemoTasks=Dodatni zadaci: - -; *** "Preparing to Install" wizard page -WizardPreparing=Priprema za instalaciju -PreparingDesc=Program se priprema da instalira [name] na raunar. -PreviousInstallNotCompleted=Instalacija ili deinstalacija prethodnog programa nije zavrena. Potrebno je da ponovo pokrenete raunar da bi se instalacija zavrila.%n%nNakon ponovnog pokretanja, otvorite instalaciju i instalirajte program [name]. -CannotContinue=Ne mogu da nastavim instalaciju. Kliknite na Otkai da izaete. -ApplicationsFound=Sledei programi koriste datoteke koje treba da aurira instalacioni program. Preporuujemo vam da dozvolite instalacionom programu da zatvori ove programe. -ApplicationsFound2=Sledei programi koriste datoteke koje treba da aurira instalacioni program. Preporuujemo vam da dozvolite instalacionom programu da zatvori ove programe. Nakon to se instalacija zavri, instalacioni program e pokuati da ponovo pokrene zatvorene programe. -CloseApplications=&Zatvori programe -DontCloseApplications=&Ne zatvaraj programe -ErrorCloseApplications=Ne mogu da zatvorim sve programe. Pre nego to nastavite, preporuujemo vam da zatvorite sve programe koji koriste datoteke koje treba da aurira instalacioni program. - -; *** "Installing" wizard page -WizardInstalling=Instaliranje -InstallingLabel=Saekajte da se [name] instalira na raunar. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=[name] zavretak instalacije -FinishedLabelNoIcons=Instaliranje programa [name] je zavreno. -FinishedLabel=Instaliranje programa [name] je zavreno. Moete ga pokrenuti preko postavljenih ikona. -ClickFinish=Kliknite na Zavri da izaete. -FinishedRestartLabel=Potrebno je ponovno pokretanje raunara da bi se instalacija zavrila. elite li da ga ponovo pokrenete? -FinishedRestartMessage=Potrebno je ponovno pokretanje raunara da bi se instalacija zavrila.%n%nelite li da ga ponovo pokrenete? -ShowReadmeCheck=Da, elim da pogledam tekstualnu datoteku -YesRadio=&Da, ponovo pokreni raunar -NoRadio=&Ne, kasnije u ga pokrenuti -; used for example as 'Run MyProg.exe' -RunEntryExec=&Pokreni %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Pogledaj %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Sledei disk -SelectDiskLabel2=Ubacite disk %1 i kliknite na U redu.%n%nAko se datoteke na ovom disku mogu pronai u nekoj drugoj fascikli, unesite odgovarajuu putanju ili kliknite na Potrai. -PathLabel=&Putanja: -FileNotInDir2=Datoteka %1 se ne nalazi u %2. Ubacite pravi disk ili izaberite drugu fasciklu. -SelectDirectoryLabel=Izaberite mesto sledeeg diska. - -; *** Installation phase messages -SetupAborted=Instalacija nije zavrena.%n%nIspravite problem i pokrenite je ponovo. -EntryAbortRetryIgnore=Kliknite na Pokuaj opet da ponovite radnju, Zanemari da nastavite u svakom sluaju ili Prekini da obustavite instalaciju. - -; *** Installation status messages -StatusClosingApplications=Zatvaram programe -StatusCreateDirs=Pravim fascikle -StatusExtractFiles=Raspakujem datoteke -StatusCreateIcons=Postavljam preice -StatusCreateIniEntries=Postavljam INI unose -StatusCreateRegistryEntries=Postavljam unose u registar -StatusRegisterFiles=Upisujem datoteke -StatusSavingUninstall=uvam podatke o deinstalaciji -StatusRunProgram=Zavravam instalaciju -StatusRestartingApplications=Ponovo pokreem programe -StatusRollback=Ponitavam izmene - -; *** Misc. errors -ErrorInternal2=Unutranja greka: %1 -ErrorFunctionFailedNoCode=%1 neuspeh -ErrorFunctionFailed=%1 neuspeh; kod %2 -ErrorFunctionFailedWithMessage=%1 neuspeh; kod %2.%n%3 -ErrorExecutingProgram=Ne mogu da pokrenem datoteku:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Greka pri otvaranju unosa u registru:%n%1\%2 -ErrorRegCreateKey=Greka pri stvaranju unosa u registru:%n%1\%2 -ErrorRegWriteKey=Greka pri upisivanju unosa u registar:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Greka pri stvaranju INI unosa u datoteci %1. - -; *** File copying errors -FileAbortRetryIgnore=Kliknite na Pokuaj opet da ponovite radnju, Zanemari da preskoite datoteku (ne preporuuje se) ili Prekini da obustavite instalaciju. -FileAbortRetryIgnore2=Kliknite na Pokuaj opet da ponovite radnju, Zanemari da nastavite u svakom sluaju (ne preporuuje se) ili Prekini da obustavite instalaciju. -SourceIsCorrupted=Izvorna datoteka je oteena -SourceDoesntExist=Izvorna datoteka %1 ne postoji -ExistingFileReadOnly=Postojea datoteka je samo za itanje.%n%nKliknite na Pokuaj opet da uklonite osobinu samo za itanje i ponovite radnju, Zanemari da preskoite datoteku ili Prekini da obustavite instalaciju. -ErrorReadingExistingDest=Dolo je do greke pri pokuaju itanja postojee datoteke: -FileExists=Datoteka ve postoji.%n%nelite li da je zamenite? -ExistingFileNewer=Postojea datoteka je novija od one koju treba postaviti. Preporuujemo vam da zadrite postojeu datoteku.%n%nelite li to da uradite? -ErrorChangingAttr=Dolo je do greke pri izmeni osobine sledee datoteke: -ErrorCreatingTemp=Dolo je do greke pri stvaranju datoteke u odredinoj fascikli: -ErrorReadingSource=Dolo je do greke pri itanju izvorne datoteke: -ErrorCopying=Dolo je do greke pri umnoavanju datoteke: -ErrorReplacingExistingFile=Dolo je do greke pri zameni postojee datoteke: -ErrorRestartReplace=Ne mogu da zamenim: -ErrorRenamingTemp=Dolo je do greke pri preimenovanju datoteke u odredinoj fascikli: -ErrorRegisterServer=Ne mogu da upiem DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 nije uspeo. Greka %1 -ErrorRegisterTypeLib=Ne mogu da upiem biblioteku tipova: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Dolo je do greke pri otvaranju tekstualne datoteke. -ErrorRestartingComputer=Ne mogu ponovo da pokrenem raunar. Uradite to sami. - -; *** Uninstaller messages -UninstallNotFound=Datoteka %1 ne postoji. Ne mogu da deinstaliram program. -UninstallOpenError=Datoteka %1 ne moe da se otvori. Ne mogu da deinstaliram program. -UninstallUnsupportedVer=Izvetaj %1 je u neprepoznatljivom formatu. Ne mogu da deinstaliram program. -UninstallUnknownEntry=Nepoznat unos (%1) se pojavio u izvetaju deinstalacije. -ConfirmUninstall=elite li da deinstalirate %1 i sve njegove komponente? -UninstallOnlyOnWin64=Program se moe deinstalirati samo na 64-bitnom vindousu. -OnlyAdminCanUninstall=Program moe deinstalirati samo korisnik s administratorskim pravima. -UninstallStatusLabel=Saekajte da se %1 deinstalira sa raunara. -UninstalledAll=%1 je deinstaliran sa raunara. -UninstalledMost=%1 je deinstaliran.%n%nNeke komponente ipak morati sami obrisati. -UninstalledAndNeedsRestart=Potrebno je ponovno pokretanje raunara da bi se instalacija zavrila.%n%nelite li da ponovo pokrenete raunar? -UninstallDataCorrupted=Datoteka %1 je oteena. Ne mogu da deinstaliram program. - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Brisanje deljene datoteke -ConfirmDeleteSharedFile2=Sistem je prijavio da sledeu deljenu datoteku vie ne koristi nijedan program. elite li da je uklonite?%n%nAko nekim programima i dalje treba ova datoteka a ona je obrisana, ti programi moda nee ispravno raditi. Ako niste sigurni ta da radite, kliknite na Ne. Ostavljanje datoteke na disku nee prouzrokovati nikakvu tetu. -SharedFileNameLabel=Naziv datoteke: -SharedFileLocationLabel=Putanja: -WizardUninstalling=Stanje deinstalacije -StatusUninstalling=Deinstaliram %1 - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Instaliram %1. -ShutdownBlockReasonUninstallingApp=Deinstaliram %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 verzija %2 -AdditionalIcons=Dodatne ikone: -CreateDesktopIcon=&Postavi ikonu na radnu povrinu -CreateQuickLaunchIcon=P&ostavi ikonu na traku za brzo pokretanje -ProgramOnTheWeb=%1 na internetu -UninstallProgram=Deinstaliraj %1 -LaunchProgram=Pokreni %1 -AssocFileExtension=&Povei %1 sa formatom %2 -AssocingFileExtension=Povezujem %1 sa formatom %2 -AutoStartProgramGroupDescription=Pokretanje: -AutoStartProgram=Automatski pokreni %1 -AddonHostProgramNotFound=%1 se ne nalazi u navedenoj fascikli.%n%nelite li ipak da nastavite? \ No newline at end of file diff --git a/Greenshot/tools/innosetup/Languages/Slovak.isl b/Greenshot/tools/innosetup/Languages/Slovak.isl deleted file mode 100644 index 3febdc45d..000000000 --- a/Greenshot/tools/innosetup/Languages/Slovak.isl +++ /dev/null @@ -1,244 +0,0 @@ -; ****************************************************** -; *** *** -; *** Inno Setup version 5.1.11+ Slovak messages *** -; *** *** -; *** Original Author: *** -; *** *** -; *** Milan Potancok (milan.potancok AT gmail.com) *** -; *** *** -; *** Contributors: *** -; *** *** -; *** Ivo Bauer (bauer AT ozm.cz) *** -; *** *** -; *** Tomas Falb (tomasf AT pobox.sk) *** -; *** *** -; *** Update: 19.3.2007 *** -; *** *** -; ****************************************************** -; -; - -[LangOptions] -LanguageName=Sloven<010D>ina -LanguageID=$041b -LanguageCodePage=1250 - -[Messages] -SetupAppTitle=Sprievodca intalciou -SetupWindowTitle=Sprievodca intalciou - %1 -UninstallAppTitle=Sprievodca odintalciou -UninstallAppFullTitle=Sprievodca odintalciou - %1 -InformationTitle=Informcie -ConfirmTitle=Potvrdenie -ErrorTitle=Chyba -SetupLdrStartupMessage=Toto je sprievodca intalciou produktu %1. Prajete si pokraova? -LdrCannotCreateTemp=Nie je mon vytvori doasn sbor. Sprievodca intalciou bude ukonen -LdrCannotExecTemp=Nie je mon spusti sbor v doasnom adresri. Sprievodca intalciou bude ukonen -LastErrorMessage=%1.%n%nChyba %2: %3 -SetupFileMissing=Intalan adresr neobsahuje sbor %1. Opravte, prosm, tto chybu alebo si zaobstarajte nov kpiu tohto produktu. -SetupFileCorrupt=Sbory sprievodcu intalciou s pokoden. Zaobstarajte si, prosm, nov kpiu tohto produktu. -SetupFileCorruptOrWrongVer=Sbory sprievodcu intalciou s pokoden alebo sa nezhoduj s touto verziou sprievodcu instalciou. Opravte, prosm, tto chybu alebo si zaobstarajte nov kpiu tohto produktu. -NotOnThisPlatform=Tento produkt sa ned spusti v %1. -OnlyOnThisPlatform=Tento produkt mus by spusten v %1. -OnlyOnTheseArchitectures=Tento produkt je mon naintalova iba vo verzich MS Windows s podporou architektry procesorov:%n%n%1 -MissingWOW64APIs=Aktulna verzia MS Windows neobsahuje funkcie, ktor vyaduje sprievodca intalciou pre 64-bitov intalciu. Opravte prosm tto chybu naintalovanm aktualizcie Service Pack %1. -WinVersionTooLowError=Tento produkt vyaduje %1 verzie %2 alebo vyej. -WinVersionTooHighError=Tento produkt sa ned naintalova vo %1 verzie %2 alebo vyej. -AdminPrivilegesRequired=Na intalciu tohto produktu muste by prihlsen s prvami administrtora. -PowerUserPrivilegesRequired=Na intalciu tohto produktu muste by prihlsen s prvami administrtora alebo lena skupiny Power Users. -SetupAppRunningError=Sprievodca intalciou zistil, e produkt %1 je teraz spusten.%n%nUkonite, prosm, vetky spusten intancie tohto produktu a pokraujte kliknutm na tlaidlo OK alebo ukonite intalciu tlaidlom Zrui. -UninstallAppRunningError=Sprievodca odintalciou zistil, e produkt %1 je teraz spusten.%n%nUkonite, prosm, vetky spusten intancie tohto produktu a pokraujte kliknutm na tlaidlo OK alebo ukonite intalciu tlaidlom Zrui. -ErrorCreatingDir=Sprievodca intalciou nemohol vytvori adresr "%1" -ErrorTooManyFilesInDir=Ned sa vytvori sbor v adresri "%1", pretoe tento adresr u obsahuje prli vea sborov -ExitSetupTitle=Ukoni sprievodcu intalciou -ExitSetupMessage=Intalcia nebola celkom dokonen. Ak teraz ukonte sprievodcu intalciou, produkt nebude naintalovan.%n%nSprievodcu intalciou mete znovu spusti neskr a dokoni tak intalciu.%n%nUkoni sprievodcu intalciou? -AboutSetupMenuItem=&O sprievodcovi intalcie... -AboutSetupTitle=O sprievodcovi intalcie -AboutSetupMessage=%1 verzia %2%n%3%n%n%1 domovsk strnka:%n%4 -AboutSetupNote= -TranslatorNote=Slovak translation maintained by Milan Potancok (milan.potancok AT gmail.com), Ivo Bauer (bauer AT ozm.cz) and Tomas Falb (tomasf AT pobox.sk) -ButtonBack=< &Sp -ButtonNext=&alej > -ButtonInstall=&Intalova -ButtonOK=OK -ButtonCancel=Zrui -ButtonYes=&no -ButtonYesToAll=no &vetkm -ButtonNo=&Nie -ButtonNoToAll=Ni&e vetkm -ButtonFinish=&Dokoni -ButtonBrowse=&Prechdza... -ButtonWizardBrowse=&Prechdza... -ButtonNewFolder=&Vytvori nov adresr -SelectLanguageTitle=Vber jazyka sprievodcu intalciou -SelectLanguageLabel=Zvote jazyk, ktor sa m poui pri intalcii: -ClickNext=Pokraujte kliknutm na tlaidlo alej alebo ukonite sprievodcu intalciou tlaidlom Zrui. -BeveledLabel= -BrowseDialogTitle=Njs adresr -BrowseDialogLabel=Z dole uvedenho zoznamu vyberte adresr a kliknite na OK. -NewFolderName=Nov adresr -WelcomeLabel1=Vt Vs sprievodca intalciou produktu [name]. -WelcomeLabel2=Produkt [name/ver] bude naintalovan na V pota.%n%nSkr, ako budete pokraova, odporame Vm ukoni vetky spusten aplikcie. -WizardPassword=Heslo -PasswordLabel1=Tto intalcia je chrnen heslom. -PasswordLabel3=Zadajte, prosm, heslo a pokraujte kliknutm na tlaidlo alej. Pri zadvn hesla rozliujte mal a vek psmen. -PasswordEditLabel=&Heslo: -IncorrectPassword=Zadan heslo nie je sprvne. Zkste to, prosm, ete raz. -WizardLicense=Licenn zmluva -LicenseLabel=Skr, ako budete pokraova, pretajte si, prosm, tieto dleit informcie. -LicenseLabel3=Pretajte si, prosm, tto Licenn zmluvu. Aby mohla intalcia pokraova, muste shlasi s podmienkami tejto zmluvy. -LicenseAccepted=&Shlasm s podmienkami Licennej zmluvy -LicenseNotAccepted=&Neshlasm s podmienkami Licennej zmluvy -WizardInfoBefore=Informcie -InfoBeforeLabel=Skr, ako budete pokraova, pretajte si, prosm, tieto dleit informcie. -InfoBeforeClickLabel=Pokraujte v intalcii kliknutm na tlaidlo alej. -WizardInfoAfter=Informcie -InfoAfterLabel=Skr, ako budete pokraova, pretajte si, prosm, tieto dleit informcie. -InfoAfterClickLabel=Pokraujte v intalcii kliknutm na tlaidlo alej. -WizardUserInfo=Informcie o pouvateovi -UserInfoDesc=Zadajte, prosm, poadovan informcie. -UserInfoName=&Pouvatesk meno: -UserInfoOrg=&Organizcia: -UserInfoSerial=&Sriove slo: -UserInfoNameRequired=Pouvatesk meno mus by zadan. -WizardSelectDir=Vyberte cieov adresr -SelectDirDesc=Kam m by produkt [name] naintalovan? -SelectDirLabel3=Sprievodca naintaluje produkt [name] do nasledujceho adresra. -SelectDirBrowseLabel=Pokraujte kliknutm na tlaidlo alej. Ak chcete vybra in adresr, kliknite na tlaidlo Prechdza. -DiskSpaceMBLabel=Intalcia vyaduje najmenej [mb] MB miesta na disku. -ToUNCPathname=Sprevodca intalciou neme intalova do cesty UNC. Ak sa pokate intalova po sieti, muste poui niektor z dostupnch sieovch jednotiek. -InvalidPath=Muste zadat pln cestu vrtane psmena jednotky; naprklad:%n%nC:\Aplikcia%n%nalebo cestu UNC v tvare:%n%n\\server\zdiean adresr -InvalidDrive=Vami vybran jednotka alebo cesta UNC neexistuje alebo nie je dostupn. Vyberte, prosm, in umiestnenie. -DiskSpaceWarningTitle=Nedostatok miesta na disku -DiskSpaceWarning=Sprievodca intalciou vyaduje najmenej %1 KB vonho miesta na intalciu produktu, ale na vybranej jednotke je dostupnch len %2 KB.%n%nPrajete si napriek tomu pokraova? -DirNameTooLong=Nzov adresra alebo cesta s prli dlh. -InvalidDirName=Nzov adresra nie je platn. -BadDirName32=Nzvy adresrov nesm obsahova iadny z nasledujcich znakov:%n%n%1 -DirExistsTitle=Adresr existuje -DirExists=Adresr:%n%n%1%n%nu existuje. M sa napriek tomu intalova do tohto adresra? -DirDoesntExistTitle=Adresr neexistuje -DirDoesntExist=Adresr:%n%n%1%n%nete neexistuje. M sa tento adresr vytvori? -WizardSelectComponents=Vyberte komponenty -SelectComponentsDesc=Ak komponenty maj by naintalovan? -SelectComponentsLabel2=Zakrtnite komponenty, ktor maj by naintalovan; komponenty, ktor se nemaj intalova, nechajte nezakrtnut. Pokraujte kliknutm na tlaidlo alej. -FullInstallation=pln intalcia -CompactInstallation=Kompaktn intalcia -CustomInstallation=Voliten intalcia -NoUninstallWarningTitle=Komponenty existuj -NoUninstallWarning=Sprievodca intalciou zistil, e nasledujce komponenty s u na Vaom potai naintalovan:%n%n%1%n%nAk ich teraz nezahrniete do vberu, nebud neskr odintalovan.%n%nPrajete si napriek tomu pokraova? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Vybran komponenty vyaduj najmenej [mb] MB miesta na disku. -WizardSelectTasks=Vyberte alie lohy -SelectTasksDesc=Ktor alie lohy maj by vykonan? -SelectTasksLabel2=Vyberte alie lohy, ktor maj by vykonan v priebehu intalcie produktu [name] a pokraujte kliknutm na tlaidlo alej. -WizardSelectProgramGroup=Vyberte skupinu v ponuke tart -SelectStartMenuFolderDesc=Kam m sprievodca intalcie umiestni zstupcov aplikcie? -SelectStartMenuFolderLabel3=Sprievodca intalciou vytvor zstupcov aplikcie v nasledujcom adresri ponuky tart. -SelectStartMenuFolderBrowseLabel=Pokraujte kliknutm na tlaidlo alej. Ak chcete zvoli in adresr, kliknite na tlaidlo Prechdza. -MustEnterGroupName=Muste zada nzov skupiny. -GroupNameTooLong=Nzov adresra alebo cesta s prli dlh. -InvalidGroupName=Nzov adresra nie je platn. -BadGroupName=Nzov skupiny nesmie obsahova iadny z nasledujcich znakov:%n%n%1 -NoProgramGroupCheck2=&Nevytvra skupinu v ponuke tart -WizardReady=Intalcia je pripraven -ReadyLabel1=Sprievodca intalciou je teraz pripraven naintalova produkt [name] na V pota. -ReadyLabel2a=Pokraujte v intalcii kliknutm na tlaidlo Intalova. Ak si prajete zmeni niektor nastavenia intalcie, kliknite na tlaidlo Sp. -ReadyLabel2b=Pokraujte v intalcii kliknutm na tlaidlo Intalova. -ReadyMemoUserInfo=Informcie o pouvateovi: -ReadyMemoDir=Cieov adresr: -ReadyMemoType=Typ intalcie: -ReadyMemoComponents=Vybran komponenty: -ReadyMemoGroup=Skupina v ponuke tart: -ReadyMemoTasks=alie lohy: -WizardPreparing=Prprava intalcie -PreparingDesc=Sprievodca intalciou pripravuje intalciu produktu [name] na V pota. -PreviousInstallNotCompleted=Intalcia/odintalcia predolho produktu nebola plne dokonen. Dokonenie tohto procesu vyaduje retart potaa.%n%nPo retartovan potaa spustite znovu sprievodcu intalciou, aby bolo mon dokoni intalciu produktu [name]. -CannotContinue=Sprievodca intalciou neme pokraova. Ukonite, prosm, sprievodcu intalciou kliknutm na tlaidlo Zrui. -WizardInstalling=Intalujem -InstallingLabel=Pokajte prosm, km sprievodca intalciou nedokon intalciu produktu [name] na V pota. -FinishedHeadingLabel=Dokonuje sa intalcia produktu [name] -FinishedLabelNoIcons=Sprievodca intalciou dokonil intalciu produktu [name] na V pota. -FinishedLabel=Sprievodca intalciou dokonil intalciu produktu [name] na V pota. Produkt je mon spusti pomocou naintalovanch ikon a zstupcov. -ClickFinish=Ukonite sprievodcu intalciou kliknutm na tlaidlo Dokoni. -FinishedRestartLabel=Na dokonenie intalcie produktu [name] je nutn retartova V pota. Prajete si teraz retartova V pota? -FinishedRestartMessage=Na dokonenie intalcie produktu [name] je nutn retartova V pota.%n%nPrajete si teraz retartova V pota? -ShowReadmeCheck=no, chcem zobrazi dokument "ITAJMA" -YesRadio=&no, chcem teraz retartova pota -NoRadio=&Nie, pota retartujem neskr -RunEntryExec=Spusti %1 -RunEntryShellExec=Zobrazi %1 -ChangeDiskTitle=Sprievodca intalciou vyaduje al disk -SelectDiskLabel2=Vlote, prosm, disk %1 a kliknite na tlaidlo OK.%n%nAk sa sbory na tomto disku nachdzaj v inom adresri, ako v tom, ktor je zobrazen niie, zadejte sprvnu cestu alebo kliknite na tlaidlo Prechdza. -PathLabel=&Cesta: -FileNotInDir2=Sbor "%1" sa ned njs v "%2". Vlote, prosm, sprvny disk alebo zvote in adresr. -SelectDirectoryLabel=pecifikujte,prosm, umiestnenie alieho disku. -SetupAborted=Intalcia nebola plne dokonen.%n%nOpravte, prosm, chybu a spustite sprievodcu intalciou znova. -EntryAbortRetryIgnore=Akciu zopakujete kliknutm na tlaidlo Opakova. Akciu vynechte kliknutm na tlaidlo Preskoi. Intalciu prerute kliknutm na tlaidlo Prerui. -StatusCreateDirs=Vytvraj sa adresre... -StatusExtractFiles=Rozbauj sa sbory... -StatusCreateIcons=Vytvraj sa ikony a zstupcovia... -StatusCreateIniEntries=Vytvraj sa zznamy v konfiguranch sboroch... -StatusCreateRegistryEntries=Vytvraj sa zznamy v systmovom registri... -StatusRegisterFiles=Registruj sa sbory... -StatusSavingUninstall=Ukladaj sa informcie potrebn pre neskorie odintalovanie produktu... -StatusRunProgram=Dokonuje sa intalcia... -StatusRollback=Vykonan zmeny sa vracaj sp... -ErrorInternal2=Intern chyba: %1 -ErrorFunctionFailedNoCode=%1 zlyhala -ErrorFunctionFailed=%1 zlyhala; kd %2 -ErrorFunctionFailedWithMessage=%1 zlyhala; kd %2.%n%3 -ErrorExecutingProgram=Ned sa spusti sbor:%n%1 -ErrorRegOpenKey=Dolo k chybe pri otvran ka systmovho registra:%n%1\%2 -ErrorRegCreateKey=Dolo k chybe pri vytvran ka systmovho registra:%n%1\%2 -ErrorRegWriteKey=Dolo k chybe pri zpise do ka systmovho registra:%n%1\%2 -ErrorIniEntry=Dolo k chybe pri vytvran zznamu v konfiguranom sbore "%1". -FileAbortRetryIgnore=Akciu zopakujete kliknutm na tlaidlo Opakova. Tento sbor preskote kliknutm na tlaidlo Preskoi (neodpora sa). Intalciu prerute tlaidlom Prerui. -FileAbortRetryIgnore2=Akciu zopakujete kliknutm na tlaidlo Opakova. Pokraujete kliknutm na tlaidlo Preskoi (neodpora sa). Intalciu prerute tlaidlom Prerui. -SourceIsCorrupted=Zdrojov sbor je pokoden -SourceDoesntExist=Zdrojov sbor "%1" neexistuje -ExistingFileReadOnly=Existujci sbor je uren len na tanie.%n%nAtribt "Iba na tanie" odstrnite a akciu zopakujete kliknutm na tlaidlo Opakova. Sbor preskote kliknutm na tlaidlo Preskoi. Intalciu prerute kliknutm na tlaidlo Prerui. -ErrorReadingExistingDest=Dolo k chybe pri pokuse o tanie existujceho sboru: -FileExists=Sbor u existuje.%n%nM ho sprievodca intalcie prepsa? -ExistingFileNewer=Existujci sbor je nov ako ten, ktor sa sprievodca intalciou poka naintalova. Odpora sa ponecha existujci sbor.%n%nPrajete si ponechat existujci sbor? -ErrorChangingAttr=Dolo k chybe pri pokuse o modifikciu atribtov existujceho sboru: -ErrorCreatingTemp=Dolo k chybe pri pokuse o vytvorenie sboru v cieovom adresri: -ErrorReadingSource=Dolo k chybe pri pokuse o tanie zdrojovho sboru: -ErrorCopying=Dolo k chybe pri pokuse o skoprovanie sboru: -ErrorReplacingExistingFile=Dolo k chybe pri pokuse o nahradenie existujceho sboru: -ErrorRestartReplace=Zlyhala funkcia "RestartReplace" sprievodcu intalciou: -ErrorRenamingTemp=Dolo k chybe pri pokuse o premenovanie sboru v cieovom adresri: -ErrorRegisterServer=Ned sa vykona registrcia DLL/OCX: %1 -ErrorRegSvr32Failed=Volanie RegSvr32 zlyhalo s nvratovm kdom %1 -ErrorRegisterTypeLib=Ned sa vykona registrcia typovej kninice: %1 -ErrorOpeningReadme=Dolo k chybe pri pokuse o otvorenie dokumentu "ITAJMA". -ErrorRestartingComputer=Sprievodcovi intalciou sa nepodarilo retartova V pota. Retartujte ho, prosm, manulne. -UninstallNotFound=Sbor "%1" neexistuje. Produkt sa ned odintalova. -UninstallOpenError=Sbor "%1" nie je mon otvori. Produkt nie je mon odintalova. -UninstallUnsupportedVer=Sprievodcovi odintalciou sa nepodarilo rozpozna formt sboru obsahujceho informcie na odintalovanie produktu "%1". Produkt sa ned odintalova -UninstallUnknownEntry=V sbore obsahujcom informcie na odintalovanie produktu bola zisten neznma poloka (%1) -ConfirmUninstall=Ste si naozaj ist, e chcete odintalova %1 a vetky jeho komponenty? -UninstallOnlyOnWin64=Tento produkt je mon odintalova iba v 64-bitovch verzich MS Windows. -OnlyAdminCanUninstall=K odintalovaniu tohto produktu muste by prihlsen s prvami administrtora. -UninstallStatusLabel=Pokajte prosm, km produkt %1 nebude odintalovan z Vho potaa. -UninstalledAll=%1 bol spene odintalovan z Vho potaa. -UninstalledMost=%1 bol odintalovan z Vho potaa.%n%nNiektor jeho komponenty sa vak nepodarilo odintalova. Mete ich odintalova manulne. -UninstalledAndNeedsRestart=Na dokonenie odintalcie produktu %1 je potrebn retartova V pota.%n%nPrajete si teraz retartova V pota? -UninstallDataCorrupted=Sbor "%1" je pokoden. Produkt sa ned odintalova -ConfirmDeleteSharedFileTitle=Odintalova zdiean sbor? -ConfirmDeleteSharedFile2=Systm indikuje, e nsledujci zdiean sbor nie je pouvan iadnymi inmi aplikciami. M sprievodca odintalcie tento zdiean sbor odstrni?%n%nAk niektor aplikcie tento sbor pouvaj, nemusia po jeho odintalovan pracova sprvne. Ak si nie ste ist, zvote Nie. Ponechanie tohoto sboru vo Vaom systme nespsob iadnu kodu. -SharedFileNameLabel=Nzov sboru: -SharedFileLocationLabel=Umiestnenie: -WizardUninstalling=Stav odintalovania -StatusUninstalling=Odintalujem %1... - -[CustomMessages] -NameAndVersion=%1 verzia %2 -AdditionalIcons=al zstupcovia: -CreateDesktopIcon=Vytvori zstupcu na &ploche -CreateQuickLaunchIcon=Vytvori zstupcu na paneli &Rchle spustenie -ProgramOnTheWeb=Aplikcia %1 na internete -UninstallProgram=Odintalova aplikciu %1 -LaunchProgram=Spusti aplikciu %1 -AssocFileExtension=Vytvori &asociciu medzi sbormi typu %2 a aplikciou %1 -AssocingFileExtension=Vytvra sa asocicia medzi sbormi typu %2 a aplikciou %1... diff --git a/Greenshot/tools/innosetup/Languages/Slovenian.isl b/Greenshot/tools/innosetup/Languages/Slovenian.isl deleted file mode 100644 index 784142186..000000000 --- a/Greenshot/tools/innosetup/Languages/Slovenian.isl +++ /dev/null @@ -1,327 +0,0 @@ -; *** Inno Setup version 5.5.3+ Slovenian messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/is3rdparty.php -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Maintained by Jernej Simoncic (jernej|s-innosetup@eternallybored.org) -; -; $jrsoftware: issrc/Files/Languages/Slovenian.isl,v 1.14 2007/02/27 18:22:41 jr Exp $ - -[LangOptions] -LanguageName=Slovenski -LanguageID=$0424 -LanguageCodePage=1250 - -DialogFontName= -[Messages] - -; *** Application titles -SetupAppTitle=Namestitev -SetupWindowTitle=Namestitev - %1 -UninstallAppTitle=Odstranitev -UninstallAppFullTitle=Odstranitev programa %1 - -; *** Misc. common -InformationTitle=Informacija -ConfirmTitle=Potrditev -ErrorTitle=Napaka - -; *** SetupLdr messages -SetupLdrStartupMessage=V raunalnik boste namestili program %1. elite nadaljevati? -LdrCannotCreateTemp=Ni bilo mogoe ustvariti zaasne datoteke. Namestitev je prekinjena -LdrCannotExecTemp=Ni bilo mogoe zagnati datoteke v zaasni mapi. Namestitev je prekinjena - -; *** Startup error messages -LastErrorMessage=%1.%n%nNapaka %2: %3 -SetupFileMissing=Datoteka %1 manjka. Odpravite napako ali si priskrbite drugo kopijo programa. -SetupFileCorrupt=Datoteke namestitvenega programa so okvarjene. Priskrbite si drugo kopijo programa. -SetupFileCorruptOrWrongVer=Datoteke so okvarjene ali nezdruljive s to razliico namestitvenega programa. Odpravite napako ali si priskrbite drugo kopijo programa. -InvalidParameter=Naveden je bil napaen parameter ukazne vrstice:%n%n%1 -SetupAlreadyRunning=Namestitveni program je e zagnan. -WindowsVersionNotSupported=Program ne deluje na vai razliici sistema Windows. -WindowsServicePackRequired=Program potrebuje %1 s servisnim paketom %2 ali novejo razliico. -NotOnThisPlatform=Program ni namenjen za uporabo v %1. -OnlyOnThisPlatform=Program je namenjen za uporabo v %1. -OnlyOnTheseArchitectures=Program lahko namestite le na razliicah MS Windows sistemov, ki so nartovani za naslednje tipe procesorjev:%n%n%1 -MissingWOW64APIs=Razliica sistema Windows, ki jo uporabljate, ne vsebuje okolja, ki ga zahteva namestitveni program za izvedbo 64-bitne namestitve. Problem odpravite z namestitvijo servisnega paketa %1. -WinVersionTooLowError=Ta program zahteva %1 razliico %2 ali novejo. -WinVersionTooHighError=Tega programa ne morete namestiti v %1 razliice %2 ali noveje. -AdminPrivilegesRequired=Za namestitev programa morate biti prijavljeni v raun s skrbnikimi pravicami. -PowerUserPrivilegesRequired=Za namestitev programa morate biti prijavljeni v raun s skrbnikimi ali power user pravicami. -SetupAppRunningError=Program %1 je trenutno odprt.%n%nZaprite program, nato kliknite V redu za nadaljevanje ali Preklii za izhod. -UninstallAppRunningError=Program %1 je trenutno odprt.%n%nZaprite program, nato kliknite V redu za nadaljevanje ali Preklii za izhod. - -; *** Misc. errors -ErrorCreatingDir=Namestitveni program ni mogel ustvariti mape "%1" -ErrorTooManyFilesInDir=Namestitveni program ne more ustvariti nove datoteke v mapi "%1", ker vsebuje preve datotek - -; *** Setup common messages -ExitSetupTitle=Prekini namestitev -ExitSetupMessage=Namestitev ni konana. e jo boste prekinili, program ne bo nameen.%n%nPonovno namestitev lahko izvedete kasneje.%n%nelite prekiniti namestitev? -AboutSetupMenuItem=&O namestitvenem programu... -AboutSetupTitle=O namestitvenem programu -AboutSetupMessage=%1 razliica %2%n%3%n%n%1 domaa stran:%n%4 -AboutSetupNote= -TranslatorNote=Slovenski prevod:%nMiha Remec (innosetup@miharemec.com)%nJernej Simoni (jernej|s-innosetup@eternallybored.org) - -; *** Buttons -ButtonBack=< Na&zaj -ButtonNext=&Naprej > -ButtonInstall=&Namesti -ButtonOK=V redu -ButtonCancel=Preklii -ButtonYes=&Da -ButtonYesToAll=Da za &vse -ButtonNo=&Ne -ButtonNoToAll=N&e za vse -ButtonFinish=&Konaj -ButtonBrowse=Pre&brskaj... -ButtonWizardBrowse=Pre&brskaj... -ButtonNewFolder=&Ustvari novo mapo - -; *** "Select Language" dialog messages -SelectLanguageTitle=Izbira jezika namestitve -SelectLanguageLabel=Izberite jezik, ki ga elite uporabljati med namestitvijo: - -; *** Common wizard text -ClickNext=Kliknite Naprej za nadaljevanje namestitve ali Preklii za prekinitev namestitve. -BeveledLabel= -BrowseDialogTitle=Izbira mape -BrowseDialogLabel=Izberite mapo s spiska, nato kliknite V redu. -NewFolderName=Nova mapa - -; *** "Welcome" wizard page -WelcomeLabel1=Dobrodoli v namestitev programa [name]. -WelcomeLabel2=V raunalnik boste namestili program [name/ver].%n%nPriporoljivo je, da pred zaetkom namestitve zaprete vse odprte programe. - -; *** "Password" wizard page -WizardPassword=Geslo -PasswordLabel1=Namestitev je zaitena z geslom. -PasswordLabel3=Vpiite geslo, nato kliknite Naprej za nadaljevanje. Pri vpisu pazite na male in velike rke. -PasswordEditLabel=&Geslo: -IncorrectPassword=Vneeno geslo ni pravilno. Poizkusite ponovno. - -; *** "License Agreement" wizard page -WizardLicense=Licenna pogodba za uporabo programa -LicenseLabel=Pred nadaljevanjem preberite licenno pogodbo za uporabo programa. -LicenseLabel3=Preberite licenno pogodbo za uporabo programa. Program lahko namestite le, e se s pogodbo v celoti strinjate. -LicenseAccepted=&Da, sprejemam vse pogoje licenne pogodbe -LicenseNotAccepted=N&e, pogojev licenne pogodbe ne sprejmem - -; *** "Information" wizard pages -WizardInfoBefore=Informacije -InfoBeforeLabel=Pred nadaljevanjem preberite naslednje pomembne informacije. -InfoBeforeClickLabel=Ko boste pripravljeni na nadaljevanje namestitve, kliknite Naprej. -WizardInfoAfter=Informacije -InfoAfterLabel=Pred nadaljevanjem preberite naslednje pomembne informacije. -InfoAfterClickLabel=Ko boste pripravljeni na nadaljevanje namestitve, kliknite Naprej. - -; *** "User Information" wizard page -WizardUserInfo=Podatki o uporabniku -UserInfoDesc=Vnesite svoje podatke. -UserInfoName=&Ime: -UserInfoOrg=&Podjetje: -UserInfoSerial=&Serijska tevilka: -UserInfoNameRequired=Vnos imena je obvezen. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Izbira ciljnega mesta -SelectDirDesc=Kam elite namestiti program [name]? -SelectDirLabel3=Program [name] bo nameen v naslednjo mapo. -SelectDirBrowseLabel=Za nadaljevanje kliknite Naprej. e elite izbrati drugo mapo, kliknite Prebrskaj. -DiskSpaceMBLabel=Na disku mora biti vsaj [mb] MB prostora. -CannotInstallToNetworkDrive=Programa ni mogoe namestiti na mreni pogon. -CannotInstallToUNCPath=Programa ni mogoe namestiti v UNC pot. -InvalidPath=Vpisati morate polno pot vkljuno z oznako pogona. Primer:%n%nC:\PROGRAM%n%nali UNC pot v obliki:%n%n\\strenik\mapa_skupne_rabe -InvalidDrive=Izbrani pogon ali omreno sredstvo UNC ne obstaja ali ni dostopno. Izberite drugega. -DiskSpaceWarningTitle=Na disku ni dovolj prostora -DiskSpaceWarning=Namestitev potrebuje vsaj %1 KB prostora, toda na izbranem pogonu je na voljo le %2 KB.%n%nelite kljub temu nadaljevati? -DirNameTooLong=Ime mape ali poti je predolgo. -InvalidDirName=Ime mape ni veljavno. -BadDirName32=Ime mape ne sme vsebovati naslednjih znakov:%n%n%1 -DirExistsTitle=Mapa e obstaja -DirExists=Mapa%n%n%1%n%ne obstaja. elite program vseeno namestiti v to mapo? -DirDoesntExistTitle=Mapa ne obstaja -DirDoesntExist=Mapa %n%n%1%n%nne obstaja. Ali jo elite ustvariti? - -; *** "Select Components" wizard page -WizardSelectComponents=Izbira komponent -SelectComponentsDesc=Katere komponente elite namestiti? -SelectComponentsLabel2=Oznaite komponente, ki jih elite namestiti; odznaite komponente, ki jih ne elite namestiti. Kliknite Naprej, ko boste pripravljeni za nadaljevanje. -FullInstallation=Polna namestitev -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Osnovna namestitev -CustomInstallation=Namestitev po meri -NoUninstallWarningTitle=Komponente e obstajajo -NoUninstallWarning=Namestitveni program je ugotovil, da so naslednje komponente e nameene v raunalniku:%n%n%1%n%nOdznaitev teh komponent e ne pomeni tudi njihove odstranitve.%n%nelite vseeno nadaljevati? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Za izbrano namestitev potrebujete vsaj [mb] MB prostora na disku. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Izbira dodatnih opravil -SelectTasksDesc=Katera dodatna opravila elite izvesti? -SelectTasksLabel2=Izberite dodatna opravila, ki jih bo namestitveni program opravil med namestitvijo programa [name], nato kliknite Naprej. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Izbira mape v meniju Start -SelectStartMenuFolderDesc=Kje naj namestitveni program ustvari blinjice? -SelectStartMenuFolderLabel3=Namestitveni program bo ustvaril blinjice v naslednji mapi v meniju Start. -SelectStartMenuFolderBrowseLabel=Za nadaljevanje kliknite Naprej. e elite izbrati drugo mapo, kliknite Prebrskaj. -MustEnterGroupName=Ime skupine mora biti vpisano. -GroupNameTooLong=Ime mape ali poti je predolgo. -InvalidGroupName=Ime mape ni veljavno. -BadGroupName=Ime skupine ne sme vsebovati naslednjih znakov:%n%n%1 -NoProgramGroupCheck2=&Ne ustvari mape v meniju Start - -; *** "Ready to Install" wizard page -WizardReady=Pripravljen za namestitev -ReadyLabel1=Namestitveni program je pripravljen za namestitev programa [name] v va raunalnik. -ReadyLabel2a=Kliknite Namesti za zaetek nameanja. Kliknite Nazaj, e elite pregledati ali spremeniti katerokoli nastavitev. -ReadyLabel2b=Kliknite Namesti za zaetek nameanja. -ReadyMemoUserInfo=Podatki o uporabniku: -ReadyMemoDir=Ciljno mesto: -ReadyMemoType=Tip namestitve: -ReadyMemoComponents=Izbrane komponente: -ReadyMemoGroup=Mapa v meniju Start: -ReadyMemoTasks=Dodatna opravila: - -; *** "Preparing to Install" wizard page -WizardPreparing=Pripravljam za namestitev -PreparingDesc=Namestitveni program je pripravljen za namestitev programa [name] v va raunalnik. -PreviousInstallNotCompleted=Namestitev ali odstranitev prejnjega programa ni bila konana. Da bi jo dokonali, morate raunalnik znova zagnati.%n%nPo ponovnem zagonu raunalnika znova zaenite namestitveni program, da boste konali namestitev programa [name]. -CannotContinue=Namestitveni program ne more nadaljevati. Pritisnite Preklii za izhod. - -; *** "Installing" wizard page -ApplicationsFound=Naslednji programi uporabljajo datoteke, ki jih mora namestitveni program posodobiti. Priporoljivo je, da namestitvenemu programu dovolite, da te programe kona. -ApplicationsFound2=Naslednji programi uporabljajo datoteke, ki jih mora namestitveni program posodobiti. Priporoljivo je, da namestitvenemu programu dovolite, da te programe kona. Po koncu namestitve bo namestitveni program poizkusil znova zagnati te programe. -CloseApplications=S&amodejno zapri programe -DontCloseApplications=&Ne zapri programov -ErrorCloseApplications=Namestitvenemu programu ni uspelo samodejno zapreti vseh programov. Priporoljivo je, da pred nadaljevanjem zaprete vse programe, ki uporabljajo datoteke, katere mora namestitev posodobiti. - -WizardInstalling=Nameanje -InstallingLabel=Poakajte, da bo program [name] nameen v va raunalnik. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Zakljuek namestitve programa [name] -FinishedLabelNoIcons=Program [name] je nameen v va raunalnik. -FinishedLabel=Program [name] je nameen v va raunalnik. Program zaenete tako, da odprete pravkar ustvarjene programske ikone. -ClickFinish=Kliknite tipko Konaj za zakljuek namestitve. -FinishedRestartLabel=Za dokonanje namestitve programa [name] morate raunalnik znova zagnati. Ali ga elite znova zagnati zdaj? -FinishedRestartMessage=Za dokonanje namestitve programa [name] morate raunalnik znova zagnati. %n%nAli ga elite znova zagnati zdaj? -ShowReadmeCheck=elim prebrati datoteko z navodili -YesRadio=&Da, raunalnik znova zaeni zdaj -NoRadio=&Ne, raunalnik bom znova zagnal pozneje - -; used for example as 'Run MyProg.exe' -RunEntryExec=Odpri %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Preberi %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Namestitveni program potrebuje naslednji disk -SelectDiskLabel2=Vstavite disk %1 in kliknite V redu.%n%ne se datoteke s tega diska nahajajo v drugi mapi kot je navedena spodaj, vpiite pravilno pot ali kliknite Prebrskaj. -PathLabel=&Pot: -FileNotInDir2=Datoteke "%1" ni v mapi "%2". Vstavite pravilni disk ali izberite drugo mapo. -SelectDirectoryLabel=Vnesite mesto naslednjega diska. - -; *** Installation phase messages -SetupAborted=Namestitev ni bila konana.%n%nOdpravite teavo in znova odprite namestitveni program. -EntryAbortRetryIgnore=Kliknite Ponovi za ponovitev, Prezri za nadaljevanje kljub problemu, ali Prekini za prekinitev namestitve. - -; *** Installation status messages -StatusClosingApplications=Zapiranje programov... -StatusCreateDirs=Ustvarjanje map... -StatusExtractFiles=Razirjanje datotek... -StatusCreateIcons=Ustvarjanje blinjic... -StatusCreateIniEntries=Vpisovanje v INI datoteke... -StatusCreateRegistryEntries=Ustvarjanje vnosov v register... -StatusRegisterFiles=Registriranje datotek... -StatusSavingUninstall=Zapisovanje podatkov za odstranitev... -StatusRunProgram=Zakljuevanje namestitve... -StatusRestartingApplications=Zaganjanje programov... -StatusRollback=Obnavljanje prvotnega stanja... - -; *** Misc. errors -ErrorInternal2=Interna napaka: %1 -ErrorFunctionFailedNoCode=%1 ni uspel(a) -ErrorFunctionFailed=%1 ni uspel(a); koda %2 -ErrorFunctionFailedWithMessage=%1 ni uspela; koda %2.%n%3 -ErrorExecutingProgram=Ne morem zagnati programa:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Napaka pri odpiranju kljua v registru:%n%1\%2 -ErrorRegCreateKey=Napaka pri ustvarjanju kljua v registru:%n%1\%2 -ErrorRegWriteKey=Napaka pri pisanju kljua v registru:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Napaka pri vpisu v INI datoteko "%1". - -; *** File copying errors -FileAbortRetryIgnore=Kliknite Ponovi za ponovitev, Prezri za preskok datoteke (ni priporoljivo) ali Prekini za prekinitev namestitve. -FileAbortRetryIgnore2=Kliknite Ponovi za ponovitev, Prezri za nadaljevanje (ni priporoljivo) ali Prekini za prekinitev namestitve. -SourceIsCorrupted=Izvorna datoteka je okvarjena -SourceDoesntExist=Izvorna datoteka "%1" ne obstaja -ExistingFileReadOnly=Obstojea datoteka je oznaena samo za branje.%n%nPritisnite Ponovi za odstranitev te lastnosti in ponovni poskus, Prezri za preskok te datoteke, ali Prekini za prekinitev namestitve. -ErrorReadingExistingDest=Pri branju obstojee datoteke je prilo do napake: -FileExists=Datoteka e obstaja.%n%nelite, da jo namestitveni program prepie? -ExistingFileNewer=V raunalniku je nameena razliica datoteke, ki je noveja, kot ta, ki je v namestitvenem programu. Priporoljivo je, da obdrite obstojeo datoteko.%n%nelite obdrati obstojeo datoteko? -ErrorChangingAttr=Pri poskusu spremembe lastnosti datoteke je prilo do napake: -ErrorCreatingTemp=Pri ustvarjanju datoteke v ciljni mapi je prilo do napake: -ErrorReadingSource=Pri branju izvorne datoteke je prilo do napake: -ErrorCopying=Pri kopiranju datoteke je prilo do napake: -ErrorReplacingExistingFile=Pri poskusu zamenjave obstojee datoteke je prilo do napake: -ErrorRestartReplace=RestartReplace failed: -ErrorRenamingTemp=Pri poskusu preimenovanja datoteke v ciljni mapi je prilo do napake: -ErrorRegisterServer=Registracija DLL/OCX ni mona: %1 -ErrorRegSvr32Failed=RegSvr32 ni uspel s kodo napake %1 -ErrorRegisterTypeLib=Prijava vrste knjinice ni mogoa: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Pri odpiranju datoteke README je prilo do napake. -ErrorRestartingComputer=Namestitveni program ni uspel znova zagnati raunalnika. Ponovni zagon opravite rono. - -; *** Uninstaller messages -UninstallNotFound=Datoteka "%1" ne obstaja. Odstranitev ni mogoa. -UninstallOpenError=Datoteke "%1" ne morem odpreti. Ne morem odstraniti -UninstallUnsupportedVer=Dnevnika datoteka "%1" je v obliki, ki je ta razliica odstranitvenega programa ne razume. Programa ni mogoe odstraniti -UninstallUnknownEntry=V dnevniki datoteki je bil najden neznani vpis (%1) -ConfirmUninstall=Ste prepriani, da elite v celoti odstraniti program %1 in pripadajoe komponente? -UninstallOnlyOnWin64=To namestitev je mogoe odstraniti le v 64-bitni razliici Windows. -OnlyAdminCanUninstall=Ta program lahko odstrani le administrator. -UninstallStatusLabel=Poakajte, da odstranim program %1 iz vaega raunalnika. -UninstalledAll=Program %1 je bil uspeno odstranjen iz vaega raunalnika. -UninstalledMost=Odstranjevanje programa %1 je konano.%n%nNekateri deli niso bili odstranjeni in jih lahko odstranite rono. -UninstalledAndNeedsRestart=Za dokonanje odstranitve programa %1 morate raunalnik znova zagnati.%n%nAli ga elite znova zagnati zdaj? -UninstallDataCorrupted=Datoteka "%1" je okvarjena. Odstranitev ni mona - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=elite odstraniti datoteko v skupni rabi? -ConfirmDeleteSharedFile2=Spodaj izpisane datoteke v skupni rabi ne uporablja ve noben program. elite odstraniti to datoteko?%n%ne jo uporablja katerikoli program in jo boste odstranili, ta program verjetno ne bo ve deloval pravilno. e niste prepriani, kliknite Ne. e boste datoteko ohranili v raunalniku, ne bo ni narobe. -SharedFileNameLabel=Ime datoteke: -SharedFileLocationLabel=Mesto: -WizardUninstalling=Odstranjevanje programa -StatusUninstalling=Odstranjujem %1... - -ShutdownBlockReasonInstallingApp=Nameam %1. -ShutdownBlockReasonUninstallingApp=Odstranjujem %1. - -[CustomMessages] - -NameAndVersion=%1 razliica %2 -AdditionalIcons=Dodatne ikone: -CreateDesktopIcon=Ustvari ikono na &namizju -CreateQuickLaunchIcon=Ustvari ikono za &hitri zagon -ProgramOnTheWeb=%1 na spletu -UninstallProgram=Odstrani %1 -LaunchProgram=Odpri %1 -AssocFileExtension=&Povei %1 s pripono %2 -AssocingFileExtension=Povezujem %1 s pripono %2... -AutoStartProgramGroupDescription=Zagon: -AutoStartProgram=Samodejno zaeni %1 -AddonHostProgramNotFound=Programa %1 ni bilo mogoe najti v izbrani mapi.%n%nAli elite vseeno nadaljevati? diff --git a/Greenshot/tools/innosetup/Languages/Spanish.isl b/Greenshot/tools/innosetup/Languages/Spanish.isl deleted file mode 100644 index 60da7c270..000000000 --- a/Greenshot/tools/innosetup/Languages/Spanish.isl +++ /dev/null @@ -1,335 +0,0 @@ -; *** Inno Setup version 5.5.3+ Spanish messages *** -; -; Maintained by Jorge Andres Brugger (jbrugger@ideaworks.com.ar) -; Spanish.isl version 1.2 (20121214) -; Default.isl version 5.5.3 -; -; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, -; Ramn Verduzco, Graciela Garca, Carles Millan and Rafael Barranco-Droege - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Espa<00F1>ol -LanguageID=$0c0a -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Instalar -SetupWindowTitle=Instalar - %1 -UninstallAppTitle=Desinstalar -UninstallAppFullTitle=Desinstalar - %1 - -; *** Misc. common -InformationTitle=Informacin -ConfirmTitle=Confirmar -ErrorTitle=Error - -; *** SetupLdr messages -SetupLdrStartupMessage=Este programa instalar %1. Desea continuar? -LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida -LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida - -; *** Startup error messages -LastErrorMessage=%1.%n%nError %2: %3 -SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. -SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa. -SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. -InvalidParameter=Se ha utilizado un parmetro no vlido en la lnea de comandos:%n%n%1 -SetupAlreadyRunning=El programa de instalacin an est ejecutndose. -WindowsVersionNotSupported=Este programa no es compatible con la versin de Windows de su equipo. -WindowsServicePackRequired=Este programa requiere %1 Service Pack %2 o posterior. -NotOnThisPlatform=Este programa no se ejecutar en %1. -OnlyOnThisPlatform=Este programa debe ejecutarse en %1. -OnlyOnTheseArchitectures=Este programa slo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1 -MissingWOW64APIs=La versin de Windows que est utilizando no cuenta con la funcionalidad requerida por el instalador para realizar una instalacin de 64 bits. Para solucionar este problema, por favor, instale el Service Pack %1. -WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior. -WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior. -AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa. -PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como miembro del grupo de Usuarios Avanzados para instalar este programa. -SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. -UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. - -; *** Misc. errors -ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1" -ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos - -; *** Setup common messages -ExitSetupTitle=Salir de la Instalacin -ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no se instalar;.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin? -AboutSetupMenuItem=&Acerca de Instalar... -AboutSetupTitle=Acerca de Instalar -AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4 -AboutSetupNote= -TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net) - -; *** Buttons -ButtonBack=< &Atrs -ButtonNext=&Siguiente > -ButtonInstall=&Instalar -ButtonOK=Aceptar -ButtonCancel=Cancelar -ButtonYes=&S -ButtonYesToAll=S a &Todo -ButtonNo=&No -ButtonNoToAll=N&o a Todo -ButtonFinish=&Finalizar -ButtonBrowse=&Examinar... -ButtonWizardBrowse=&Examinar... -ButtonNewFolder=&Crear Nueva Carpeta - -; *** "Select Language" dialog messages -SelectLanguageTitle=Seleccione el Idioma de la Instalacin -SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin: - -; *** Common wizard text -ClickNext=Haga clic en Siguiente para continuar o en Cancelar para salir de la instalacin. -BeveledLabel= -BrowseDialogTitle=Buscar Carpeta -BrowseDialogLabel=Seleccione una carpeta y luego haga clic en Aceptar. -NewFolderName=Nueva Carpeta - -; *** "Welcome" wizard page -WelcomeLabel1=Bienvenido al asistente de instalacin de [name] -WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda cerrar todas las dems aplicaciones antes de continuar. - -; *** "Password" wizard page -WizardPassword=Contrasea -PasswordLabel1=Esta instalacin est protegida por contrasea. -PasswordLabel3=Por favor, introduzca la contrasea y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas. -PasswordEditLabel=&Contrasea: -IncorrectPassword=La contrasea introducida no es correcta. Por favor, intntelo nuevamente. - -; *** "License Agreement" wizard page -WizardLicense=Acuerdo de Licencia -LicenseLabel=Es importante que lea la siguiente informacin antes de continuar. -LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar las clusulas de este acuerdo antes de continuar con la instalacin. -LicenseAccepted=A&cepto el acuerdo -LicenseNotAccepted=&No acepto el acuerdo - -; *** "Information" wizard pages -WizardInfoBefore=Informacin -InfoBeforeLabel=Es importante que lea la siguiente informacin antes de continuar. -InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente. -WizardInfoAfter=Informacin -InfoAfterLabel=Es importante que lea la siguiente informacin antes de continuar. -InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente. - -; *** "User Information" wizard page -WizardUserInfo=Informacin de Usuario -UserInfoDesc=Por favor, introduzca sus datos. -UserInfoName=Nombre de &Usuario: -UserInfoOrg=&Organizacin: -UserInfoSerial=Nmero de &Serie: -UserInfoNameRequired=Debe introducir un nombre. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Seleccione la Carpeta de Destino -SelectDirDesc=Dnde debe instalarse [name]? -SelectDirLabel3=El programa instalar [name] en la siguiente carpeta. -SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar. -DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco. -CannotInstallToNetworkDrive=El programa de instalacin no puede realizar la instalacin en una unidad de red. -CannotInstallToUNCPath=El programa de instalacin no puede realizar la instalacin en una ruta de acceso UNC. -InvalidPath=Debe introducir una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido -InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra. -DiskSpaceWarningTitle=Espacio Insuficiente en Disco -DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada slo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas? -DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. -InvalidDirName=El nombre de la carpeta no es vlido. -BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1 -DirExistsTitle=La Carpeta Ya Existe -DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas? -DirDoesntExistTitle=La Carpeta No Existe -DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta? - -; *** "Select Components" wizard page -WizardSelectComponents=Seleccione los Componentes -SelectComponentsDesc=Qu componentes deben instalarse? -SelectComponentsLabel2=Seleccione los componentes que desea instalar y desmarque los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar. -FullInstallation=Instalacin Completa -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Instalacin Compacta -CustomInstallation=Instalacin Personalizada -NoUninstallWarningTitle=Componentes Encontrados -NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nDesmarcar estos componentes no los desinstalar.%n%nDesea continuar de todos modos? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Seleccione las Tareas Adicionales -SelectTasksDesc=Qu tareas adicionales deben realizarse? -SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio -SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa? -SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio. -SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar. -MustEnterGroupName=Debe proporcionar un nombre de carpeta. -GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. -InvalidGroupName=El nombre de la carpeta no es vlido. -BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1 -NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio - -; *** "Ready to Install" wizard page -WizardReady=Listo para Instalar -ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema. -ReadyLabel2a=Haga clic en Instalar para continuar con el proceso o haga clic en Atrs si desea revisar o cambiar alguna configuracin. -ReadyLabel2b=Haga clic en Instalar para continuar con el proceso. -ReadyMemoUserInfo=Informacin del usuario: -ReadyMemoDir=Carpeta de Destino: -ReadyMemoType=Tipo de Instalacin: -ReadyMemoComponents=Componentes Seleccionados: -ReadyMemoGroup=Carpeta del Men Inicio: -ReadyMemoTasks=Tareas Adicionales: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparndose para Instalar -PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema. -PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name]. -CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir. -ApplicationsFound=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. -ApplicationsFound2=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. Al completarse la instalacin, el programa de instalacin intentar reiniciar las aplicaciones. -CloseApplications=&Cerrar automticamente las aplicaciones -DontCloseApplications=&No cerrar las aplicaciones -ErrorCloseApplications=El programa de instalacin no pudo cerrar de forma automtica todas las aplicaciones. Se recomienda que, antes de continuar, cierre todas las aplicaciones que utilicen archivos que necesitan ser actualizados por el programa de instalacin. - -; *** "Installing" wizard page -WizardInstalling=Instalando -InstallingLabel=Por favor, espere mientras se instala [name] en su sistema. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Completando la instalacin de [name] -FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema. -FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin haciendo clic sobre el icono instalado. -ClickFinish=Haga clic en Finalizar para salir del programa de instalacin. -FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora? -FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? -ShowReadmeCheck=S, deseo ver el archivo LAME -YesRadio=&S, deseo reiniciar el sistema ahora -NoRadio=&No, reiniciar el sistema ms tarde -; used for example as 'Run MyProg.exe' -RunEntryExec=Ejecutar %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Ver %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco -SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar. -PathLabel=&Ruta: -FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta. -SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco. - -; *** Installation phase messages -SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin. -EntryAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas o en Anular para cancelar la instalacin. - -; *** Installation status messages -StatusClosingApplications=Cerrando aplicaciones... -StatusCreateDirs=Creando carpetas... -StatusExtractFiles=Extrayendo archivos... -StatusCreateIcons=Creando accesos directos... -StatusCreateIniEntries=Creando entradas INI... -StatusCreateRegistryEntries=Creando entradas de registro... -StatusRegisterFiles=Registrando archivos... -StatusSavingUninstall=Guardando informacin para desinstalar... -StatusRunProgram=Terminando la instalacin... -StatusRestartingApplications=Reiniciando aplicaciones... -StatusRollback=Deshaciendo cambios... - -; *** Misc. errors -ErrorInternal2=Error interno: %1 -ErrorFunctionFailedNoCode=%1 fall -ErrorFunctionFailed=%1 fall; cdigo %2 -ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3 -ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2 -ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2 -ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Error al crear entrada INI en el archivo "%1". - -; *** File copying errors -FileAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para excluir este archivo (no recomendado) o en Anular para cancelar la instalacin. -FileAbortRetryIgnore2=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas (no recomendado) o en Anular para cancelar la instalacin. -SourceIsCorrupted=El archivo de origen est daado -SourceDoesntExist=El archivo de origen "%1" no existe -ExistingFileReadOnly=El archivo existente est marcado como slo-lectura.%n%nHaga clic en Reintentar para quitar el atributo de slo-lectura e intentarlo de nuevo, en Omitir para excluir este archivo o en Anular para cancelar la instalacin. -ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo: -FileExists=El archivo ya existe.%n%nDesea sobreescribirlo? -ExistingFileNewer=El archivo existente es ms reciente que el que est tratando de instalar. Se recomienda que mantenga el archivo existente.%n%nDesea mantener el archivo existente? -ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo: -ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino: -ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen: -ErrorCopying=Ocurri un error al intentar copiar el archivo: -ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente: -ErrorRestartReplace=Fall reintento de reemplazar: -ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino: -ErrorRegisterServer=Imposible registrar el DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1 -ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME. -ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente. - -; *** Uninstaller messages -UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar. -UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar -UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar -UninstallUnknownEntry=Se encontr una entrada desconocida (%1) en el registro de desinstalacin -ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes? -UninstallOnlyOnWin64=Este programa slo puede ser desinstalado en Windows de 64-bits. -OnlyAdminCanUninstall=Este programa slo puede ser desinstalado por un usuario con privilegios administrativos. -UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema. -UninstalledAll=%1 se desinstal satisfactoriamente de su sistema. -UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse, pero podr eliminarlos manualmente si lo desea. -UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? -UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido? -ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es utilizado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi elimina el archivo y hay programas que lo utilizan, esos programas podran dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao. -SharedFileNameLabel=Archivo: -SharedFileLocationLabel=Ubicacin: -WizardUninstalling=Estado de la Desinstalacin -StatusUninstalling=Desinstalando %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Instalando %1. -ShutdownBlockReasonUninstallingApp=Desinstalando %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versin %2 -AdditionalIcons=Iconos adicionales: -CreateDesktopIcon=Crear un icono en el &escritorio -CreateQuickLaunchIcon=Crear un icono de &Inicio Rpido -ProgramOnTheWeb=%1 en la Web -UninstallProgram=Desinstalar %1 -LaunchProgram=Ejecutar %1 -AssocFileExtension=&Asociar %1 con la extensin de archivo %2 -AssocingFileExtension=Asociando %1 con la extensin de archivo %2... -AutoStartProgramGroupDescription=Inicio: -AutoStartProgram=Iniciar automticamente %1 -AddonHostProgramNotFound=%1 no pudo ser localizado en la carpeta seleccionada.%n%nDesea continuar de todas formas? diff --git a/Greenshot/tools/innosetup/Languages/Swedish.isl b/Greenshot/tools/innosetup/Languages/Swedish.isl deleted file mode 100644 index 6a942b267..000000000 --- a/Greenshot/tools/innosetup/Languages/Swedish.isl +++ /dev/null @@ -1,339 +0,0 @@ -; *** Inno Setup version 5.5.3+ Swedish messages *** -; -; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ -; -; Note: When translating this text, do not add periods (.) to the end of -; messages that didn't have them already, because on those messages Inno -; Setup adds the periods automatically (appending a period would result in -; two periods being displayed). -; -; Translated by christer_1@hotmail.com (Christer Toivonen) -; - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Svenska -LanguageID=$041D -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Installationsprogram -SetupWindowTitle=Installationsprogram fr %1 -UninstallAppTitle=Avinstallation -UninstallAppFullTitle=%1 Avinstallation - -; *** Misc. common -InformationTitle=Information -ConfirmTitle=Bekrfta -ErrorTitle=Fel - -; *** SetupLdr messages -SetupLdrStartupMessage=%1 kommer att installeras. Vill du fortstta? -LdrCannotCreateTemp=Kan ej skapa en temporr fil. Installationen avbryts -LdrCannotExecTemp=Kan inte kra fil i temporr katalog. Installationen avbryts - -; *** Startup error messages -LastErrorMessage=%1.%n%nFel %2: %3 -SetupFileMissing=Filen %1 saknas i installationskatalogen. Rtta till problemet eller hmta en ny kopia av programmet. -SetupFileCorrupt=Installationsfilerna r felaktiga. Hmta en ny kopia av programmet -SetupFileCorruptOrWrongVer=Installationsfilerna r felaktiga, eller stmmer ej verens med denna version av installationsprogrammet. Rtta till felet eller hmta en ny programkopia. -InvalidParameter=En ogiltig parameter angavs p kommandoraden:%n%n%1 -SetupAlreadyRunning=Setup krs redan. -WindowsVersionNotSupported=Programmet stdjer inte den version av Windows som krs p datorn. -WindowsServicePackRequired=Programmet krver %1 Service Pack %2 eller nyare. -NotOnThisPlatform=Detta program kan ej kras p %1. -OnlyOnThisPlatform=Detta program mste ha %1. -OnlyOnTheseArchitectures=Detta program kan bara installeras p Windows versioner med fljande processorarkitekturer:%n%n%1 -MissingWOW64APIs=Den versionen av Windows du kr har inte den funktionalitet installationsprogrammet behver fr att genomfra en 64-bitars installation. Rtta till problemet genom att installera Service Pack %1. -WinVersionTooLowError=Detta program krver %1, version %2 eller senare. -WinVersionTooHighError=Programmet kan inte installeras p %1 version %2 eller senare. -AdminPrivilegesRequired=Du mste vara inloggad som administratr nr du installerar detta program. -PowerUserPrivilegesRequired=Du mste vara inloggad som administratr eller medlem av gruppen Privilegierade anvndare (Power Users) nr du installerar detta program. -SetupAppRunningError=Installationsprogrammet har upptckt att %1 r igng.%n%nAvsluta det angivna programmet nu. Klicka sedan p OK fr att g vidare, eller p Avbryt fr att avsluta. -UninstallAppRunningError=Avinstalleraren har upptckt att %1 krs fr tillfllet.%n%nStng all ppna instanser av det nu, klicka sedan p OK fr att g vidare, eller p Avbryt fr att avsluta. - -; *** Misc. errors -ErrorCreatingDir=Kunde inte skapa katalogen "%1" -ErrorTooManyFilesInDir=Kunde inte skapa en fil i katalogen "%1" drfr att den innehller fr mnga filer - -; *** Setup common messages -ExitSetupTitle=Avsluta installationen -ExitSetupMessage=Installationen r inte frdig. Om du avslutar nu, kommer programmet inte att installeras.%n%nDu kan kra installationsprogrammet vid ett senare tillflle fr att slutfra installationen.%n%nVill du avbryta installationen? -AboutSetupMenuItem=&Om installationsprogrammet... -AboutSetupTitle=Om installationsprogrammet -AboutSetupMessage=%1 version %2%n%3%n%n%1 hemsida:%n%4 -AboutSetupNote=Svensk versttning r gjord av dickg@go.to 1999, 2002%n%nUppdatering till 3.0.2+ av peter@peterandlinda.com, 4.+ av stefan@bodingh.se -TranslatorNote= - -; *** Buttons -ButtonBack=< &Tillbaka -ButtonNext=&Nsta > -ButtonInstall=&Installera -ButtonOK=OK -ButtonCancel=Avbryt -ButtonYes=&Ja -ButtonYesToAll=Ja till &Allt -ButtonNo=&Nej -ButtonNoToAll=N&ej till allt -ButtonFinish=&Slutfr -ButtonBrowse=&Blddra... -ButtonWizardBrowse=&Blddra... -ButtonNewFolder=Skapa ny katalog - -; *** "Select Language" dialog messages -SelectLanguageTitle=Vlj sprk fr installationen -SelectLanguageLabel=Vlj sprk som skall anvndas under installationen: - -; *** Common wizard text -ClickNext=Klicka p Nsta fr att fortstta eller p Avbryt fr att avsluta installationen. -BeveledLabel= -BrowseDialogTitle=Vlj katalog -BrowseDialogLabel=Vlj en katalog i listan nedan, klicka sedan p OK. -NewFolderName=Ny katalog - -; *** "Welcome" wizard page -WelcomeLabel1=Vlkommen till installationsprogrammet fr [name]. -WelcomeLabel2=Detta kommer att installera [name/ver] p din dator.%n%nDet rekommenderas att du avslutar alla andra program innan du fortstter. Det frebygger konflikter under installationens gng. - -; *** "Password" wizard page -WizardPassword=Lsenord -PasswordLabel1=Denna installation r skyddad med lsenord. -PasswordLabel3=Var god ange lsenordet, klicka sedan p Nsta fr att fortstta. Lsenord skiljer p versaler/gemener. -PasswordEditLabel=&Lsenord: -IncorrectPassword=Lsenordet du angav r inkorrekt. Frsk igen. - -; *** "License Agreement" wizard page -WizardLicense=Licensavtal -LicenseLabel=Var god och ls fljande viktiga information innan du fortstter. -LicenseLabel3=Var god och ls fljande licensavtal. Du mste acceptera villkoren i avtalet innan du kan fortstta med installationen. -LicenseAccepted=Jag &accepterar avtalet -LicenseNotAccepted=Jag accepterar &inte avtalet - -; *** "Information" wizard pages -WizardInfoBefore=Information -InfoBeforeLabel=Var god ls fljande viktiga information innan du fortstter. -InfoBeforeClickLabel=Nr du r klar att fortstta med installationen klickar du p Nsta. -WizardInfoAfter=Information -InfoAfterLabel=Var god ls fljande viktiga information innan du fortstter. -InfoAfterClickLabel=Nr du r klar att fortstta med installationen klickar du p Nsta. - -; *** "User Information" wizard page -WizardUserInfo=Anvndarinformation -UserInfoDesc=Var god och fyll i fljande uppgifter. -UserInfoName=&Namn: -UserInfoOrg=&Organisation: -UserInfoSerial=&Serienummer: -UserInfoNameRequired=Du mste fylla i ett namn. - -; *** "Select Destination Directory" wizard page -WizardSelectDir=Vlj installationsplats -SelectDirDesc=Var skall [name] installeras? -SelectDirLabel3=Installationsprogrammet kommer att installera [name] i fljande katalog -SelectDirBrowseLabel=Fr att fortstta klickar du p Nsta. Om du vill vlja en annan katalog klickar du p Blddra. -DiskSpaceMBLabel=Programmet krver minst [mb] MB hrddiskutrymme. -CannotInstallToNetworkDrive=Setup kan inte installeras p ntverksdisk. -CannotInstallToUNCPath=Setup kan inte installeras p UNC skvg. -InvalidPath=Du mste skriva en fullstndig skvg med enhetsbeteckning; till exempel:%n%nC:\Program%n%neller en UNC-skvg i formatet:%n%n\\server\resurs -InvalidDrive=Enheten du har valt finns inte eller r inte tillgnglig. Vlj en annan. -DiskSpaceWarningTitle=Ej tillrckligt med diskutrymme -DiskSpaceWarning=Installationsprogrammet behver tminstone %1 KB ledigt diskutrymme fr installationen, men den valda enheten har bara %2 KB tillgngligt.%n%nVill du fortstta nd? -DirNameTooLong=Katalogens namn eller skvg r fr lng. -InvalidDirName=Katalogen du har valt r inte tillgnglig. -BadDirName32=Katalogens namn fr ej innehlla ngot av fljande tecken:%n%n%1 -DirExistsTitle=Katalogen finns -DirExists=Katalogen:%n%n%1%n%nfinns redan. Vill du nd fortstta installationen till den valda katalogen? -DirDoesntExistTitle=Katalogen finns inte -DirDoesntExist=Katalogen:%n%n%1%n%nfinns inte. Vill du skapa den? - -; *** "Select Components" wizard page -WizardSelectComponents=Vlj komponenter -SelectComponentsDesc=Vilka komponenter skall installeras? -SelectComponentsLabel2=Vlj de komponenter som du vill ska installeras; avmarkera de komponenter som du inte vill ha. Klicka sedan p Nsta nr du r klar att fortstta. -FullInstallation=Fullstndig installation -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Kompakt installation -CustomInstallation=Anpassad installation -NoUninstallWarningTitle=Komponenter finns -NoUninstallWarning=Installationsprogrammet har upptckt att fljande komponenter redan finns installerade p din dator:%n%n%1%n%nAtt avmarkera dessa komponenter kommer inte att avinstallera dom.%n%nVill du fortstta nd? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Aktuella val krver minst [mb] MB diskutrymme. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Vlj extra uppgifter -SelectTasksDesc=Vilka extra uppgifter skall utfras? -SelectTasksLabel2=Markera ytterligare uppgifter att utfra vid installation av [name], tryck sedan p Nsta. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Vlj Startmenykatalogen -SelectStartMenuFolderDesc=Var skall installationsprogrammet placera programmets genvgar? -SelectStartMenuFolderLabel3=Installationsprogrammet kommer att skapa programmets genvgar i fljande katalog. -SelectStartMenuFolderBrowseLabel=Fr att fortstta klickar du p Nsta. Om du vill vlja en annan katalog, klickar du p Blddra. -MustEnterGroupName=Du mste ange en katalog. -GroupNameTooLong=Katalogens namn eller skvg r fr lng. -InvalidGroupName=Katalogen du har valt r inte tillgnglig. -BadGroupName=Katalognamnet kan inte innehlla ngon av fljande tecken:%n%n%1 -NoProgramGroupCheck2=&Skapa ingen Startmenykatalog - -; *** "Ready to Install" wizard page -WizardReady=Redo att installera -ReadyLabel1=Installationsprogrammet r nu redo att installera [name] p din dator. -ReadyLabel2a=Tryck p Installera om du vill fortstta, eller p g Tillbaka om du vill granska eller ndra p ngot. -ReadyLabel2b=Vlj Installera fr att pbrja installationen. -ReadyMemoUserInfo=Anvndarinformation: -ReadyMemoDir=Installationsplats: -ReadyMemoType=Installationstyp: -ReadyMemoComponents=Valda komponenter: -ReadyMemoGroup=Startmenykatalog: -ReadyMemoTasks=Extra uppgifter: - -; *** "Preparing to Install" wizard page -WizardPreparing=Frbereder installationen -PreparingDesc=Installationsprogrammet frbereder installationen av [name] p din dator. -PreviousInstallNotCompleted=Installationen/avinstallationen av ett tidigare program har inte slutfrts. Du mste starta om datorn fr att avsluta den installationen.%n%nEfter att ha startat om datorn kr du installationsprogrammet igen fr att slutfra installationen av [name]. -CannotContinue=Installationsprogrammet kan inte fortstta. Klicka p Avbryt fr att avsluta. -ApplicationsFound=Fljande program anvnder filer som mste uppdateras av Setup. Vi rekommenderar att du lter Setup automatiskt stnga dessa program. -ApplicationsFound2=Fljande program anvnder filer som mste uppdateras av Setup. Vi rekommenderar att du lter Setup automatiskt stnga dessa program. Efter installationen kommer Setup att frska starta programmen igen. -CloseApplications=&Stng programmen automatiskt -DontCloseApplications=&Stng inte programmen -ErrorCloseApplications=Installationsprogrammet kunde inte stnga alla program. Innan installationen fortstter rekommenderar vi att du stnger alla program som anvnder filer som Setup behver uppdatera. - -; *** "Installing" wizard page -WizardInstalling=Installerar -InstallingLabel=Vnta medan [name] installeras p din dator. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Avslutar installationen av [name] -FinishedLabelNoIcons=[name] har nu installerats p din dator. -FinishedLabel=[name] har nu installerats p din dator. Programmet kan startas genom att vlja ngon av ikonerna. -ClickFinish=Vlj Slutfr fr att avsluta installationen. -FinishedRestartLabel=Fr att slutfra installationen av [name], mste datorn startas om. Vill du starta om nu? -FinishedRestartMessage=Fr att slutfra installationen av [name], mste datorn startas om.%n%nVill du starta om datorn nu? -ShowReadmeCheck=Ja, jag vill se filen LS MIG -YesRadio=&Ja, jag vill starta om datorn nu -NoRadio=&Nej, jag startar sjlv om datorn senare -; used for example as 'Run MyProg.exe' -RunEntryExec=Kr %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Ls %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Installationsprogrammet behver nsta diskett -SelectDiskLabel2=Var god stt i diskett %1 och tryck OK.%n%nOm filerna kan hittas i en annan katalog n den som visas nedan, skriv in rtt skvg eller vlj Blddra. -PathLabel=&Skvg: -FileNotInDir2=Kunde inte hitta filen "%1" i "%2". Var god stt i korrekt diskett eller vlj en annan katalog. -SelectDirectoryLabel=Var god ange skvgen fr nsta diskett. - -; *** Installation phase messages -SetupAborted=Installationen slutfrdes inte.%n%nVar god rtta till felet och kr installationen igen. -EntryAbortRetryIgnore=Vlj Frsk igen eller Ignorera fr att fortstta nd, eller vlj Avbryt fr att avbryta installationen. - -; *** Installation status messages -StatusClosingApplications=Stnger program... -StatusCreateDirs=Skapar kataloger... -StatusExtractFiles=Packar upp filer... -StatusCreateIcons=Skapar programikoner... -StatusCreateIniEntries=Skriver INI-vrden... -StatusCreateRegistryEntries=Skriver register-vrden... -StatusRegisterFiles=Registrerar filer... -StatusSavingUninstall=Sparar information fr avinstallation... -StatusRunProgram=Slutfr installationen... -StatusRestartingApplications=Startar om program... -StatusRollback=terstller ndringar... - -; *** Misc. errors -ErrorInternal2=Internt fel: %1 -ErrorFunctionFailedNoCode=%1 misslyckades -ErrorFunctionFailed=%1 misslyckades; kod %2 -ErrorFunctionFailedWithMessage=%1 misslyckades; kod %2.%n%3 -ErrorExecutingProgram=Kan inte kra filen:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Fel vid ppning av registernyckel:%n%1\%2 -ErrorRegCreateKey=Kan ej skapa registernyckel:%n%1\%2 -ErrorRegWriteKey=Kan ej skriva till registernyckel:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Kan inte skriva nytt INI-vrde i filen "%1". - -; *** File copying errors -FileAbortRetryIgnore=Vlj Frsk igen eller Ignorera fr att hoppa ver denna fil (ej rekommenderat), eller vlj Avbryt installationen. -FileAbortRetryIgnore2=Vlj Frsk igen eller Ignorera och fortstt nd (ej rekommenderat), eller vlj Avbryt installationen. -SourceIsCorrupted=Kllfilen r felaktig -SourceDoesntExist=Kllfilen "%1" finns inte -ExistingFileReadOnly=Den nuvarande filen r skrivskyddad.%n%nVlj Frsk igen fr att ta bort skrivskyddet, Ignorera fr att hoppa ver denna fil, eller vlj Avbryt installationen. -ErrorReadingExistingDest=Ett fel uppstod vid frsk att lsa den befintliga filen: -FileExists=Filen finns redan.%n%nVill du skriva ver den? -ExistingFileNewer=Den befintliga filen r nyare n den som ska installeras. Du rekommenderas att behlla den befintliga filen. %n%nVill Du behlla den befintliga filen? -ErrorChangingAttr=Ett fel uppstod vid frsk att ndra attribut p den befintliga filen: -ErrorCreatingTemp=Ett fel uppstod vid ett frsk att skapa installationskatalogen: -ErrorReadingSource=Ett fel uppstod vid ett frsk att lsa kllfilen: -ErrorCopying=Ett fel uppstod vid kopiering av filen: -ErrorReplacingExistingFile=Ett fel uppstod vid ett frsk att erstta den befintliga filen: -ErrorRestartReplace=terstartaErstt misslyckades: -ErrorRenamingTemp=Ett fel uppstod vid ett frsk att byta namn p en fil i installationskatalogen: -ErrorRegisterServer=Kunde inte registrera DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 misslyckades med felkod %1 -ErrorRegisterTypeLib=Kunde inte registrera typbibliotek: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Ett fel uppstod vid ppnandet av LS MIG-filen. -ErrorRestartingComputer=Installationsprogrammet kunde inte starta om datorn. Var god gr det manuellt. - -; *** Uninstaller messages -UninstallNotFound=Filen "%1" finns inte. Kan inte avinstallera. -UninstallOpenError=Filen "%1" kan inte ppnas. Kan inte avinstallera. -UninstallUnsupportedVer=Avinstallationsloggen "%1" r i ett format som denna version inte knner igen. Kan ej avinstallera -UninstallUnknownEntry=En oknd rad (%1) hittades i avinstallationsloggen -ConfirmUninstall=r du sker p att du vill ta bort %1 och alla tillhrande komponenter? -UninstallOnlyOnWin64=Denna installation kan endast avinstalleras p en 64-bitarsversion av Windows. -OnlyAdminCanUninstall=Denna installation kan endast avinstalleras av en anvndare med administrativa rttigheter. -UninstallStatusLabel=Var god och vnta medan %1 tas bort frn din dator. -UninstalledAll=%1 r nu borttaget frn din dator. -UninstalledMost=Avinstallationen av %1 r nu klar.%n%nEn del filer/kataloger gick ej att ta bort. Dessa kan tas bort manuellt. -UninstalledAndNeedsRestart=Fr att slutfra avinstallationen av %1 mste datorn startas om.%n%nVill du starta om nu? -UninstallDataCorrupted=Filen "%1" r felaktig. Kan inte avinstallera - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Ta bort delad fil? -ConfirmDeleteSharedFile2=Systemet indikerar att fljande delade fil inte lngre anvnds av ngra program. Vill du ta bort den delade filen?%n%n%1%n%nOm ngot program fortfarande anvnder denna fil och den raderas, kommer programmet kanske att sluta fungera. Om du r osker, vlj Nej. Att lta filen ligga kvar i systemet kommer inte att orsaka ngon skada. -SharedFileNameLabel=Filnamn: -SharedFileLocationLabel=Plats: -WizardUninstalling=Avinstallationsstatus -StatusUninstalling=Avinstallerar %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Installerar %1. -ShutdownBlockReasonUninstallingApp=Avinstallerar %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 version %2 -AdditionalIcons=terstende ikoner: -CreateDesktopIcon=Skapa en ikon p skrivbordet -CreateQuickLaunchIcon=Skapa en ikon i Snabbstartfltet -ProgramOnTheWeb=%1 p Webben -UninstallProgram=Avinstallera %1 -LaunchProgram=Starta %1 -AssocFileExtension=Associera %1 med %2 filnamnstillgg -AssocingFileExtension=Associerar %1 med %2 filnamnstillgg... -AutoStartProgramGroupDescription=Autostart: -AutoStartProgram=Starta automatiskt %1 -AddonHostProgramNotFound=%1 kunde inte hittas i katalogen du valde.%n%nVill du fortstta nd? diff --git a/Greenshot/tools/innosetup/Languages/Ukrainian.isl b/Greenshot/tools/innosetup/Languages/Ukrainian.isl deleted file mode 100644 index fd41fae9a..000000000 --- a/Greenshot/tools/innosetup/Languages/Ukrainian.isl +++ /dev/null @@ -1,340 +0,0 @@ -; *** Inno Setup version 5.5.3+ Ukrainian messages *** -; Author: Dmitry Onischuk -; E-Mail: mr.lols@yandex.ua -; Web: http://counter-strike.com.ua/ -; Please report all spelling/grammar errors, and observations. -; Version 2012.12.14 - -; *** Inno Setup 5.5.3 *** -; : -; E-Mail: mr.lols@yandex.ua -; : http://counter-strike.com.ua/ -; , . -; 2012.12.14 - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=<0423><043A><0440><0430><0457><043D><0441><044C><043A><0430> -LanguageID=$0422 -LanguageCodePage=1251 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** -SetupAppTitle= -SetupWindowTitle= %1 -UninstallAppTitle= -UninstallAppFullTitle= %1 - -; *** Misc. common -InformationTitle= -ConfirmTitle=ϳ -ErrorTitle= - -; *** SetupLdr messages -SetupLdrStartupMessage= %1 ', ? -LdrCannotCreateTemp= . -LdrCannotExecTemp= . - -; *** Startup error messages -LastErrorMessage=%1.%n%n %2: %3 -SetupFileMissing= %1 . , . -SetupFileCorrupt= . , . -SetupFileCorruptOrWrongVer= . , . -InvalidParameter= :%n%n%1 -SetupAlreadyRunning= . -WindowsVersionNotSupported= Windows, '. -WindowsServicePackRequired= %1 Service Pack %2 . -NotOnThisPlatform= %1. -OnlyOnThisPlatform= %1. -OnlyOnTheseArchitectures= ' Windows :%n%n%1 -MissingWOW64APIs= Windows 64- . Service Pack %1. -WinVersionTooLowError= %1 %2 . -WinVersionTooHighError= %1 %2 . -AdminPrivilegesRequired= . -PowerUserPrivilegesRequired= . -SetupAppRunningError=, %1 .%n%n , ﳿ OK , . -UninstallAppRunningError=, %1 .%n%n , ﳿ OK , . - -; *** г -ErrorCreatingDir= "%1" -ErrorTooManyFilesInDir= "%1", - -; *** -ExitSetupTitle= -ExitSetupMessage= . , .%n%n .%n%n ? -AboutSetupMenuItem=& ... -AboutSetupTitle= -AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4 -AboutSetupNote= -TranslatorNote=Ukrainian translation by Dmitry Onischuk: http://counter-strike.com.ua/ - -; *** -ButtonBack=< & -ButtonNext=& > -ButtonInstall=& -ButtonOK=OK -ButtonCancel= -ButtonYes=& -ButtonYesToAll= & -ButtonNo=&ͳ -ButtonNoToAll=& -ButtonFinish=& -ButtonBrowse=&... -ButtonWizardBrowse=&... -ButtonNewFolder=& - -; *** ij " " -SelectLanguageTitle= -SelectLanguageLabel= , : - -; *** -ClickNext= 볻, , . -BeveledLabel= -BrowseDialogTitle= -BrowseDialogLabel= ʻ. -NewFolderName= - -; *** "" -WelcomeLabel1= [name]. -WelcomeLabel2= [name/ver] .%n%n . - -; *** "" -WizardPassword= -PasswordLabel1= . -PasswordLabel3= , 볻, . . -PasswordEditLabel=&: -IncorrectPassword= . , . - -; *** "˳ " -WizardLicense=˳ -LicenseLabel= , . -LicenseLabel3= , . , . -LicenseAccepted= & -LicenseNotAccepted= & - -; *** "" -WizardInfoBefore= -InfoBeforeLabel= , , . -InfoBeforeClickLabel= , 볻. -WizardInfoAfter= -InfoAfterLabel= , , . -InfoAfterClickLabel= , 볻. - -; *** " " -WizardUserInfo= -UserInfoDesc= , . -UserInfoName=& : -UserInfoOrg=&: -UserInfoSerial=& : -UserInfoNameRequired= '. - -; *** " " -WizardSelectDir= -SelectDirDesc= [name]? -SelectDirLabel3= [name] . -SelectDirBrowseLabel= 볻, . , . -DiskSpaceMBLabel= [mb] M . -CannotInstallToNetworkDrive= . -CannotInstallToUNCPath= . -InvalidPath= , :%n%nC:\APP%n%n UNC:%n%n\\\ -InvalidDrive= , . , . -DiskSpaceWarningTitle= -DiskSpaceWarning= %1 , %2 .%n%n ? -DirNameTooLong=' . -InvalidDirName= . -BadDirName32=' :%n%n%1 -DirExistsTitle= -DirExists=:%n%n%1%n%n . ? -DirDoesntExistTitle= -DirDoesntExist=:%n%n%1%n%n . ? - -; *** " " -WizardSelectComponents= -SelectComponentsDesc= ? -SelectComponentsLabel2= ; . 볻, . -FullInstallation= -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation= -CustomInstallation= -NoUninstallWarningTitle= -NoUninstallWarning=, :%n%n%1%n%n³ .%n%n ? -ComponentSize1=%1 K -ComponentSize2=%1 M -ComponentsDiskSpaceMBLabel= [mb] M . - -; *** " " -WizardSelectTasks= -SelectTasksDesc= ? -SelectTasksLabel2= [name] , 볻. - -; *** " " -WizardSelectProgramGroup= -SelectStartMenuFolderDesc= ? -SelectStartMenuFolderLabel3= . -SelectStartMenuFolderBrowseLabel= 볻, . , . -MustEnterGroupName= ' . -GroupNameTooLong= . -InvalidGroupName= . -BadGroupName=' :%n%n%1 -NoProgramGroupCheck2=& - -; *** " " -WizardReady= -ReadyLabel1= [name] . -ReadyLabel2a= , , . -ReadyLabel2b= . -ReadyMemoUserInfo= : -ReadyMemoDir= : -ReadyMemoType= : -ReadyMemoComponents= : -ReadyMemoGroup= : -ReadyMemoTasks= : - -; *** "ϳ " -WizardPreparing=ϳ -PreparingDesc= [name] . -PreviousInstallNotCompleted= . .%n%nϳ , [name]. -CannotContinue= . , . -ApplicationsFound= , . . -ApplicationsFound2= , . . ϳ , . -CloseApplications=& -DontCloseApplications=& -ErrorCloseApplications= . , , , . - -; *** "" -WizardInstalling= -InstallingLabel= , , [name] '. - -; *** " " -FinishedHeadingLabel= [name] -FinishedLabelNoIcons= [name] . -FinishedLabel= [name] . . -ClickFinish= . -FinishedRestartLabel= [name] . ? -FinishedRestartMessage= [name] .%n%n ? -ShowReadmeCheck=, README -YesRadio=&, -NoRadio=&ͳ, -; used for example as 'Run MyProg.exe' -RunEntryExec=³ %1 -; used for example as 'View Readme.txt' -RunEntryShellExec= %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle= -SelectDiskLabel2= , %1 OK.%n%n , , . -PathLabel=&: -FileNotInDir2= "%1" "%2". , . -SelectDirectoryLabel= , . - -; *** Installation phase messages -SetupAborted= .%n%n , . -EntryAbortRetryIgnore= , , . - -; *** -StatusClosingApplications= ... -StatusCreateDirs= ... -StatusExtractFiles= ... -StatusCreateIcons= ... -StatusCreateIniEntries= INI ... -StatusCreateRegistryEntries= ... -StatusRegisterFiles= ... -StatusSavingUninstall= ... -StatusRunProgram= ... -StatusRestartingApplications= ... -StatusRollback= ... - -; *** г -ErrorInternal2= : %1 -ErrorFunctionFailedNoCode=%1 -ErrorFunctionFailed=%1 ; %2 -ErrorFunctionFailedWithMessage=%1 ; %2.%n%3 -ErrorExecutingProgram= :%n%1 - -; *** -ErrorRegOpenKey= :%n%1\%2 -ErrorRegCreateKey= :%n%1\%2 -ErrorRegWriteKey= :%n%1\%2 - -; *** INI -ErrorIniEntry= INI- "%1". - -; *** -FileAbortRetryIgnore= , ( ) . -FileAbortRetryIgnore2= , ( ) . -SourceIsCorrupted= -SourceDoesntExist= "%1" -ExistingFileReadOnly= .%n%n , . -ErrorReadingExistingDest= : -FileExists= .%n%n ? -ExistingFileNewer= , . .%n%n ? -ErrorChangingAttr= : -ErrorCreatingTemp= : -ErrorReadingSource= : -ErrorCopying= : -ErrorReplacingExistingFile= : -ErrorRestartReplace= RestartReplace: -ErrorRenamingTemp= : -ErrorRegisterServer= DLL/OCX: %1 -ErrorRegSvr32Failed= RegSvr32, %1 -ErrorRegisterTypeLib= : %1 - -; *** Post-installation errors -ErrorOpeningReadme= README. -ErrorRestartingComputer= '. , . - -; *** -UninstallNotFound= "%1" , . -UninstallOpenError= "%1". -UninstallUnsupportedVer= "%1" . -UninstallUnknownEntry= (%1) -ConfirmUninstall= , %1 ? -UninstallOnlyOnWin64= 64- Windows. -OnlyAdminCanUninstall= . -UninstallStatusLabel= , , %1 '. -UninstalledAll=%1 '. -UninstalledMost= %1 .%n%n . . -UninstalledAndNeedsRestart= %1 .%n%n ? -UninstallDataCorrupted= "%1" . - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle= ? -ConfirmDeleteSharedFile2= , . ?%n%n - , . , ͳ. . -SharedFileNameLabel=' : -SharedFileLocationLabel=: -WizardUninstalling= -StatusUninstalling= %1... - -; *** -ShutdownBlockReasonInstallingApp= %1. -ShutdownBlockReasonUninstallingApp= %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1, %2 -AdditionalIcons= : -CreateDesktopIcon= & -CreateQuickLaunchIcon= & -ProgramOnTheWeb= %1 -UninstallProgram= %1 -LaunchProgram=³ %1 -AssocFileExtension=& %1 %2 -AssocingFileExtension= %1 %2... -AutoStartProgramGroupDescription=: -AutoStartProgram= %1 -AddonHostProgramNotFound=%1 %n%n ? diff --git a/Greenshot/tools/innosetup/Setup.e32 b/Greenshot/tools/innosetup/Setup.e32 deleted file mode 100644 index fc581c5b959d2a9b4a24b0ad3519911045a75644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1170432 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%0AEve_6cJ7O^lHU&y~x2u%2%j*Y_U2$J? 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%0DsaZAcx44+ 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%0A8cNOkh+)cPa`CSpt51Q5Ly@)S)>412)dcVP! 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%0A#GvP4|`@ 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â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 diff --git a/Greenshot/tools/innosetup/SetupLdr.e32 b/Greenshot/tools/innosetup/SetupLdr.e32 deleted file mode 100644 index ed70852a8c20445492c037abe11c6ef5d5887668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118784 zcmd4433yaR)<1lENzw@o-9T7HZ8a#!VnR>}A!9?*7?waoNC>+qv;h&A<TjwPBy*FI zOW7JnotgJPIwRvOjyf|qq6A#%q#+@Kk_3gYnXu?o(})p}1c>zaJ9Te|;QIdc`M&21 zbf3Car_QN5b?Q{rsjAyqGu@I=k|eWalfq$1Do2?9oKjyc@I&7QN!n(Yy4<)q_Jf<s z4HG}OsjO^T{-Q$1@`7a#7R-Ox@vyg0cHF<vQQ%$b@Gf1ju)r~W(bD8$o#PVj{vope zU#7WTk~Gm^kxB-~PKoeslAbE=WH9!Tt{~<^E%u%6sH`1f2Oy*)!Vp}PmfQ}d<%l$E zkqF@rnVdSL{P@#>_E2V!YC9w72i;9t)c@7@CWF-bJ2JHW#voa>0(?iRBn_1pu9A^5 z_)C0IfzINimm4AR=a8iPhAz?&Gddy4jxt&SFNoy!F9+c*m@m&q%z8>E8Fc|P0(SUw zqLxGNFD#^}&AIqW)YFOXwSWGhi!_2lHf1`!Z{RtJp1efRvrzsQbvieE2fYG~o{-fh zq?2sEfd_idp#_Bn4-hSCi%6SLeLDO(^%iZ9qBf_$+8@Ewu>ODbZMHilqh<8c!bR!% z^9w}zVFjeJeu(cDT__hUTKeDsgyZ4}CtEyA67!cK?uY&;U9<_194Ss|06x#-^DI7_ z@hQjW9eg(7GkAnk%EYGxpO|Tr?_a#|0Xf|NwP!|yPq_cfI{b?cU)16AI{dv32k7uw z9VY0oOovbCaJ>#obXcUr)jC|ILs^H*b+|-_`8ssyaDfi*)8T9##_Q0oL#qz+bU00i zW*tg8Z2OH?Z@2zDQHPm2%+R4zz-(p5J8#E9$kpbA41j5Td^jAwkdZLhAV=A@%uYyT z0cA(Vtborch5L`v^N!HrZ~;%64Y2*;@J!?%JHJrQ%5scZR<LCL(ghCJf<^M8WlJ3c z9vJ8tmY6u)F@(SfhkMb&f`WyPB?}!>7d?=_&~b;uU9ilvu&@xw^OrcXmwDus^MR1D zaK*wU%a%X9a4C$<Xc`3;u3C=fUAVyU@WO|e6+8kG^B;2L&o6W=d*A^tXf7D)Kry6g zAld=B@ZtGOmN@QTvh0C}M2<oSsE_O%C-4dvJ-QJ2JsmR;S;1t%BJaZvs>+i21rILN zNNBkQAIJTV$O{Wcig3=-hn6l|xfJERs_8jP7d^0S!NQ2*OJFJGT&+ZwR*8w=CP~e< zO<hUO%%aAzOfz#@)bVC@jHN>yB3LG(EiBW@oOX4*RUKpho^&L#OrY3VW;}EDR>#My zV|o*A<ABC|OJlyhF~2v<bg1JUjgR(jeAM3fsHJh_H_{vP9V~NzI(|Uoqt{@Sb)W&9 z#{2;+Gf^F%*!bu-F|XyP;Wp+cvdj_c_z{hden*aP(*}NH{s@-oRL46TAN}rJ;G+bs zhFymDTMj<by>YOiaf!jwxVo#Qaa32O!oKQriW=3GWf&}KMpq$IC1}?0wIrp&vg#{l zHmK&VfijZ6J*7_V3W>|cKv{8c$H>u=`hG>wWP59W`4y=9KL1VT=Q0rMZ4%FF9b%%K zhzKx$@u@_NconBC#izn1N$OK`)BDAh6!KX=CQ59IIpuxTqPoqhQ5|iTO@Xp+@*rcn zuPIjJQBF_b&=jk2P|`+$isYqy8%H2`!P#c;_E$37EUX754XpKzH>sIz>NI0(@g*vZ zO?eQd2L85Yz+2pHT694-Zo{)65=mj51qlc<v^7wc%^LU<Kv`_gr=dQ-Iow@ZEb-4T zhr^|QIg9le0Df#&wIKoUC3;Y&pjxc9xROxW`w(=sfyTJ4O?V!(TNUI7?PHZMQPGv% zz*SC})xNU=$^Ms!b+Ug}psXk@D-m^+(?SD_(mozR)pdYxDfn*PF>|!^A49UASGR@3 zC4RZj;yAwKnuLFe1n*9iKX-Z#<GwfTl0llJRGEuElVGnzZR}DmDBgmMtfBO<oX9S# z%Ph)=W_6{NuOX@I0iWuaUHDe7r?7gjS?ygFMeHRdU}u3j^XAS%dlL_3#}U@7oU!wC z<YZOMuEr-YH1M<pGjm%nR9d`!^Q9sQvdiV=mxS=l$>GpF%HD8jB>RM&Qa)`?4lnNK z%Sf=gvw0t&==j-uy}<WI5pEYIC&Z_oSrI+xjNx2pZ)w=uon?SWe1d9c<^%?Q&?~)= ztXkQTAPOnupzLU3XIU#^xtU3<K{?T^gyK^_u_?#UK5SpbDWhp$>i!jGb}D3KXV?Md zlwE0RHr1joqGT2~cv;;1v5Vnw@#=(l2}1QQFJ6!U%|Na9qg68!?5VYdv)RXk_7zuB z`uO7GBJogapwP$~Nb(Lz$_Ap<&Hn~MP@^HDJ=$Z-wAfx$P`kR^!fH)3t;%kTI@8J; zLo3-%{wS4~8f|g$*MsBC(h3VkDh-$Nz<RQMZ12<jGiuywz88HjbWdF<^;|(5YgE3l zt1B&`J6IJT7NK)<@fDp;gy%k1%|7HGYXqJI0U8S(LYO|csp6C=Z7|Gv_J+=+r?$s4 zq2eVqwzqzD1iI?$w{x}wwjq~go7ou4)>i05$|1RzGRA7S1>JHy`hJ@{pvojc)62?O zw%xX6g3(Zsnr>aWf{@e+79;{mOUFnsBVL_g)-#kttTbTUBL7JVIIccDea(}igq-Kl zkF?IS8>*g(a<pUHO6H+d=sCj>8+t8wdZfptL{Rz<A30i*Z@)_8Gte-1prIkeg2tH^ z(5SY(S7^B9PBMb>a@#vqzTrC|UWr*t$xzzfsqtA~_l^2MSiqHLmTOk0o7Isi2fV$u z36olRQ@p_R#@OBvhHksCRcqUd!}rA*q=F^tCEJ$A`VPG0Gv9sHzVRo~J3=`SU~eYu zV#?lvTiKmtTM*aR_cWQmlmi7ub??9{0|kaEQbRY{wxst}t9c)^v07E?_uBtVHC}I` zUR|`{?zR@+<Y;wLTasVIt2d})E!AVKkiDc9+I?dk)M&nVgPLtIv<%#<K4zshTi!<5 z%dQpTglmPk{le9T(4`C^{sXb0YUl$r3rp(9JA;$&_xr%E_yo<dlt5xhjrVW9XKK%* zz;zX;I#&cO<wywcYq~`nDP*g1tjYF{Kei$?x2!BOGBw>I#3}c(y;I9HMB6*N)Y^)s zC?MWhrd#}j1%1UpFt9;bX3bE;KC5|cp%}G+e~E5c6-6R~+U8F0(3E4%WEw}LRC{}U zV{}AQ_8^6bG^KiJ;34@&pE>zz1L`A@jqfByw4nZ)>?ar@d!3)!OhTPi>bI$b(A-J> z0CTrpsEko7vNv2WI$-Gu$f@Ko>+7AbEVdfZ>*T?ue)Ke-)1Z!SlVg(n>rH4EHo>gU zjHkKPlz26pdQ=h(H)XIw-PxFUhJ;MBIyyedpOS6&n$&dbdXrkqrnYH(f~8;+Y1>=m zXRo&FsVP&@Jw8R#%$(7VU@KXM=0Qpv-z`!?)ZZh?TGNlYN`pGsOTfDp;U?tvAy(+d zg~}*f>3>lO<#=<+VRc`wTIKzBOGa`VsU@43+~&Pgsj;XCTo~JC@j8ny)37VMed#83 zY@0eexm9ge5Ahl3u)1uM{G_jF66IL4VR!LG>MsSAyoI#!?J_p0b>N5X(XXq`{1Zxe zxmffhqU{}wVUI;qf2IkIPPKio+kFn2+iK_|xRjOo{z!Rv3iwy2x6!<yI*JB;idC<t zUVBZk%4S`tG}%i24_O`3^Z?6jyHF96jcVIU*He}IP%p$JBc-n3ZePFWoQO-=U0|j< zsr%GgK3NQ&a!>W3TB!z5ej~~c@b=dL4TM(an;7eut{zD853Eya!#C|R)Qa&JDv?ke z7Q=!`UDc}d0hMaCIh@@OG*%LgR?*)tRG?iRM19oVkRv*W0cBE7*izolu|001o;<i) z$_E7&Z8XMw@6uq%xv)p^r9H@G`_&GVdmBZi)U7z|dqwp6PerfanW$8l2L>bNdF-{y zaYqO3nF94$a5fxn*FR0ctW%&s6Dc0r_qGj;ZkgK_8&c=Csk_;9bR&Z|R(ao|PHzkK zDpOmbScZLu1A4cN;%A_G>bzD`pp2ny#g~PC#QDrap+?=lYF8t*SyW9u0GS^~b3uAN z)t!)5vwD#~Ni>@Iy_lA%T;Q>L+g>)<N<K$vFvai<Hl&=gJ>H0?NIhp=ThHW<^`xHm z*q0r9npV>;qNmLlDWUD{brrniwGlom<up-;PHO9vsoaL5&77g`s^CV$uB7n5TIE3a zrdD5xk(!{tXaRqsFULHva%CqaVQ7o8(;T{?tW2FYw9WUZNnM@TrtZ{b6=P`T63E3K zRhM41TzZQ~EZH|08EPS<y;J$i=nyj@vpRi3V^ZC%?c%!;eF);S&_Jb$uWatD3l-=X z{h`cc4gJ}^ys&bjjo$}4)ZJ=)@ut|_#g|Ea3%j)(K6vJ6e0L>aS=Fk>9rYh<p?NFY z#p*EiX5G-_raD$BCgS3$wBBn>_S1S$Uu(#HSr6)*skH_6$lN|v#1xtpzddl(9LO<Z z5DDq|vvV=e3^>%j%$_>N?zOO)meiTn6@6GU`$P$u*>#wNnm(~@8DkvOp!Pv`gyqgu z4HWRBPbz-Hw$byJt1ZVX_zh}Z@p0II8!Lj>`{I9Ns8n|;yAs#OsI|&PgVGqT;Qd6p zEw)0$`^>)qS|sf{krwlvX?;bS={wW<h&01@ru7zS(s!oyqO^72oz|1m?)mPt9+Y-t zhqOoq;<ZZMYnVsv0=a(44q=x2Ay0zalm$#xLT1_Q5VWY9;@`z2+glbV+sEr5vsr<S znV6CCIsJjVi|x~%wuqFn9CkVzjS534Nh|VUaJ>((91ELzlI=>ZTWM!=EckEAZiXF7 ztt;$>wB#CfeDmUd2q~2(r@Hy#&oR$-S(H`H=7Jj#C|-4*R*T+l2w!lvUXWu&;G#h` zC;LM&n+&t&V6}%Y!8><4yTlrb!yL2hH4B01#$4O~GGBn=&A|F@Y9y+bPtl|9A&go^ z4l4i4slC0om0pl<6KGX@h>p{po_*5|ESmpTi}Dip=uHMvPFU?Z&@t3q*>N(P^-lJy zuI8NNdKTdMI<_(SFbm9LpAufgEPZ1=`qgQyM~}?Z*Q0lzX<v^XxhCNTk>K5_q%{Cn z^7dY=FQ;jR1Y`C`V8293I)d#v(WkNYE<sr!f`J<;wRpspdmy5I;sGnT9u%q0{*_ro zge9$JRZ&zR%+ateWzE|OC;6~)k0js2@6xE<#bTI!d};maTgN2(nJrZ=HhX)qUaT9l zvG}K%O`TS3X1&63Zx}*m=Xmc?ogxd+P^Zi6BT!deZ4CdVVouAQ3LaI_WPwijHdjiS zSHixm24Bt*An+C#u3#YsLFPJwwdV!NU@Ohj9{F@pBwJ~wc(zm(h3~x*MuCCK=V4vI zT1&&WQrb;HOz|o+t$l31o?32llex|#!M4R|R9&Z)HKz@79KMaV(sLrqd1uSRrxm{y zjjOCVFWH_vBBD`f%7VhAx|(fIR3oy=b;3aTy%VUEl!G(Z`BMMdn^o6GMQct-vW2;L z(FjK&X_0Z0VZG}_*u}$HA9;^avaO_8kOqq6edKKvPzn`9NS)M3B}7P}Kb-U^*U(a2 zCyhj`QScg}AxPdk-lj=XXu#X(98&72Ph^`i>Jv$hO)tJo&i1vZHMlNH9rX$H`fxbo z6SHU(s-M9H`5#GjHQ0V#3|XT2NSmSa?(*A^xp;>eODuP$_X2Vh?`Xo<fmZdEQtKtx zY?I0j5`Pe@Twm#t7%j#rNjwKJ=q;tKXsD`EYAypyBhOFpSD=aI_AV?G#Ok~N-4m{c z#Fi?OhBvpRigt<QPC4jgTQGN;5lSz9m&lN@SaY}X89XRv_07|W0Y(}yO8j1j#zSI) zA$yKe)n`SC!dg^-57Rk%pJeOI#bNSA*-8tbSxh)?LU)s$u=9}S7P>V;vCyiqqzSAb zrEcy>cb2*MGI@Vw>(x@OezWLZp`o_Yr_eA}r7cu^5(h_M;|Mactv8a9^*wjw@vrrm zNwBS~p}MpgIJA9PUD|}uTp;^O+a{wvrAP40M67L#1fi*=ClOOsdI8_kc4}#+;WYb7 z4~M@Fr#9Fg9}KA~zmROdrruEWt|*E3rj4Vh46-N#483^zP{>CstfA;#LDZXDW$K(> zWr|B@qU<zOY{0~gHB^}#h#!KFBON1*C<$LCk~U@#@m>+);^~(<aiVGn!ErHI%Lz}4 zp&&-SDN`O9nx+jnpWHx_i3~p@M8;6Y#)(9<GLj~q`e|tcHo7V8Z;>?dBxz|@Hnt6A zj?>tSGOyA&M<aSWl$kY5R?b+IFbqf)nG#VGt)+^EG-;bj5mI-AebhL%(v?6|G^Jd- zP8X_dkBBM)H#(_Uwn(wW(;^`u_9iLxq|yroqsJzPwVtCjZ)sS*Djcmb;dJ9YML{F2 zy0X)~ibyk0@_x8+8gco@^}5i+lL=h%?G8!Wn1@6+7(mP17(>Q>+TOu2KggY)>`%V1 zjZ~~C?Pl}`NshW;w0W<$Z5dhdg^7J=sxj51wyx;3em!}toT;rVzhc#6l}d+l<!<ku zd2?asVGG_PZGC$cs3@tDH@e#NM7&e-rJq#Ou^_-Vhvug@SErw*4i10HXC}YN?=w52 zzQA*2_AI8`g;C`+>yE0038>(mmDZRQQROkfV!Qqmu0Os$`_qc1&Yq~mP98PA4St@_ zY+I_?u8L!3pLJYu1(7R0CT8OmiCCi+V(k>Ql>i>lJ67NUfK@0QZkYq@{p9+VFFh?^ zcu)`z%HdJ`i6DFhQ_)Gb(nMGWeh3X+9Yv;sKGjiV!6@_|ZDnuUfe@=yCDmzGDlL<| z=c=Q~6ws$Sik!g|qTx`?#ir-HEwWN1d(0f_#+G4#FCusEbY623s`qv3W$&qNB+YUf zE7>j;8#DMaS34~vJItsut%~0<-g{ELPMu}mMy1#)N>QPeqQWxXdydT|;*Uj$XY(aQ zyfO6??<w^zb%j|hHk7m`ltYrcZ6xUCr!k|1Z=D{B(mo<zx*Ww@&~5bDhTKOltC&W( zd2i4JK203B1EQijVp16w?vZ)hXbKt61vVLib5QO8#>ejA9-}(OyAYq`KNldM3i3Eb znwRnzg99lKvy|4z!%FMr-fneQxJL#MX2imcuNnv?8Yrrr5-4Y^-y0%k&5#jt*xhQa z#*T9Q7dcQie)%qRW9{^bY~!Efi9z=Gc3Lpa4DiF(q<_#M-Aw7(d|P`I%6uKmvn1E6 zZi|xU5PJ|-76|vCAdRn>5elA<w`U2cJ<MoQ{y)7?H_Xe=vWB7)>y$K$$Q;M^Q+9eN zIqdDsCsV%Pqj9B>t>|*!m2tMW0=Bn)KMi$7i0$Y9g2XkwQkvGmuOIveHGzBT6dsSP zN;zefX3Wg<8UjiFV1wR1v`=&XPDoCW#@vs8h9`{?Ka3!1R7P3#@~70wNy<gX%GFBH zvMwf^;EPYh<{-Ao1}GOTYrA5TP`PMd8%;Zf`tBe$(BLci@(!m|0Mu3Zti$ICe4fVV zd3^qX&t`n4HV*J*7+QT3<60XBOldi&9H+2lX8Ts#>aQ9{&cuG>+My}6E9(ZnpHl0K z@48|aiZVqM!BD3hYaLjp<D-CI&1f7+{IQ~09~ZD~v3S(DfQMN&IE@IcA7g}0A%-H% z^lV1Z!zk=g#RGGi)HrpFDS*98vCpaOXr0DSGzmXNCv2R&WI+?om>J*)5Epr%zMXV< z(KD15RbsJ>QAM!jxLQl|V9!hakZ}0;!65_#Ws9YQqZ0B0WlCD2X!_`I4+@mmL+ruF zdywY)vu#^4&7R`m>jz}pIFAxE7FyY%@IKZMx-R)}s8?D-GUgjGY3J|6_JJ8OQExwp z+}P=e!HlRE4Pu)9F?T<{Dbn^>V<%sL^)-9aUO!N9hbQfg11kr5`v2#EC+$B6yvPZ6 z6>BcNpal~s2raMT)tF(0x)ooZhEmFL<;01<fjFkGC3B~!A6A?(%C|BL>zi`W>zX9@ zpv}>lW;~2g{8;_LG#(E{D}Go>^IYXKlYG|(%g8uy;v~8IhD^iA@z|G~BwIFQ8b^*d zdix4r<J=Jkz4j4bd#x2gdqv2OC*z2(q48zPCCB;?R^Q`M(Y%>xSO`kZjK(I^QR!&B z@#r+8MXgYd#XwC4Vt3L|+j2;cRx0hQ&y!b!ysM@4Yu)Q78pF!*D=mk7@j0i4;q=1s zvNF)>hfiO8dgId*pLl$_;bX_A3qDqSpfQ=mKN=t6k8)T7Vjoeha>D^#qCiSX{-nd( z_w3nY^{^Y1Dx*ia?2ymDDFF_VSKxb)T!8NcS;qG&c`3g0<a~T5di%8JSS9C*c((_w zds`@qz?~i?l!(~am4i}RSKj6`7a9D920csZVQ<rw59Cgz{x$ibPGB2~ZfRIMXVt7( z13wAPxUy423;lXK)WX)DN8S&5^9#(N?1)fb(FLKdh>uzs@F;;e@OrzV$=s3C`&T~j z8e1A>BweUGqYl&7eL-4+kPasuF7>a@f?F2PX%e;pZN6dz)k@{~jc~afel7de;ZEt3 z8mtKAM<~`NTebLOcWUuwc|Iz4__g$vcTq$ryQM)8S~K>WL@pAM;ol~Lc(dHE1CfiN zE=L;<zq%2eL*}Cm2hYq3piJ~v1V4=SR|Kz%_V=REsRg86QIXIkiym@5Z`DKYfK3l2 zobRTEihle1o?6K9&U<~d(13@|^wUBYjn6qm$hjqb+btqw|LaHmRuQ`Wza>xKPNAan zj?dm4LZKIv{xR<aY$guSZLhiRNfcg^b`E{#&#&K&kaNYzhdO;S5+SadZ>iq!3xw`} zZD(lJKSw*IqDOmex%EIphEpngZRxO8zkWOu)^~c`Jw5aPF~KQq{Cv-c*H!MD<b1It z-Z_8DjFPF&U4QLUw)L;e{+i<)X>**v?Wx@#<~d7ZpKV>0a!>JW=ck>v-gO}6sg3iT zjguZUe^7I_=6>gIZ!UH@S1)T@==|fG%Ll#u&z&zUa(?``z2R{;uBzPUd@249JA1zR z#usU$o1O?3)!e)7nU_bu((AKzgEsbjtJ|1|a&AlUwJdL1Jtnbc)QRwKr*8P~m?uBE z_`>DT+E=EeKXJ$6*?rn>t$#ax#fd#<2i{Rqd}~I1T-jmiw!i$TETh*et^cy0*tz3U z#*F7T1!JDyaCU*~qjN2xW8)uvZm;Y9KR*|9q~RCkDPyaj?((;Pz1Zi(OJjRky~V%w zuBge(I{Ei!Qc~|M|Ig>ypUz3!IVY9<@i#O7*1XZ-pZ3=$?w-$PvWEV1)Qg87Y(00| z_CN2MbF^sbAAaZ9V4Qm2j{e@}86Pjbzw4d<djGLNxPL!!z9~ETFy_{9-@vOH<L$TD zz%iK$V@64u-x)Khm^7NHd5v!v$TE{ZOWASWwk3*&1l85*bG5k_8x~9Xuc1Nnv0^OZ z{SVQo<IPI;=j4|nc0o9Cf$FGsou}d1=Q{89xmq!yN1l^N#md~xFCC;A*~}R;7O3|8 zCnB*QAvO@a0h8#^7dl5ze}CAvC8yP+9KXlYsZtxEXw9E3O_s(=)1>LrXlbhCl4eU| zq-9cpv_zUOEtMAFIYU~Ar{z+<v<OdAfjbf987sM^94QM}h0;S(F5nW$3rzYueBuxK z(8v6nqJmji$msJQwqFVCVkZ8|AW72a$gBYa*saLLYp`j+YVkB1Pc)8V?t-Vk;R&D` zsWcY&_b{?GCH1mJ+0o2p%nA{<@c;q~o{9ppr0lQ;xCt^Xsb3q#|BM7N=ZyJ}fmy;+ z+Q|Qf9iIcQvI%>V{8K7|#&PFfouM2voqI*CRgbd?uVET$n8Ie&!t%ls9r`@wBl-GS ztdkNjvqC$@$Y}OhygEEa3G^H1MWXkFW(TqR6i}<!T`YGqTTzQyX$%iu2lLl}5jKd8 z(jt_E#<SE)+p~VuL0coxybz2!V?Jo&qfvbLHlmVgTWk}#yD`_8{#zWoxQngbft6xs z+ZNjtrP_Gb^KUtB2C=yS_JKTuf8Z`A-`h41bb&2l9%o_BTIdta$+7PYCvFkRRLnyK zuSJ+OfPq#H;zOTY4;$u*y&(7U6kn12g?2ZS_-bf&o*boqIX8T4E<`xLIZ!rrN_I*8 zYE#&KKB?X}F~Poo^;P?*i!9Zn&7EPG)X~-jYTPVLoPx(uYn<vB%$!zCqPsB5e~R5` zg*+aMy7FCUG2+YY;i;`C3;M|v&4ZX+pOgO(NG%8tTcF+ybte?~%i7vo*%Im#ECF@2 zE1Zelh}<I}CupKYW{`ijq<)<NlVr-vXJQV<$<Q-98mAMMRu)#tp(oG}u^*APLo9;2 zDUVs<++pcfb|=MzbImM}T+cJG-9qih>`LVx*3CrclUOC4Nphf58&-6s&WY~Xc<J*l z;U4jrJVnwZxtH5Lb=qPhb>8+=Wrrn?>OM^vf~F4fW)UBu8|w}inuGh%3K4pS6*2DY z;0}sGeyD37Hrh~>5|ph)DIu@b_MU(A=#WXNh%!__1`#^f(_&#SGELDq9&6_~1M7yX zw7a3CWSWk*r_Y24BUJ2KHBMYj%mWX!u(`!)j)pL8rF5>nc*G~bU~U{IjF*?T@&D3^ znI3isrL^8wLMOz-^)zkzFSW<C1S^}EU@lJi@X{Au<hwa}Ws1@gAXRAv&Uuk|rIilo znb|#s=X^v)SIV=Myo$VPC9%fQ$53K>P|IpqaYH0)4>!(FS*A|G8dl4U`pV0dOtTSl z7M#*rz^==Na8Ql`izRpdo>5q=gnRTxVcF`00sM^tDD5UNlhhaKn=P}jdFJYS&8<LG z0#V$9@`g_Yv!P4;*Fa|L1zK0NOu*5W;A&LA9AY8cb&af+waZGrv5i-dL$HTcmr^#; zNJ`$gpm2jbd&9XuEy02gl7kZoY(|vtm$B+j7LAUTu6}`je-C<ot9&=h+><(a4}AB| zU2OWUq#7~zj&+XVqp=Ms_h##Aktgh}RjMo#ynb>H1VuY!B*b6SZllAZ#lW*4ABF`$ zq)o00R&SGv`beAn33U_=5l?M$+YdB_Ps>A1@o>`N4oyJqf+KkD{Arlj=<P5|G{o(< zeXAkR3PnJJOf7sj{J7x<%)#9#1HXbn<=gFW9`23rYKM}ikVjL7ocsazkl9IIpx%N~ zX(}w#V|BuC{&$eQMi(ZVp$;eoWkQeRPf{W3__}YgS9aj^h&EP}#6ynYEmY3jZy_@1 z%fxS#lbT)cU-FG;`|2^~A}|!1u-HO;dkVfpIZ{9PNaD&Hh{w$_k~DK#&h%VVLv5P2 zIA*aSpStH%)}x=$H8~}`ymxqce0aG%yxbaIZV4|phZ7gagcIFU`G7C5zg#gh4|c}H z#^Kn2mRW5I*DE^`!~KP&BO9KPkXY?Br#qbzFX|8JYuX>DYQ15MRk_dnwWePf?#5X7 zgYa4M_n`7geh6m)v(I4N)UH>n0Gj;n?;vF1Ly&VOTaYj~$&a~@C2tPD2OTVYoc1ti zkJ6a-8(g(mH&~vX_9O**$kT^lXz<Ikhdd5}$Z47Kq|kj)zr=Q{!i@!Y$%&z<X}=}R zu5#LtX9#m>rrbSKP6&-0@-;o)q3|^M*3jThyF#~bstMh?>4VVCoA!ooz;oYC2SPnJ zeHiMtsUg&5)1gq@ri0i`d>?y3VcT1NHr2|{Vjpx)r5Se*uIc+KiV`tVHdrXLo3Da> zhH;aBNr-Lyb?oC)(^GG_ACvotRhkWBnJNryc05b(Enk1tv|fTOQX4emdIn*ZZRNip zv(nj2O<f}!!*yhA%MXG(!)YhDl8lfIjtfBEZVczH<^?Qn0nQ*>(3<_gRn51|z=32j zPCLy>ut;)0prq`=zP$v*0E<;F!i$|^@P5T4IN!uL4&B^%8ookcPh!_MBg9r=i!3KU zYfNNvTY7kHj|r-lCO4WfwK9hHmmXdhicD%l@xec%C-8rwaryJGKs<ym=(xT|OLK(? zlPPQj+;DL2xY~%zo9$duFR$%I^M~OL=^8JMPwM4$!47;z5+4`w8BTl@jSnUfWz|un z;V;{raPiWZunD1;sAh16Qnl0`=c#gI%r6Z`YWYb#@Xe5XRn#avOMDuLlI)<Hi)n)% z6Fw^7ed!S~_;T7X!~KT??SW9$Ry2&n$HOZgDPI1Az{Qe*55%M?5KM=zhnmF<=NmNt z{SBHq5t=-?Be}P9a)&HL?mV<ZCr9%j6pwt9ybtn<`60~W^jtQow@>bEW@F9F+?(|@ z9AcBmT^ln_?lexe?cq0~k|8T!LLiF237}M2CwuqKou~Q2zd@rXsF=oDRC8Z}cAC&4 zcSh`}eqz$F<l%STb@zyr(PPpxTw@VM#%}v6_(R{YvpXeB2_PwKIZFT2a<Ql~5l+(e z@i8KTRUt~Pnt-YCkvICWJIM>ns+1<1llAz$@TX=N(KGk0H}~2~yjT_O3TPP)K)0x^ z)M_@bH(M4TUfD0a(!uWDN_WuC{dL~lB>&@4#Jr`UkKb8SX~i6GN>SQGYG`@7r#Ni@ z9CdK6#lzW$khG#xIl1oOw8r;hNp$kX*XL6;7JtPHc4M2BKY{N^k}-d^%SlPoMba<v zJu^_0HUJzYZ+A?}mLsQ@UE&XkR4F1in#s~#5*ifVBQ4yXiDD^fRDVhC%HM%b^2ul! z=q<%5X}xDr%1!(@2&G0j@#Kv!j|brK7)`X$S>!5OI{+zkR=~z$RQSf#nD9P4dcQ=9 z(c48yBauk7Zc)ctd4R**(4wXr)aX|@Va8wAW4vehaVRfx8CJyVx!^`zYA^j9!`e>1 z6YC{5*3MSh@twNLEXQHZ6Fr^(&-<WQ#n<Y2y{2$(0u>7G&noUl39;Yl?W?2>7VQ8B zD+M-Eq1-%;@<!*fE38>>#koQ1=QPd)ULqX+J}3mro{A!=1cOKmh$TY5YDg3X8s9o@ zwY@n!zSSG&_Ki8uQ~!$v5v>`p-rLW*V=>XU+SHEOMPOP8u^SMvYMkUfMC%6Njr1sw zUNFd=Sm#|>SOh&7mqC5>x*M=W8H4SusprMnbG0&WDo!-=r4ZZ9ybyNd$Fx39ixwP2 zMOiv<*z}pc2Jo*<cPsub%SR|pS8(!XHR5N^@Kk3QuV6v!x6Z_&@oHzQ0i`Uh@kVR> z)%QKB`@E;xdBFfPFa>-5;>;LqN-pzS(0!uWom5U*)l79Wm(`7<gt`2Q8mxonR9Ym> zrnRTgxf(thiFz8t@pVy8zBU?m2J0rCMFDMHKL$aDqqi6nwVL5dNSsGWG2&2=ozwmW zoB@@(-Go~nTCHZasxXkPICiA0X_eN+;!r_0nl6+JCn=7HZ@HdI%it!lZ3(zpR$FpC zZiCRd9~>*IPOiZ&N&+NMdSNXNBk4#nKtsHRkYW@LS8wl74Cr3g?f(pI+<x4eFeRx5 zEih!NCpAuXcv8n3u}DtEO`tCLj+Ud~^A4R<DvjEIwQlCXy1HP{Ny-E{VGz8@om4Z@ zBKI1ZX^^{)%rwfKMrN9j&u<QKr_(uO;4a7lcyY|#I%X}}+}SGp7F_~#8VGdYTf$%Y zoN-R9B1mQvHEoJ@^QR$&JZ2~DknhS?aavAOrcY4|%*IV>cQ@(N4bX}_mZ_;wW~&#c zpwIJ%v8~6t&r)ltoWYl<z~m>Go<rKLevlM~=ll_7Ldm9jlvU8)_{Eaiqy|}c{x`U$ z=Bcgf*~e3rRjmeZ5(KDJc3z&~R-5<`(9NR*GbS8<ufoz0U3uhmB)kaQGB0#TunDsw zcwA2Ld#IGvf`whZgo37gx!S0H$(Ld48h(@Iz*kd6cP+z~-`Ajv{YC8g!2@TnCa0OL z1aU&nqL)NZ<rc(KeT1C4X#E&d*)OZ8=OSM3yHqQy)_2|fBP5F6%C#{d#V+4Mi&gke z!fbq7UC>rS^N=a%UK@c*Y#%1J=r8(-8D&Qs1joJ<T3UKRDCna=2`%xBHKc{n+t=KY zD~_L)wqa5Y)!Rmq{4Law4CdOdzUM?jHQUYU?szEKH`jn0C;Rw5Jc+C<hHpWb)OH_V zqi0-0JCKC-8j@hw;M&7<lj_MtpU4*HsmKP^*h)B*#f>AbAMMmC@iLxghKH#}UXPeS znb7l_rjCq*u8t>Ng{pTNIi7U261qBO%ow5F!569W;34p@gM@@SdV5k|v27WD{&CDQ zgN+~_Tmj5rF`+}=<^a|O<u^|xEhasif*D6^@?rGKJ7LUk0X`-my|BrSYfI(?WI(sX zy`(x$d&;TJYmB%?waZk4bE*4y)(K!!z0Fhyee4cyfmA>{csC|C1hX}W9y5%JXq2OZ zJ75Qd<?SadFK<IL=vKGx7{35#?ho7D5y!N;gJ#bN&E+~x>bu`(ucb&nzibGUzl_0L z_=bN#f9Pyp=)oV>pB1R!xAbQm>Ce!J{yd1n>H4Fo&KNyUyXv@r(XKk}dNU8~p*LiG z$sFueTX`)kw|Y^n#x%MU9pr|<cA{G7sa05(sj1WqQ`O^JK~LfV<e#bQ)c>XJT#u}z zU(?-F=oCI&p4fV-%QIBu%?r{zvt9RkX)Vx0C>@j!su=t`=^e=~7==)v-F{<;p%K_Z zI4@z!KLaVj`%!Maj8USe2dy3H$LYFl^hO2WhHhP>;8!pw5q3ICsHvvYBr9P!*9fbI z9lcdhyKZDSVK(mt@s4KmZkSC&{qjLdWtZi*lIcAANe9#EsWvaiprsqn2jER7<M|S% z1~^imft8zXI=gi+ooJF_*sw;EBm-Y-63jnrC2x`Gz{K5Fat0OATQ%iFd5K4P1SO0W z=ecl`p<*$1E!QHZH=4Xz9iG7d27DB4GDO9OC#V<MBW*0V&2Xuu5+wcJS>R<tz0_tl zsf~57`>){=3h~cI$|Q_%6n`0u**sDXjaO&2A*r5+seBb`1IVeD>W=HwI`b`PHH=#q z7fYengKuFT1sS9KWXY-Yi6~8~-B$7*o>MJy7x)FQN7T%`U{4f+>a|b(Q0$gy)quY~ z0Y~MJp|Mbj4Pc5&c$CLP4Y8U=>31TH=I49~r6P`{x0%Ma{X<mmK7I%@JP76ziaMbU zRjWrEiOSX;W7%zW#|@YGc0|EsbpjFDx{ape;I$tc7kPPk>Ls+GDLlEAd%=gKpuQhm zOvQOW_yFn}tjE|4TcCbQYsBeO-Riz1tP0q~=ge4U!ERCW+=%UkjOWa}FXcPrqafWG zgZvJ`TB^+{7Oz#^%SN}24_T7@p)7pha@J|wqtQrEt7v$ly!*%m<g^JoD?tZgkRn2+ z(OSK2rN2TgQuca{N#XI{&8R{jOeb&xc4Zsyfl-^S;o-aMJ~Q1tA!Om@sIi+$_<|W$ zyPJBJ23L&cb;k@J@|TW=!xOwGSk7s+wxz+BQOfx{a7NAqF?b@au%jkSuz8*+(rI79 zvw39B^XB9s7;Xw~##Dg%JH}dC^V1=B?UXU^f*iD*zCJs$oW@!ooO{x>1@!ij7`(7_ zM%}oAra+3;QI*SvHFT09W<qKJV+uBD@E8uovDQJCQ(F*oMOo8^L#d#q@Hm{l44FNs zp>2y_X*J?@?LJez337B<*k1k#$`G=Fg=wD_@vbP8zA=}8lF{OQ3Cv9(`0EgG>E4={ zS)xAJ#v*;qYHhDlDiEnk<EQ;-l{P_!?Ny=!9JVK4M~exo6Mt0#v8+3mV#+nht(Zd_ z*2G}R=4uUf3TL&Zu4!FkQrEOHQ>v@Y_N?oi&-@D<qo(uGYohotnkEKV&UxMs+6P=Q zi8fWS?!Ndj%*3)<edf$T$i3H8!{0oNMc$fo5-!h~SWc@i-c2V9`5zG-itiXjJ2&eQ z+wSR@f;yA1?je&LoN-DQ7VT9EGcsPY^_cVi6WcM7Iqz_7&dcwlKG#0qMK2u;+TWV- zK6VgQ5i{Ph;NM{`V6!o|80j|nmnYI1Y7kEY2CbU(B@-4;u)=OhqO}s~K#x6GXwc#* z5bTR7h~_&>s>$9k-arGTPwpDWR(FMu9Xm5U;WIHbux{FTcpFLxxBKLE|5Y2v3P7io zG&`-H<rsL|5eRIu^FD`AD&?YND~ZA=>L&dVqi<6EhUg8shEZ|ykWt;_2S#<0$BeSd z1*1C4YesdkmB4W+jk4KFHWKV=D|s0(xS2R!G^h>h;&^}DfeQW$5$gLqjlzHKkVyAO zgHLOTM<`s{o*2Xb4f_yUiERI(z)}^rckFx&gg1HJxzM~E^<y?|Xq?($nmyFWCJv2e z-FTWv<a0u!k*cMrXZZoxy2<OB=Y$3k2{TWJV}(fcQybK?6!B-QDJHM`GSrE>KhFJi zK~qpLP$mQz{0s!>ELD6&W)vWqecFHoNJ^|*lKdM+8+@xRacmhb>axkLrJvhMIzg6G z*ktp-inW-y7@7@-xRq4lUfgP6-8RG(U5t}Q7G3Nl&n&vwP0lE~XqD#|UF<ABTyzn_ zErB$OE<(D`iU7p>JOZ1Hv@i+ggE@;&G&Jy@SVoJ(ctLocB`xk(FgzkIv_^~A2;J2p zmf(aPat(&C%E=iOnuYC}@rJP6)re0tn+Q#c)o|`Za$YD^q$A!qMXl2kVvsp6bhAb} z4vs#JbXT=bi((kMM3m`Xvr=uzvX!<#h%+FDIA45k+)j%|>9zG$M1B}WmL$Y)u(gY1 zB8g-!i3HN<EUy+K`7KH$MDmIVKqPM>po=8u07j+;){~pD)IrPQEel!RGr_+DLqxv- z$I#VitO>N}Txec<bZ9lH1@D65Lf@1sJ1B(mA%V$g+!P}vvdI<}8(wMVqag*;ji$S^ zygcNh6kIU;9Agwz;a-Dj_6Va%9%0P#ei|Ae*dK>0^(vouibIC`Fos29Pm@TnjG{j3 z=4(MJk2^nxlHqw%*PwSlf^dG|)dnpI32Frb=9UEsRzn5m03z`Ij2ZBf(3;1@oNWP) zMh|C-`F_}I5o>l@rIiJ{W99-I#QzTc1QcUJlRhS#rD1MP8}^|v(u^n#uj^YHUK6v) z%rBrM<kjBKcYtg#7kSB)H^c4LiEhxD=xR&IY<p|0!BB-IliR4~aORH2NNZ-paAfrY zt8RIit1j%RpZuSeaH@;TME8%Ni#sRqu$+_xBOf9_G)hS|c<)r_G^MU-UUNO>{(b23 zgoPcj{X2)7Dp^+ZpuH%}9Vm>?)x>g6^1&aWgmaogbHf-!Px9bCJT@>_GcM$$t~pIZ z&1sOi9a91#A*dzS@GjJoT&LX_O>yx^u=tSIKmkHMSr#y}INJwb3sqg>Stwhz300>? zQ&aK94h+g^7W7=)_HS3SDFB+=po%owtsSbkEM^RKlS{*^Z@w32YmgHTBit-=o%fj) z3}UFlYA_4C&QJD!1}186D1o+|o~D>FJDiJD__E0PolLV)ymBEtuGM=R&Ma#^a~kY^ zJq|i#wvm4vhHyA00}8irGXy|;<+xQwjX;Y;$Thw>JfYRw1sikkhtpg6OW-{-Pqm9R zSMiSX&^p|de9SI+2j#~>IfVzArDLn;g*TD3<39#2Bbqhi-2=j7mu^<m?JV71yo27= zh7pF=Zt#CyKNxlr{2Zx;aI2;kTI8tILaVnE<^|7yCu<E^*mZQ45RTGn)LA<d5wc|S z^P8y*wk^pXG*`4oxiZ^(iUqW>OZYyXy{t{Sb6T}I872++<#U`8H=>B*hE=m9r{{l! zC^WyDp94WPfU?|?Ps5w9^tT{@CTMeq_o1`&A?I9&NFD-ya4Il?g4<EEy{RIw$~fCr znyN*^i^eBXHJUwi^`(UTe7><pKB7aM9dV&(=52!|VxJ6}(^hx+5tFhH_ZAF-xz3WW zCU!f~utb0?CA}MEP*q(kuxlk#z?nv+wmszsN{0leJ6EG1riPVnJ{)v>r7xldBemf* zZ$tzVwv`l7ev-$li1n53Aw(WSnX(P0N{!39xt{8hIV7LiQaQ056vzZMf!mRr;y1c^ zpaY%l2s=#;tVPJ9G>PQ!4Y5886zILC-*7TMg!5YkIQ2#6y^^J2(omfLT7rM{cke=Z z;<BX=y64OJljc9Xa5}|_w*LsFhBM98rZ?q&ss$W#;s1ogo@&=gND*xF``}%W*uBWV z52xKwiz0qEn4_)dek&D9Tg3Zlsm_k6&$s8j4BE(hbH~)$_SB;y)mHj@6p?1p{pLkx z(bcXd+A#8!QX#jIH2ElmV6Jes?xa{PYH3i1RyTiMW0TM^J>Nc`lo+XNwbW>>lFZel z>j!-9RO|K$?JZz0GNd6xAozGAEZG-ASfubeKW;(d;wYc%jC-+(pLm@#;Z1xeU+^gJ zQfc*>phsDAM)Gz7IEk2Z?Uix!y})J-ro$RRQv;6wgm3^kb*LPtMWr@)KaYgq(?nJ! z00a<{?_m1|)z)2tde`epRw)FM&3_51bZRM5%qheLs|@dBq9n4cC46W8Gk9N7(l_#V zjpR>-*v>|p;(N27#ZmT-?CbFiQ-)*c+S$crl1GxIl{kG^0Ii)ZrQ_`40)+0xhvH`A ztl~210fd(zrVw?`#`Cp#zIop9n>qeBd9FPp`E3fI!5Yf3*(&i9dr*ZQiLk}E%#vq* zi9(u<#`~yP8a-mwa1-XFsXM)WH_|hc1lBgnkDZBkK_N7RHNt-0#*$%@ufqZZ$nh}T z(W)te_FF=W7AF0mHn$V=3bBvkY7>O9@S}YcIfc5(J}9<!<dn^6g=&Vgv01OJU_)`i zeprz3WuKtzu2yXEYZ<*XPRtPJ>{t&PUR3)_1hhHK6c`0M#Fu|R5sn<<bDFsfTNELk zzYMA1mKsGFy;cNKT?&V8+(-cZyeHlfkkjUk6*B_Wj!Gfcdnyo2J%TD$YW!(Gq}|WY zjA6HSwhpm<Fh?^^4ZF>G%<>fNe&KwAVG0n$g(KCD<DA+f<U>Q{MQwu~t&k59PcFT% zVnS{<%@L-<fCX_Fgg=D4IHmp-<5HUoTpne0`V|}~No~gdW2<3BPfsyL94Y850^!D$ z=FE`639EouDb$1Z(yk$P1BgM4y1yP}5dI(Bd~c>!seGWlRjP3WF$J5GMZb{bOxs&G zkW*tHe+updl&+1xf+XK01I7-XOvawJ6FRef<7qLyn0yX#2!X_S;K5}McgShD5Zl|K z28;-`8j*qEF*LXCq!9Cf$eDmSpp1c^{Pu2g_jJ4}T#_I;U{rRPNq&%ATJd98${D0J zw~JTAwNG5I{Fit>d~9wWhy4`X`}_!g|39EuaK2RG)mVHl!o@p?n&1`gpZE-V0nP{= znZ~D67MxSV8_Z}P&hMb-TD%+qg%QWEE4W3u6ot2<wHgYe5L(fxI;s|{^>si9Xu(*N zOVd#jarDB7h{I70K=j^SJ`KCaqMwP)d;SKxQaN3{;r~F0Z{CH+;m}RKA8zk*I#R&* zAk;3)&Y&0wzJR4=s1@f&!u|cC{NeuZ=&)Ren+0?)c5*mt#kxWm36d{At2d&2my-4x zScGwy>p1GbbHECdHtaw_3B6V=(uv5B)xD80-Tco;n-$p5IRjhyA_^~vx^)5iDDpG& zuLAr9An3SD1s&{0Y@7(}fSXerqt_h{ly9b*-As!Udfy*T4G?vV?Sp{vQYO)+ub0XZ zi^O*{;HOL#z}QCFQP6kMONE~!+@C*7?HKNVQin}CJfgz}9oFh_j}CX~aEA{4I($cm z<vQG~!%aGTO@}WF*xtEu4vxd4EWEJLp>Y4d=y)&c@Od5nUWd=>uuO+f=y1IbOLSPI z!__)mr9)YV%XPR!K)tWCIachplP0nUBbvwp72NLal$|Ti>*5xeL-cm-WYBU_0Cd$R zKzFV<8%3?7dmDcPBGi#bHd06Kjg?QRnP%&7H(Dg<V!mF61v<P>hqHB<r^9JFbn9@U z4l{L_p+lz*N9k~c4u|V7QHO(dI6#L9I&|o;pALKLFkXjt9a?p0(V<y~k`7z-K6PG) z%{n}-L$1S<I&9M65gj(@@FN}8>Tr(^cL|6#6X(;h`w9!qZ-ObHH7zY5t@z-)ybHcg zS8sg!;p4z30iOZ*w7I9}a?I{&27~*A)d*D4_&KLCL8AL1qyftoMKmBB<woD4b41es z;fLNx(9LhdWU#%hR{%W_9F9dW85*4iF5~C}c{nN$dD^l6BCw-%Z0d*2LUww-k2~a> z-7()0k?+HgG%n0foxU0Nmf)8<JgdWVIy|q#uXK1phb=m6)!{`QUeY1Gyn^Vq>F{eE z;%x^ao(@4!dXo;1>5%L{#h=jONgaNw!_Rd1UmbEC26cE!hanxF*5T(mJfp)ebXcpy zIvv*QaGwr8(&5KC+^@p}I&9G4K^-2_;b9#f(cw`Yexk!h9r|@xp~FfY26VVXhdXsx zrNe3+?$Tk64&T?|ZXNE?;RibWP=|YUxJiev>+nB1d_#wub@-+Z-_qe09hU2Gs}8s6 z@NFHwqr-P~_?`~8>+nS#Zq(tQ0c)2yF}`Vk4IRRfxKoJhhlde3zZrRdxcomq{QmGg zzegV6*zxHi2pRC*8x$~ykYZh{9$2_s#tW(^KI{~!-}f~Q>BM^#%J5ToN4rMfzpOwm z+x#PZ-a)$K|ANmR)Qjra5UHapbK(5u?bRwvSn33|@BbT&bO(}W6W<i=o$Nm(({J*# zx+Z(&$sX;U*FLnxkMMh5=l4_P*vU0+DLA?c3YHZ}%bed|F{D_K?g0F$ykcFhRr10D zyu6(Gm;4AXS?BdK)$e~HM|!t?N8Rk!&g*L1HT?)r{xf;TLYA5&nSbJPCnWX#f76ie zK=OLx`4j3F=gL^LV$35m7ZxllEB_H*{-4RKlWXeyr4KF?I+E~9=l53%DT9&j0Q{-- zvXTrZuUJ^%S+Z;;>Hm-LdtT@FQ}rayl?4}`s9Kp+;6%y4|IdPS2a-n-&!5z0<Cd<N zzhu#Z$;-=@{0J}kXY%UgBGrJ7ELyOz;YWBi{Y+l5u1JG1e@3D6`vr)UiAZ+<{&X4U z(2v}Zc9d=U5nkmwub*m*ZO}#0UhZX!mcnp3WG71g{eJ_H{&U7O(tW`%9X}8O-7otQ ze!u^j{5reRmn}tCi`Xp5>-_%8AqB6=6>axZ`<mS~`hf@V`xUv1mMxi2lLXXJ{t=$5 ze<sg3m%9L+V9CM<7nU{s2rvFKd3AAR%kv+2DAF0q+$(-qo_R=jK(0Skp0U(^a>24C z>CFGmkMP=o^q-@fon5)}3l`09AKwPA{NcI{NBYm<2VE&Fgla-d#?D9cEr71P_#-@D z{+T?xU`~l&<C*_})*;I5tA4nSy^;QN>ez+GIuCVrZTu<v5q|4`Cckd3?D?LB58zi` zuFi?h{|L{vpUKnW%38K`k-V$`?RVcJKP=CDq?0_K2hX1}zV?XlnuwpUX|E#lH~a|S zrk}~TuWQmWy_VVD<;$@wX=h$0J?fOYnntD!r{xhXlg8`NlKn_wj=X3|A@e6_IEi=u z0L~_}QCxX2AbSEnuOZJ5{p~`!9S9xQcK@5-hU%T<l)mp1JI%EeKh%R?s}kqbwT%I6 z5bXYsVdDslMSQ~baL4`@$1mW<fzOsMYGc143YRZh8UlD%GJdWHZ=1-$U1mB>ODBNs zQ`Jgw#x!FeoqaUp2r8XNw~71d{0>Cs;ku`p<+rh!Z3B<uCt`wzgTCRJc&!nB!$w}g z%#&EZ@hJ`RgC2bSqCdGqig5r9e)rb-t1U|Fqw7p~)g9jKgNMuX5ONG`@H(}8{c&|U zj2{iaH*zPy#fbMT{b0rzrNX#+gUZ!otZSz!xa)#b4&q=d593x<9^POucaHGwT57!4 z$NC?MZ)xD2(F~sQAvhj4_KI@GI65FM<xR~^qF3)Jm5GS+D3?aktA{FMJZeu|Q$9Ik z=D;uOf&<@Q(bG^jaKEQKQ5v`(=Pgxp?s)G-j~X2S{o#TRE<uBSk$kJTp{zEw^h;16 zF{uRyb~&xkM|-NrUKt{R3rZKrRZg1^u1+xG4P2gLYl37uI5@$hS`!ZP2%*~qA^cd0 z8Lqi?`H`=1<B|kR<KTpb%1<hk9rlnBZwNCd9IOD{gRPA>9J%OW(ReMP<VhPTp(;@^ zsBiSaiiUlEXl(jp;lYDT62RYlG;p-?XvI<g460si{i?oH#YhDWb=Op}40TMrrj9p% zR~=~wyJ~EB$fVK#uhef6YS%B}$i)pf>ykKXWP#Bfv;Jzmj(xjcsF8i({!NLfjcL7k z*m&=y_0i&tQ?B}%a@vtpBd!!%_zjS(dNz;$c`r`G>~M$+Waw8@@V4rY_?z&HDx(r4 z*~kJjsV{Zx|B0w^<eB!IhDb^H7UvK2dto>#1Sf18H-1RY(VYC@>mn{t#EKonZ=D5R zStE8iw6nm%BfAKhv9XDJD6?_k3L99xar%hk1n~%?+?m|(*fJZ9T&w|meudccOJr-> zuuIsRevjr_w7!IfUj~@A@(T7#`2kol7>6jl{d3)4+TF3KC?q-Rb3PzP{j%-CQ7=5g z*wLiD3cUQ9?JHjmG~N}$WBB=iT*FpUQ239})oW%4a_A_V+0w|Xvf;FC3C6}`zb~hG zsxRj}KCSq);R@5O*Z~nzYk9a8F9CFMHRm)=gCy6}eLjvuS=>QqBeSfk0YBY@b1EHD zqD6{bOA)WauCz;Kkd%a%`&YIc@-Pbyq<FB``jrni5bHQzNf^-5yMH4c*Y5*p?_Abw zs`(9H^KY=Mnk&vM<xF8ga<b#(K6btTL=tF74dKUvj<Vgj{<9yElYowcxpQe(D`BSC z<;J)R*+DPR$<eHrl50|}35A)qEz!0uz383uf5JP?`WC|YG&|U#4v%MXr?1wF*RA=z zU2w?TwxxbhrJ9j|_iEymYIx($XwWGr#}PZk(NVt{;<{0&6V=j$w?(4D^a8@vI`8LH z9}nz*ERPlKhIjZ~2w8wgFJO;gHRE@o{Kn9iR9zZh#J%e(?C92Ek5S)aRd$rKgTT9d z<BF)aZ$!hg9k>`)iz7*>^=x`XX`EFV2^n#|X$i3MZ}uAihkp&vx=5WY6J#I{`1iBf z96LT%d~l#^3wjYYoUPc4qco`6m!xb^`GGi2&>y?8Nnimrpe+q-ZG4Dx-v@Xxa)E6+ z*amQXP`oJ}TT0qHdsvp`>BsAM6v`;hG=lE8Hi&VMe#d!mQ?t(F1_HVob=k=nN2tqg zP$FISZ5qhGx8H6Tm)7(%{Au*lp=<8_UgY0&L`GfCYxT)$^OZI?Vuvzp!vKC1b;TjI z(4g-nGod3H)}YS822Lhk5Wa3zXub(=BuD?@f1)mrD(&N6??%Ym21)kDt@CeK1_`8~ zmRDdmqLeSp?4IfErJ{os{3MZ~t9|3SODmVgYVGfccuq6_6R3x9O_0h@QCZFWJ|RMV z`|oMUk*rD>J5zyRpSQ`XV0xmRU=(ddvk_|ZgVec5^wyGy=*i0M<N3%+q1|ZoJ=mtg zF)OltN5KXhH5*uq)G9u+<7QNMkO3+$)w1(q>`(`SzuSfqaN6e*=QOfeXZv7WJx`$* zEL~4Qc3pTM-gRZ?{a@AhiAg7IZ*^4INf`5m!qPrj@s2$7D!hOV?LgX8t$vt<gRgBY z%kHyI!u<t$I*%5Ot(UvvYEx&=KRs#vaRJ`*>Ui%LYU?0ZYaI_hZo<8m59MY(@q`aQ zdot&=M|GX@qz%C<jgj_|=bz#i#b}84c2eh@N1WgD&(I-t&Pm7>oiJ@E5)k_eFx^mn zoQ_q!M{u?BH+Y!I=A0b3yU>_)7-ywU4e@pw_<o_;P?uDH&hyvD4@Mq5<qqkb=hdqb zNS(pFM}ofq17uCRU6OD0q$R>x=SfSER*rn=aGYmIBHcqV1i;#i0yX6Y`vV)Al<Kmq z>xQ$d=;}qQ19;&`zkrMa0Pl$BpMiwN^%dnbqh@o?r_QmgyN@uvR^RYXShVe}Tyr?# zIe#hc+x;59vx?6%_-uIGDSZr>4;a+rDebTLWFW2?@YjHw^|V_Nz6s%OfJuJd6*dDy z3ClV{x1lkt^2eYuKJWiwIZb%2=L%y|y}G+7m|-iq4%Z6A+Zc*2<IPT;>4|1KMVE7I zCE>52L$CYZe3UAg(}bVWxn!rTA|suxznW2|r}m5<JO#bTRdg}iR=NZMwRtNEAe1Iz zW+FyB2gKt9JYo<ttgvC0?rP?fQC8+{4$Vud(GYG20{wc%drwSo;w;a5egaYNH3J9& zaY#3L+eB`d+P3iiS(N`qk@z|F=PJBg?RDIc3&o4LgORuw5LXvW&1zbS(@9xP8oRee zDl{B77_yp9#E2V^lP9YeX*M|zIBr|%?|>tYd<hw7G72s|9}aK9&sl7d)T%d7w0q@y z-Y^thbjc&$Fcw`LD|dUtRCIBY+^Ogy?gHe1!W-uDZlo7EO(~Tt`imJp(!AH%-s(|+ zT~)kW+SRlTJqF8+Zg@X8%%+4_3HeG%fa+P>TYIT#GjLKwt?)fZkq{q6`2s?Mu@`XS z5Nt#x1KBuSC{pKDVhu4Xz(dFY3n7e@RVvF(y6{R-SdvY{{I6IJd-1}VP+V;Nn&?eK zS`LMxEhptp>zmpUe&fzoPbfI1jOE2!i5UIxE|B%z)5l>|@p){`y5P(i6E>J$Df(I? zm$J{>oJZp=?1-|X0S7@~I5y^^iWrVO8<!&h6L7(^aj6zM|Kbt^*1OKV_^^Oy%e$lM zMHeN!Tgzp|MX)td;usXfvNlSHP{p8GZo3UgYwX4X6OErf*CGA{b%Zszl<zt;gkC#} ztc88m3NC|O-7(+haX!^4Z6yh#|A%h#d5@9>EV^uv@nv2aYuoNRl<KmsHNJsg5q#kh zAd}rBW7by3XU&}#><<R7Bl@NdPHC?G*$+5QnuM1%PLf9B^P0u)HEl|qH0)%cXw4A` zXSr#a_G&=9$I`Yv>rhgCYL<0ff92xWs~r&D&9o5nyh;boCU_Xc@@mULih{igIkr+i z8UvEDW7tX0tH-~hV83A}E1K+t`zk$lrj*cEdLGzgGj1f_9N=rw;G7N~d0y4%VwyQl z96SP{md%4On@}#A(Zy>vxi-u>y2W7Io^xnCKY{)j5cfRj7iKPXD~Q@gT1zEIX)Ri5 zLqn4elkDX<bywyarVHoRpGfCM!E2n{ZG!h4IG)EWPd?>&^$k<#BuaIQC<LO6o>xy; zH8SJn&ZE7p;^F~~8y5mehd0bQCt66z&az?7*{wD+JPx~87}xKXLcZt!Fp{ASqfnv^ zrcqA$rYYH@66Cm1x9eiCij^^5j&lzRGiyfr@q+=pW&`UD96+4ZhGw4|NVpv@g19{a zUkMHbZ+9R#AmR3b&LNbNFoeEtAA-2s6A(v;w-2GO1jG#?>>-p7fgwbIzL4eiAxId2 z=Ya!|GLU8hR+<yyXFo~*aj&e})rLZoTFY@f3GEt`piN>j7rcN+55t>!D*Kb($~UAD z@ZRic85@mdcvpJyN^J332m((gXHtDtx=9LtfXBl_htO+v7y0d3c(s44-H9$Hx(Ei~ zgU84`^2)zM5(nGRF%JJb0e!dO;2(~zx$p;1i|c|kT8=%mg*tTD)!OLgzQ;`4VnOu} z8!~SH@A@5nZZ0}$!vZ{!S|<cc!Pc~z)>t0F5BddHLcpnOtmu7ftV+0B;cZ2$Q%!dk z^smZDHA$0Kb-n^fQ7J1w58ddgPB$eHlTiG2(k30L4<RJVUwT+B?wYiEDo)uvs%d?; zF#vOPhDMkL_|Q)i+0ogV_?^3o*g9Lu7DUI^KN8b&sHH(UgqI_*HI~@$8eE`N!sgXC zZYN2N9)j$DFFy3fTTPt{&yIu2;HjRTR9BOlbF%T_CiRlIu{E$3?*m!Wc4+hCjZff3 z>_QHIh^_Hnx0QskA!DE>3-1l<n-Xl^8^?K1hf>z>GAF)rZ8{<d0bm?{5dg1U?`|5n zt13pCTy#&O+=Acet2lLI2%<}>U!QK$>j|qux?&++!D&pGZ!A*2!~!B;f=>8+6hrUA z=z+x`u1|JjyT<vRqe!eyKiG~DI~L1^{ruPO(Q+m-|HOoCisndLY!oL#aTM<(-1q?j zEYQpec!y!NSXgQ6mJVmFXyt+fR&c3_7r8u$Hm2X6=!{uAGnZr9y69suifHHDQ0C;C zDdG<-X_ouDry{dl9)l9Y?u*~zdGA>m_U$|Hm9rT4gwMOT4u{Usx!LrLO#TSC%)p&j z%yr*;Hyjoy&F-xWA}Av=d9H?n7tHWK03}_irkifc<<8!JX$;O21N&_Jrb~L%))=%J zy`3tjHD__O57(TwKC97!jw${m@g5p5JPn3ff+3K&d+VkSNVoG75HgTBSPtmO(&Bx- z-MjEdR2Nydk-G6q@6c4-iq&!`q%8&_>%!dR3!;>GSNr7{`Nni*)C(g}RLR@yGm8)` zEx!j%_#WCEZ_3gRD(mZr>|7G;xUz^~uc0-VXiWpHFleETK&J(TMRQ@b6m<qIU>3=O zaC@=cAV$j<rzr8vf1$+UyuY|Ct?2|_K}2lNwX+4jn<wL-<5ug_PH9^wEFXF1*MikH zDmDMz=Xd}a#s9U!O@*Ttn{&Ad`0o6dAtn9}6lWVXOnDxPTP^&~xKA|Rdw#Jgmmk74 zKX?8~LVN~@?IpdWm-M$-3Iu|ia10smP{SJMsy~K!lc(xhU1XPNt%54%AR|>I{h5gT zL`&dBMfH3N(nuNkY;fOtA27DXQnh}GDHet=ty=!m=mMfjwqHF1W*ZYxe7uALzxL`s zN3S)+0e<>HD*R4Zx>()Xw#a!`Sd~ZN_sV_o?U3VXCbpkXg0!)?gg!NpK2ZZa_!frf zTk(|Iuy#jq9LQ^j#<y(4lzJpRe%})JdgR14tm4&kuSnR67XciDzZ*Xp1iI%?4gIDJ z#slgBbm>kcIs8<L(<sGM@HNe84ZaKMZCilaBd0GT@5)vTOA_w~<$;%`8>`;73TZrn z${Z{s+@cP+Li3x^^uX;3+}{&!D{86)OreF_{?Y+eklm@F+JIV4s2>0|Jv0ieZCk(_ z@|r=n-?+ou1t@z6<rScW`l6d*eGG5k%q!fChSPfHla!q#dHtJ^<PpT<x0#-#H`}(W z(0I^j@1wa}sma^;SinH=J}ibq^j>KgPN-D7k1wKA4@wUr_G&!M94U@sAJPAHOebM1 z)c;XD;m}`4-yx-Uj3ZtYgNaep5OT_B^XB3m&tIgmU^-UdFHlg0zv7VQN?89~M3?cy z;HC6~U$_M1#L3a(cN_3PM7;g<n_?#~laHx%4<YdexHHjCw{%Psr_0^^T_j;hSpho> zjS0mLdV#X2b6S0+M8dOew#1XLBEj1ZDviF<Ghd^}m{E3Kj&;S`&!a@!=?hm2deBKO zuKq>*bl%OlHN(B-piOTXcLEpn>@2Qx43(p{zlbc_Kv#N_O1N=3`6`@dw<r~V8O{wi ze+wHnzUN2=_%XpgxVp(og+NMQL{wGjU+~>kE0J3IvWR*O-*K?@YUw8Nycyq7>I>!K z;T=j;-}Q@!9rWN6l-!HWJ|C5WUTq2$xfdOuAUg$k_2l<cD6&r!fE%`u5?%KXDADKQ z=lQhpS2Qo~^<fVlxY(z=^Db&+`h#@QJXrYuKkU5=U{uw$@P8&Vc>sY75NK4aqYW)q z#AvjoM%ri?L?t?sMA2HCND>1Ek|r|{Ea=!s%{Zo}^--u+L!p+cZBuJCAlg6>P*NMk zYJ5j)?FosRDwQb6{C{ijb7m&trS1KH_kQ=|BzyMzwf5R;zt&zmc21|p{kq-K*2v06 zn%YxE74P0D4SZ^8==cf)oN8<ofAbw+9`0W?84&TxU78Z6yQ<<OE&^2Eh4-Z^MZlr{ z<Bp_6k;`@t^J~(yT?L@MT1|w<t)W=v?VPC9Z+5ADDyk{hDq~TcMBzRfH}IGZAVYtb zdE&Fu6d&@d-RCD%r2G^aio47-<?|B1y=TqOB^ByO`%$h~L%u;~KJ#6|sMoWsK+zn{ zSMZ5;*j?0~!dm4VU~${t^9Xa;-ko+w-A@)H)eDboB})zscM1Bv46u7j)>?aAb9!E; zQ0+~tRzSPW^Kn*t-?n)BJGjXqvQEMSjR+}t!TbiaB)s*;R}gsr99~gT=&Ab3ZggC} z)J~u<nt%*7F8~*P$BSBU!#b6P7Bh_;!6W3roa-{XIEaZ>_cekGN%{kh?LB|KkBTxz zsN5ypA-SuG7i7WC`lVITvR~>Vm#4Nz%RYYp*qXMeHjgE7XEX^Z{hAf=rROArME#Pe z>`zKn%$lBPMbhFc@&GYG8GUm3?jNK!kzZ1qUaK}gB%h(R(ep@dV62luK;IgXZ29{! zEZwJ-GNa?EMMP9a#)(;^Ub@3Of^Q+b)%?M|ke64k6Ty^UAtqb!%xO1;eTcXT?6%)Q zXg7}o4eF;AtCU8Ew?xK?Q9XZfGCq3$p9iD9pKkb(y?qBo(9~<YB;V#wF|WjpXUMrb z81lL8bdh9gj-!5T<xgQ{=Ff<Htzz>^uDI0F0%`-t{28RdzG$`cA=3SJD!0C$Bggo$ zV5A{S9M*Jo8S*OF_wE5^<~4$<;kLI)a1@8*!b3Z|Y;Fp{go<Q9J!F{SzB$J)*{_&Q zQtJL*M_&D&r0a*}oc>w|v)I5t#WpUS`dTM8I>lLVyqd!xAic+O(!*JX3xW7Xc;s~5 zXO#C_c!#PpF1uX8rSxayKfF*g9UPzlymcGy-1oFU73DrZxHF?>Oz&3_{Ynq(Juy7) zZqbiNGIOKr$v&A^^KuadF_-V9xShSp=2=uT+*uIb)U%$U;@fhsg0-?9@Yvu*7=v|1 zu&AQ)E*m9*c&d<w9cIt(smn+X*;aX=hvsu^heN55v#`Z$jt&L-ws`wThnDTy;vE1d zxpkb-Sk%2LSAzaZg64Mvl;>ezGDXH!9C@!LFRmh+6G>ls<+14PJzr<k=|y;gHB|_8 zAkR6x!03tKuKSd#Pa``j8|4vJQ|OHx(I9to<P{pmGhrk$&mlMSDHY4GrDtDeOV2LQ z(zA=S^z5@{`e*hQMWttF`@i0Mt}Q+L3@tr-l9HZ1zV{R@J$s@^&px*I_!cKv*4~oX z-jdYblHA^s(%v$xy=6puOKN+|$o7^|?JeWgT{COE7xCG;k>pHRjYqeD3bO79Ef*8R zsQO*2ejk)yE&X}yJ$A#e0~emNx1Np^NRvhh3Z$oTtfAY;CDtie!?hXAS-1+$yAN6> z?+wfPWx|rS{10Gt{PlLES#W;(w9FXNZoCsuqJ)+|OzvBjxAL3VxLk_Tc!%8FUY96y zk*PFR*m9L3o5#E*4!ZOkaM-fEjo;CNDa$u2`!=zM{@9@`o&1ul<iQQ`#yh0KtENiX zYnX|I8^sRZtQEGD0huXu^<J(@)r7~E<+t;jsM21c>>^5=v_&=n(-iS+TrMF68}AUn zu1b}($E&o(Zl|s0I<YCo(SW&8wS@U2)@qH*r5u{h{7~$m=_2&@o~C91{#Ut&CKFm~ z|Fyq>gXbdTfhd99@5D9PUUM-CN%J$Q`?P*%N==IY*z=L+ReQpaUi+5;RoR>(^EF~z zM!mDBr(99Cde|<e8k~Nw$^h3*uN=SS_fwnnDj@ZYip(~}IN?b&tA3_vYmxveFM|;g zpOnbx=y>?9)RuFB)hzbfdme`pGal-fpxGMf0)wKH%uJnB3M-o}k_LpU$$a1=u8Rt( zG?z1JXb+E^rTbsU0y5u3Syl^;3Xkm5&U0#Uen6asWUcbxy446m{8lYh#*BM0=3>-C zL&&|VTDj-mjeAfTGb!<^8<lYv#@1V)A>na*aR?=}u2q(FWs&`W`e~BA;XhhUMz-W; zIFvy>&BFao@vNUFMUfz)s~}=9f4)Md4Y6|4u5MLIWsou|gOpDhq;$$4MG=E}(T~&w ze4;r6LwKB;D!oCfyoNK{oQ<2$oXqd#<|C}2)Er61<nT8`IRN-CklinWt2xfVyAVR~ zi}vUbe-WabhUBv?9GXXHc|;)eD#0a+pDR1^gon0xtXb;CPSS}oB`q+YAs{P}W9qrR z9B|8oME=ahIEV6F@`~qi_3b=w*MZo&w5azSL9BsG&ArlNl=zfz+d4^p{Th<bNeHBZ zh3BwOaVr7akzd0;oX;F1mZpN%=I;Q*^B~MDLB@sWxPXYywSEn*KQYJP+#Ad2edepo zDb3p?BmL%|$QF>WX0l3wd%`j#n@et?#B*HhCGnq_+X0)%86byI%tVG~zv45mCXL?X zU|CC}!Xr4gyhjr4>ZPo*u~)2Yl1aF2RSONZ)!2L@SA-R8UkA2d3TF$Hm<fqI8ZRZ& z!UvEYPu^jI1YV;x2>-$IkCu97gu8$jAijo><oJP#HVTUZ=-;G|6g(!y<$&5O$KCuf zHF`|yCN72Iay>4s(q!vp24zB4s8+b`hRuCcaH}gbo&Hs5o&jK~sS?h#x=ZdMGp|_v zsy3vo?#93)r~EnsZoE<_3Jcxpw{c+C61y_Cn%Lp1NM9F}tO5_nt#nDB{L&tEm*4OS z`y0oiMP6CVwg0*VZvBrEo!yQkwR_vH4u`D0Huf^368<h@WhPVF6|3!G>IvC{fbdZ2 z14u4>Y7Nxz(L#11RHnyCrf)3HAiVhyNok2QZ26d_z(bbe7B|4Xq%TDHpR%y%8Np%< zip3_LI*T_ieGOMdi<L~pWhwPr`w((qez=L!eboEav`40YorB>kzMlNmu9~Cr8oW?s zQEh1tB=!NDecs5v?SWq5kJ*>HY=jCveEQdu1NvU8Rqy)E!ea8+WZG=2Q?A}`&2!1- z_0~M~!mYW4WfZke2s!0chRT<7o8JllO{l=dDfdQmcqlLBi8X6j$4jQ`1i3%_W&Jd1 zP1kj4x*Zb&Nn7$pI_N0pn;GB<Bl8_?4S6GZjy*4x`EqiRIS$ZV7TZxFl|y{YHB?5@ z!OshPTp*40i(lD|Wr8mea|Nr7;IygKOQy(I_2Tp!AQ$dpjPUVJdOGPdk$K$2t*F0M zP8rQQ2*29)-9TdNkI^CSk`UfL=I-xyMIyhDBS*FCtHMmsVHT?}CSjhEFmfDOzHYLy zo{bO5WDVZstJSIHx+%u`QQGxK%2iG^Wv01KrFWF}`ie^LZPHsJ>B%W?`MOh#^~Y-O zLKV}mV!rBI*CC~q4o6n+{zFRpDzjGe1nSJ0acdpn%%9&UReRpI&Xm9&9k@*ee!j7& z%lwyGWp=eLmB7^mE?;-1vHpuX+}ngJUmaBWb^6x1*OJ5}?X^sjDC%szQQ}QinRNKp zWlD$>b%<}P5FM=z5@NgxAuKt?$^=K7d5JP@vmh{0$C{{$whiyaFDiPJMo(Ekm2}N7 z6Q1cI)|q1cf{MP`ivA@X{hfCN44a8QRY(6;qqofplE}0XNVTgVZ3Gz?&0*L2D<sLy zztlMltoMuck60stfk<F)#Vyz)fnBY)P#L{@Z_>jp&t}WBDeAc$PlX6@LP?%?k!Shp zGeOEI5%@LjLD|+*D8qaoO48or_$k@<TAPdZx(~``WT9+3VxEl!#wi?howDD4q2#u} z`tuNCvf;6I9hcw}OGBty3E_siRS$8Kyem+4-V(1uxy0NOar1DHozL5Y`Eg;z-FEfF zxyzpDnW~JjG^9@2?M&nW)nYS@hXLy7QH4eD?awT!tvI`;resNm^0BtXFh{q=m?ynW z_)#MY^Q%e&m1XBGEUyxZBo%1ELsr0qf#Mb2uz7$fsoGxr^j-|65R;+;TZ+uOCvY3M zAtHN~i$;dGI@`=GH{#UKe!;FwFNp<gA|Rpzj{g%>87c2Gd1Upd-0bJV+c&<MxUu(` z5!=Hrr9GN@N%l+U%tSET=A3@@D#o3XR{IT`Qvjuw|HEPLmQ&j<+1QqN^A|sA4+f42 z?%^@;;GVOWrUds~e!Vle-E&&|jNUgc`}URXbH06L&s5M(Xt>k`&b{!snXC!IW0)_D z$T`QwsWryHzgTYy=Wg1Kf2ZcKVb<5BW9ibC@SOBu4yVdnd7f)6!+39snC@OcI(aU$ z_qPHSBy-+!JHfr#A2pt}2>1G>157G-*T@xiAv$(Z_ySkB@L5+Vp?8+{<#oPu8eNMJ z6%(GmDb>uRoa;WNwbe5&!ah$PijCgYM3~0(PjWVK0-%z^IYnMS3b}5Uw9Z2M(OB`B zK0r8?Q~I+!4Lt+Cm@1MDkL#vQ=~jE0@>4mPm?3&5RRJ_IaX`sWD7fT_F6Kor$$Sy1 zi%IqzXk0xL8&1c2)V!u*)&unOj~^o$VYGBtRA4VK2XI*JW)}h>u>2ZK-fp~}=Y_-~ z57i!0CL6o+eq%cCa>^T=Gn5RhG9+A8)8ppi=QZkh*ONwZTTdPCW>%)hdtt;3cg;4x zvq4tOyJU15^PoMty|iqfIP9W;mO!X>a~4}!KJz_F%N~4`vg{!U?_4j~*WUBHpFmMQ zjQSi!YQouQ?jcHh&yU6TeKzV8$q}3iAFHqliG%**WN}V2Xjtc^o3}nFv!hU6x{_Y? zrka1=C=~6v&^Xb}DO6<DQp-hjbAq_sV!4QJ4i}du%SCi^AdE|c<s!QIj<^IZ7tzh< zaS@!Cv966q?PS_3w5S!c-!ivgHs}iCz83StmU}a1S!Ig*3e2+oBjzT|r(5O*%*9ri zAm+7}xeoK*uj=sCnA<G(3d|jrxft^;mU#~5+by#X^BgPvnV6d__gu_=%Y7>5U6y+m z=C>{LB+PYI7!T$O%bbC^*$U&ve1+wng1Oi-8<-2NFazLgmSyh8+-;dn%oD8e-Ixu_ zy$f@p<=%<;Zp&T9{B780;V0i_%oFgFuMKm$<-P%Ps^#8_`7F!)Fy_-Oa|`B7%lshb z6_$A|=6=h(2J=+Q+>H5E%X~NHEGw@Sm?v3gIjtYC!ZcxSu*|n$uC&Yzm{TnCjhHj7 zxIxU@Ecd0DOD%I9<_(tFkJ+@$)tEP1=1R<Umbn76%Q6cm!h@E%7;~wW*A<wjTjn{K zyR0yUn0=PnhuLkJXJJ0e3O^I`jh1;j=1EqVT+9RDsC;K(_E}-3Vt(EVb2{cq%iV){ zjpaT8^Bl{}+*;_%lfSp=OC<4j`d-@dYaNEMs%e?-=%Sn620CcrwNTDIdsz2%{u<M> z2mv%VU^VMM;pgdp@^kk4_;#=$Fq7|=aAI<>1=ISxm`=G9lPu=Up1UxqiTE30QuEfo zib+jMw~I+lGdGG!O(!1}lg!1;--t;jUgl~s3Ezl%Pbxf4cD~IEnOL=M9^&{7aTEp+ z#rR=`%oImq2#I%06UVcLIDW!*Y^xtf_H34r#}Aq8wbm)SM}V?O?5Tj(bW4%aF{vYR zE2GCGdWSd)cLVg5jeGMxadgpj*U20wJg)d>IQ|&NDDCc`VcL6MhklAwA@+%9x_IYk zacT{Z_vQ>=?5atU*9CIh>$gSJy$*-F-sdvXZfhf~to79Zm&u?xf-xDv`DP9o$vzGb zwoQMCabbsf>OK07gWPv0qn#KcV{<gH0LhKeTrrSldHui@{$c!{;+KmSJZEg}ABrqP zVFMqK6KIQ>y^9R2QEQ8NG~`!G!-+k6f+C){_2<;eBgco~?dK^r3eIVMbuXhb$4L^# zyps@7P`p8E!qfhHPB7bhwlg?rsd$=~oq5s44Q#iwq-N!ssNVkw57b8zmX>he#GK9q zf~99s+M~#k{kpcyd<>Wv+3)7;SvnQAf-Co_dr^cs##{es!m`XfJdV*Gi7H0m-QE$h ziD=4Oj?S)}J<GO*+h_L9t&cdC9xJ)Ljyv&32j%)yvVvK!7sijXmq)J4v1|By0)@LI z@kyL;U%BthfJcQN&)bM&;Jdog6h2~-NkkYf0v6Q;4}GCV?UgbA8&Eant>rE1osaN9 zXel$TxQd&N-*x2lE<Hn+{@nOtxx#ypNKN=WCP`A6<MBl}ZTn2QO_S5RY<qa?W%2iS z_PaZxg$qg}7s57{;!`38N$BAfGB5c7=U5_8__{CLut&D+m!+|7<APyjyO~GJv8S_@ zw%^O5hlh4N>X{pbt30FIpZ#upB?eRlhXZ;It_ccUQv!+M-aM-z%9zxvhIl*tq?!kU zg>rp{nC<Fr&ftq$=Yvnyo}@xWm~xoVh){5iFpcSX#FJ%%%yV)!)jI2Ua$sneZ)cd@ zYASjwxgv)+4&Gh8jtfAC@r~(M;@?h@rLX;kV;uV0-{V5&v?JyDNdT}1I@p_56y9#5 z#cv^&dTjtrW{XWun~Ewv`J>&1^uv^Xfd-pMGl8GaOp=p~*a?8+5xv87D`~g){2F@A z4pX~qFg2OKB4YhO#P3?`R#&9xxnx0Y*~pFLvOyzzgYX0L{u8H@?7$gj8|{e{Q=WdB zkjd0Au^zlRrU34W?WFI6HK<*5^Lru)Ryy_wdA!j)K`J(qecm1B_4F_B_%X#q7~R|A zz7dnh(b>=S9*_L$69S3B4;;N?tp`4ig2A%!tnZeGz8-O?`&n5c=o%rr`#fnsZ6E$} zpo8|KLcoY_U@=1onG;}L_GlDX`D{8+xe%3O>j1VUO17Dj$p+l*U_rRE5mu*mvqIq6 zMQOQIQ^6T2qI%o86{fboU@#i+EP6jmfQm_8;%5=Az32R!G<fxGn)o)mKUxfP8f<<v zoS84#bdq0?GDH*ny_Mh_w@ZQ_|4<T?$}#8F=_%&AVXbzp%=cKNNpkz>vQ+t_-jOpj zTF89{xeLkG`Mc5N-9(h~237JuQ^{K!j{5G-F7Q~$wlI{~H2Zha+>k7sSs@GJ#^n-_ zqZ{)HStM?2yhH4?f2{!QYvvqr)tSq&E0C@s$KJ8JXtPz(Xhi3Qz49&^#gE(;2ZTqg zQof8M@1HIgAXqztvNo|7?z$vUD4*FU`RxdAHVd{15s^i;eYZ|l^;XYWz0L+37dJOx zF(*)JAjC5=PP0#U&GYc<6h9-*uT%S-ylN?vCvKbuCJ@S$P%q<Sr*OXxl}w{vDp<yt z<uw1yEQpnrw9$0~80FZ?bjMfse$t7uKfK3Mti1;z!?FP+m$IUJE;2F|s@;{?SS)m@ zkd>tDxyWbl&y2ua#9Gs9%*JQ7aS`j!^N_ae#hp97DRTQVHIo~UiS<3M@UWbx)9!6I z|3(v8_j^@el6_$rzxS#efdjk(M~AxNF&l>2udoR8_Q`gsaQ5``OFey;nmZm)8@$V3 zA~P<gaxa3*WTK~}Eq@ZX`el6vvkke-Y9>?NKR9}Ri}MXQ8%A{vZ*;#(K>~d<o_!D8 z2|q)y3BXG-65KTzGBCvQn@fJvb`m%3#`%Dqql>GoY+=WeYy-1N?b-Kw9o+C$F9tDc zRC7bPzkXSNav%{$#|+8o1+$xcl;c<&Wy8_DmfVmIOmJB+3#t}!>hT9hv`fteAQJFo zoZEZOtrujq&->N=%lVG^3FZT!yq*_vsUY<%_QP*@MmDA70t)ZGx#hvX+wNzk6}|Ua z&$~kcVEg>_o((qOD;~sH(an!JldAj7*$UwPVUf;oSI^G@L=;V@%88Clr`GKyxSae3 zd2(}+hSJ52Ja9Pk@my&(#V0MzXC_jL-mgXD&B0&BBZ>D-9q%ZKx5kS1Mch=pKQq~- zRpimchw(Gt1(blFTg~PoGURSA4;A@&2r&w|Us5Dum>=FMG54Ci=<Pj;KOlcNCe&7h zNDB9Z$+hS;?4^_;9lXQ{ATL~81*1!lh<`OMCH$6A^+WH;Od$;~eF1iI;ubQG6`AA< zNeyvxr0Su!NQxq3{|eF<A1!si1k*efR-~277cWO#?1xH8N-n!Vep09=<=M(!MY(I# zUeM6ABt5$?1AHZ8L(Zp|%L>!}vp>>A=P2llcQ*)HKXuBY)NuRyT>|+(fQii5<Ks^u z4dVBkH&shhFfykxq|bVS(921S&~nPI_%DZjU(GaAxxvjIAS0U0&t4#-t|cm9v|R97 z8Q%t)b*cu{)a@eUDu`_vcE2$V*v$h{-ysxvb3;Lh-^=W-${sB9zm(a$nl9GU48xSU zNUwvf)9Xfajy4@`UTz=qR>UV${5z39z5U1L(I5wju$L?IunB+4Rp}n=Ckubs_MOVo z&z9Zt@5&n)QJ5E~^;a#Jf!v?l50meM_%p#ZHUrtun(y5kk#Vw#H*8QrR2ynSd#=%m zdt#yF8g5H%%QX)5rQ`1*z`rXCaky9V(Q<zj?cY_PrvNVt&HpK>TYQOX^qK-OlgU{C z-s-(RZr&<psiIxkPqnrX)Vz5kO`X3NHjamZhq?U)tev6DGs2t9<m=<c`FjW~9sh%{ zbo|uoz=3{!=wajTXzDaW;ZYg&JCBo&i_oP<N`I}vJW*ZrVSqO??~`m8Tywx#IjgoW z&WB%ASLCNgE=^(cJ$3z;NfdleCm6Geb|#I~RW_YjD?Sf5$i=CbU9M?0=dL!p<o$J| z{?CRYdXJh$9=%u?V7N`lPYOTzZaPVOI4g2Vy6_?7$s2nJIgbRA$?7{~wT1K4Fc<r{ zIhkfYOlol)javRQcPrs%?2(M<=)vn!6cZz}o158uu=y7^K}#+E#j6QP`Drh@_DkUp z=uAPX##8HI*YW|j5a?b~I&7xcq_~)06*Ehc4502aXOOns8c7lQK(?~6>tf7+Wq|Q~ z2DzIYeubR%Igx<dY$G%kOJ>F&0ttj}$esf6B!UXwNDw>tk7L0v*TH4}7Q17lpUdI( zdSOuTkq=|{7lPkUVV~VBB5wV_0`hX2#}b+C{mZ4fq+MyU@CS`&W&ZM)!n2@OoN}lD zZy4!JB^?30+Z<zO?=)XwGIyC3pUJ(18&JNgeICbG%@<YKl(Yqvtjh-uN!ZhM*`zE# zCTz~>nc&f}8jm`d^{JGp+r#a-I3E1lfWMp=|GWKk6f)KpRM#N2PWRQ!&AA8944=vP zOMX|7uT75*CI5AQxute~(@Xp%I?ok{$+P)C%yWFSj>scZ@>zAh?k5jj*9rK`nf~Xc z`Fpp-WK4~<X#MoExfYzOY8noculRc)`kyD?=54vg_(B`DWu@m-A|q^eSqZWvo4E6} zZUwum4A3%!t#$Z^J!_ufsc(I^H{n_H{J?u5$Bg=ot{e6l4i2PVy3#rW)Ivh)r`=9e zrq|{lp*iy%6=F5l!G{x;2Z1Mscj&hmxF%no{VZG@;q*HsvyHte**n57Uzp1h?-ezD zwRx6zgr8w2(PS4eQr~aU8_uULX~^HhvYlZdG3}OnC};hGy)Gdi@;D{84}}h;CIvq> z{fWVkdjf&n;L;=~J7A(k0wu7zI^i93Q5txALPfjM9!ZCnWmb}7<C`fXo)uHV#y8y~ zo((SBV+5Qh744FzXM?QN#LM~7vkm-;pWo>$+SQPr6n=VRPYRBXjXT{9g-HqWZo4B_ z3Uf;>SzM`aSSVU)lk^vBG^K@}Z!ypR9u{v(Xa;MB)X<F7@D{~LKZ3|{gj!v&Lr%XM zBfFs%c3NRcD{gq$!#pcgo5B)sovhK=O_1TIe!vw-Z!G$7U1GdjqJR9lQV@divV(qV z-t`x@%wK1GY4m=$UP7ARgZ|}s2Zn^Jm2i(pIPMxMHb!;T=|gk)PI2p2ZWp^S;cou5 zN671SgR{z#Bx*?_xNNuKcNbJ_drHayAR=xV#=IZG!@ecY9UHkm0ZwrMu^5|SSdPvM zg)GWkcmXqAdG|-o@yi&cJ<JX(ai7aP*rQHGJ(y(_uVEf6^G69K^Hj*Y`IfYY%y+p4 z^m-Kqyv}X-k7azOfneASUy{md|9I*o4tmtKhsb*gZVi#sNky@xt8wRId8#cnv3C5r zTU0eQxF<gY460;_^1N=VycDx-H`snnsw-TZN<X7>FG_quw8nx7%q0kLF9A-hO;yLB zq1uebya`OppJpV;ab?m>@#%N`ne@|0U)bZRpFOwv&*8-WHoWdKWV0c+lMUr>)?b&w zo!k2BID$V7q#g$5hu_G#GGmc5d}T)Xui+W#jnk7Ru<!bZvPi^nW%`L%W;lCK+T&n1 zFLM1R8DjN*Bbcq}38Nq5{RlOM%HYkR-idlPrDOy!n;O5)|8xv<-|V2OnE^eo`md^I z%Jy8KcJMD9e?PRam2t-&;|@31Z|cZ3gzk6!IoDY6Os?^T!daK+pM7e<0;EyK)BXaP zX>^4qL@z$9D<wC(qfU|Pp5Yf1qh;;-vYr9YuLb{0z-L(v>Ap~_T;#>JGr|7@_mEQJ z_)!P%A0A_pn)9Bh05Yh2qq&%|&PB~AUoOBff3%(Q-2nv~RKBsFseBXZwd!sxyJsLn z^h!m5^sTjk+);XgW1Dt!C4-G@K`#K`qRacGgp}ERdQfKfQy`G~a7LY3<+{v5(&xNL z=DhzRqU!9N3E^sY<QJ}qcI599g6^X>@<MqP;k;7Na!iF0G+1%^)IB!oi=}FQ2<mn< z=2eCga7qfw<BUf&7F4biE+ClhBLyj;B;ovU31K5qJtt+qg^A(wnl!6W^#h6i;hG^_ zb~hXI(%~BPQ9g4Ry@%)E;6xS4km<h0S(&MLYtK?P-zePhR(4wqb3HL{SeluN*|lhR zYqGfAhg;a6nd0<krsmXE@J?8}c><uD?^5R`2&6P`W4z@I=li9wF(;bKo|4g|B78xq zb5>>wIfV;K%~|BLC2zC?@rSW_ai8wC!S9bYnAx_QUm{u9Zf~S5LWp3zM3p)G7g>Lk zj5z_iEzeLpYEJYg^rp6|(I%PV^&Z91Pb$}a+_F|rWo1`EH!=I9<jk~lwotz$sf*hG z+?*~Yz-sq_@t9{>eL(g;qz_16@TmP8*%#0wLOd>S$sG;Lx?8>HN;_Y2F%MnmxdLAa zcZ6%XzQrZ1@xpU5!kL;Gx&YpwOoTga&C75|w(^wP*ogDy1fj7_O-%|<E@1@YSi#Ba zt{@|HK`I=rKm*oU;KF%qBz!??_H#@(ZtfiM?2P(-iJ^kjrEgpD<?K+XDm+E+hIt!4 zJcngeX1F@lpM@aBcXM7}oOsfQ^?!D7paojhj^Fq<@mFVxr1_4d`9k;u-Z2eyve6p4 zOngJtso^Izf#nVq(&)kkDI0f=Nc-KhIR&YUazX_u>txdc-sO{?-uQ81xg+HUmO_&J zF_gH6Il#mS)^I`U#<x;NY+_{II5<iN4)_VnND@1*t^b_(@{<iEcaE(L{SlmQHaM zrIHd$p|v{S5jlRc@*U9E+fUDAnmDe}_1*Aa)t;d9l?$Ei%RdSWZ+>c~infDGIPI68 zv?(@L$oXTo0M@kD(JYWua?6fwoc<j{n7!0k<a~uw#b<VOj~JLih^2pv9xDoo`6S%0 z;xxLhM6%h-l-v2ri1u(7Af}C%>Pu8KE@3&>WdqxekoL&r%#EKW^X}~59nR;%Pj+Tz zZtPBRwmG-(?(K_-!sKIyb#h%fPx?>L2`=NRiew~ntHBxdrdV0tM>S*Pp(25@$Tz=9 z6jrK7b9C{{#%`y&P(yae7<8HU<JWsmV_pLDf$=)raYMr;s{7ADe0ia_cU)sV(sYgR zGithT&Qs31OH<eSj}w>a)&eu-4eU2-qSowJf*+q8nv+s9B9faD+_(c<?Z3ov7#9n~ z(G}dd8(ZzaZjgs~j8IDUQ`xVa6PlTt_Q+}B?RgvDbe^;09Y=L){T|oSzWTaUXvWsu zROwOKZK@+M&%I&uQu+!&*QWqlIs!62d~UfLl#fu#z3U}LcxK9ux6Vg8ing(xKGUTf zy5-=Wz^{tVsZ#anVz_L2*f%v))Fm!wpB3^xF9##%=Z5k-#n(48RMeroCWpM+lvh?L zf3xzM5Gq367O_%8-VNeK_-iMHeV$O!jmkYU<ZXaoAXIdVvZjZYOAS;a8PJ3Lpv?2# z^~*ZgoXKwM`87nZe%S^iFut*<m9)2dH>mpL@4fl#Sq<J+0`5y&ewS3SXm6_lRS%yJ zU2*2Wx}!VsYY_C1_u)`c3-^}78$;d|;i8tDqK9k05YAswzSUv4BHosI?}~)5w<X8> za7~Yb4&zc$XQ=3TsXs4B!{i()+6?n((T1?MEjzMhx;tVts#2S$?Ey=cH5q=^B~3k_ zLa*zW-44s9>WMw?VwcFkY8Nc(jp>e1(F(3u@g8oDcSDWSDG+MA*_D78hqgHlu5W~k zRx~6;ynPYxigR<8Z9w*DB$D4j6;%d(oYmB9lAANc3g>UQdHV23gSVIas3bD$%t%9i zZ+08`d7DB-x5sD6)6a;eN~`Y@=y>~_-fds<z8&&D7%O?+kdkN1$kQG!dT?X6%lRC= zhqs_NHQpgDWxmdl88-x$Zxon&`w&k@g4xe~$=ki7Te1D$T-19K;Qz$AiH_dr%2m-5 zD@OsGJ;_T?=aK0bLPcxB`D=3WH`F8nR)^Ty!bNLtP95El|A5Zt=KKfD-vM5!;V3KX zT5S(|SKOT6+mNCm74~ihnzhb|ce4NjkJK}5=+SkSC1=0V^Bi5ce$Q|&Y4kdKo)k-O zQqSY)I^l4;E@KeXGWUJVL*r@7zm9pZ?+Wql##d^8o7Dcm5K8QpfR9=MpCDlUvdzMr zinGzvrHYcgELjN|>P=k7M8RN#a6hD=;``M{YF^aa;HKu`{LR2Gt$r*NiK_REK<_Oa zT;dif$P`r&m@vFuy{8QJ-zNT}qW;fwmf-CS3+8u*^SeU%&xZnCY#yq1=d>uXVmL+3 zf6xqr0wHe)&ABXD-IwZ3Y*p3h>e(%|8JvO+CUYx-kpf&rl2|D-6f0?xoT`&-Y!n;= z<6X-ra0d}&p0=?&X}!#6bSo9(WOffo5t{3lHM^EB4(B&N`|)|9{JX>a2b$~OanwJP zu;U#(M=hHqyaLU{d=4bm$tM;=R8HCyF1owEZJ+rvDLMOl&%mmCb^WHjCU3e&z<nLw z*)QdtP6_m#g0(t^ldNV0hHdq-&;a(!>b)HaIf2d0BUMAcFEuUNa8l9coT83JDdGGM zNB(AJLf#D_Fm*_CrzX&QAurOp=~Hd=rSr$NI8?zR1*$*SJVx(>B&7Xd(q2tK^KT5D z?-7Dq)DZGzLS92lCWRG&c6$3l=S&uY>)jkWI}1`7sySU*yFzDA72-=<pMRE$+ZpoZ zN?gVONvb2{n~C*iZ)?NZvm~Tyq0ss1$~PGDWr!RE(&x~Xd8X{-umvM~Fc%jHn?hIp zCqA3C>NLcRN)qknMnK3QeSCPtdZF3Q3mA=%V|T+QA=ys2O+;G91*xIouvcti>s{{Y zhh|RLnmbd_UGM+vyHWZKT-ez9*{IUT;9q&!UIv8&BF+=$rVAR2`t%0ER&ztYz^l)C zv{_a`KV(%b2j3#oXRn$0ef;SGB2A}B!YXc)Pgo-%oa%zWACaa-ig0p7Q=CsI4sscI z5&irrI~;am1Li-l*@@*@i4B-1vtm+-t!G2a>6Q5qB)$KnZA@Xdn#T|>x>B1$WrU6H zzDmhsuXz>aXzy8C3d)ISSPS6x++Mm_5vP0CpsIM?c_DV&Pr6c_G1d6mer{hgPLFew zG|p2iT{$HTurlVI1xhh0wXmSfAE@S)Gqyq}faS;GBMhAKiO#U0beR~7T^3fNvpJ)5 z*#Q=NhNa8yx7a<Fo@wcmEPb-2XIZ+GQo>KQ^s_8I*V3n3`b<loW$Cgmlz6hL6@8AS zUt#IRmR@S<73i6StF-iLOZQuP9XfK>UjZg#HB4sl>Q$hGhp%{KWyv(Wh0sY>@`?Ug zKqFZSXhav#i0-j;0S#+m`jukzc-6-6NaBhckPI=d^%l5`HHK@R+E41@kZ3O9;eWUa zq=79}r&A9@j^-gTV{9b-NZeDWim%xjD4AM<)5{S=`U0gWUq6v8Q}dgg(5S=eqhw?A z1@jWw6I625I>FGM2ML+;A&+ryKk1ogKjwM#XJx;EaPL(UPO%lOC0zJJ__tcuk{iqv z<u~N8o*I?*h?6^ia#eD5R1Q~z_x<3q_Yp)4uUEZ!Dq`hwHl^L;eXrNG#rq!eLf=Ew zM|f-6qhm!P*6lw&3o2pG)IGN60xU?KdY(+o)0LY%?mjVX`Du7?0kh|;=+XXm55Z(h z_LGIWzkPtt`DaO7f0MRU-#+P52mI_lCquzR6zwL<D7{QkXOeObcsEUFo-7oCts1ie z+D4C7GQbIJ$@;rA<j-^oOD5E%UA=*7pJx?Z@`u-+kR%iz-{q7OlES6ZepUzTDqmMy zO^R#aAFV*+tJEO24|XnPD&%}$R{gRA>{q+IvIC&k|FyX5m*Eez4?G25pV}uVQL#PH znyVDWm<Pp?m>%>p=#P$F&HXkBQ_ip7%2oECtKbW%A@l+zSBW~a-euufAMq_phw6^Y zfT0WiE5`fHvm;3TR(D557F}+roy|{{=)0feeo|`AKp^FYoYx3Q7>6`B%RP7KNoTDK zxhSmePkPdln-=brMX32WH~n(*QUk;B<8=|(jS`i(QVXCtlQZFTQc`!HG)v@s1|~~3 z)Bb8^0p)Y$zM0e1z<ypYLal!J@f&uxi6pw0(=U%UFQHXirIpr6`7G}8?=av*G0y0g z&Uycpx^r@78-96<Q<%P8Esk%u2d8;R$nYN}hq#e(8CZCp`<S*|I5kIYaXNa3Aq=Vq zRuI{1XhMV(LN5`u6&W{ykectZpHpC1F5&h8gYE%5q|M@r)ne}~>FmFu08zg0dl+YY z=BvwPezn)EgbR_L87=F>1Vy->2{#(O;-l|SW|<vvAD$90B^V;3A}-%A>wJ^8cq2yd z49WJ3Z^mVN++Ss`A2Ii+jAI#2B#>k%du8oC%VQaSM9DZbkLVmN_<tvwWF#@2`bW!M zibs3T42iDz@(Hi^PC+**OJ_8qqIV<N+<Z*-+Z4^Jf9trkN7IY$hQgZP1w1nKd2yXX z@Ujl7xADEi3j!}hvwBgLc(1u`zLa>!6#^o<bsV3la6Q_8Aib99FSFvk=29X_d0u?W zh7IyJ#N&;>kZ)1H%m6kMrj^VS%!e+-5sCQc-T-tWj_X)3=IjnkmLn&^4Lm1N%*On_ zmRaTlteu$Bu=}h?!t)P9621U9<l5{mGHWb)o0-SoLDop%ZSK$t&!f;e^FA<M82sDK zNqB-eKVgNAgV{4L4u@ZtB)o6yC|mK7_$+nUW5v?m)A4P<@VYf$Azhn3Ite0o@J>dj zP1FD;pyA%Q-1%2+^UuFUVZpAp%!M|AEEHi~>f5<AvH2?sCj5<i%{R%+XGY*sV|H0% z{uYKm*`s=t)cuGh-{ot}f14R-%h$}iSa2YVhPOMy?eaQ@NC&F_nYeWe-y|C%@Lawu z_E*7wAgV5hv{aa<NyPkJHXy@)0Fcj6yPod?Iz3hV3tY-kbQqxYjow$)K9u<zd?<#t zG-GM+dFXP1jK<;^Tm<w}pp|k?CtqZuaR-FHjY)5mfAHId^Cy|NQCFY&cMyOYi_l7o z$Nz3X!&dcXJh(P0ds+s%Tbe|p9-GZ>;UbYOa`mRY8B}2NOClmOBf)gu$dICFP5tKd zb~sk$hGYdJg`fRmJ-hTlzvmf?tWiUA`O%Id6M+M0aQdIHbuK-3Mm7?B9dMk(lVciN zsPQQ5*RkGA@tOTk0ywoSxDX_z8X4xlC^llg{iDoYWpesm=Uy1tpt_Ob+f;eLUy?wF z@Kw0nh9~XOcAxpAg2Qzpt_RNWZHS77m!7a}fl?xU2FzWR6t+p+TfF-Wwo|8MztVdg zOp;+YlbXOCssLPhNeN{TAfe|G0G21r!tIe4LH-wn<V<$dxcnn}$Cw`o9`^T+Fh3?= zxqO`c5$x}2H{L)bl08b2&7G9?=nD)|)Lp0P=q-y&@KwT{uft7@&>O-p*diQ=lZC)h zT;XeX1thVwM{_5s@l9BSJ_hSA=h>CGgj3@Zet?qh6M!l4uL=gt_hdh6FR#^vAQ6fO zKk|;<xy&GEK`i$HsBkHbOJVR0yM6%n%ltxmNS|5qQ-ZMA^X^i|+UCX=#cp!16*6V_ z5I2iwmW*}}nb$%Od2mi#mq_}DbO}?_ho5m=BUJ5X^!A=Lmx3EeGhtaHW7mATH!r&r zUXM>^>A9q>CER>^u_8xbp6_0ziW-~@l2gjP=I?~34Sfemg5qWYtrP8!i&W-&&7)O* zr%QhQLuj+e$SSG`n$cXp*hzvgW~TjUBQ5)cbS7bz-(r^GvHorXN_JCk6XfxK1q$U; z?<m-tt>zD)*fihzhY4wpR>1<pwj_2lpg4Nx30+zz`y0{lvsL(A>$@cUn?F%Fc~nIv z1KK)>%=Jp(uH^Vt!u6iGewS5%M^#Aw==G^Rx<vQssL5LrUzMz8T#&YWItfH!aT5`v z<Y+WY%J!ZwT|$z*HaUvYX`x4_(EELgQpf1j@TmLQ+?T#ksp;^S%4gGfsoE)=IB9O+ z!G1Evo?^^|Q*{<;$KnW`I>q=Fzru3>Z@}_bmY$n)?93mYZ7lm%&arP(9sk#_`Ec5* z>9{mb&&n{bD+b1$${xn9&xdFZeN*Ts<~{#nCZi(CF%(Z5C91^S*R)MTV4kGna)c6o z?+9;{_0h$JtrY^qkpgsHa>ycp`3D(8IY?r15V>5@73diZD%<LNM*GjZp=UWz;-qfk z4a?jj*j$=;muljZaTzTxnPG4GY7@8Kqr*k%v%^Jhc`+)*w`vyY`^=i_qz>Ut-`V7b z)^mRRcKFra)B^J%+zZS~e&JVF^t-_P5jJS$TlJeKFz-|Sdo46h?T5rpgh%$;NL(=q zV?o7KelMYu=#l!Va_M}n9Gy-F(B?DruC3lyF*kbG(wAE4KCwSRx$9X&N}u|}_f_`E zE%VK00gLxRpLsoQ<_v&S5g~>7N~Y*qAJfy9m#Klo|CTukU!Lt*>oY$furi#7A&Qad z6i>SF(h@<&I}4<D>RCf<?IPXp1eA?mf-5H&9)4l27gA8)iaa5j;)~&tiZX=6YLlav zAE1!O7LxqBCNi^~+r>FaoTKUfPh2CN`dt4ox8my*xe^b9<&FN#EOl^fmI_4A%A7yp zl1t4L_EAN`-o3z~=STe90E><r4E)|lGsZar*C<($;f3k-pE~?$+@ACgum99dU-{G% zm_TYNzWKS~89ZT?<TL+BveJ(vii6Q=WH`y$Zr0L}&MPwAIaj9EycgtpBF~qph)gJm zXT@D2MM`qcNDXaO#rmF3D;35ecyZEh1pN?KJIgx9n?Jnb>XT%CVlG%hJmG{-G{3qJ z+{bA=QR@dLvrx;hT-ID04U{NO=3Oxdb>j)?ThTG(=kMAbL6HApZ06GM(x2QF4@Wey z{3TYw?1^L)#m6-S6nyNvQt&Z}AxDiCQ5@OFR+qhwmidvrjvl<al@;+^{>l_5m8`Ah zra}Cj1-(udsW3t%O9@fQoJ!Wv9zx1WTvo}FzVKJqGB*?{qoQKeQ{>19%@kLer^yUW z@{$#|%&~=UWg%;D;p&on?EH0FHg%WSS}sP3;t3NTF`b5#Me3^4T8u9IGCI{-Qj@zE zm6S~WJfu;@?-G6k=n}e?xRR2%3(tYv-;fdosMEJ_(=d}6uOFL~FP86Bgt=OUmOV+i zRbuZa#GoFl$9aq<UPhxrC0pkd;}UGMjmv;a%tz{Z9w|x5g~x3!y3{n5o?TYSTXsqG z&WMy+@)rK~MXEJqZzJ9}R*oXZG`ZpBCDj7%ffX3%8t1?zKS#NI_7c=mzG?*@&9UcE zxFEcH`eu!A?^Ut4E53H_v&iRMg$sFv3gDw#a{v0xr7mR(-cnE5yAe)6fv~+Bq}w>w z8alNa<13^pIHB*jdBEFwDlLJfKxoO3(oBO++i5N&C&B0wEPT~A$zRfx`GS;RaJnq+ z7K@ZbV~60Hjo~(yY22y>Qo_|TkG!O9q(+jfz(;zP^e5>Pr|ef2yTx_=B$jSx2`#W0 z3KtvJ7gE+d?k!!&ugqkmWo2blrZ7Y>CcY2Z(3A9K4{QM`&!tQY`IWm(y5|f0OKCS* zUuk@|OCk1He~a~Fy9Y@sf*bLr(>Pd28E4a82QFVcX2eRSxkROR*HDk4WvK<iQkF7R z3xSv2E_O(PzTmH>e^Rb;Z2QxVSUsf8HQY-Gt0|stMGaF;5AF1Io1ZrbCIZ<K%37)5 zCoLzi(-cMO^F7=JM!H?3goA5oLvAqCy!6}ifL<Q0EjQJskwzW42tL|8R03I%B4p#= zJe7|w{akXDJavojA2+^~@ok~$t*)n(Q^uGY>MK-L@KQ`RZVYY@89xN)HTDVJ)wFDI zZ6$<V<2=>x<ZdeSQT}F8W5Mh~^ozjn0);y^v=2=;=K}vK^43&E=$Bx&V7fi>NVx<i zc3axC!R{@(#q3(xy;IjgD5B=bj4!|Li9$OLSBL%kXFSYf_;1(3E@KJ#{-3DHVBGu9 zTVrsW3q~He9yTTjBtLr@J}Wc_m*Q|RwaX&yiA)}FP#$DE_$cz(@KUf+xPRk&jr1y; zx(W8h+CSE_2KQ=-Z{w>#Ge)U|(#VdOrrL8=9~HiOJ^I+`3B@?je9x|P0X3F+%YRLs zWu_prm7%k>SYNcyf#RW{X^vgu_;FR}T08{oQqQ8)7cy>7qp$1rzJ2@mV3g5LUErl@ zz03?`e6VK-_Ds(XIW%RPF6eR9E{R~vY=tXz@N{26X=QF=r>SQh7g;kn8DoV5)}}iG zC$Y!wGaqPf6Dy&e=egu~5$Eqd3rA%%lyqdS`0wYeN7bR}*m+7n6&n3{sk6Xa#;$n^ z+Ldai6vNe6-;jCyLS}k;l#~7|IHPI0%$Dt$frt66j72irA6(-2RP{X7E_)$!a-SMW z{p2tGD+VXQm(SBaGS1kmFFQ3mAAycYVGtPUbwPn@p;#Z(*l(}2q<(_kGG57uZDXJg zU#%b_brm1GU2CnG?B^--fzs3Ui1k9d4l;KuFfKp|{rkKnmsXNH?)#VbV6&B>b+=Qn z`-mQ!Wlbk5Ji&8&c5xugl3EF0xvUK0$LoCBV>a}{%M9cHpZd+B4Tbi`F#43ZybiRw z-ha(uQ=S7+z<9XC*2H>_BI}zPR#F<9#8*;^l|;9-ja~66NjMGR#c}Y}Ba76fN~I*J z>y@>*NuGK(I279ACo7@BG|k2=pMrb=d$%&;%kHi81DUBy-ZjKJ9PJ(&{y-F2(wL#r zlhv!FD`l1vNxk*jT5w3PN9f1kJql?PnRN;Ek=n`HTl%J+eOHi%AOAC1)15-8<!=i6 zNU~ERTnB#anww#YO8II+>HP@7%4%hkT^E^?Pr+V+`WCTdmquo+(^Q_Cy3D2YrNokQ zma(zM{xrJwQ)ifRc5pl()h8CMvVm;=W)?@blQ8j=%FAp$jV!|M`yoEJiBGYZLSiZv z)AeGi5K{nCbT4WWiMIFr;G670sWa^3$oq8MqMsX?n5DT<YYX<%=j9rk(d*FbMxSl8 zp#QsH1MxjA|9<?T`A!%^dN3wsqPM<r@N^6DpUR<n{MW{&-T%g~{^YKyoYbV%H&Z+F znPU)5keKR0w&~Wy^embej<BtX8JJoyZArWkQ-XOM+t#an7`G-G{JuR04EyPq<#deQ z(kC#Ozx;{_%1N9f5nseGDcdp(oFN8tnL!HE@ilWCm~zFmk<Itj+bGS}#14L2INUJ* zCE=!u@1O8xAG-cz-?u4mE$k$#3o*&rNkRR|bClx+6%#-iGnXT!a971t%mro+7Iu@9 zD`sJhbXNG3>qOht5#+49v!YbFrfF9s9z;61!E`8jzAz?E=XT({nzFh6s+uJtx>tR; z7nGIM%&qX1_$!b)Ej<=DUrp6q?&(kW`g~QD^X4uw>QBBx6*<v7fs;ygo+AA?LOFCl zu0L7iY&vQ$YTf)G;LSXZE_&8)F<pr%IL%9JWJf50lIzn!So7&KfqPLSKYMQ_tP;O@ z+C^9!oA{ZulAj$M&qaH85|KFnoUD6y{MkkpR7t-2lZDmKA$!_Vw)2T#mrZz$Vp5MT zR!LoEB_(G=`W*GcxER76<EULwVT?s^Z7x6NO0dXht`=MpCZmcgqCVFvpOE+nQ&Igi z@kjne{WP(1R}YQ>-pc%iFe<G#f=HiSBMEk{;Bbjs8GFvGn`Qo#^Oa~_KcOJ9tA6J< zWLLfABzsrgU<{HyJ>f?kyayd~p8+kN4aJS$Yt*uT1V)F#kysiMU+>-e<8nMy%65B< zAP<@I=zY3u<l{_Hqk(XWsx!DXas~%$)#i|w-!&m`Cs#;dmgf>p$lC>LN$X@twrO&b zAdPs>(RL$dKUY+7xw4&B8ahG0lsLW%EGgR|2qp)(hCkIj=_QG12EjTQkTJcrn%-5^ zr$>{bsT^q}aAM~OkCfqs)2*}q1d{&wLE5em2gxNVnu{4CgVk5yzDj<$WaJ3UR7UlH zfO+TdNqd}l<(xAqFa;i=Rg#E^VR6+jGmU@;MwyrsyfSuZcWt6s{Q?4LB{J84R3LK- z#aLg7i(=~2ZXbXct>P9QHyI(fn%(cO6BN7O6jBf<y*SQ>(yErH5ylf9DaD|2Sx-{A z)Q6}<3l0)=OEl>GW9GZo%b2@PSd~{v0Q1RqinIo|)pGcIjXDCJX4YnqfE)oMSexGq zIBTAmm;KTFr1`FEwoD6;6EA1yx@okrPUbq2nQ=kj^(aFBnOwEkUrrE|evNa^-uG<p z-eY>ELx3rTp=1aU*erl`#Jv2g{QQ{q{V4I9<lzYTg42X4zzCc>KhxrB@N;%)4*NQN zvoXIbJWeXqvdVmQD=p*gGW)-#53Q<a%jsB>KW%Gb9|_3ur}=7-)UQ5TPI#X;@9hvY zd0tO7rVy*KsAH9yfh@U4lIm#8?_9qD%rIZOOYEJ##-eSj)WoDz9E!H7xyfbbL-biS zISG$bla;s5h_-UNZqb?d(`w+^ybNhI!Da@B2dSUnB^*a1Wolz%W;TIW&%r?&Z;pzQ zRT}bWyvfZl-ye^^M7A&~BYdpbVA^`hJdWW}qW$U%heD5ce;0=ycgBJ$%$%7K-k}@r zKCsAcu!^4(Ogl$B(w-w}zCrEjpBQV;Rsx&#w4!-4%|8D?B`y1H6i68`mVFbe-BTto zM$aI!UB6WV4Ab>%T$E|2f~GdVx7H4)$}Rq3F8;ft<^C=JTqW=^cZ{<Wn5JrQ0n>oq zx9xzvU+#G*Q`bPGKwV3;aBharT*Uy@GS7VG&s64d>Z}?Ro}qEl-^>q>lj_C)>1SrS z*}e_TS>MkO6e-;Y!27|%iU)gOLfgAa%<!m@_Uc)rBX4~uw~%-37Vm==ymCDuZ_5_% z!?rau<Za#J-2kJ_TE$q@ntBXH=&0btIM5b3Lr}NkESws>Ys@L2a3rv%(Ysl*HGDvK z2^Vc%CtYEcnn=G2qfY%a;k=0Whp!Ud{N-Qb8r)6MHTI68lJ(Oh5<Iu_PpkNZuC#6> zKjCrWNc|>kmk`o5kjkOE$h>SBJF{WOte+;eMHGrv>)$Cip&*9;E1ElH<V<YgaSw8R zz%0xG$l`0BkS@hhWT?I8=QK`FC6x+J6Alu1UCe~16}!`viY&vS*&M=(<H>xNp}=Pm zi%f^~dvV|(`wFs-Hh5ak9mmtCYas*X-$33~0vq!ilVd?DehCZ&ng;RZ&68vyB7061 zOP|?`-rkc)xq4rLA;aA9ReAO)dJfLykdZLPuXrA-Be{VRTN}+{oUCEAm35Qm9wZ9> zvhJ7Dg*>rF(}PukRapV&4`-<Tj!d}d>o^UZNL>3jKD-dT6AX_y{jd2Fm`lfhr;QD_ z$sLfWvOL{ma*ayV3RD})7|YEYR65Fo%0iuvGSodBE7B0HQ2EQ{lLLPh%HMNfPh1<6 z|D=QZKdk(-4(k8B@}GK8{{iKndr<$(bn%;cQ2#>Z?>nf!_Ly@R|Kh{=R~*K_`Y`@_ zo`3K_!Gn7#pN7NuHyy@*#bNxL598l*82`4z_;()0zxy!${fF^~avt(?AI9Hv82_xp z_~#zRzxXiz!Nd4BAI87!F#g?#@mK8Qhk#(Nkl{mo)rawKK8%0&Vf;OEo!}5(^<n(m z4&(2UVeSxL@G$=Uhw+z-$%p#75941gthR^v+%lve;%hsMe=y|`k@4~kJG6h6unQmJ z`_KFbGIEWj6LR7E%r$N~KG!Iom}@knjO`uUo_g^w+y4B_D_t+Y^z^H*z5Yh`n}0Lj z{(Em<lagKtukGx>LjSx4Wu7v5nA;;?iQkiDefUqG&dYL<1eBWgP=|0^%zTI{{RdvY zYbiUQ?>g#&T01}2Xh9i9?xHiV8S(m=x#2beXzn$+#!QqCH3wCUsz6nv>QF&c1F8wN z0@aLKi)ul&qS{c~P@SkQR5!{*^`iz*MkVrkQEpTQ%7dDO%0f*=<)UVye5g67VpIjn z?yPpFvXS3L;!?^kpX|xWH(zVUtm<54YPIyt?`gYHqxDKl@3Qpiwc6d|x55Rq?zeQ` zB5m)s>>DimXVoV!*6}N=wC=9cdeG8~muP#JrLSoQUaNo)sv31S%KC!nxu`ajA;eZ- z<g|3Li&@|#FgkDH!YYrtac%vIm`~57Gp3v|CF?}bq`--UIn);yKcCG`ZYS63*x8>Y zwqZ<vnYKjvQ4Odp<5c#$ve}zEgB`lBa|`<$%-zpn=C0*-pUeE~JmY-MC}(lnD(BKZ z<6`#eWR711FM~aAm3|{%bg*GgI|n>#1-Az{pAg&>{1betL(gKrc>q7bs}#(FbH%u) zvVw8rF8Jp`2@Yn;-ZW`6<KB%PBwPk&={s4N`_To@GqZWeO41;F26_w1h1rdofD*i~ zBWyJ)C~--<pY*aYx1c&v&4k%JmG`R9o3L*~H_=<syHMSjJ?Jx04Jhe5DY(r<wPBxw zF8#=dZlF(+{BhrgT`r7Ppl5h^`w72UvI>-N_;;gH#7)AZci}!2w`$ZRR1<14@uUy> z#2vkXFq2Ro)C%0DqUWNoKra?EO5XHsL$AR7$oJm^f&QjwuP{>Xa2R`kg8j!aHy>`P zw>b=VoLdua6L8Cnb9(`|EZo+{xqb3ehw(6O8{*t%tZ*3HaN8B<_RW>#ce}&rki4zW z^>c^Oh1=V4Zq>N;<JK4Fb~|nZxb2E_yB{}$@*L<JkNcNVXIcJNqSv5)VA=0R|1D|* z>S@dEZS?n0AE8`#I*fEwChBz5g{Uh~HK-q;R-k^1T94X->O$>A?M00O9w(rtqRvNM zftrt6ifTaJiTVZV3Dnc5S5bW^`BH$}cvL3pG?aX^(MwTvsGCtgLp_4pjCv0B4(cP+ zaNv71YO=tYZx;F-)I!vasM}HZp&mwUM!kUQL+wS4`WbOiUqzjXnu)psRe`z=^&`|h zsNbTtpk6?|hcfO0XHXv0X{Z^fD^Lqj*P(ubYDPVR>Oj4N`UExVZsMROqs~DUqZXoq zs3z1J)I+GvsOL~`p*}*%H->iqGU{un>8Lp<`L46{Us!spr60kCBe-DWLRDp1Nx+|d z+LY2tIa)IcmekIuDJv`R*UVdZwYJYLJG&Ce+}deY*+T6)#I2-sQAzc@SUR)IuD&=> zR<q=ilFC4tx9(C&8@G$9%NAZxwnRH%&#SDeEyKYG)Rxu6VxL>)$MLGFlA6-OCDk%- zomEv*s!JeAS<|d@s_M?hmRC_yb75JX|5D=`B&C;C4oc_jJRd=fg37Y8YV=Fy)%XJ? zl~Tu;P1Qw0kuL!7mo1PNleN8Y-rQ^Qs#vv%zp9e2tfsuGW<klqxn;_utVV~tq^zcP zUX_4H(#Z?d)RZms7gp3D#pgUV1-J56iAbnR=arU8*$b=k1C{=H=PdC{nWE;xDmwtK zm9_qw%CdzDj$)o$y+m0AF0<xcRZ~)90afzWna--3TT&@0O0E1Q)Vo@$B@n|!PUg=p zEfp#HIEagWD|%+h!qUnzl~2@7p2fJZWI@zbr!0xt;Sk~uKq$#V6-dBqm5Q`y%v)GG zV_r?IU(!)A#6>kdzTUcdHk$ypOKax&%Oo7;qJ<TzFs0tQxn<RUV2cOB@bNNc`zwnU zE+!c<m&~gL$E+~ot7=@Tt0H!lmt`G_BZZZ<%>5Of5)vDcZJVlSJa!C$(O|62qpAI6 zmr|&z#Tvs4Yf2W@R^n(Otdxb!bdXt93$Iqt@RgNaV+Bz5{MxH8Et%(^QB|XGp}Ml{ zqO0b^Zy^m8!+Z%kxK~K6753(r(S7Htb`|LA>}tJr#F##>wz|YWw<12j>17~P)e;?y zFoKgs)zxJ+=LE{jRf+OSDl4_Opw0gMEWXujq#caaR)q?nDt2|qX=snI>}2Anz67vC z9HhS%%)7R%s(f}?ZB?LVuAq!jFz@PxC6yXpXD=+3Y{j+AKdYqHuQwsIU2x1-HBTN_ zQ1QzA-bM6R+br7?78{Gi_AV^FsN6zJ=vZxB=-Fipsuq<E=7^C;4D8Sc?$2NrPaVX{ zEiF0JZuKD50<^8wjDvF$WYu&>V;uG(Na^&l@)Br@NXt5Jy3`5x15kw_w64G(*Jp_F zUrQqfwE(Hl2vk-Iw@^G~5uiz<>Jp3XY(KbsRlr|XYr{cMIu8ybDP4?uc^594S5vic z0d06mNzJ^Ht2C)0A5i`pHKtXU%vIzEH;X#Qk`TASG)!E4);OTv;Had@%7hj{m9CZ& z#<|KP79}-8gltb^2o01G!yn)4ga+CzE>-g`3@o6Zl`SkSsj*4x^s>q_O%5f5rY}~R z6*RPqfGOs$&^XR_Fuuf7!vA#4HVhfgt@0FBU8AN3(4?ws0@c2nd5b94)n$s5UTVy( zS}@liH!`2MP#ST;f~tjiRfuw{s)Sk%rObNF9$Lz?OXu?vmC7!fi6V7C=yQC{>?fce zWG(J)kumYe_x~CM9>4aR=jb{o8L}UkYZyV<*k_&?l>Oco^ik;D=x+1@^bB-PuYzbs zEWS(aF;2o=_8D{0CA~T5F7)dC!Y3Jf(hQ>k_r2)N=%1puqVGfRM311G=;|mrVQ_v< za_e+b7Tn)P&qDtIeI~lx>n|P>URHy{T}BY;3_*-><#woYHyy-%?E&1!QlU1f<dAg4 zz4IXM-3M{+KY+VRSb)bDgRj&8xF5vba}f8egSh7&#NBrQ_hHnl_yF!wp6Y|R2M^-j zbO3irzxg2UEeCOL!+pYLhXKAtzv)l1H<1{%8V^40FiZ=+;(Gg^*`rE{`JeRy;bT@~ z4ff~b>~$})=MZO~(B&{5j7x9Z%MN3fRXz!p{yO_9asF$&$^Qqj1e)e14C0Dt#_o$N ze}8EL{3fw)LRo_G&6w4=0{bptWq-c;3C5bZ`VM1ve5RpqUCUm%$R$WJrn4I^H*L>G zjbNAjY-|_sEB9dZeZPx%Y#<*OvDvq~CXtEscMpo4FMh#!^?QJyAVdM@p!|plgZe{n zYionaTK#jLCH`WG@XMceNQTxJ$w4F1*d+SmTSE<^*EI}#OzB}m?ET*lzoGP-9(!Y; zA(-6Xu&gV2aWJ{MVKHCu`rQq64Gj&|$&2f1PB`I|Y9l$Kbz`xm8#TWWcf+W;|Nh^J zem(hD-*Ozqh0X+%;}mTYB!I0jDswk_KWcBB8Vsitd=%|d`p}=CIPep+3_;5xFlu|X z&A9LBe#7N*87V0#MrvxRF?#f9WBmB>#)JtIj1x{c!8q~66OE#xA|pRP-#F)-bBu3% z;~Pd~DS-3&j2DdCjE=sD@%{^2jDP&&1>-lrZsPRB;693BtVDI7#3371j#`Q8Kt)gz zC>vFdT8ZjFMNkqk8&!^4iRwT_P?A_SsvNZv)q#qLou*xh>Oc`f{gv~(64il<prioV zsB+XwR0k@8l0s#p%26v(9jFLO3Yv{7N3BG4pdu(Kd^V~awG!2VilBIWf^y)7>OjGA zMp>j3<?3%Gza6LuN-CX=Do3qEb)X_B0Yo;c9JLbFffB%Eqsmb$Q5~oVN`RG(T8ZjF zMNk5~Y}86r2P#629sCLqR{~J^>k!}yWUv#GyjKzeH-MduDwlBR9jFNAY~q$nd{hT2 zf|3TwMwP4lamO678Y!EGD#yGMy#p1o8V<-P2;i#zq=B<(%yQI9R0k@8lE%$Om6QKU z^bS-6vov@%svNZv)q#qj1PQWH<*1dY4paoi53s<U{8yrPpd#W%?gAM~rjRK+n-)Q> zM0KDdC_$)fR5^LCMDIXFFq05vz#X*`)q#qjNSrd@j#`Q8Kt)jSOOh06pu>_#8nmOd z3#weDDgF`Tm&WnNcfb2x1A1co@P|J%?!5C(WBc~)#zPN1WW4y|i^glOy=MIFZ+|m( z?%Zko^Pm4T1_lO<$ew<qxp@tJIw&=vzWiGTa#9wH&WUgA>x1C*MIy=jKGAO2`;wC* z$)6<S!KdxX#wUCB#Mv?1{t=^ZPx799k(fQXZx8keAynGYkbNqzKJ0zgM_!Q#+3~Nw zKJw#B?yI_X_Nn=^BG^^w`l|je4%#k3s{SqxmYpC~*NQ`&eU^MNd%ynrjQ<Kc>!DD& zD0@5##*MW&$G)JZ*EXG{aiFyPp?`+)NYY7O97|2Cb&anvILTKxzz}f#tqrfO)DG9* z8mvyfY2eeBRx&zi|C^HQu5Wm0g|_2gxA>-;23~3ix7hx5b#>Ll!jCDt<!=~|wFaa9 z4UBw*5xe-;Jr-(7zUe0Ae|@C?rti1j^?1bgkM!3q4n6kx!0wwQIHOwsO*h^3*lV}m zT9?v55wJHjeE;#+8l>C})!LrC>@|ka#fxow+U~`RWjKsfgZ$ME4S1=KA}G5`S$=}a zk;v|phGd3X`EHWFLIhmZCq*D`O7aJcR}90dNCZg!ptU~x%=@*Sz{wx%X~@pD?2^R? zf06*&U()zsj|7Ob|49PG*~1bb&fXva;_VV3&K_4DNk6W<SPfMTsfrQVmmFyua75aw zjYylvxV{YtqQ0e7F}f(*Za6VJP{vRd)GQYc)=LiN3yys#sDUFga0s>6a84pE4=NYs zkVl~Sf-a@)_Y)Ksen4ww2wIjS^NAz#i6ip~#`OPp<`Yaw^78V83>@g&x%08d-rO|j z)IlNoHbge4iHfl^Ia&K>-5ZxgAKn`bW&%6kXO8gLn{!Uhy7%6=06PBeKBM=20zCGn zcz^IgECDP2?w#-RkwF%|e9-`Q{GA(A0K>o&Q_NrIzkBC~4TO+tG5?77SLNT`xAQ0R ziGP1TA@+~|!3X!=J7<nzyuUlrA0J=F0E74+;5)mvcK!RilOz58aq-2!j{xFb_vZTd zB|y|$W>6~r?wxaH&#ry*&GjU(J2_9yr&MXR|L)zpcdF?4zrR~WPkvwKS5|!djox08 z$3HKR3NQ^z9^xN~yvx_yD=Df^`AblP=)2Y2O>Fk3(g!7&rz(Fb&Y<u85jy*b3Lq2D zK_AImNvRa9uy*DVRXj<rPiKL@Bkqg&TLHv>&$ZW{%E!{x5$CT{7XS7u?Er)PbvX=P zsEq~~?60b&;@bfZ>`#0vz=8d*jRrV~e>A|s{8a#|d0_to!^dhAg$hyd#>2-7&^zQ~ zS@GXIPf0?)hL&Vhg0znm_%20)h{%c)IcZCb@$4im<leJLR}y(g9#(r=?nX>1j0gG7 z9&TCHTD3foHjI?DBvX<4CsIdhjAXbywbVy#PhsDxO5L%xL!_|lCGuZlah#+RphQk~ zx<tm16FyOq%je{lnB4CcyGWaNTJ@6fQllg*o~~7r6<gbqtu$(_IuEnb5?LL#TZ)yg zNC(legzq+A!N>{!sxFi0mALbW2NGN)Z>h7>s;AScpVO*UGVw&-l}Ni1xtA%FxeVBd zggot%sB)+Q0u@FgsaE4B(6@7TSvi*(+9VR0lC0dd+`!}ZYd>jANkww@({8rhBU`?z zzT+-ZQUtz79X7tmJCW8DDC;=x{o+WDS5qsIZ6mpkW6!b<UE+x>B$3=Da#U<-w>llc zsXBHq&j#kTDy*G@U|~%D%NJCBIyG^ZR0KOk-i?+cDN^f1I*gVhG(qJ)G%vYhD4|6v zo8X+3O3Ec=7RfsD-t9PA@+x@FwM-%p{`TwVc5WhxK=7uNSDiJ6inJNYduU0d4uUn( z1MK?RsYqF3a<=C2?yjWhR(;H)-ixkPQci7&G6Jbm<3wW=u)2ymh;&+kgVf)PStN$m z7~jG-CQ(yM!x3p?v6d5=bP}h8)a2%+;D0UliNMd6=ej^aLhxLm{1sKEuW*l3Qvh2o z(ScHsej->WeN*sUV{r|-#_auRjmS~dQiWo8DlH>5%=(XN^I6I(n0IJ+jiQH(BqEX2 zCpFi7r(EI1Vk98t;U@Sl@UMhQ<`GI{A^V}LBK>giD;PpurR8<|Y3afmGe(1VLwlLD zl1N6gv3k-0v0A9|fm=@d==PTO)smgWRg_3x8m-!8f4P<MICUy*DP_>Ip=0=<^Nb%i zbRUrV%_W9NY}R;pm4!($NmoOu#W9L*N__`Y5$QoX)p*%Yu`-;%iOFDE7vGn){9Nhd z0wKHS*;12ZaCIrkA%f3|j0@6cLPav;`jw<4eMQ$tOK==YWpz1i>Z0o+eRK)Ec4#RN z9#%tD%bXH?lUG&j9w)dU^h6}L8noX<gM6jt(sN~;NrhgXg1^vQn>J_)GK$uWjqaL$ z3T$<{V;KXh_!F8a{dkGWTkujSr#&yIHO9oHB7H+Bt)?SVa-nQO&At$YtCm70@|dOc zQYx+Mx4-OkhcRl3{4MEeS{iUA^!Pl&#$%a`rczgFr@4d_e5+QFaI5&X1Te|VmT)H2 zReI=XN+k6X*=y3KBC$pH>=>N%*d`btp@gar?e(7h%B1N*Ja))vBqh_WH?(IT2mG|W zQCp&)hdRV!h!mSc)#D3?i9fW&8HWk4TVHBxQ?~tQ1+ntkP#Ib)L%-m70=xl}4P)Cm zs8aX>DrC0k298<mmHCWfY8o_}jAl3%+Kf)4TTbd6ZimN_<;ZpT9L0`mN6^vaXm+$X z*adcUI=UVG4kN*x;7Q0z$W8Di6em<C1hF?IG$*tqv?X*VbSH2+@2pPn5&!f3xt*Uc z{C`Jik2A|EWv)|p4t>sIrDOV>wf$`2tDV6ie@)KM`{#2sJ6kAqo3qo|?d*3NuAt#| zdH9vTELX0}XPLFjp?`I`i(S>9BhH~yJmNbD0<I=kv#Z6`=IV5HyZZmjq5RqK?ntQ5 z0s$j&P|K<Q^gqo->f!#spq&5H;C7@uM<8$n0!JWl1Oi7Oa0CKJAaDc%M<8$n0!JWl z1Oi7Oa0CKJAaDc%M<8$n0!JY5e;WimiCIT>ga1eF)c>Esq|bYLcqIJ)CJ5vv{%@+y zk-B_d2;{1p@9sDb5QDE8dUz^)AQvl6kQT)a@+W><2JwVEhCRz6t}RHa@Hs9fy!;ho zit&lGIpY6pj**KE;Ta)*!l~qRsufeEgsc4dEWHIO6v9(NdEhCz*buG~I8Q9T61P)0 zFy4p5B-gpoA>0@J@SEsA;gx7|HaowITbrYW-%k@tm7m4=kRZGdrMMmH&+U@bJTA=_ zq4*qzp2%Z265WZO#Fw2}iMffs#3om9Vs&CLvD4L*2w#MRPi#qSOYBVSPV7%KlH5t2 zq^zXeq?et(q~fHD316KQOlnH%Oe{@kR`!;pwxrIaPFHu5wtJHL2`~OevOAgbBxfb( zCYL7olHXS~Do(CW4q`7&Xi9EQZb@!S?o94h_Wooe#hv0w`7!k{oLMQkDZZ38M{!DZ zN-#yjOYNFcnp0X*+LT?~q(wSY#HU;RYIr(gu#LJJ!?a(2f_s=pnceC)V_4R(V<@Nm zWm#czhxvvTW3IOB;ujpI%WtRhpXp7*nuoOvYm27eIjnowEv|m-#&AkF{1%r7UH-C$ z=MMJ`FCJb!Jjk!OG^yWvRov#`F^uR>*q6{Uylr?V{-07_32O}N9^OCP7~$rRwipo$ zy}v1o5d8_cBYY!TQi?}Z?-y2jOmIXsoK@A1rV-5}E;h=PxkZI+8_}YAL;P=NoLl#Z z{t-rMzxs8fds4I1Uv8=|wK%mpHJI9z+ML>w+Lqdx+MU{;YK(M`^o-0JnL85P8ClG4 z^~m7JrjgAfTSm5x?BuU|WdBHG6g3;=;Wukk?x@ob`R5~4v4mHD)tF8sd=P!osHRb+ z3F6+2-h#SpnEbUxLwAn4Y?vK$u%0|>qzW}T8dm(%l&zcJep1taMjAdSPg+)5ZkjLc zvSG#8s?&mLr;lnv4NiA|+tAuIr?n7E{@TzxNvma4cbc8s{<`#)521KM(fZR60TtI? zZnwuRK3VR5Z~!cDOMhz~_7j)>lhl0fVq9Z??h&J;M%G_<oY{7>^>M_jb_d-}?q+w3 zJJyfd+?`f_^j~)`Iqpk{`R+~V$M;^~E_u=`MjV^A2`F`^8KWg-F}p`-v-s(f5B+tk zuo7~pkG4mmHKKovK5&==yY5pMqj5$`_&Z0|=-kmU_zX4qNWB<;om%yNArF*GFfLTn z=tKWCk3RIDr2navyAh+1xERBvtSzJ4Mt6?x9^F3(3dWeygm<l2lEUMJwM+V*GTp0U zyT`OSJYyamku@fFjBiZwnCdZhD6I#_G>!3C+?&l~TE^T4m1-l*-h|FE-DCR47-Jiu z`^O|-lK80_{bIT3_=eLxR{G?;VV$b?d&Xvs9SmVfD|c*vg3odX+Ss7tV}r^?@ZZI_ ze6eAd?9+teIQrS7LN^adHI_$zLd!w@Bvjkj^Ar0MI>&a8?LS~RJ6F;7MzJoIzOI-4 zeSMgb9`n&A!Qq4djdLr%bREKzo|T@9*{AHqDlI#1^?oT2O~3j7Ywzk~+sd-~ji*kU z)YG_WUJ{!rc&*WD8If-%la^$XZa<iG+nr34c4v`RjAOqvW*ytuPG=%Oltl{zLSp{l zAC?8G<qtk2b}Q{7kPvEj5JE@@RYFMc2dL5l8W6BW3j!pB_?>gld0&oOr%ks=>*M;K zd(J)Q+;h(Tc=x@eFWBvFwMgMyGmLZA@SWj%!w-*5n}OK<;RnMHhrd2-Ta1%*-ZU9! z%2{#NoN3dGT>Co6I_rd6-iBPwx#fIm_<iW!232-`%=y*fJD|P@Y8&{TbKm)Me1iE4 z*KhL-w5O(M)_nSbgE{5+AHT)cf~UXMI?g+fTwnOF8WA|<IL;`(BSTKgIpH`jdf+&z zRLXJs+ro%5G?pBTw}p|^P|BQgMgi&cSUNtO>H$g(4vxjs&e&l5<lx|-nomhDYAmId z{`meMWqYl*5|8(D1qCWpP|XsyViie<YPN|h@jkHP^nXtKkH+O6iGW~zl=88@S<ALj zTgU=zSOG43TVM<jWD@NIw|Hc)SJMjK!4!fRU~G)aUi9Zs1#~~<HHHtnPFe5)Oo4!# zT8(keKxstO&>v5c9d7E6r>Xzgv11~kf)=wLJJGJt&chh)V-f=3z`hW3PFRbf=%a*_ za1!>Pb|3mb#9@L(z(S`!(Eo`Q3d<tR!6IA&h&fKLZ-YDcmdlIeeP3U~Z})0WpZM8x z%vO4P6A8B5*XQd)Je`I!L5TGPB8<g6ivez*cq=Gm&y(khr_|e<Mkl>iBas*gizyY0 zCHe*i22=~x0px*0fu>3!;zVfI@ZDjNSYlwn6DGBws&52*Az~B|)dT&<VlaYl!V4B8 z8-pB;PB7}xQS2*#wDkn>iD^%TykPq<iTH?5B_g#dT(S#&V6rQIgKv)-<V(T=);NfO z{|T5GAphaBZ^_n1!wmL}O|gE0@(&4#Uu9tpApN7}$DeNL07<j1v4$l?nJlmwDs0t? zQi&FFnR=!?(bvxp_fHa(XogYAH;Jkd?U-qjMlfg};8fGZA|Al25Yb*A^O4n|&;EF7 zpe(@YwD=($n?LFkU+ynpU;PZl?s<<?ab8FY)<l^NCde8C`5W9nXak_g0OY}_?E>rF zLg@O+F2Xi<!zFXr0ri3~nnVPIXCGNp|6;wAQ9y7e*n!2KLW?~JJY3j-82p*Ti-wCd zHm7uAWN2gvxw3|}r098vrMSpjZSX3}AdJDVAe~`!LYpo0DLS@=3LED^!ZhLZ1>><H zurT%|9eaBjv3aA?wsXll9BSMc;7ir&czo9M^eN>4(26}luR;bAUUL2P`85b=26S4o zw(Xir&l*+e0%F0FIHjCcJTe5S02>K9e*CznX)8P%13ab!gFtkk8SzGFbkNgdhutn- zn)X<KfpJF1boCzXi_AZ=8%hRfJBm1HI=E6NPLcnCOKKn*@d`rRA(dp0`?egGpw%9{ z{!mj0#H7^@&L^@)SNJf9IQL5J6lU}S$(u6R>=~7!#1?&Xq{`s2AP_v<*i><Jajl zN1!%<$$SJ72|0GLEH(PaF)PXqDD=2xX~;47{?K8OJ}R$rO5^>X3{2ZoV*k;xIF6;@ zcr;USvP$N05cO^kxI56?qc0yj<paNt1n(CGIL`3NkzxAU`QkX=^%6JJ?TUrrlZ2B= z6e--i_>jUKo(HG=^Bn8<48l7*CvkT(G8FgcC(|(=lR%c~?xhucfx!4A62|~k1eob` zKMg+$zKP(1S)33%Gy1{62f#x8d=nCf2BhIt3a4*CIt31O?7NH_R(urtSxQ`FeeNa& z{WKY||16J7zaW_u350-cv?)}OnyGF}R7Qrh$-^X|a>`VB&8YB|4D6rwx*iN(ZCGqu zLOfUj?b+fA39!}R-Yl$;GVw%EDr`$+=<4Wyf?nB^r<w`|K>D1<ks(6t4%3*3^dSal z-)yjE1-+7*JVGkOp?=x06xa{=&MkOjhPpRJXurTzi>ld;deCury?fGnz43a$zCV1D zmm&(gBzf)e&D!wENRFXK3pm}|ciaz+ri%TX7#SK$d$ZXtq7%Fz)5PxW!*1<uwTT4X zM)#c%#y-e_Dvm!iHa0*m!$UP_^}KlO^)zrrlKXD*f`#n8c2J&nf4=ME0t8(f2Q;B% zpE9BvL~ETe-mM&h7b0Nu9~c1Hve`!PZZk!eJ+N``=>=6wNn@~g9Z%atM|d7RejH@w zoD(OKNgW`?+z!bkZ@;XAv7--|sS}uvF?y&(7T9vAf6qrsL=PzkpFc^wgy{JZERxZH zPN+(QVj25l^glY98cUCk#$@BMK~agz0j(6wMxwk~!P74?W$f%3Bsmu3iWGgv)ggQG zQcApH&q-AIbVLgt(nL<qnJNWw((%;DA?}bLCFl{2RtRZO3#yDX5SB(E<LOO6qP2~% ztPH<K3_jg4rlXX-aQ1kQBJ`n%9O}gaKhMy*VzLj<0y~n#;km$<K`#7}_j%Ep$l(02 zAJFqIoNVZDV-Gmqqb`z;(J_UA9*qI?5F{jVL;y%-*aNbuwgNJ~w5^e>t$EV8fJdb~ znp@buEqqC-1=_SqE!v7r!M}Uc8dg*Ybnq01x0hJV;C&VPp`Uyt<;@jq-n%QP^$yG2 zliycJ(pxN43vaWa`V^Nd9)C@0Z{w%0w>++=rP^KmTr=<hy}ysqxs5lF=-AxDdq}k2 zIezd2I-OhpPM3Tr*)_56^h|W)?`EKzfo=x68R%x9n}Kcyx*6zZpqqhi2D%yOW}usa zZU(v;=w_gsfo=x68R%x9n}Kcyx*6zZpqqhi2D%y8KLhr^1L8M2LXZhjof1(i^t&bP zV851ui12`!3UON7L(TXrPhl9q@3I6T+8%6c_0{)q4S&hyao|h0m#pDEAP0f>@xG8p z0gY&@-}`H{#vb)JO7Caq&Lc*Yemm$s{>Dvvc!=K{`X7_*QHc!x4vy9>Zt$B=!n{XO z^xH+o+``|`d6ZPR?RJaoCFb1W($?>JGIeu5@>hAn)`(ieZ&AICZy0JV9BmJ0y6s<# zS8>Mgx3P9R^ml<mDlNpGNxsm+Y{Q6|4BiBj75RsEt=RLz>g2;^sjXOiRB%%8u;4Ml zFA2^F&I*3oIE>iQ{yVlO{zv8S3;%)O58KE^^*mbSqkd^#RBq}C<9}K7K5g;JFFc_g z_2Zz}2prb<Yo7m0@^(bxNeCViJR&$P_`3yvMDT;VhT)*`JU98r%#%*nkIsjj<l!~J z=LN3{{-njX-V}O6=<7nue0uMXgnn*$iHzg4_%kDT_Bs1!1lr|C*LkPo*UnDo{EMIY z>^Il1{pIp!-n?}5`nA7b{=zR2{Hfr-UY=$6hS2}G+`RC;A9?HAA20v<mw)#^f9tpZ zN#@}_!G9(A?*#v|U|sKu+wE_i#;x=AqcWZ!6Rh)9_qU(0eBI|1zxP$k|Mt&U$;Y#b z{}su@_X(a5tk;Wn>p|E5vmT$U_|tCup4$JrhN1KM|8(+J+nDG)eCjw3d7h}BhdsWB zZtvSXe$Q&2=(*&u?0e&PSot}m`E^+Fb!tcV4c)Kwywa(Di`--K&?0|G`JY>{BRVhm zRly5_PYXUH`1=Jf3SJVd@h=O#V(~4(=B&_yjmGnF;R`nBgcfY%{C7*RxghO=%|)RF zn;#Hbuz6i*!A7sk?Z!|0QMnG!o2F#@xmUN?>{+}b*Zq5+v-E?{OZ(4SocVc+^*pfh zYnHD4hVZ{)v7QrZzh~*U{y^IATKtP&7dbiizV{cFzWg`B|Axgs{Gssw#p2O_llE^} z{NMj!u{S<CPKS-}%Y66tC!zJ+CHdF<Y5eNHQ8^t)9j`X$E!97;p5)W(SNqfJO%&^S zsvVB{t@hesT~``kJ1lYQ{L{QW7R!BiOMbK;9iIo@x!f=u_<6!zt9RJ*NbOncrt^6l znQxkZja%(LV|+{RTc5HY-A6i)U&ll8pz~Gppw~5-R|mJN_74k-pNHmOB<`atb_VHv zZ<~H}pML6mXuhNU>i+P!=Z#OQr}1^#kM3_z>u;xaqWwH+obCE+XRl@bwV5C7^p&qz z^V|+c$5)>#E6&J#RGbyM9ggNr`;CrsyS%8pV%1aJK0ndtHu^j!$~O%9eCEFQ{KoR{ zOTJtBxog`Go4>Kbb`NX+J@9_e>3BuwL)QAu&QtNY@zn8)&bR2iQiIRl-ba_-Soq*` zum1kGUjFzCqrZISr||Q}Kcn8i2j8B7b+@@&yIicB<j-7ni>3O--AcijFP__}P;JH} zuWjtr+=ekfxxUv}t(2O^{0VAJcgL7l*YeG6s}KY4TC-Gcn527dJ73Qinr_`BKJlqi zrC5Cj-0anj%jc?<MicdsE6_8^Ux5y@O!Cv~&AO<6ZFMJq!+pJ6Gs)k%?$%c;TUBGu zUM!W}bLD&k+8?Y|n)A5}=)bTEd$#}iD~%hg=i%m0qXP87x#~`>?n2&t9=3N2O_PkT zzkYVwy!6WYwp%WrU0XGY*(;DhZ?O8QE9d8o`3FwNg$km)bomFboIURrU}t?NUoIQ7 z{?^*Yw!7mR^SA5yE%*H8%M`y3WQVxN95Hz5iXr^59*h7eDvz4&xH0&dUB<S37&GPt zP`2$ij~d7u^Y2G;D6gA!^Ft^vn5(F*nm5cRL9e2`h&sU^9{J|~l4cZilO<cx)~jIl zz+ThTP03Wu4OlCgvT<R#Vzvy1!A!8s6n?62KRL6>KjE*Nap<0d%nm*-<eLVmHydUf zHX0_w78~H^VX=&|2~HJq8S@S(lGrr6++UM<B}i<eMtxTxnSp06c)NJ3#RP}-1+(P! zS%Zy=*+T~M+&>9qp3{f={u2A9`8yBK8>YZ{t$C3@Zyzri2l-PUufxYWytJco5Z_4l zU!mP&E~C7G5h(Las9`*4Cf&d|Vm&>l(K!5BK=InSw}$wtrieLNK!pEa=HAblS&T*4 zx9I2|epXs7Ql8G^+k>4dk4))I^LG<tUglkG1Ff`v8=;+n^o_Z5WO4c3opR=;TW^%A zm8I<T#8fupRtnW(sd8f}du`+5_(C?*Xyz-$e7Rb2m$G|qBfI?Civx?eT(~=%<-H6H zR2oa!-FoFrqkt_u-x%L173$SSb*nj!9sW$du`_XVI-A+aS4vxMqlpWT-&@esYSFDU zOU=C(2Qq+4eh2+sx;n91sZ=NU+L5&_wR*LHYfH6$wqDpSHQhpUw+_*F7v@DE7|+BM zVzPQoTx^%J@02RDGucV%xac+t^-`^g*k7YwGTh7JWRTBdHMaua3VTo@*Pv)Q&9jmP zY2Zf9OgJ2BA_zKRty#VXd_{9NA(!_FTy1x%m2q6noAqkBA;GAY7wbGl>cy(fkIj`Q zxVu>{6+YqaZB#$&Vk*qfou1pA&rRoYg~HZ!aVyeoIbXT4i>v!m_LV>jWt9w43R^Se zb2*cXI65?%bOz~g4$WrOe8Vm5)-h9pX|KCKvWwZ}7T4;fn>f+n<Pm6QuRM_p@4^5L z`(^j0Th5fJT*~Hg2D^#q>sd_-;oZ{N0!_E2>{h<qaCzov`{JZ$vZdF>$$*!OlU}fJ zYB67{A=!EI;J~qC{?e%rQ?-dj8jNwVSSy`<Ctr8f=617LJ2N>c%W}e7mJ?W(lj~Pj zCugRn<|bvHsln`PaMi_Fi80OjWNXKZlYu}eE;`U5s?AavgQH%w-x)&Uv`1)PVY6Pg z8@shywT>ZvV?DE4T+05aJ2N#sott}ge0nZ7Kc1T{%#G*gw%qZlsfD8Jy0gXEt*IXm zk64S1*}3W2h0W9X@wwt@*x1@EjxV?~#qs=1E;ltZGq-hmHvc#qx%|x5%z`^RJ~z90 tdOVlQO^<KpPZ!3E^QVisd@eul&Mx>iTGBQdN(3cxQa2G0cCWVO{{c~;)y)6^ diff --git a/Greenshot/tools/innosetup/WizModernImage-IS.bmp b/Greenshot/tools/innosetup/WizModernImage-IS.bmp deleted file mode 100644 index cf844e093a4cc7aceee0be44353817397825e35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52574 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�h%6mGMR?D&_9v?;#S=W5T_Ez3 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 ZAv0SJCQyo6!nL-C18G<#HQU&+{}&UhRh<9; diff --git a/Greenshot/tools/innosetup/WizModernImage.bmp b/Greenshot/tools/innosetup/WizModernImage.bmp deleted file mode 100644 index cb05a06329e4bc5f84d739da16fc4dd312456752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26494 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 Ss+W(w)-$ikIhNl}J^ur%q$FAZ diff --git a/Greenshot/tools/innosetup/WizModernSmallImage-IS.bmp b/Greenshot/tools/innosetup/WizModernSmallImage-IS.bmp deleted file mode 100644 index 1e8e49792789cc6c89ff18194cf31e4c6765b9a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4158 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 VrFl`p+`PP~yzE?|P<oye{2RBq|HuFU diff --git a/Greenshot/tools/innosetup/WizModernSmallImage.bmp b/Greenshot/tools/innosetup/WizModernSmallImage.bmp deleted file mode 100644 index 63f42104099a57e2f0be9b17d9f3bee47bd2607d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658 zcmcJP&90j;5QWFa?xvgj2$+D>Ws)n@Ef82%3I@MQ7hUI7@+x_)+%sc-+gz!t)KSde z%*Qz%n>0UueIbdTIDW(UJ`F`io*U%fzsB)~Cp<WAJZ?9--|zHzJm~p+{`Cl-$F*0V z#`P-7FAx8fJG6mC%XF2V^mG^65r&Hp+~Pa>Ov2?bf-p^?yJjYZOM;i;WKadzVIqYa z3MtiN=J_h;S0I?Pu93<z>s;Y*sl$mMFn7_?oT4gHcwt7DEXrJOxY&4I=iGRCNe<WG zlA}ef9*B~-Cb)v-iaF~nxXwWa!RUy4T{CA>lTvvk%s;@V;fgcVBBy&>D^&vE`QaSG zpnK+YMP3sXXLwBQqAGfdC6)CmoQ$_{?8UB=`Q@ZNWkg3EJUGIARK)yDtqS~3Fe4n^ z(s5(BFVw+jJ6zEe;n)D4N?(-5gbu2g9O_jMlQV~@RVbS|I_TrVp(~Bsa8?=|^{`Da z-IX&rV^NP^j#%_`kbCh-bk<pxEqXL=xr^l{@*IR{x7?Z&f_KfLx8{VvY9J=PH75jj z^$)I&dhxjDJVm7!+^9_a9A4<9yqn$;vJ7)y#EavUg!|oRC0*rQDmFKq=YC4mLT%<Z zknA8Nqu6GC#>t*VYX16Gj<=RXTmli4?^danH@rl&xb@kVQ%W{Uv^o2nEyfRc?{i+- riHN63FFN6Wm`zOUK)OYwJ8ah5RIisaw<mUbYw_mlpSh_YuTIwwkBHYC diff --git a/Greenshot/tools/innosetup/isbunzip.dll b/Greenshot/tools/innosetup/isbunzip.dll deleted file mode 100644 index 2128bd2183488b914be7446f1605e4b60275623d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19456 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 MqT>Jl{%soge-CY>X#fBK diff --git a/Greenshot/tools/innosetup/isbzip.dll b/Greenshot/tools/innosetup/isbzip.dll deleted file mode 100644 index 49b183f8d5793ab14150d3edb3d3b9a3e73969e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23040 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 diff --git a/Greenshot/tools/innosetup/isfaq.htm b/Greenshot/tools/innosetup/isfaq.htm deleted file mode 100644 index 9ce717f0a..000000000 --- a/Greenshot/tools/innosetup/isfaq.htm +++ /dev/null @@ -1,474 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html> -<head> -<title>Inno Setup FAQ - - - - - - - - -
Inno Setup
-Frequently Asked Questions
- - -

The Inno Setup Frequently Asked Questions contains supplemental information not found in the documentation or the Knowledge Base.

- -

Functionality

- - -

Problems

- - -

Installation Tasks

- - -

How Do I Install...?

- - -

Compatibility

- - -

Miscellaneous

- - - - -

Functionality

- -

Translating Inno Setup's Text

-
-

Translating Inno Setup's text into another language does not require modifying the source code. Simply make a copy of the Default.isl file (included with Inno Setup) and start editing the text in it. (Do not directly edit the Default.isl file, otherwise your changes will be lost when you install a new Inno Setup version.) See the "[Messages] Section" topic in the Inno Setup help file for some important tips.

-

Once you have finished creating the new .isl file, create a [Languages] section to tell the compiler to use it:

-

-[Languages]
-Name: mytrans; MessagesFile: "compiler:MyTranslation.isl" -

-

If you're using a version of Inno Setup prior to 4.0, use this instead:

-

-[Setup]
-MessagesFile=compiler:MyTranslation.isl -

-

There are many contributed translations available for download on the Inno Setup Third-Party Files page, as well as a program to assist in editing the .isl file.

-
- -

Does it support MBCS (multi-byte character sets)?

-
-

Inno Setup 2.0.6 adds complete support for MBCS. It does lead byte checking on all filename and constant parsing, so it should no longer mistake trail bytes for backslashes ("\") or braces ("{").

-

Versions prior to 2.0.6 did not include any special support for MBCS.

-
- -

Will it support Windows Installer in the future?

-
-

At the present time, there are no plans for a Windows Installer edition of Inno Setup. "Supporting" Windows Installer would likely involve a near-complete rewrite of the program.

-
- -

How do I change the icon of Setup.exe?

-
-

The installer's icon may be changed by setting the SetupIconFile [Setup] section directive. To set the uninstaller's icon, set UninstallIconFile.

-
- -

Can Inno Setup do a conditional installation - for example, proceed only if a certain registry key or file exists?

-
-

Inno Setup 4 adds support for this through the new Pascal Scripting feature.

-

Note: with earlier Inno Setup versions it was already possible to install different files depending on the Windows version.

-
- - -

Is it possible to do a silent install without using the /SILENT or /VERYSILENT command-line parameters?

-
-

No, nor is such a feature planned (it would be abused). If it is your intention to keep user interaction to a minimum, use the Disable* [Setup] section directives.

-
- -

Can Setup use the value of a registry entry as the default directory name?

-
-

Yes. Use a {reg:...} constant in DefaultDirName. For example:

-

[Setup]
-DefaultDirName={reg:HKLM\Software\My Program,Path|{pf}\My Program}
-

-

See the "Constants" topic in the Inno Setup help file for more information on {reg:...} constants.

-
- - - -

Problems

- -

Compiler says "Mismatched or misplaced quotes on parameter"

-
-

This message is typically displayed if you try to embed a quote (") character in a parameter's data, but do not double it as required. Read the "Parameters in Sections" topic in the Inno Setup help file for more information.

-
- -

My application can't find any of its files when it is started from the shortcut created by Setup. It works fine when I double-click the application's EXE in Explorer.

-
-

Your application is most likely not specifying pathnames on the files it is trying to open, so it is expecting to find them in the current directory. Inno Setup by default does not set the "Start In" field on shortcuts its creates; this causes Windows to pick a directory itself, which usually won't be the directory containing your application.

-

In virtually all cases, this is something that should be corrected at the application level. Properly designed GUI applications should not expect to be started from a particular directory; they should always specify full pathnames on files they open. In Delphi or C++Builder, for example, it's possible to get the full pathname of the directory containing the application EXE by calling: ExtractFilePath(ParamStr(0)). To get the full path of a file named "File.txt" in the application directory, use: ExtractFilePath(ParamStr(0)) + 'File.txt'.

-

If for some reason you cannot fix this at the application level, you can tell Inno Setup to set the "Start In" field by adding "WorkingDir: {app}" to your [Icons] entries.

-
- -

Why is the error message "The setup files are corrupted" displayed on some systems?

-
-

This error message is displayed when a file pertaining to the installation (e.g., setup.exe, setup.1) has the wrong size, or part of a file fails a CRC check. It is not displayed for any other reason.

-

If your installation is distributed over the internet and you're getting a lot of reports of this error, it could be that your web server is delivering partial files by dropping connections prematurely. Have the affected users check the size in the bytes of the file(s) they downloaded.

-

If your installation is distributed via CD-ROM or floppy disk, it could be that the CD-ROM or floppy disk is bad, or possibly the drive is defective.

-
- -

When I install a new version of my application without uninstalling the old version first, I get a second entry in Control Panel's Add/Remove Programs.

-
-

This happens when you change AppId between versions, or if AppId is not specified, AppName. If you do that, Setup has no way of knowing that the two versions are of the same application, and thus will create a new entry in Add/Remove Programs. Additionally, a new uninstall log file (unins???.dat) will be created. The obvious solution for this is to not change AppId or AppName.

-

If you must change AppName in a new version, set AppId to the value of AppId or AppName from the previous version.

-
- -

Setup gives the message "Unable to register the DLL/OCX: DllRegisterServer export not found"

-
-

This message normally means that you specified the "regserver" flag on a file that doesn't possess the ability to be registered. Remove the "regserver" flag from the [Files] entry and the message will go away.

-
- -

After uninstalling, the directories created during installation still exist.

-
-

There are several reasons why a directory may not be removed:

-
    -
  • It already existed prior to installation. By default, the uninstaller plays it safe and doesn't remove directories that the installer didn't create.
  • -
  • It contains files or subdirectories. Use [UninstallDelete] if you need the uninstaller to delete additional files/directories.
  • -
  • A running process has the directory as its current directory.
  • -
-

Note: In Inno Setup versions prior to 2.0.1, directories must be specified in either the [Dirs] or [UninstallDelete] sections for them to be deleted by the uninstaller. In newer Inno Setup versions, directories created by [Files] section entries will be deleted automatically by the uninstaller if they didn't exist prior to installation.

-
- -

I run a batch file in the [Run] section, but the window remains on the screen after it finishes executing. I'd like it to "close on exit."

-
-

From Tim Rude:
-The simplest way to get a batch file to automatically close on exit is to clear the screen at the end of it using the CLS command.

-

--- batch file 1 ---

-

-@echo off
-echo Hello World
-echo This batch file does NOT close on exit -

-

--- batch file 2 ---

-

-@echo off
-echo Hello World
-echo This batch file DOES close on exit
-cls -

-
- -

I've changed DefaultDirName in my script, yet when I run Setup it defaults to the directory I had before.

-
-

At startup Setup looks in the registry to see if the same application was already installed previously, and if so, it will use the directory of the previous installation as the default directory presented to the user in the wizard. If you uninstall the application and run Setup again, it will use the new DefaultDirName setting. If you wish to disable this feature, set UsePreviousAppDir to "no".

-
- -

I have two [Icons] entries with the same Name, but only one of them gets installed.

-
-

Two files can't have the same name, and since shortcuts are files, two shortcuts therefore can't have the same name.

-
- -

Setup isn't waiting for a program executed by a [Run] entry to finish.

-
-

First, make sure that you are not using the "nowait" or "waituntilidle" flags on the [Run] entry. These flags prevent Setup from waiting until the process completely terminates.

-

If you aren't using those flags and it still doesn't seem to be waiting for the program to finish, then likely what is happening is that the EXE you're running is spawning some other process and then terminating itself immediately, causing Setup to think the program has finished. This is known to happen with older InstallShield-based installers (to work around it, try using the /SMS switch).

-

A simple way to check if a program does that is to run "START /WAIT ProgramName.exe" from the command line, and see if you are returned to the command prompt before the program exits.

-
- -

Some languages are missing on the Select Setup Language dialog, or it doesn't show up at all.

-
-

You are using Non Unicode Inno Setup: -

Beginning with Inno Setup 4.2.2, languages specified in the [Languages] section that cannot be displayed under the active Windows ANSI code page are not listed in the Select Setup Language dialog. For example, Russian text can only be displayed properly if the active code page is 1251; if the user isn't running code page 1251 they will not see Russian as an option.

-

On Windows XP, the active code page may be changed by going to Regional and Language Options in Control Panel, and setting Language for non-Unicode programs on the Advanced tab. On Windows 2000, the active code page may be changed by going to Regional Options in Control Panel, and clicking Set default....

-

If you are sure you're running in the correct code page and a language still isn't being listed, then most likely LanguageCodePage is set incorrectly inside the language's .isl file.

-

If you would like to force all languages to be visible regardless of whether they can be displayed properly under the active code page, set the ShowUndisplayableLanguages [Setup] section directive (new in Inno Setup 5.1.7).

-
- - - -

Installation Tasks

- -

Creating Internet (URL) Shortcuts

-
-

First create a file named, for example, "website.url", and place these lines inside it:

-

[InternetShortcut]
-URL=http://web.site.address/ -

-

Then add these lines to your script:

-

[Files]
-Source: "website.url"; DestDir: "{app}"
-
-[Icons]
-Name: "{group}\Visit My Web Site"; Filename: "{app}\website.url"
-

-
- - -

Setting the "Start In" Field on a Shortcut

-
-

Use a WorkingDir parameter on the [Icons] section entry.

-
- -

Creating File Associations

-
-

First set the [Setup] section directive "ChangesAssociations" to "yes". Then create [Registry] entries as shown below.

- -

-[Registry]
-Root: HKCR; Subkey: ".myp"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue -

-
-".myp" is the extension we're associating. "MyProgramFile" is the internal name for the file type as stored in the registry. Make sure you use a unique name for this so you don't inadvertently overwrite another application's registry key. -
- -

-Root: HKCR; Subkey: "MyProgramFile"; ValueType: string; ValueName: ""; ValueData: "My Program File"; Flags: uninsdeletekey -

-
-"My Program File" above is the name for the file type as shown in Explorer. -
- -

-Root: HKCR; Subkey: "MyProgramFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\MYPROG.EXE,0" -

-
-"DefaultIcon" is the registry key that specifies the filename containing the icon to associate with the file type. ",0" tells Explorer to use the first icon from MYPROG.EXE. (",1" would mean the second icon.) -
- -

-Root: HKCR; Subkey: "MyProgramFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\MYPROG.EXE"" ""%1""" -

-
-"shell\open\command" is the registry key that specifies the program to execute when a file of the type is double-clicked in Explorer. The surrounding quotes are in the command line so it handles long filenames correctly. -
-
- -

Setting Environment Variables

-
-

Environment variables are stored as string values in the registry, so it is possible to manipulate them using the [Registry] section. System-wide environment variables are located at:

-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
-

User-specific environment variables are located at:

-
HKEY_CURRENT_USER\Environment
-
- -

Setting the "Close on Exit" Box on a Shortcut to an MS-DOS Program

-
-

Inno Setup version 1.3.15 and later includes support for "closeonexit" and "dontcloseonexit" flags in the [Icons] section.

-
- -

Making Backups Before Replacing Files

-
-

Inno Setup does not currently have a specific feature for doing that, but you can make a copy of a file before it is replaced by using a [Files] section entry similar to this:

-

Source: "{app}\MyProg.exe"; DestDir: "{app}\backup"; Flags: external skipifsourcedoesntexist uninsneveruninstall

-
- -

Installing Different Files Depending on Windows Version

-
-

That can be done via MinVersion and/or OnlyBelowVersion parameters on an entry. See the Common Parameters topic in the documentation for details.

-
- -

Settings Permissions on Files, Directories, or Registry Keys

-
-

Beginning with Inno Setup 4.1.0, the [Dirs], [Files], and [Registry] sections support Permissions parameters for setting permissions on directories, files, and registry keys respectively.

-

If you have more advanced needs, take a look at SetACL.

-
- -

My installation needs to do something that Inno Setup apparently doesn't have a feature for.

-
-

See the Knowledge Base article Implementing Custom Functionality.

-
- - - -

How Do I Install...?

- -

OCX Files

-
-

The recommended way to install an OCX file is as follows.

-

-[Files]
-Source: "ComCtl32.ocx"; - DestDir: "{sys}"; - CopyMode: alwaysskipifsameorolder; - Flags: restartreplace sharedfile regserver -

-
- -

Visual Basic System Files

-
-

See this Knowledge Base article.

-
- -

Visual C++ System Files (e.g. MFC)

-
-

See this Knowledge Base article.

-
- -

COMCTL32.DLL

-
-

If your application requires an updated version of COMCTL32.DLL, you can direct your users to -download -the COMCTL32 update from Microsoft, or call the COMCTL32 update from your installation by using the following lines:

-

-[Files]
-Source: "50comupd.exe"; DestDir: "{tmp}"
-
-[Code]
-function ShouldInstallComCtlUpdate: Boolean;
-var
-  MS, LS: Cardinal;
-begin
-  // Only install if the existing comctl32.dll is < 5.80
-  Result := False;
-  if GetVersionNumbers(ExpandConstant('{sys}\comctl32.dll'), MS, LS) then
-    if MS < $00050050 then
-      Result := True;
-end;
-
-[Run]
-Filename: "{tmp}\50comupd.exe"; Parameters: "/r:n /q:1"; Check: ShouldInstallComCtlUpdate -

-

Don't try to install COMCTL32.DLL directly using the [Files] section; Microsoft does not allow this, and it's dangerous.

-
- -

BDE (Borland Database Engine)

-
-

See the Knowledge Base article Installing BDE for details on deploying the 32-bit version of BDE using Inno Setup.

-
- -

MDAC, ADO, Jet, etc.

-
-

See this Knowledge Base article.

-
- - - -

Compatibility

- -

OS Compatibility

-
-

Currently supported platforms include every Windows release since 2000. No service packs or other OS updates are required on any of the supported platforms.

-

The 16-bit version of Inno Setup was discontinued starting with version 1.3. Support for Windows NT 3.51 was discontinued starting with version 3.0. Support for Windows 95, 98, Me, and NT 4.0 was discontinued starting with version 5.5.

-
- -

Administrative Privileges

-
-

A typical Inno Setup installation does not require administrative or "power user" privileges. However, there are exceptions as noted below.

-

Things that require administrative privileges:

-
    -
  • Using "PrivilegesRequired=admin" in the script's [Setup] section. This causes Setup to abort with an error message if the user lacks administrative privileges.
  • -
  • Using the "restartreplace" flag in the [Files] section. This flag causes Inno Setup to call the MoveFileEx function, which attempts to write to "HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Control\ Session Manager". Write access to this key is restricted to Administrators.
  • -
  • Writing to any key under HKEY_USERS\.DEFAULT using the [Registry] section. Write access to this key is restricted to Administrators.
  • -
-

Things that require either administrative or "power user" privileges:

-
    -
  • Using "PrivilegesRequired=poweruser" in the script's [Setup] section. This causes Setup to abort with an error message if the user lacks either administrative or "power user" privileges.
  • -
  • Using the "regserver" flag in the [Files] section. In most cases registering a DLL involves writing to HKEY_CLASSES_ROOT, a privilege not granted to ordinary users.
  • -
  • Using the "sharedfile" flag is the [Files] section. This flag causes Inno Setup to create/update a value in "HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ Windows\ CurrentVersion\ SharedDLLs". Ordinary users are not allowed to write to that key.
  • -
  • Using the FontInstall parameter in the [Files] section.
  • -
  • Writing to any key under HKEY_LOCAL_MACHINE or HKEY_CLASSES_ROOT using the [Registry] section. Ordinary users are not allowed to write to those keys.
  • -
-

Inno Setup itself does not require write access to the WINNT directory, or any other registry keys not mentioned above.

-

What is different when an installation is run by a user without administrative privileges?

-
    -
  • The registry key for the Add/Remove Programs Control Panel entry is created under HKEY_CURRENT_USER instead of HKEY_LOCAL_MACHINE. Thus, only the user who installed the program will see an Add/Remove Programs entry for it.
  • -
  • The "{group}" constant always points to the current user's profile, as opposed to the All Users profile.
  • -
  • All "{common...}" constants are equivalent to the "{user...}" constants.
  • -
  • The program may be uninstalled by any user. (When an administrator installs a program, only an administrator is allowed to uninstall it.)
  • -
-
- - - -

Miscellaneous

- -

Are there any limits on how many files, etc. may be included in an installation?

-
-

Inno Setup places no arbitrary limits on how many files, shortcuts, registry entries, etc. that you may include in an installation. However, keep in mind that Setup does need memory for each entry in a script. For example, roughly 120 bytes of memory is needed for each [Files] entry.

-

In Inno Setup 3.x and earlier, installations and individual files cannot exceed 2 GB, because it does not use 64-bit arithmetic in most places. This has been addressed in Inno Setup 4.

-
- -

What exactly happens when the user clicks Cancel during an installation?

-
-

When Cancel is clicked, Setup will begin reverting changes it's made so far in the very same manner as the Uninstall program. Thus, a partially installed application isn't left over.

-
- - - - diff --git a/Greenshot/tools/innosetup/islzma.dll b/Greenshot/tools/innosetup/islzma.dll deleted file mode 100644 index 49395ada5e019330bb84ed5d5b2504d6fc4c437b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74240 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 U0?=&!HK8hrv+Z5v4; zeKbuPRufQsJs|~1R*z=Jj*eujDK|4p+MD3gZZjp*ej{qLG$93!z}aX}sA}D%Sm^=$^0(UR07Naph^$Ety1Sb+<{~B{WCm;~JJ#4fll|DB!=L4)SeI z`hMJwZx7ZE_-e}O6LWGnn=GLWveICdw*wfsXX(*K*<4hh({R}OAl@cbPFv!SwP`Vww}=B>$9#LP4tGTXbrn5g~^LJ zHK+;xpdde^?#d=eczk76I$Uk+4iFOi5?Xv=n) zw$p06ZYTG_Kr|7yVMSpaq04ZKo25!ElD*JH84D<5pO~IT6Op%sf*W)+B#~&W&jk6a z)HUzBK~`g-MUuye?AT)@cl7*^PAIo3btR-xwn+M(O zA!0gS;$*9Yz?fCa){)TRL4`dexG9sZa!|r7J6k8DNzlO_669NwUCUMxCl6hm0gQZ> z%`?kY!E2phc98YE0lw5xk7b!vzV76*OgFQyBC_rX_3{#U{!BHj#FnBGGMvo3#Oy1v zL`nkM(ro?TFt_0)VR(myfc;VI=qOfVW+fJ$60LX&TDTCZO%K|L%NPJIG1r7F`eH%0 z_F58)G5Q`#j07*OPuqB@t%A>S2drEFF31}k)~$D#yvhs4OgeY9FAS2gtPW-IPEV{w zu}z}2L`URW&%w9|H>f4Ae=oX0?*F;%7NKik*WqqR{no8l!_Zpd;05lWb?ZNxyptdH zwzd2;jh}4#D^1zGaX$Gu_@yC?U<2|ktHf-5t#PqD7y1#8dtzF)t))nsloq)aWaor# zj{_-Ke`_g9n{-E7#D>)o^1NxqW?FNxNO96-lG}p5; zW{E|$$}%uDPw-I;-BGB&ZHic@q1(Q+$VZ;t&@=ottkWq;V$4PDP%Cm-%Ns;e@zo7sBKKvM5QtpI< zYdM_Z@Te4+_$;?q`8A*Az;FvDq!rN;^S5;~Z%8*&{oDQx<1_!{VE;P)PsZndF+P|u zMo)bE`0T^Vq8OhZF+S*@ob2DdAD~Ru9 zg)d30SrZN+^t{$)x^5!b91_K0ltA>hmj>dHB0&d6}K<>JC~`ZBi=-*Ie3pZ zPl$@`8*aV$=BQh|0b?MT#eN8Fp~*JXFvKc>J)TnbWNu=~TWD+-ua*KqvcyRx>u*{~ zx%oOGxA2IhAytD&)NLh@jUADzTOfVc6xmv7h*^=H6**Y7nN=fd0Y;sR2;RG2@2iB| zgE@Se0#%P&$l&BA(JTfaztRz~Zf+04E^wfImn6BQIMpnv?dkk;UuT`Ql@Y(!)*1oT?9k> zX9AL%fN6ue_}iiM?cxSK@pNi;$-bC%CHXYb1{x6P3a5+397r(t8f6OXIBi-20WP?2 zfetXO=rygeOyNZm_dBSEyueaU#@-<`WA`-WT_sBu9vJ(YeG05||NoLC5M?$-F%KDX zfgbq_Q?*&Gw2%{LwCUDB(9fmBAzx?Y2Jfl9G2wiqIqB_@NUcb*eABOqv6rrdpJ&ZAR@Kgn60tWY*y-GrA}6g*`uA6+E}TDm71A9ih_lf zK3Y*AFqYqqI2V}& zOsK=n&HgnYs6@9q0LmPOz^INv6c__g$&ahY28fF>h%+p(+7u|{<#s+U_CdP3+$m|{ ztH{?Q=6JOHY^?BGn@^*4ZJOc_=)b}$B0|HWR^W)=Rmv-XMdY;cN~{}EB*cdO^rq5T zCa@Y`q2rP8$u=CvWe9$M^dsVHYjijDEMS46ULJy_WcC#~>*{!>Tx1h`V_hU^fTY|X zz?9jQY#;1pK?Dxw&?aki56=weh&V^{BG5pQrL0`z8x#!T{%JyVT#J{!uFx|}ov_7x zmCn#_`>vo~f`6nwF{iy8yAyg5P_PVmh}@_ycS&Iv&%{ETJu)gO&F1pIlHZZfuyrb! z0A-qhe@u0f$%9r;Ah@sq!gyhq^LkTa41Mzf?*FY?^~jv$JV7HqFAOnOR*Ho0i9><+8dQeGCxEmKMZI3aQF?NogA{T8aN< z7vVWaZF9jKjhxaR_X7#6&Y`IrV8~+qi`PH*;yaMQm6`#-Jq-)QbEh;0TA*WCaGo!EcS83Ojjq zAzxmqPs_oWRw#iASdF9_kV%qWb>Yi|2_O8OHdAD;wzCalWv>3w9cU|FsD5gSe8F!c z@4BWf0pw-y;cb2zH|2>p`HTWyRLK2GnIBaa6;}Frfs!}`fj-o2m7?#wK=5UvVg3cQ zi46>5`{H-{UVB!b+o{c6R{4J%Qp^0qdQKa@gjPg`kvejpjl(BjD_zo_$gcM(UT?TI_KNFjl z1FQV6)rJsMkLL=_TbSzK--h&$mbZi`!C=TSnEj1bF-13&UM|`7^W3Fshw?H=QsRH( z=YW*GhVu`hjOuHYWsr2mje0x>@}VC_zCb4$GXt4slq;vkFn58~(1i>inYw$`*a-Dt zTF*zmH|sH#GpPevp}*83USo&=PmPa-CN2ZyCjkjztxl2}^R-&P>XRblIfS`uwqgi# z-VdTm*Oi;W$ETP#oQDn~Jj|qaxO^pfph4TRy*!wwo;86LAI##FB-zT!{a^L(ee-?`>+(}ze&Bkzfn24$)?n5E^JSf->&tlD4^ z4?>iy4L0#$11;l?U0OcEy9X6pAB{olstpclx!rqMy^v{rv>hg``r%Qvy@2^0YJ*d% zp}hH}cI#&3b*c?6QIiY3MNMugG6vQTWpG+I#k$X`?Y5q?(CunNwzT{zDjyy}4T{jF zh{0q~`bnLh^fzrMu!5aMlGIsbGVyc#_3kr}U?RA(=OZ}xYynO21pWGsrDzm((tDUI ztBJA8-Xz){;+DYla$#vH#!Izl%aUK?%Q|GKO#kb{kijB-t zyrsQhn~0Lz8`@;)WtYgPy|6(f4Gc}P-6V3whUOAU0~eF{#vHWIHa-kkxSC7%>K3}^ zd34X8p!=1e8h&*i~ z&peUmHIZk&$kQeAED(A2i#!WOoO)Eb{zGsJL}_dz zQ5{!_(wItA$2n0N<3x3QBT*XLNL0sFqBN!w)p1Ug#yC+O-$<0kHWJlwl_-s=M0K1K zr7=!a$2StCv5iD^TqR0lDp4KhL}`o@)oCv@fYN|Pkk}x-5v6I{iRuRFjVKKm!nkrl zX}}QO3rYiq=zb$n8Zd)$&ZC5c)D;c zjy0K3C%#4}Yji|zRvTgJeV^hxXSzKDn1R#QC*MFAn-_9uer>|KFct@9I@Cb6v|?Yv zbRSx>jlR!5B4Cd^iS~IsraP+F6f44G+lnF*c6p30wj(Nwwk`|`57PIv&hlCJEj$BG zUf#oB@A*Xi&~*Bp35QGpvl_67@iEm6j~z9$44wQ{Fdbp^rs}Y6vtlC5$MW`=KEnEk z7?5a|A~u%Mid{cgw~XoOa#!CKCQL<986t|u^6uCt>7Kp!Fe}fX!5^$V2K`nuM3oA} zQvBADApfjsA5G!l|D_=DDYOO2tYuHNZkr)dZ>i60q-Pk!Lc2ZIQ@}T#eth^%cG2B<7H^kN) z!dL$*RDri`#9p3|Pw{sqyeGfIdt)ceav$t}n{}J>=k%DV{?&B)&#^uw_LZXk^+E5S zW#w^s4}aVH-szqRJ;_>kU20w><2R!x(28&ohkq_YbucV;J{EQmKhSd$!!SqCqx!K4 zgaLy6R>FV}iU?z@hhm59_b|&pTs9Wj@PNqgj(9(MBJvx7e=@3v{6*W679{^nz|$C_ zDM7F=Gv)suYuz@znnau9GLXKFGKR7UmAsT#x4`+)y%^Igz=TPx-4uEB60$I$QNJ>S zvCo1Swq^3q>WcWNSTA^_%ixbg;1Br_8+8vGcUkRIP^&^=vg%G^nHU1Wjv+5e<74Y)#y&yuLoW+1 zrDAdy6`PfIS-EW}ClpBgK)C@;vrhp@5kTj_94UYUHU#m5JGgzFb=zHO%vQ9oE zcU8gzWrlmmf-M<7xazFxL;#F!pj~Ef0^YE2PLiK6cDxHy)uSdYyVtsH@z0ghM`8nt zdi25A3B{|+lb^$u&;e8AO^`J0EOW^NZ1S%uMC+_M^gH#et?n1v9RnaTv+(yBZP929 zwsbQ*B$u@D?9T~#-`q?Onjw!mnxO`hO<{U_)<$iF9;XKC=4*HK3u%`aDOg+d=q3^G z(1o6Kqa)AWMJWB|M&3cybyKyWf32;?q>9#C%P=oT#3YCYTIKEfshX-l zkymQZm`fq1jB0Frqk^Zh@}NEgfOYNa2Y%m#CZGj&M?sTME;ya#u7;k*9lARH`6G7<+)hdT4eeH8w zkj@{X611WnGc}zx43k&rf`Aau+rG1P<1|a2=g5W@(ox5i%qP)MCC!QMNeVXwB5RGQyCetv7?HNfdJK6w>3{CQ(e#^(O+}Z6Qf|NHUF9} zq&bm8lu6}KFPM^ZDqJIbMc#yQo<}lV>%Bh<% z?H>~H6_gof2JS=#(D+eoQUCm_b*RbIr^93MtBJrI>0&FK$z;@E> z$Q9%!^z*;zK?o(#y0g#DwM|sh=7%X4Hu(rYcT|wx0PVqc)sY3VthOdDa3l5H5) zGWnKWM3;Pq1HP#;xGwu!iW4veG>v8nYYN?A_>gk&al^!g35;eO6&LjvEjwJ@f#rd z@XfOY_WT6|mfIg30-^v0SN`xq8negRQC>UeF7FvZ;xqRN*1w2X|=sSYVjRm1> z-t1n1?97aXFWA&J(Ji|vO33t6?>go}I~Z7o(sd!aagrF`wNb&gn?!NMG-xF#&xVI> zMp-NY!f)>Y`wLfds)jc`v)!}RL|RLEV$E##m380G117@PtLM_{oJmm7-q(@OAEl`^ zkJ5YuU@V)k^J$uyJo*&I(Ym$X@Z;Rn)$=LWp27No0cN-+TyF(wN4h$8ks8<~_w;Izqs0Gg-H-t2cNlIy)W)Z|Go=CwN(s29>gb6~t?A0)<~GAM%wQs~gG6j(HEWvhysT zl^qBBseKAHaUrelPr{X`gnnbx4Iy4h=tpY{hF}|b2Gs%Gh!h5MVLgsqmIw%PSw*Cz zH{p9!sIq15hWe`p`=iFwd|P(Xi=|(J!Wz*3tb6wenD=RGHCqlKwa+DV;02H&V5TkH zSMV2iK80e4em$3tmwDQ>3n61eUeg6af8D6q(M-8h-W2s;D@%QaFJn8DIcKsSO&k)a}u%VatzBATX+2634}Ij%_XxtftA82u|tZPvhF_n^U+vV=C3l;~uV+h}YVZ=Vn)APU^NBv(ni$5j&U^oOP?w3Qf+`Yx0MWOjr^PRefN&4z?8 zbh`(wKE6Z1K$T-gQt0+0il-qDeFUmXBR|O(4b}})w^Nf+*pIp+B>$mJW{^I(h+j;a z!1O|e#C0p~cEF9n zUlOLmLA-R=D_FdAWA>Sa%^+3iG3h(fSk~sd@Pw!s-)A_@<1?}7irew%nF}&$vUZ2b zbGF4c$({+boz|prEJx@hhzaTdtuEO0ecFvweS=ZAaVFEkj(?$az2Pzu(rh` zIAR{i?mf@@@;M;hfoz3pJV)&_i8zUZ$mdWS7}p)ugmXjCTeoc~qLGln;!USTlP95* zg(imgMQ(mnj7761)Rxd;a=Wj2BDDrBMi-phfN{qplp!XVl{wf{XM8FJA4_bi1tT<> zbP=u%xDaKzki7xXt%aLrw+w>_on!{)aN0Sdbev3-*G6iE${%p(K#t0mlZY0<>pnaUf&1 zJBP#-?MQI(1N^kU<#Sj_@a{rmmm26HK9*nCHYK}17nK6o0^+EY4u2=5#m7M{p(;D{ zI4%urbbRV@>M}%6QlBT%>d2AYfYXVzVv^O9xkf~Z?72vgyKqbbjx4CpK!_k(@WlvQ zuqB~#F%`m&{p%(<#~It};Sq-P37t^)COmKA*dalF+18b`3TxfEY*fO!)j0}N1CnXL zt|6fI^37yWLQD}=ZdEemgA=;BMwxm(W$qf+HpyT1smc^DH2_kY0L@$Q`(+2~pui z`=?DX2Mtn^Iq*7Z0g>n@HldCs86^8M5jezVP4Nd2$k+H|A|v?h+UyJy*h8$7v#Asw z*$|)Vq{dm9nUz`CR6C^^+7qxsm>i@KtFU`I(%ruP`iTg@h?2R+`|GWUmr-MBJ_t)B zzVhmq!vKU1 zyJ!IR_k61TBXL2Nbt|<61JE)Pz!w0PoTM4LH))097?E-u zQ(<2_KTYS^`3CB;K&>v%+nPNe@J&asKE7L=S5LayIDrW#W%P&0`RxWXW9I2OB!3Rm z9~uh${6|BbEaNW;4ipTn73PucF?~Wm?1g-iSTINCS;6wl@-JM%=@VwVr;}0g-5h>5 zZ7no7T3CBdgIBwWE8k3Uq;L%xTAmmivP+wpRAta_Vou0=QhYo)RqDT>)slQnozlWN z1}Ar-^QCp(%Q>0&z~SkaDL|JvdAbS){?sJGw}^pJ2&t1(nk~h^Tf|%wBmOl89#n9I zeb^n}q2xRmc{}236o`2Wpv+=Zjl)#13nInFQ_awLtSrgKX^_wq1Jn>MNiu;TMk4so z4d1{Ihk8D-Zry|#Co#gE#0V;EQAO>@!5px6G~7PuoSjS#^d7a?tx+Gg&-9V=G>>V* z3ltR|A;XVBxyvyVT?GMt(eE*2c>?|_2eusb;{dtG$VC#NP&B(={~KaAQNI};rgfse zheX}e;Q%KHZ_{}rH$fl5e+nid zm+lF}C0kd6Cs(~WDGyvgq#cMfsppi?Bk<7Ke9w{I4bemcu9}C0_XqSr+eS=Uk>NZF zI84G5i@mKlx!@3;J5-bG9g1ZeKBBAPBNDlcqld^x1jp@QM(?}oS80I49{LG!7>rTA zWgWFfY4y2U^SVuV;QsT}flngWfrUQF^x5DD^PlGqRX3}>X($A|+xRC--=b2eFk){y zM{+Gh<`qrXCF&Ctt_$9%P`OrO^6jo0ugyxsb_FvQ2qB~DtXfd^y%D+%k0=_t8Pq|C zv1Fsa ztTn)i8py#(hNEjJecY9#k7?@egkd3`talQ5bQ$#2a`hzV=*U$``uHkz5(6`oNPS<` z(E(L-uoy9s8)V|bmL`)iA$Et>14-G4NMsJJ=z_ozfoD&W1)v;C6JRW3eT_$jdvEje z2n-;v7ltUHy(s39)@>OutLVkxYS}Ea8pPW7;7ZxJd$4Og^1lq`2p=VsdOI1yj#xe(nWmdL^8_VABW`_Yku@ADksalk7dgty?% zQ3QSxa>OVgGT;DT+d`0=phx6)yHAcdVk~{P6ZL_sal~Y^3&JL)d>vM?rCeJ{#7O!J zO3&qK*Zyq|Je4<-fvCMgMj^lxS{5KWllX(8d}I^4TwjsYR|t_W@SdU-Trb(bLXM=? zJQvTnY{B!ze84~)xmNfhfeZ|Dnl={(&5$lD@Fa|ll9YDaBn*16ei1Rl9%Fb zNavZXXaKv#*o^boIfq3}KFh*pC<5!+4D;ap26nZ9{M>CM=H%QFs090TVv0aU=zUrj zU4dqs5G+7iqG`AIjuWc@i%t_E!5US-rC`MP$^l{*{LO88jYj$sW&%B?;-_=5&WV-U zQ`+_|WWL7P3;%(F?1e-4*5CRUSQjrisD&=vl;VcHuta>*4m9?{9PvF*e9sr(3&i(A z@x7S7VdUYHgHJX-pf z>+V+MES|1AaplQP)#ChO?+NxC^^`xfgT9TkdGnvs@xY#=q{x+go!F2PRA>t;drmy8 zqK0tXr@sQ$#6#2`pQe;o;8@@11PITGq;-T&>|!XxE(Z1-JzR|Z6ylA}$Ds8{r@E7N z4N2iEv53WI;6#J&cvPgI`|3^-eprnn0cDMzKoCO|yI%f^Yko8-sKh%VsCK3Vl}HkT zO58y?j*drDViXHxcI>62DEgiK1ms&IHh)Ri_c1xM!-#QOqyL7s1vqAagBF_?qDAba z$ts6KzV7ItvP!DabZu=GIR>xh#>PqUpv6t(;OCvj4j$EvWOk8e>3a?y|upJ2IOCbF{3>{&Asyj(}O5ss}+g8qZ>(AgE zwLS~cm_JylpTHT8{86D#-iM3;bvn>@c)I>dc*o9mhDz^# zG7T;>g*pu5=b|_fOXq9*;WW zDdWhNvaf!YtT=kgfH-n5AE&Jqj!_WYf7QggmTD20z$z6CWfL|wl0RslwnKQi{aTbL zSN|*J10nS0lTg_75@8f5F&yHwTg`KnKi3x?lsH z2(J1zGtsI(3_46ZGPM^ZGVX4d0@-(o_h}q1Gjk+ z8Mywk3d6SL@9SqE8u)KSCQ>|`R#U-2@)s*>2KgVLu}$G`t?>W<=cF`9kcXjrh|-fa ze22xJ?9}TZ8@INZtap73x&``kN#TIn{HPP1PiRqk6Dj8VlBT{}Aj!6ZLA|(XI0yL>yxpsP07=Hk{P2dp=js zjjFrC(-Y7(RgyJWu5U&GtYyBZww;GHs}}=z@aP4!DA~IH)NJB@sy0d%t4Uy15L}Yf z1c9khGH*-<4H}e}q&LB#zyz(R*e7a2kqFT$pNUdf3_LNPoxuTqQ6jg<_nUT7MJvES zp-ldU{t=Xdx|15Vg+}nN^kO_yMPjkij9Fx~4bs3FuEH509T>N4Dg4Xy?9o`i$MRL( zG#>3jZJy{MeE*XiJ%Y=XoBxDwIoc-fU&D90Fn7MpeDPXP{!=U7+H!5vj> ziuNO)D)cad8~>~)u-Jk4x1_GVo#3^uya~BI=S+syK9J0?t#yXaFZh#zKlP4j?c+&Qy9Ez6q9=2}^hT@sPirLgmBX%ik{0b#?yse(*~8idK9} zeIskdUbq_ijRP-!XW|)(*O#9m6^3o6TqQN_!x@D6+sOzDoAaNc4Kd-L;A}L10D4^P zjKP5>VuGw??ZEZ7k8Ru^CF9CgBhG#c)kVSm}dv7^;n8M^|vH0=j z)aqOTP($7}+Mpb{4}$0*_P**_uO<@JwB1(xr~|YH6qRKm`OLHz$a*e=S<$?O%7kxA zl~JA@S_VhpQWpf^Nh}QQxIiZ&9jX3{LnrPkyzjC{NXxTFNC&Y;gmisGNa9C?Bwk6Q zR~cX{i3Wr0kyc#TBRlXNU->+~F)>KQR}vl4;IT)D7S}xTBEH!pM5*i%qEz+>8IoEH zX*g{qt*U50x4bGrw8B_=%8inSJ++JGf_=kM(b0)}nAqKR5A7LFqiOf2_po2;_pn=W zao~e(!D$HVj>LHj(TChZw2~ZVtWKP(AI)2c0`6hCQ)&7X51nj9tBUptNt>5fptUca z!2`sEv2Es=d)U8^g`mWR0zG(R%* zp?MjFt&@$i`E|3S!@;rdU|OMU;R|0i8tMY{N# zyZUpyVt?ot?b8HDoGC$(%Eq5@zEZJS94h3C*A3$XapUM&z-|Mt2K{CF$2jV2Vxt-7 zB*KY8JJ~OmSC2cn6--JIl$A7Jb^QvPdLeq?C84Q=lRc(W+m8thJVqD@XYx07H!T}> z>LV%s`5`g!dX8Y^tB9LnC|H2UY_^Jcny2}Nu*NwJz%P4DF!*DF!B-73_^Lq$e@rm= zV}ijS6Ab>CVDQI?!2@jFf8e4=>8PZ2qD8dhIe?$80K5~e=!O$#lwh7G(QzxzuL&f> zf6#QCb_k~ql4*7;cmg4P2BW&oB+iR7PKFKWPHKp@t1nPrB@{@Jxj2qu3Ku=|h~64- z{FA(jfW7h|0#+8?x$+_EN;$vM&sPzOVC0EIFYKwxchP}Kbg0{ted)XC0EUZ)TRipu z;MH2U1ufEm;Xs;yK;+5bHuym)yO0h(5T`4!RfixT;aBa9ucDc^kd_9v-oju(A!PD{ zz2`AtLwzc0UOIn>xTh{dY$@w7&L(MDMSS|l^i#cQt4QMgaTwi^1bmr}j98PITCWwN zzvrm$Q2iKjSiZO&EganA8$awD^$M(HsW1H%^n(Hb+F{-6wlzT$PFjh5;#gB6ubGv$ zCWzl7N&>|*qR`0V@M4_ZOGg>gF~oGfGaW;mVf=UtbT4$(kaTQKgQN$3ip_X|c_|f0 zPrOlE-BF7JkLgv?abcW)hYC=;anQ1n`3L-3I?8o}+K3Y`ricTxaRzZWPRl4~#SS_L zIXn)f=v-*j9X?W9BMu3s@NDC#!XXJ5uC`R%c0ju$=T#Tl$BB&e`!Z||4GddDJ0h4F z$AzkGW~?tpJ_fs**`4@rVZ+&-3cJI`?zDeBz8&Y&2KZ+|?LJ2(A25!ML`iZ&I{Bdq z-Rjvy_$r*qIr~BmfBTww7jjKwN7pE<@Inroejyh*UC8N9<-8F&H(kg9D9F48nPGSY z%%gE6V6#YNYekycXqWKgImNbU8}=^H*1;(_F+OZBFRL)l=K(@8TZw-A(h#15!^Z3F zmByLZ#$j+(@YEzJwv3ld#u|ngU^<~Gz;8jBq`)l$GHmX7{Nyko?xxNK#Q4~`EwlMkvNZ#7hr3JI4=W^&057so@GID@<0vz zXiTkTE`F~K2c_V+)L}RnCt&m0!Z+cj0Oz`t3J*>OeuM>wA)=IxPT`26v-lA?!2|dS zxtR(|Vly2bvEo;7boZr2vC0qZ4K1sLU;Ekt)gmr0Zu}0GaV+)Z%g?DUh>S95&N!#K zsslP9^$T&S-C%zYKf@8@?3(b6aL5UVQAH(YQ%+DdT-GM5{I=&apnN!hRz|3?!rAH)4dl7VI^d7(g5!j4>Y}+E?*&FxZ@x!Tn||P*&pb1pErf-UuB*Dnkxn zyCp^55f)1mYlE$fr&A$EOjw4W7pv9_?*AedHP(!g17s`2tmG^wGCFk}eE{ z%ieMjqB$ruO#!UmVhbWcNom>jGZ1lfYSEjho{z#bh}O~_FxK+nEMaLlL5A8Nq#S#a zf9HzcB-=*0sbmT`_;6Y*4AQSaKzk*B7(xs_09%S)<7d3u3fSVV9DH)wvt7hZxKQVC zdh-x;MIOz+FE2c*c5W+4&{R9vj6(zi0=41L4sqBOta*`*yrIc#+Oz__93qr(00h<2 zl!{P9`|mN+v;+Zf8BPwe1N**q;J%IQ855@fK*Xn!vryadYeK&6A&re4MiC1Fm2F`< z1{)Ps@bPr$4fziZp`t#36I^BX^E}XsJ$X(n4qxgl&}tkN$t)xmWOkn&&*BK`;ADOq z2~jaz<*X!^mE;iv4>_#Aq`+Wl9Ndq10W5cmP7G=@W4%eNmrjFU`RCY0=uP;wiUQ%( zeIQT&Jwo1nC+l6>3)C6NQ~fTX+pN()1L3p^+ga%QD%2Z20b9ln1WMLb2l@H6 zbQrwacwEvNk4GLf)UY=5KNjJ*{`0OT7(S!o#RF7|1U@V7kBl*hBMNu50}Y6t^-VDf zE=uP5GW-slvySpbQgESvnQ_>>J^}IF>T3?vk{KC0SV?ma>ZZ!};R@EGPz!>XrgZqh zi=SeuW9T7o0(-!&$I!Z(I@c298R9^EYx5Qqyx2|3z}G#G3}xb|{?yM1JVd{Gh+hx@ zdnc2kiTVj5xA=L1rp^t>Al8#Ih(vn;1WkTEi=MEqY9`pIV)07?O`TLd|0*?ODn1X+ zpJW`*?=?Es_jhDCqQg?(E+d7Cr_$o9o~$ zEw#Y{p&FpOmSB<9Uk05P*6l9|*BKqMhVy`H>Ch>P#1T4EKfPnfOBkN;eBp#Lkrnf~ z)U*b&oQ~VeruDfj+Odw+N6hFPumSAW=H1k*<&x1YayhBX6$uW)B8zTD+k6D}GFZjY zdRNjKAuT{(g%htyDbW^E2WBK)0;f(GchHnMC>bcP(62#ZaB4Ek?=EJEn1kp9oy19^ z!A>yijbG5f)Vp!szTPb{NKcL0D6K(m6N>2#pFyN?k>zT4IUnx)@E zl`9}ZlEAc&F@Q<6Ps7iPj_HR{umf3_i`E5_)vu0PS3i#TI5K`RV4&6cd;t^xD&o-p zHXia~ygu_<91N5|F8zNZIH#)Ww}b-_S7em$)3CyK_dy63`1{7I19D_UrCtGv zh2d9t)emL$j5&1E7r#rmH-E`7=j3rQJyv^_kVQQz%Uua~)QlGix2CMcdtBF0J_o)E z@mYw^gzlD%HJL5NrZpv|mf|$jyQU;f?UdEHsD1xn?XZys^NL(BIMT3_jbQkf!CV`R zJcz;}2w_Iy?V7>2sG|>U9>M1jK3({<;nRxG^Y}cC4=-GIj1{gwhO3UNj_Yw;kK@{p zYd@}t*Ixf6uGqb^egN0=xSrP(4TzECet95?4xXS+Tkvt=2ZqU$5;`H0VbOCNrS87bo7-Qn0 zG1&xIkb^RBcnbGj`1Iq`QY=sChARW}c&ZwEF@U{)A5t~JmdtZ;tUg6fF$!yjRM83*(Yd5pA6#!kKcDZxBr7SdIJ*ey6X4AWISSG(vroaxu)?}2j@VYiYPQveaO zA9Cyol4BRHgh2T{vXKZ)ESZz=&-UvG0z#a^aZD74u^GqU20f2@t1wSTFnZ*eJ_jOf ze?Wg3+^#=|FTcJK->`i=P)6o}{)kB1Z={V(iczE8#F#>~&N8sW5E09~Y&P@H=4Es6 z)9buUDZ@F0dOpE&`_su@(N%AUrhr_cUWw-dfJf#AoG5&`4Ze_btonS!sb2@pSV4br zX)HKHfB5^T>NPv2bjt$z2!OND4iyKZ>7yISX!3ngRTaKde;z_6v1D;T|0QzpBD*?M zNwDHMyvXV6sH$R(vm>%r1dmq45m;Ee4s;x`K!YU4l%gXz6We97sB+kM#n*|@M~uS;$552yCBUrVQq^p&=DP(-nQOHGHC_}0gYPE=W&>wqHtu)!z8^(rLy&Zi`te~FpH zbTsnh6T|>sk0d>LjEtyXf^ws6%QN-W*I>@LU!Q*yJuh?V$3W}28HcG{5m=hk_=rUM zQIzR@7D&(=@V;*k=q?_)E&p~(x32q=W;G+}KL7T$01Usxz78}0{N=XD19}Mx=+~na zJqD)fTZAa`NR_@Drbmj4o`6UJ7oDy`PyQ8E!L*nUOCWLEF*hI`Mn+2F5C&^pFrbe? zMO9S>_X`Hg=yL@0>rW*TRlUDJSu$EOgL*Y=9I#9Q=3sja)9)y8O%*xt&micz+KiWE z;hlmLW{l{CFvp2_eEs2c?97SW^4rqSXiUTAAk57}$W3OSwfP~Ug+PUVkdEjeBhlKd zCX;^sH<5%xS0ZkRF;@`b#mkWf(y7oNL;h5i8I*!f;apkuf*iS#>TAS%n)h9AG!!14 z$~@S9lGkAU^b4jm0Y%Tawt2l;nrA=qG@vDw@<3 zy5S@ADF-AQIPr?9>Y1BEpJ}Bh)H9=(S{99*)4`Pk3SM=j7h-@HjjHl>;aAvW@RxV! zcVSonZAL48LkB-DNlAIBq{T*(r6Zu@_djXZk-3bSbq)7bykBp_6)Y#%tt_+e$rU{*Wr zCBEA!|FU;#5+eWLyV|)!8)i3C!_^&R$L|`ztvdN{%Ya)`WW1*QtpRr|Z{ZW5=>#?p zIrJ411@Kj2OR;*vz3i}{{|?nHa>B&!`wRfn$<~2asVsiH8ng5(@q?MB@W^1IC#b)J z2oUu~OguWxO&1=%0s#I=itJJF%Ci(Y9f)ln<_Q@kkzE8Bn2Gz zF{VqHG_d8zu)uk(K)yp?4CRH1$Zm|NF%cOiW>}a4X}JQ}{PCEG#QW}BpgtV^snW{^OF_@|jriZ~ zy$f8FRsKKz00RyP&RD2un&Yi(HJd9kH!i{;8Yqf_lsA&00TF0;9xtsZHs~@uPPyOO z*8Q%#X}FuawY%-sn(ej*V&J8Vm$ode*kZSb#w|)#DAD=9Kj)bNwCvmd_P5`C{a*hD z&U5bPe9rxx&*yVK$D8cO1n~)oiv34A97EWVYBPXsL9*YWjv6dizE3U~Ubz%*#32=4 z)IpSG!=-3Cqy-XXR4fFtx>B(i44eXKo!HvcNc};;tE|9Ud8TAxcH}%$sPVbR9r%J+ z6G!W7TjV47qC&XT7BPP^#L8^j`lRgTbtb z-4A(Z(ZVDEFk!TRtZ#06zt64%hY=c{QRG>u5SPV@c}nqa1s1r7oNn)3 z3X+qJ??Rf`=LYxE2lME(*;)G%1F;=Ii{eUNWG&8f>%{Y(|o#4NX z1yZA02ZbtB!2Sm+)#;CXbqwxkwdm;c;`KjmpXlfc;Mt%H@ZUq7jaH{K1Yq1wbSKe7 zs6rQ)3N}#4UCE05BW*eIAmd*4XHkM_N9QV;6=V_F)3djpnp92~u2-_suVgqk5r$Ci@U}UgekKD-#Ms#v<1od{@=*k{`et|D59uGc8 z5@p_@#KtYaf?6Xf>{^9qjWV8%4K{udqLJLab}AnT8b@39&`82WOoIqhv$abwdYaU$ zoAA~yn`{e0Q|wCA1-3Cns#))m$DbUFjoH-~<0Dvj*Wok_>#KIK;CRba^KFEl)nE>z zQCT2kXvrs5xFN7s-JcDW*8gMAJY~R}jQ5lSkpvhvh8`u@H^4$eo7M$re=&_-p1n_9 zU^wf?lLhnVL*P=b7}%8mMyeNlV>vEcxWa=H3(`P$-uod zZ2@L8@HMN%W7o`P-QxT{98%_3KPAM1INqD1#!8@ia52ET*aE2%4j3ZdvR+UQ9F(&RSY(~QY& zz;o9QD&C;^ZN3tzc`?!9eW%Sz?*_bWqMr6@SWX|dD4goSpCPnZ(}!uLIiQ&D38eV4 zb$v9!t`L`X`^MtrsmA0;@t3K+g-Y+83YtysRN`wbR0;(R*+Vdc+=v+@fEi?nqIzs? z&5bmJyf$cV812j0ks-e3*Dyb|Z~iqCM;!wi&Y>}m7gJE@eZCBRA6Ox>!}>6{EsiCz z6|;aF()V`SP<1%wBtcX8?x1>H7JD165YG$q-r46{YUo2tHD6K8^IS>6$^kbj((;Rr zJ~Tir6huRzA%}D5Dd$3UVj^D$EevT58QA8x$C^nDs z{G|&^Gx}y8I;SSTpau_E1WteK$>|OF;ssjbAscU*(k)rf2%E)ml<-%Dc}ouSmT%{|OkFT$bibdK z#ptrWC5(`MPSR7)Yz3}B$qv5Jw1JRP!HHKW-l>M{i*&UoDZu~LJB|UFt`^ncgu#5n z$BWxpw-Yz+$e5HvFuw*7S2$>ia&OGa5Y3^o3=25=#P8Rk>T!L|{~^sZUmo|_J2DJ` zNv{ew1QSN0WttV3Gmp;RdK7bJPPe$|bA=c)4LhDsL!C3HcN6tYYmcffjJok$g>|kH zq=ON+-nSPU@4Q(7ro2QPg+`^;f1=Q5)5L_c`W%8hWe*t?8w2kv&B#jJz?|} z6=LA(^D>P3^Aqk=1h)vi$VVyOukdbAAVcwfnif=bgl+|p!F~ybBLo0x3LHmZAdul& zF89l!818bvteI3>GZeT5*73kT`AM`@9O$Bb(HrYCXuE(QaRc2m8m~K}L@&so&TD6T zq0=8n&%`tamXo1ibIKl0Lmo4s&=ql#Mm3!D7}VY3u&qaZ8^XNF!Wio~T47P$Iek{P zjSz+ecd~GS7{*x&HiOI5(|`%3qmv~)i>3BKO=}+@r1pW33i@dP+c`&H@HmSlt)I5q zGMFqX6Hpfn=9MF&0PedHQB4EBi)y98L_~uE$S&`_(h5;jbm1=n?aTSTs|MTAJcvOw z#3o6*aSo-&nKG5KeFxcbwc}!{qC~ZIJavfGv7XCUuuIp1lYs6QlE?xLgo5zPeHm*& z(%u%23R${MEn-~b_UcIRo*n^~VQUj*8@4fHGs&&MTY*!(j;&G9V_HgbMcBHhF+{ zi&)d8djJ(cnQnH)@;AEV>iM&HL@ExtBM{y=1JBFVu+`9;v#6qcRz((R4cW2&yxG}1 z78!mw_KJ*^3#NGd4}|oQR7kXQ1et!Qkg*JmvK%nc@lnbF-yb{S;gL_=9d<1RLM1T5 z#STXNNLMzjK!O#^_9%u`KG8y&bdru>GMc#@-Y=IarE)sWwZI_K*$r%KUH+l$U>c6p zTNQZXRq6g@Iox5umQIEJ&v5F+d^l*Q%s@v;a7a2S-~!D4N+s@%Xc197ERu5T{e{AKoXTzPv|ID2H8`| zPS3*kpUuZ(IDp)bhn=yq01j$@v|1sdc2D7C4}i&=SHi4x zsq>YEG5(bBpfz850=Q(cD_9rNEP0E)(gT?c)HKMgF;`yh5tao)Ik!eS8I2%JghvNanaKlA5 z6r^=>65v0*=;}hayv33S^>`Jid2*P5@$z2O5keGQ8$uT>j9L?h7weGBVyTviH3{ z#K1z;4w5mec44H8YFsj+h!DZ80= z`z~m^9*R5x4exn29%j0t@d$Juj=isweQP^La9gAr<}i@K_mF4fVSw5ec>v#N1=rLT z`2tMn95T1Pck3BM*|QYOrg!T(7y~1=qox{_hzXLGkt&d8ih4M@rla=-M%2ORu~Pt` zJP<}rVO*4UU_>qaFo$o17Cgi$F^vG1OB8#M>vPnQXc=NvFHu!SLCsU+ldr*Nxwb^L zc?i^eIBhO~)8-X$sw_#xry>`hwJY)2R0WTF;kLOFZkyM^ZS&?T-~L(@%J(9D=iu2B zd55{gl6P+Nb$>xzerjjDgrI!g;Z# z3jr?dML>U^^)RmyjlUb|F6uUQy|uwy8KF zd;kd|PV8qLy==1w8ci{JkZ9V0q=>_mpRk9BHlE%9KMIHz@(jGe$Tmu`mQV%$TU^07r^u)qnh(e+p0NK~LiNyN#1o;XGi+e4K~6+8?BZWmJX#Ib7boC4uYWwEYQ zTG7|y-szx<#xf1GdRyjF7vd5keiKdFcSt9&bi!~8t9j7k#c{L?3!L_DqqcHU#lV&9 zREgeARju2OV3?)1ZX?mD=?Ah#VEV{(0g&B@R~9S13K$s263Cg}%yL3L?MY&R$^&c5 zrAqXv{xuzY08Y9AfPzdQ{Rw+uG%S!-(+L7b`V)Jly=WsmwLo;%c_BjKIz%KFbWO|E zM8XafMs+5r7smLDnNKh^HwjF>|_Xdt9~|W!odN%_iHn$+isHwqCYn$+j}t zw$x6IL&+ABLs^^z3URP9H@QHg83T~_0c2FFYD<8so(BnIIt31q-wOa8Dl>~B!VPW2 ziJQt1cT$100SjoM)lRL!$8QO&jE5fUNr8OQ0_lfi2DJ+oV^rSjxL95&Rb#h}PL9F@ zp3yi9U^Rp}R*GY0kDYZ%KAUd6fk#ug<;z3!h7cV$G#QA!%LxfQh`38{>!95VBoQsP zqQ8SjGqzS5Ff9dxIy1Wk7A?JwNVso77gwm$y0)XU76jgK)so(L4g&`ko>^!h!cxvG zL{1L8;jvQ)PBc;SjWo>oksdn*^iCMOYBdX`p;`8!V&)pYgIJNa6SW%S;khx5E_`hwiUg z#nj2o()gYe5J?prVuLXgvS1*Y1RrKNWyeXPN%hDf@z7ON_%FwhasBzyFw`tHjjApa zBUQ{_y5~Haj<}u0V|ivXKTJHc`fRMHIX2>L>v8wTtD9mWZuUsE(rgwKVl!Rw0*o=J zFT%(5F?`%5^fQR*hn&QfbfrGEljbYWC3MMmVG!r7By@L9tasi@T%;l{Hu*{MxOQYL z+B@ibGU9XVn>CYHAH~CTOFhMAywz)G-s8x7R>XS%$a;F?`?L|^><^;M;-+FDx-GNV zgDm{Z?K|Ma>|4k_&;I?8oe+BdWc$M*`&P2gu=_&x2grW2{h^S38`+21|BLLnSXkTu zdthxbh%l$YNL7p%`%p;Sx4>?s(3`muR1QY@IY9UlBK!++w7`PnmaPM{JEy}L++wBE zbfp;=J`06g&5`FZ!q$$*#^WiBZ{IcvBgQH_Mj%ZLDX~j9N|!%be9T?o+a@ImZ&NCC zwh4UGbej9qK?-V8(hBUO87zgu?EqWNe?yQCvZUDIqzfg0gsP_|FTn~ZpFd>g^Ow9^ z>C#8OcWXT=&+DTm@cy8dzRNaxh4tPVz69cJVK3S4Blf0}?aQi4wmZs8wmV%V+t(ED zdT8rTIE%lhi!8pa^!0At1(!C*89Hj6*O4cCX`g`K*B(vR(24!{<1GEd-q}FyY2xtyh+XOTPtsK%t8wU3I*G)P2BU zcxAana#Oavv=26RVnV zrrr|cX-X2~D8iOz3JN}f(oxOUC%&%Z$yHHWPA*I0@^HqJ)7=Wx&y%?s0S|%r)&B zA2ys7FHj05mH@Dy0lW$g^lVh^JVmYF-I}S`vh}PGS$1)WKSpfHVi*0I{(<&kIEP+r z6!~;)s8X;Q3&LjfCQk_t4Fe(S2>cr|mQ1LSXkw1pQwMC&<2GTv3 zB2?S&g(<)qH!$L9lo_Z?T*L$yNdJ8yOhr-$w%3@14l>w@Z%60*9&3g%p3O?g!}QI@ zmFp2|#0OrtEh&;!eXsj{phOg}VZCEqJ&@-^N5zc?F`<#bfpI)+`2}DRdk)(`(L|hq zz+hbv5{Pd6W0cHh=fh^_OPv^ug`m=fHAGojgpbM;vkRn;u!$hP9I&?9tAKUlkIM-x z_NV4c2M|G&9JR^zLjI02AaPzmXvPLRgrA$gI9Hm;kl3-Pl{m&}Djad-tldbF2IXXiuJ9KFgw7?P|ngs7Kn_1+uuP1b>JQFj-}b5 z%*T_2pW(pW#vrm%tUaCWx~mC3k<>dRf3T{e3o}{ zY{Si}{VlnfQj~lq=5GuP@!-Y<7T=uMhNyrewmvMg?kv(rhP<9gy}~bQFKPJ5+Dp;G zV@OHSIxE0yIHDw5o0i|rM|d<`AcP%?y}IKi1MMnf zE_*SD=jYXr>zjgII>TG;*^TCgynjSVhv7bj3R7TWu5_sf!H88Gm)GU!5myTGDS=lo)5!^BH5MZ$ zugQfkh9T_%7_wu*f<4?Vgs;SfH2cdmM$dv0&{7t@Ot?MpCZ)>9wnb79>YVnAyneAX8O6f5f}@(Bl$WN zf!WX{qXS5Po!LQjM7R?a&e3gfbQ!>cEDSj~A1V8XZoPn8udP_xhjw`xiLvJmuZc2X zT=;D3r9itfVwHRa6mvFkIA!s!BecYSf=g<&#Dhpe;iUAxqY;S7S;+GN=_jrIE9_uk zkCQp{EvR0a{c1YGK;~=0aaBgrA;b-?ov;E@I_t6&A`gyx5$G~$Jw(12Hd6A8C!gIW zc*E;x_uoM$6AlZcq%1(;^+X4G2TGiDltoGI3gWBihd}%5{TKXN*$<*my*#l(Ic0!FervMoC!w3 z>5J})+!nZRY~a3xzK^F**zVrZWtIu2d|L`QBBKN3F`n}PFg#KgyZ zkHS9?_#3(R!Yw&E6C zs~h)8D4(AJPemwOVU#aZ4d-;(`N5zwZ)m<0p6j#ilrpgOENmny9^xfPCRn|Ad0bH- zeTVrFMGw_BwvY~)Y$W4iqXPTEOTY&awJZX`P@=6DSt5-T9($$)5KOVhAYvyFkrIu7 zzrP2fumjzRMl4b5E}Ok{vd(3hd%z5fptqExt%U~;L>)hQjGH7 zCAN4Z6>sxMQT((leymh@g1DvW0#k^}cLHsQS;qhCg9P3l`uIm4r1I{ek3Z%hm3R+* z+8iA;&T^#&Y&NtLiq;3@4*0r@{+pN^6U%ZWUZ}r31jEwkakj zkb5Jg7kDFAYLp!n%+VNhd=QR}NwD}F-MNwl9hlK)f?MayAbYdLqdOdI@DkxVDWyV0 z!q%WM74i6Z*NKpO8r%yTZE)Q~A29z|oB0jqI2P`{Txlo#117TJu7*g7;C`Ff%ja7! z@e2ulezY&={DQJrUrzgiGOSD_jVbD)LkbfNw5CcY(b3s9Qr_7w4}sUEa7S;+Q3KV+ z`7@Y7!TGIwsE}4iFR#m$#>pV_w?L?53;Gg2ZV#23e8GDkz?z8y@nA0Qqx(300Tb1l z^kL9ljaS}-m+B~hJcEJvjv5rZPDnZ`;FW}Lv|d_wlVo`XM3a%ry;>Q{XJsfsA+v*l zBmo;VMSX(*E%8Ls7+x`JzJS)`KW-RSA2Tb{a-5HtFI>Qt1a*Ca^x4ZuXJVmODSqmI zR>oJdwE@_2^pj=r1%euhsmMQ_qGXU|A?zbxE^O1p^c;RD;9A2LQ7)6RBs6dt}%dKA; z6?VPRW%NlfcQOnqGkKlvBfr$I0|G@#JJ{jcCDJ<4TTbBiyHc&=pA z<$hCN&_o)w-0`bgt`-~GK~?qzwpQr=XgOVf%Z*0M(e>QzxTPpUP@~oHLQ+hJa7qNppk>ERO()wSSf{1u5N0}#PiP1SP9Mp9i0*_) z=XwqSuf_3uOGJ23`me&ZmC}C+>Hi55KmGM2W(`slvUE;O_vTYP>m?v&Lh$8K$SkjNMLSXV@PuU=NFu-Sj>JN~_0tEI`deYki z?ytc}5u4zSh#5#ZRor$Mw%f1ZlPmoi0mN-Y?s>5mpJ{Em(vO)Fo#e^pV~I7vCOrTn zXgI!uufqnh#M8*71Kmutfpy~o`HWTm~@@3hDL?I89|>oLQ#c|mfQDY6e4{|!H@Dt zaeQnRn=uZMNbi;dH?XflN#@~XrbEV`*s-c>F?P<&$KodTP;5hS@dT21yqjVTO}vXu0e&iE@^&{k8tR%_w~}4MPxCDk zRr`;q_D5KctQ$G4IW^b!NE~^UX%Ukf`0D;#K@Bt1GnTkoDmEFum%FS2(QipX<4Ajm_VP)cI*UtjUQH< z9W_qfusxE}^bfz-9L|p*Ck;6vmHO>bR8M|oYaKJN;x+qoeA~zway4xy5^w?jSxp)9(d1inMqk7 zxc~*xSMZ{5jS|;(TBHSxjiK{lfP!iT8v4L`RJE!OR8ua1JK#-Pdl!uE54Qv)5N}j< zB?!4C(8}*nEiYz&_b{xz6W-@F4#A?@pNZEdk9PhX=0VB4(1DWVbRe14 zN44Pe_5HS{|-coV9SSBN0RZz3a+g>+8b(lcq%ij3j}zcx`sXI7OaMT0H#C#@60CZ7pkrIAT{jhaJ2zKWHJ1l5G00y7w_6f18>x8@Xcut zNQcf+dwOfmNiMXbxWa{2mcWyW*<5K&SE%X=sPZ+KLZn(O3WaocMke<^PXt*ELGjXs zpLr%h3;-e?rga9$k#-V;L7O#EI2Ty!>K~QE#Y~r79+$b2;r9saUGB=0SN6c07c;BE zRa=SRe=(BA6H4(8EEthVEeJ~6P!zp!J<10JTjNHi$2QhNrz3j@-fE~(mx$Tv>Jo3P zqa4nueu??mX`s}^HDo7@t*>{DB9BhlgQoc!%#sN-z17!OC6M3WfZswh^@DvQn?3pg zzyDbRd>jPdS zj&NYECn^>v+)#E|%17H3wndTypuz$~jP6IM-ButdPy-vEUrEGOJyNEB3-4IWs%5fYOYOFpfm$QyL1Ks<9rmV?ir{Uj5kiuVVMZa97vSz z>jslui8)2=#Q+8m?=mF{ozMi}Tf~|UNaNf3B2oxSZ<(Giy-%1Q>b9p)`BDeApP;r1 z>8{~}m@o0^; zujEUmWS6RuR!Am*bPxx$7HK7%IyYkYBmPKfA#4M{M8gIdY!EJRimeg~v?OCwjs=@? ziRzQ4fp_)5V@#aMv(@y`&__!j;zFKHT*$MD3wd@`i2wM+VCG{rCF@XL&0`F3Y@m&a zCq3_P#;tqnG5&^W$G}Wq4NyIYl?ab3_@JaYBET7Z2nRQaldJ*LPWOdh!p}dW=RIul zy)|9r3|{0eat6yWVyPpJOgjPjn+v2(EG?4Ta}_w4V`wQX>J4BLH1WjHrQZ!Z3oT(^)}h}EcruEBK-*5x}g$a>6gLwb@JLMb;$GT z4-1wK1iw~Z8-wAx^4fxF{1{2qL)Aj9hpK{dL9K*Z0tFdg9gy+$FUo79%)|f{`UR*X zQ0K@cBopl4Ca*2^Eal7OwROFHU3qO8@FIzB2)ttv%|BT+DI;;w)t1& zwE7SxNaNk{J;KL0ev&3zo|R$mDAJUoLLnD2f{qm*{^}iT+2FzW{Hc7mfma6fWgW zUwbXo+J&Q89Drzna5E4saDq}u zPt%bL6d~zXtz`Hb#=eV@wJ2~{KBycq(syZZA#KC{9vcp2*+{7##zHwrxT<{}1G(Ily_mOvri^;s(5my(Q@#Y-0)W zmG(=jjUXyXRksB@F`W9P@4z{*Rw+$ndaN{t>1yc)rpHS$Oiz%)Nl%n6{epsPqzg=+ zEcux}Rr-MG)1|Xa*Gi|EZj_EQeXP{N^d#wzOt(qTK=&L@4XjO-_A#dnX*bieq@7I9 zmUb{bSE^_FBB_??OQiKoUn*5GeWm1Lda<;U=`Lvr)61n?rdLT>Oy{LkrmvThn7&cc zLMIUR*P>~qiR8M!j*O$2kxm#=EHe_JO$uYi9b~+?kHS7eMn5y|Bx5@>?jqx#nQ=E6 zk1^w3GQP-+`^fk#jGn{OgEwt~Jurz;)<}k!MN>TrU)+qqA$}2|YT;7HTp+L2w1m0j zOKx%*h`$L>2UsJQ27@n_6Hr?tR|Z|uWtVtsWO2|%C%YtABV9q4@v_TUYh-!QB~EtH z0GkkWx%32qwsx}B#4{K0wUNv6FYjOSgA`L-jRcDmtwrI$Pe%iXt$I>1+5aiddY+>J zxC5Qt5XHP&!&Hrm$<-f=&7Q*=NTI>(47MSMqc8G`3QO??<*KrAfNfFVdwW0J$!$ESD+!w2|TApv547?JWx*f-g>1R!x|^E#t1 zBSmTFfNolMqofAMg?Jbwzp-r)$cyQDc&_w)R2q@tqT4tcpO8aCXIsA1r$~XI@;qtR z>(oDDanFpA<8Td^azf!C7&4yDJK#K_;u0xCilf6bxVZfSL=`U^D+3?zb&N$}21*iu zP|jXpns72KWb%4uTOA4f&0qk_Q7=H5s4&va1S=$%gLcQC!*L0@4I&7Rg&a0yYP|qT zCJ?)y{EYfSo6mWkR?D0|!zx>gAfS{6uQkBLKqTn#Z zuw1o0X6y1d=s#kBbsQY(QLvgQz(D%#RTF%i)o7_Cpuz-BDiUyn1e@d)pL>(cx9^fxNs4@7?Mh-HD_5J z@ik$oUPt^M3eWo3lSrKUSR-`S$Bx5*z9jcCJgkB~rWxpClc|rzvp%LC=wq5tAA1my zH>H=g8%{0h=|TGLnS=Y;KA?WD?Ps^4iLUNvpl|_cv#i?;v0!y}Bv=p-y5$C;UWUAg z_xF7iRy0wa^Af{RUHw3tT|&<4?O{c+{}X` zcGARYJ-*2yL;op350Nm@!BH|&`Uv$acB9*swMEe=0Y=L|CRcLpy|w^g)x`B^1Wbbj z44mTofeSU^M8K1mCn)mr{86F))(h#ABpvn$1~bM?zVsGOak&59EuDaY22W=pYZ;}? ziGX2)#=#g;qOoKPwG?d+p9P>ahP;mRjPDS56VB?;sOrw5gfyD)&WJ!FYBkac3W~7= zGJH4xx@d}J^@+-cuUwzx)r({h=hi(1JmknRTK3MLR(P(v8Q{Vgcxs4!ggPeJ8i3dMK?zLSRLd1*W~ z0)!CI4AArLO&2F2y7X(XM;7|WgsKvWVQ4e(M^J&pE_5XlvfC}ayN4zOM;GS0STiOU zEL_K#Q>)L}-akhy0r1z%5pkU~M@(gN#AF7`)zif7nBg$6ubCzo@&V7dK$=jFBpsC) zcFLC?W~U*&4%B){tPLK=m-qz;-D$2-Dha)d(*xr<&y{wg))^bf4Gj)lo2Ym6)-U_K z)$s*a=#McRtzXvL>iC>XLrNGMRq=r;1qsDnKnoAj0pEr+9LQ5ZhMO1aBs4M**N!W>Bu8v5gxt~5zl)ILKyNep@B+NTqnvgG*Qg_!Z#p`(xv=vtRDHkekdSKz zTv;)x$_e}M!G{d{K&XoWT*DNumJrZa&7oy6GKxVez$%2EAQQo32c|?&CBX>eQmART zDyhtnzQ!g&A(Hm$F^o?JXi_vOo7;DzDTD2197u*_?B;;0_zdPi(AQ6hxGv*3hZ-ia zak$2s^Rl<5-COgzs%{1KWfS4m(Oh_U3KNYuj#gKGxu*tFzC8*m9fa%Sa3knLDICSW++zw(&{9<@WXhbnkPB zO7k0TKQaDK5F0HzwiowI%^1&Z@_80?& zjzau21i>?{!K6;(WCf&ayY$_kqCHTfeu!&5hxb9moD*IYt3y(Dv$5CibJBG`xy3$y zj9QF39Q7>4G)SK9IWg&ocz6njdb1vJ$B4~^kATNjF}dY-5=^(1^LMiD7Eco^mhbbD z8>b*@V<8sp*~W)^LG~4lQ<&%Zr_c&vn@0H@=kZQDm=Pf#l=d?@=TX^ywfKEDg7>$m z_A6$2+UZ_lWW)H`{qM04>G04(yY#3r&&&S!8FefEBO@JS2f%C`U@kHT91Q&*}Pzu`;K{1=M_$`5h z;bAz{gN1rO9-xn%cd=Q)D^&-NdpfoLF(u&g3FCDQ$7?%_YCj(h=XDXDPK~Ges5K|P zdNd$b;*x>;RzYDswsr!n3MQEaY%K}%acf7zP>B)XY$A$-e<|(>s(!O9J_7O)`l#I7 z_bCoyNNyHx+7~7yd)mYK=q(ud82;;`QN-zHp>OT2(&N~MU34UbwQ&>S#iO430)BOa zBVls*MaC5x(Te>vnibUIL72kBD&gisjmRbJqFAt{mQD%crEW?;92 zfg4;Egdwg}+>-WVa{TRO)+z92AwohtGZ42!kMcR#`J;T#r9E@kehr-qZi(q=7{cF* zBfuo=r?RzOiJioVoOgk+>eN@q(_|e&xV<}`{`O6!kp|p zdG_Q-C(jH$Ds=Z;5W5g69wC6l>G@m4N%t@-!mU%fRaS&u8$E9tJZ@SvIo@y8iYJ3g(|{E7#543V{h|=x5kI0KhIodK^RLw%V@5koT9}~R@;B;k z!eMangE%D4>H~LJB1o2>SU%uy1*h7F#M#uskATxTI7Pwfb^oKwSI98W!h<3Jeb!}J z>mw~Nr5*F)KQW8j6W@5-Zq?S0RaDR{fdX+ zLOj$1Q2!0}JE&t&?NH~Tl%UooKuw2Ah029m4s}1&HmLuC+6}cIsuk)Clmzt!lrlPu z8woWTDiLZf)Doy-C?2W->Zee@gL)O}JQNob#tnlS12q*&4>cF+E+{wD{ZQMX{u}Bk zs8*DF*u9H#n3+4J-AWEZk>d2{B?9%SV*=I5l%nK#%4kIp4(4aT^bvsYcU$hD_5o1v5w^nPag{rDbH+-B$YcwS&z#0?`X~4LKK`?_A0A(Qf z3~@2HYtjb55Ri6G-kfY?01!*um1~eiX|<-Py4tzsp7ITvV!>Tnaj&KVNv$O?5URAI zlrJqRFTI~7AG3(UmsS*0ft`q{xktDccFl%L!95t(8Jan~20_PElzED?622Pvx$tpuawe{Dq35djKYS&Oiu_%UM(< zLyL6uGry*c>q-YjWbHN(FY&tZs`=utiD#mCRRVh3+EOkiWuUOE z4!<&Nk^5eO0#=9GRLjOw2_`X~25ePjX$9Xu6HyX0y*XJA=D3{FRqo2_$`W3aU&>0E zK5bfmePqj%9!=XZ7!NaM%;0QQ?#g@Jn9VARFe?ict1BwkRU~7q1gp?N^Ynz67)<6A z%%VZu0}~*`A9B)WtSMc;%FS~Q%%R23T!PE#hX0+8h4UQQ2K|hT>}*)M4CmGUndQ}) zSPwYpc}_mRs9a#?*@Mh!<>(|7cTQ;jbEdm76QZx@q0?cmPpc@-t17KXuLPh7x7z8h zaF!!aT4eA;V!`#N0MljVx;&l@L~>tT?R3w-rwqx=8JM`!a#X_TF*l7J zck_77go%?TPr2pRskeP++VtCJ+@aO!4MtPq%p|kLYO^P&q^8YE&v0bU&YCm#&g`6d z^K%z0%v%I5*CmB_-Mw_#@)awK?pamrEVU)vS;CR{dIqJ+?W5Z4!?yP_#@FF-{fy_3J-7tf8pFW`wPX_ z{QtV`<-&itRbBtvJs@mL{~r!w-{===LDC-x8~6(k`(}Tk_+KvlKkM>8jR49i9)F=6 z$u?kC)6w&v_+1es({`nSJ(=Gouxf9}BZfB54Ie>(VL zQ}dyg!!NbA9XWdJ_{*=n`r3(;r%u2A=QrLw^VZvE&%N{Rd+mRD|AUUd{_R7l^CSQH zzkmEm*QcLd=>EsWp5D*DxYT#~N`U)U7lP|g^xtS9_)nMrKb`--T>t;mLVSIHwh;fP z%b%5HS+mAMr*4ib#&5bN2R{uNHsHtQufX1{C&ZIDfLO8#k|VZNGUw zPI=^<=d8j}S`LsV+$&UL!!=hZXKBpE9-q=mt8$mp#w(}Dy~+hW(|M0uzyX{5<`z{j zBl4m2IiyQza!8BPfvP~f4U`7Or??b{%PZmqcQHIDJ$ETHEpiF&>Y!VJv$(<;v@F8* zpPX|lE0}Md5Y&r!ipwD$hwvQ2Q5X*Xlq~76!WEtfgP_P2?#Lft02%-V*Z?9R1;BtC z;G+~&n6LN|QUoL+E&>X49Xuz)aUj|En;|TUq!xXpBHYKdiqPKIQ+UXWyH=6Bf$OPj z!;(D<>i_gdd>^S0YC>h*@i@oTHQ{VPMAonPf#yR(q&TomFg;|y*{flAq>%ku|6O0> zpMv*A^Pni*>&36zaeeT+`mqLc+V1Mw7T^0ZG zZ!}>c*rT5wFb@tl`Wa2w?NEc$**++p>gP3K>!1evgq$}y0e(%__=8oxKYfb#>%&*aADsT3z!%;NH8}mj{^ag{^HJ>C&ICj(@Fx(K}cB4=#V&R!!J!sO%_K1j>#p2VR%!V#Y6hzQrYfH7 z3ZCvgAv?ncEC|nb7OlPZn9p%LfnNY#;hN(=E{S2?DtGc*2E0Php66UsROJG;7j7-#3z0K0#r=*P zcV8GV3xqvj2osKb4PmPLb2M`4<(1XWtfGqIa_0bkgyAYihGzkP#;Sl*GqYShf8Yp- zzKEgBu>Mi{=>kyI6+yQ-#T-`|gf0|H%|cbKS%ZwSODh0uC%NQ1-PJ&uIDoTgBzq7u zLiuuBJj*i!*fV$K2JQxClk0%v#xUDLrwq~VP~5cQVjz;S$Jk6RIhDmid9ZA#o#z?c z!7RAF5e2~8I5UA-hVUbV&f|-N)xgyZ#3uiFz(67X@`yztoLwjpZWe_MmOkWI5wW-e zh+tG`v19!zY*A1`B*RcpbE&nj>unC7Q=Q=i=KNl#I~N6^PT`DLR9=ltWNg$bvITo- z37PxxRK;XtjWr#;2$>Nw(^)*HVwKxTSUZlJN_h|J2~!7$!>%C|Ep`08{Zf4eb!f#7s+$aT6I%>zhy1~hhw?@^pZrK?s4 zOOa0YtJ@4+_87V5Z2+ov%_7i&(yCcGVdCBlU&xm)u2=_j9k(z%8#v7%x)Oat!P3g5 z;&Yb?hnJR~%W)5r>wHHJnN!fFXuHzlbV5Y}L&uF}eK)W4e(X<$@cyzbstgsFgVaZ~ z6eCH<70dmBLC0#7>K-}&>1r3$Kt_0WdQMT5T;~Yk7;K0Cz;7G>%R9-o8?>}A=(Has zwI23*sGU&S?}1sop5xlLa$MCmj(ZYr2cQl?y#fW+3+yK&xYFwK`_~jP>}K{|IcY0o zoU4HgT8e`vn%IIy^ePOMs%it$`1bcd)d1BrNs*$xduaboI<*%r&$E3zUC*GsJngS( z4<8Ffdvnssjda?-lOOG^Lw=Ml#U)(@Md_-c$Za^(4M9cj6QIZ)qEA@3w4gmbXh&CP zaTW&M^MX2cJW9V1it?tj7^SlYN&{5|H5Q8S^8_oEgTmKB5zJeH`UB9(-vdSdbx@QJ z-PgVi>Zd{b9_R$`UMR}%2`CEp92Ax5RVea*6N>y3P$^VDq^Mq~{Gnf1&=Au9S@-M3 zyIwli3m7n@lNu3^IqWq~YcjBcWs=IRN)JCb$sqOatL&F|b-UyxQJ{vmqsj1L! zgx=SUyMfRTLmv%&7j(#oKh8^H$(5Zpa~lfy%xF#dKUBv&~rc2giVD0 zG?)}; z_Q6c$q~C*s%nuDR?-*o8-|P?nUxUmK4>HpkmBuB(O?5`V)RN(!{JC*X_$KP`CAr;b z+|uvg)u%{)j+}%1{a5Xj*i{L_PPbk{c{F{l3Cp^o2|E(NWk=l2A{jE|NjlwS4~6^p z=<4hKyHO*1f9bo0B%$D! z8q|OP4a27e!|zA<*BxJrulAvCPIs%0^^7_{dS`$e4MmE-rI?q~s__}4BZ zwb;OtTNfVjgvRCOEh6pz_?MgUuf=~F@ODAbJ|YCfwdR}QVTHO2iuN5pg!(rfY< zhND1QsCiIppeR1Yu|O3|Sp z|L1Bz-j9M07SW(;L$O2dv=7&Qg*%ObEch)!gXTl;kRx!me&){gYsxFC?Gpueg{69x z3+Tk^+t-AcwTS!DQdGTW##-G(FtApXmH-_W#M;>>>SkysCdb9t?g*uooST-LmXQHA z*(FPYhHvfvT77UDT*E-SJ)raIcIbYn+pBw0_eb3!-D|oxbnoi^svDvotvBc$`i1%u zeU*Nrew)5c|CatE{RRD4gTY`itTea{j~Zqf?=wD}xI6KeiBjU^nfWsllNKheOp+`s ztsZNGb+`4G)-LN8)>~~?Y`5Bx89I^?n%l6!P;2;};X%WbhTj=pG_*qa`dfx}!+FCO zhA?Bi@re0V^90LOOSfg0oy*0!4soWL^d_rmmT8G;lj%XzbEea#4%2uuXS>~YD&?&d z1XwAbv7a~n-gZMW?3h23pgp7=u3N3U&%Des!Fr3e$9l!O)VA98GuwFkAMI!CAJ``( z8&x^H=zoKHxS-b=G7Jk1 zHHO`Q|3kxUqtoa%HW(i>9x%RQ{F~8lylm8%zGr&ebX(#biN=}RlEkE)Nyn4kNt$lf zo72sO=GEr?<|gxB%%d&0TFNZHw7h5OwFE3ftg%+LHQs8suCi{i)?2q*cUT{>?zHYg zP42aRZ0)x8TKlY=t;BYpZM*GZ+fLgq+iqL4&2JlLpKPCMpKjOMjrJtF&7Nv+uGiu<3PN5&GpQ@js=k@pNf1q#Gzpwv7pJTY+@PXlq zVZ2dqY%{)UY&Z6x{1K)bP2)_rnC>v8ndX}EO)E?#rYh4~(?-t{Z1ZZp4P{?L5he95e^ z47ZH6%&??cvMmcOODxMQB^HmxYk9=-Bg-Dk6PDjv4p?5coVL7W`OxyQ<$|Tp5^Ysk zZ?jsgsn!M7XRX;OOH#y?-=_FexZQXQ2P=nG8=)VjAF01hpQ(RL?=gsmy@rDZwK36n zr*VPtE@P3g*4S&*nvzTzrfkzn(`uCD0n>KV!=_)MC%$5O)AX6?3sZPvT;ffM1&K=& z?@cUEY)Dki96M7tvt;I`nckVdnz?`GpJuksj7l1sWJp?^bbpdB>E}rY&?7kW5VOua z(`-k-m}8!A&NnYJ7o&f;%^S?M=6drE^G@?#^RLXmGaoP?G9Nd;VSXR=&|~g1hg+1E zn=Ml;KeRq>J#9U2O|ac;yUk{@&9&v)iqXd(vi$(P<07HC&%H)w0M+qAp1d$hmM{zkiB`+~Mb zdsKT;dq(??_OIHHwO^ojDReQqVY+zTXx(_-tvZ8lj&6~zP*SK+JB(e%Nv7#&lM2&1lgIQE({D}l z5|hC2vdqMe_dSL&?XIPbI&b9G()Bl8`bfMVpeE;!atgvL&TH<>8daQr=GCnt-=L zwMA=3Xea3Ap}ePcf7d1G$LaNY4|?4j`oHM?`Y!!HFrp$2CPTWR!SImbbv7^l6*J?f zhLy%rW2NyQ#(;68>2{OBly1sGUo0^Rrtg~SO}{ZUnc7Tmn9iCc(?!$D#7&925-%oQ zPKq#3MgQtB`z#Bs>#c{ZQMPQ`4qLZvsC}$`iTzFc@Z_n<52fq|gde7Sni5FiPH^0L zz^T;Upv~7V*H&vcvGzNw?bcqwTx!sj=^oSlPB&4XqW_-0Q?JA<=r!yz{MvBTa1zjV z8KR9-j5CZzqun?Qqi4NwkMVcLCgTO;G}EJ|U8cXAE?~r45-Sq<#M;ER#JiFnO4^t7 zo22KGUPx+6I-KLv~7gVXM4i-wC$8F#-3x(LvP=S zxqnIWJ;_`aeV;VHwjShqgGoVVZTMD0f0>1^r?D%lg;#=ky)=^ZIUmpI%{z zHN+dn8YUa28;k}UR<3NrBEwYUbfXrnlw`CSQ;iwMEMvAY7wgv%;~Arb*>0?9Dn^&q zWW)$d#k^N#uCvrzc3_s>Y1w7jZP|;F@|5Li%d?nmU$8V;4qJ|3);;m1w&=#n)@R|Y z3ac`>x+Pf0S~b?m)~VL%R;|@&O+riMS{GTDSeIH?T8phNYq_<`%3Eu#TAR_WI@aw!w)uo{4S31RNx9Dul_~1P+kU7X3xEmQH3u z&JiMEXMmN(2Koc6^@mz-?YaF`j@p9)3P>h_OaQ@zQ~_-jEwwuYB)$~Fi_HB#YtMv$ z+H-pTxc7cO_XcM6-fORyXFcnAThChSnHm4QPBKc8B;ym0OVV~+>CY#=|Nhr;ydHJS z>!YMsh8_IYcEj|8->Rs6sLr`4_|yLp{NYcWKmOsPkNz~|{Lur>VE9qzLytQ1XO=sE z^3w$m+%a(#yUj z(ifM7#kH|)DXwJ?{kWFuxE5l6fh0{g$dWVsyZe*xj!QCN`t##GkTw4QFi3d4Ok@=0@FlK;7mHf-} z576JCXOqk~BHf96qi`LL>ySU6B(>fVtPB1aX`-(_ya$pb`&aTI>;M1v{{{^3e3#6n zHd%U8|Kro~Jk{);D(h*bN@I=`{+`nKh!mcvG)|X7xAGD*5BQbNxI5}?t54x=6AS&S z*}zK7;q+Kx4vqEfcAn-glzB;(vC!=9G?wHsvn$lA-YfBvY}Mu}^K(OKyerbm3Lgm{ z=CUi&8rowhG;`!Gl)Z)di+6oZ1>v^Y?WF`XEFbD=6A+? znN9#7^HoqEV!mSH7v`U(E?UIfl;Z|PGo0(X)v0Vh&G&crdZN5j`Ou*B8qRe$eMqU@ znx~UT^^D!UiLC#3WMiY0HiOb3H(ihbxn+3?^-=F)X*oaIbP@e%t>llmtd^CFk)vA^ zNy}Ki%Tzy%w@0-Uy2aSr)corW#7v5TWFLWcHDf_G9-IcMzEHo$KJs(#UKgARE1Z4U}rprj_a@-KrOe64iGD;Zg zM=2MKqFh|+OX=2FVTRIbK;`wI#Q7xe@V-91i5f8AUQXOw0mFP=Qfn+(U~E$wDo8mJA)-UFc=KQEH2;$5ozG{MR{qrEBK1F=FUJ%waX zYhM~4hyEWXns$b4ykvoDTg3vddE1GY=FDz0NvJS^B+q-f)zewEGdvOmjEc)pGpo*; z=V=uglf;Q@d4PvpX2Rft`Z0okoH4nH8bwFFg$sh8@IpH(i51!?k&R`AW>zT23Ll|I zup?cx?_Y|?DPOhhF0?88;_d_9Xk7~Lq02ON{n+q|*GBON!K?MIox3Th6PUsHPSia;t>4jExIkqlQD{xQ%#yQ7}V!#Fb_69QV!%a5?*A0Of44O`0?=JY4B8C^3V#KiubipJ1rFnf*YC$x1ZN zEVz36`TGpXp&L*NSHSIXPj}e?be3d^R0E|vR#QE1PMb@Y_{u3O!BfuXy0R(*)U6!V zJfN1!XxWB#Gu;)g4F0KSpXYS$beE5XTvmqq*ds1S*iG=(#L}qi)$?L>k&u)#N7-X- z%aHnvgpawdJgOA<@EN>4b#DSe+1?8`wN7Yvw;5xqqXP+9?$5jjgDL!Ai+m?CXHAlG z!_`D7(_OAm77{5TBbjgukMU2`JcC<9{VnqMCZ&hXct>bK{xHE=Tz3lq$!8{|RaV;K z%!(_$1n9-UdwytMi|tP2$eLs`ppzMOH{rpm*2%mV7_&1gA1``}UiR7X$_5~;Ss zNK}}22p!0DcY6QC+kw%&Ee;dXGbcH+!o?&pFxH{*{C(c5X4~C;Jl^8CW77EWcS&k? zh_~U>d>kPIIG9Pm+dwS|=pB+M{y~dbuhX0byiEsU048XUYiu+hC*UT$-H2B8*#19;iJw-R9j&#`oLN6)C%0wVqd7)Jq zFoM>sb+-zUY5XzZH8Q^~%1V6mBM`tC z&z9>TNB#vP3-Jf}403L9jF{xe4W|=>?Z^0|u+kd$?q?&|GdDl;`(-@-O`UXKh{tRA-g$GX^?p*rD4VIuFQ7I%ZUyQ~`6xntDN!%se*vL) z;Mz*B8iDTfVgv?j76SnOBK+G0{$-M}-;Dotr~rgQ(hB&m1nMnY(=A)844#S=i-3O& z!%vO8)7VP?Jozs!0=A>aQ==c6JZ%#SGd%nGyFB1*`m-31%%?CgFkeVABAk{^<9dyE6Jze}V`9q47r*|DPNGP>m4cH|nFm?rVmh-iyJ%iwA6wiXbC9 zGq3xmfxhqT-x+At_CgsC2rkFf1un-$aCsJq4j;z41?B&fvHt7dzILo>$jimFMu^<1 z-DEoP6034PC3qL6ht)7UTNW8wtQh?fnW`dB%ck9Hp7%89Y2h= z-DkqT6-E<@i6L!~ee2vpQiSZjmBa(zPY~?XIei?v zg*SrR*XrE9@*8-pQhN&oDmwKwaP@oJl#zniH3R)0KkU5&ZsSn>D?8Dq^`Vfv$w9=ZzxGe}hQNx&>)e@<#F4MUOhdsyy-BMmbag zRa?$5IE`jZcKGB>X{zLp6$%ex{79sg-<*Mza7w&~mpDo(McfB$W$`f%yh%J4+84(C z@iBI!%<0QeOR`GiW6XE}aVw~-YN4TwHD<=gxbz}v@i9~_WXNDKy^Iy9vBFH^*P5&6 ze;7|pt{RIi&CBpoX_Te#zbcKH$Ze+Fq0wq#79gNTQ2|oG@UW)&?bPH#X(8N7Zv)t5 z%K--W3?mEF#tKaWFj#yx05*uMw;_lY#(^Jd9@dCA78>D?_W(9I{&t^{HCl5UGeRTP zKo(GJLmt+cfhxX|4HDS?l|)D}$5#>^Fd@E@=tO^!Xw{n@7Jr*fAz9JR8eNII1Y;#G z$`tr^JgrcuglO&G=Svv-kZHRa=s;o>pPUU?fj03kR+vGZCwgIpw$SKgx}IPUTXX^t zrE9285SMnohUyHTR0Ga3-p&tbcF{=qm`WCSyJw%4t|xRtLzvVOD;b5>#E@un^wOJS zY1A@RdQ}HV9XKMVLtd0ML)w^x0|m~BB`$}$z$J+Z0e@G_cjT7hxZAOoRbOJZwd6rN zZ3ur*Q$1&1+m$H?CMk9)G?O4fZL&}|E)ubNmFp~9O`i8!8dCHMJ#$rwQjSf44b2bm zcdx4c5m$yGd`O7u!3OmD=ZN~@dKFU@A;LxdnW%p%8+ag5i?N$Aq{>(}t92pZGIsl0pCyRIb)99Jq za{#kV=hyYCb$w-@gr(v7V`PyN62qo z=yR9Ie2THNl%_*)UzYi`eYGS+d~l+v@@SUE?-CNN6E0)-TZS2uJ7$R3QA2tBon%$- z^gaOQ=Nn0Ul4KD)E?iZR0_4Glt16hPwQ9&zA~&6ne-Mw?`#2aJR(}-!GWf}a2MoS( zNFoN1O6IGMmcQ>a!-T-DJGT`~YYfVt)1!a37@sDOYRpJe0`?fJmtyZgaEkDC!6$IO zDSr7DNvcoXO&4C0p#~Pg0GnT>PBUS;tK)3Y)%cKGiCmGx4{c*!!U(!oKC%i zL`DBdxb{9ko((l0so(^ADT^$^ZF0mck#FO*K5D(=a7*Mc`--2CXo3EeQ#QVqge%oi zzC&_iD*G&n_DbV>Vyfx=6DULXWum{VShlQ4L+1iX`dLXXZoc*s`s?kqM1F;@zYw*Vn~(xWU$b@2{4&o z*5UQ8wW4N=@*{jl_Jy4AqLMs`$-hP2l0jrv_8OGkLUV-wTFo-%!F^!^3ivOmgM6EV zzMsWHp5(^b0bfZuy<$!dXOlUYMphck@-_ei_bfeHDVviDbm$ISFQl7A`4w918>ai$ z$p6xfMTp2@c#W)<=4QMj@O2dNUl1nL?B7B>@OF28%OxgI$3<^Ytdy^Hp?)l0)cb5TZb+;QtcLAB%D|*BPBElw&Ht7}#&6+{s4z`xiVknsNSICbSL+(Hiv3u9#k9_W?w@!ipnt;WT2Kzj_n3LUn|@!ep{ zJieB?t#{ZRh2K}r9_DF{oUOl!#+RFy!+|V&_L1k9nU~YpbijWtpr4ay8SSp6b`#c6 zOted#s!6QEB%y_UuG=FCgC($z7x^FzJ!fH!%*_8f`S*CX6uwV+9E)&HUNv3VF}#Dn zr5OpwMSfyXKU{aPDLUEWP=Xb<(wu5$@s;|X)H$LJ zR5LpA+^h*xCC?t#>{^DWD!$XT8dpy%kE8#}fOW}$=ArgiyC`>!=S@$mw&2IGkoVB@ zP_7r^-yGn_$jKRLz+2TUR#2MGOFp3eGa`Bxb_UH57~4~UvpG=d$}S>XDV)K_K{)42 z`npPl62l@Ri95=O0`RO9kfYLGJNjFwko?K^@}@RP8ZBv;PsHOeUk+BPuabzUl`?(O z4lMjjnvL8C1Ce;hiWP-%gf87JZjvh1aAvKQGWsZEpO~IT;^8Ag!Chl+B-UrD_#4zU z&wEv@+DwZi&k)(MXGrd7xgVqUbQqhg+Q!mIPnTGEm6HYRyl6g_ztowFSc!{Qx!4oL zbiByHRtSMHvzV6lZh9ZyhY}4 zQ9xassr?Rf8(tKGcUTD6yQ9ZPu_6;IGV`Qp#Z#4;3!&QdxRtn!0pKE2be%<)MNaS#c*nihvoG>q{mn^x z#I|PW`sNzrLGOX!NwBx^Z3bKvnW&qFpIQyyn@Ij&;Lz5j=3{7zOqNIunBf|!^7r7+ z`hNg^3@#~q!okfP&T)8HdL-OL%%&1C;}e9idy&kT-F z`+sMAek#TX6UfNvZyuimSZNgF(<8i_yO)_)qQdAO0+b_cwhk z1V9%kLU#@E{Ve}gi8ZUjL4=;ySPi#KB>Vj80Ukf3=Q^RrB;W1iqe=RIoWczx{6FyD zIJ10Gfd8I!32l-%nGz~cP8verQ5t7SulL{TlftR5FT;iXJcKN@7h-NVWxs~>SWn)_v>;ya7ccOz*jB1vYwp9L^x1-Lo zJsnR}Ev9U3*xE4<<}#TT+TFu}$GNbDXJB88%ZXKo@qo7!z&f<@e7plVk$sltt*8$k ziQ7nYseu%4cU?x)WwIO>J9(uEYwIH_&6db08A!K89>xEzkjmWxa+~<|({D;(j~zko(MKWc+oZ8JoK)=LVxx?uPNN+NQu-pO2{t zh%ytSn1c-2K#%cr!#tBxX(p%6Xv3X>DnFOvUEYrHt)8=eDeO+T2b_{+Wg$U@K0P|( z>OO5Bb`_?vEv3K~8kSpN$L<~&4!qlZDSFb{dOUU6N4E^`;?Y&t6Y$dvtL{%x3*)qD z##ri`);D8(1?~w>#Fk9-L#DWkUEW*4F%+D$z(I^qi2}CQ8vRCvT##X zIVPvxm?g59fWx9an=};N2|a*mndfkf>_Y6^a$)wyiZfZUlNCEyF=mrCR%~U(W>#!s z{tQ-}!-})9{cDItjP;{RY;}0pN3K3B+1Y5>E~*GBCN+ z#>YiJOjVXTBsFvc`F_NlkCvnL6@N?fIkc@#ll=khU$Cl(tzr=iu$06ja$0#M){y`{ zTlXftsdSVkaI4{wFv`}Q!et1CzjrtBwI#Bb`V}xkQ7;X`QZji99CdX(-B@51d}CRd z#5<n}_(%Tt)VX*_Y zn77gqe6H_0>LvI`>JxL^YjJyhFE$t~0UpBNQIig)6o7WrRu z5~8z|RwwMy@LBa)Kd`{+?5eU3mMo96;xE{&<809hw&)aF8%3(Ebzr$zvctJk*%cXu)S&(1p=RP^!1=1es#!^n@1*%>n>gAt9k66JN z*3W;VZKTfMpN-z}$1-_cPGhP-ROIaA(>A>pa`((wB$2Y`o)_=dg2zcSiPwx2O#U zeyDGAB>wnwlzyJ3wBe_b+V>>NQ)$UspN`U!)w9ogXt6mcd)w;LcpG_~*tDz~?0(1_ zBL3i?%NCk9KiSK_4e8}eAPOMcL4#q8!t8Ifh$*|S^s>pWpX(}C+U3_kkrMwKzX;Uq z*PVgb+NkWIEQ6#gZj@75Bxzyf3#6hk6HsbGxqGNF%w1qLbRxsYhVEV^Izl;=((|$R zoq9~=49Y-8@XyqPAp#td2k;*y5uOvMYP?f@%&*)n=>ptYA?pI1_k)m9HR*Qn?pgMO z&;)Ya#hl)UbCw+Drp(2i&<4tU+>tD03V@T?`dRqait-2T znW1At2>VC$8|Ql0+&QLh8VQqMBc!B|_e4s8@>Cj3($e&p&qR|}rNJy7gy>cptm4563dS3ov~+}LA1byy9fg)v z8tl?io9D1{Io zzNFnKm1?QaLgb3{^>af;sZ3S&i~wCo)>w1BF}F{o_vvK zv&d5{^1LkaOc!}x5qbO~&vucgLgd*g^2`!>T1B3@BF`R?XTHeODe^23dEOLxYDJzd zk>?SS=MN&!B9Z5)$P*HI{wVS^h&;zdo+TpB36W=+$fJoo%_7e!k!O|2(=YO@7J0tF zJ#g(7SZo6pbH$*jTfPuUb1~w{aax~;p=ImM7+0?N=w7kXJBeE;iHX>(&-iXjZZ$x%} zZ7I^ZATvR4M0o0YqBK<@s{2RjjVMjsK~y(LZ$xS84x+ljqy~@`a)HDKlZeug>q-(A zl*Rc?eTXXdZc-%0MdHVa7vUx-c60%#%k$|J0{$rwgb9@MA&=^8(Tc zpj$SyvMo>IhOOU(@7G8@Fy*(zO8G8Vq?IZCC>Ns5${BD{Eln2+p)Va~$x<9`fbzlq zcLU=mkP853S)OfUJ36T;uAvf7D_buC8nPd<+iL_!;#Qa?gJ0N-Vrq(`>3GnJDFl!G z-l=IXlFc6qmbX;PmC8Y!tbohX%p2`^_a@$@w698sI`K9-Sff3ByV3{)@4K|Wv&7{d zz>J%YK6wX1IJ}TW^JxRtg|RqLVpjs0(y{|_!=q@)I{H!Dh=48pYqZZ}QO!PYRiP|A zwA)cc!YPl@g*NQUqN59g!h`fZt+RaEeFsm2Q=WT{KD!ur%ZTE6onj$)Hp=#ohTJLy4=~y%+5o-=h;w1}XULHTqn% zzl+)i5F`Gy4%B1Eet=efa6%_09QtPep6E%F@u0EWvd!#Qu|0VRMBjvnp%4wf2B7U& zax}ij4|u>f=ej5KCO~Tzpj~4Sm%mOHLBO+*x2ZpqfuEz6m)ec{fLL^96pwdnm`91H zx-V!t^TGD#kRR*G`=h;Z>05CG3>7eWZE&ZUP?dXHoA!zBCj3#yqJ8Q7eDsXTvMsMs z`Lp5Nd(n$>^o*?h`Ek!hqx`yYpYE;-zAcXC5Wf0frwTl+Blh#S@hpFL!u!T|d2jTz z$=C;b-)hOqMFG}HK>q??0QM~Il!KGBp*h$4^rd(5Q8_Ed<(l$`0L(}Y) zK~e;c+s-9c0Fl3@?r>Sd@tX7{@?6 zO`bR$U!kl7KVj^6C#I&y4QghuW!obU%jb?p2V~{=FQVh$Eo`hVVNeX*yx) zG!C%5pVJnt3#Q<2lnd6npQ!f?fXGZ@KZo8HjmBV0x5FcHRU4ZhCggp6Gd*aAJm_eK z8cZ~Wx$*@owGn)l8mODE-qSCnU3{cqZPBCK#D0fP^rRad*?d2t^y?dW7gdw%OmD6~z zuFz8x-uaM~6~J?2Q1;5S>Kg2x2S3qJe++g<@)A>Jl^^>Ny0PU_ed1SEm<%g6!S922 zw4sS>SPz=bcfR-}-gw_2J0pA_Hl<^$RvA3!t6$uNbp8aDpcU64Y;eMKoA5$Jp@|buIRj_p5R}z~&oF z+X<_iO*?ThMyuHGSK~&1sq8fU77vn|X9{7RrHr~6RsT62TSl2-X5da_Kpyra)uZg* zOa(&UjxB4T8~pKSU&bAKauvS$?pNr3yWRxV$1gTC(7L0~#?=i} z)5a$$7Y_Ldzjj2B-ThMiZMOW~^QZz+t! z6i`)~C9KMKh2a0s!p8*@7bY;8v6o-bUtm#wV+;Dg4`EwDuVKA zG?dt)m|?(|L#E9a1J>XQl*;CFS1;fZ;y~|F_{4m{Oy2BThV0CQg)Z3CR?#h+AwtOX zQ}5d6Ks)GIhSGIncjF{6ysIOEZ8wPG*u$U}p*$NNvg&2A>oTH0%bVtpgjjg+EIp@aj`4`t(9;O7}Hql~&*Tu5te5SgI)H+G>)8q-+h z6z+)IJZIUfM+vxX2Fte9^Rgfjbaki866m?rDm5YGPK54^oxsKQ7)3gMnjbELO%5K8 zq1^(KQjjb2g#1Fo&7xr#jmBmHxiRXE5D0bGF>z(D5*RuFq$Yp>A67?j^pc3NPaMm` zl&x+&7w}>m8PNa`&kRE;9+Xvq;v$}_#r@Q8>Hed83nW=B$ zSzUb_@#-MGi=|>8$@ShWYVwQ+^V*#Yl*=i>SukERu+0?%TaF{e2Q@!ziih5#9aoUh z`NsEEb3IV6ZhCrF1L1ul2^4<4vCCU}qHZKBJ>fabN-wcoR(cBTr}W9x#O0K_KMGf( z9Q=h|H-va4p&zX+7=mr!8B_;!W2Z2ft1neB9yS0uEn=snC+>Y(sIn!lhWZ-@`=i8C zyqk8>i^X4n!Wz*3jED9Km=CC{RcjU?wap=P;02H&U-a0Xo<}k4e!ZBAmpSUR z%R&7>Uejelf8D6)@pNN{aYMv^vr+2He+|c>B=@0c?=9z!DIX43qG|kc&l&7JH%75Y zv32M7eub?}YI9LV2e6VKA+~5xKC~E{RX@lSaOLQjvU*zK-3PkZ)JyD6HuY2j{_sfZ z3k(D5M#x42LnclkNfXWLEdmh>Vt_|LtaV$OkHCAXqTW)7R2iqWyh4%yh0`s{3wTG% z_o!xxLABKb1AOOgzr~0_X*Ay^#JJ2dNuy#YAH1 zIx9D;UDshP&89BGrO$)sUk!Plpwk>*eH&#@<{GJ*eW;6X5S1t$aV)G)RCdr9U=Gb~ z8>Q>T3az8}5K_3jk?IEgj@~!$j78XQCtQY>I*dVdbBqa8J zbYf6e8wVbWO90NeONi;q=|Su{#1goW;Z?f0);`2`tiJmwy#bJC6Xe307TX*w+iWxG zCLJMS&K--Mmz576hs^eL13%fu)w<+v6%%$mJW{^I(f?rIU!1O|e#JmbYzxdlsT*=2q za5Din6EF|Lt8T)Z?QyIWy4$eH14zKSB>7;likf0s-VQege^rFJsBlh1q8Y z4ui}_k4fK=#-Og0aA%kem7!RjWr;E1^(yZ7B67%u|xc4W&} zVp&R`LF|k0g+GJZz_{+5M>y97y=B{`0vZV;SiI?+Xz~nnve3lvz8IUI7Gu$@3biG4 zn6b^(E%z9ZD`V1B?3L)FGz`^ls>6G(eyn;=ihDl|fI*)(VE`@% z&j8^RU&O9D(h(NqJE|FH!N9}_3euGT5tV~0A|PWxHx-gdzedAgQTo5ef}NY1C1?xV(b+|z_8|BC(7Dwu-?DZw0gov?sN z^b?y<#}W*Zd5s7hVzVasg9zj+{4tRcd^WWr%>ecg>*Q=IZHH`#O?6P?tklFx&1|ZT z(sbbHLMA(+9l6!)d!rvyz_U*El{<|PL-!}lP$Xv|*=F3Y+U_O6xk)!hDS0%+qFulLF?C7}W$B#UfzB7#d9LMT;sd+8 z-$)yBiIb-*VBk*-V!IYGFbW|xFR9s*47^FqH8J8}Vc`;M7Bsji;KR@mOhsjZ+|@bBGN>MF}Pl#7G1my!C7Np{wVlW$OmaIEfMN zBSuhQi^@uS7UqDxqv7^J=WJwhp!cZ7W{G%le5Q|_r#Va&UZ9BZ2l4Z;J5DtBBY@m9#iKEq>ug@(J}1zpuUi76hB}r?@rY-==sYw?QAme+nidm+ooZC0kdGCuhAWArG8D zqz#BPC>Q16Q?%pN`y%PxAWbyjs(C_qe?T8}OvIoT=+2{n-5@-%INOTI1zi+(s5;R* z6wB0oL^r}mBy#DYhsZ|+7tvrw&wI+3DS*Nj{2_4|j8VR64YfvT_1S9knhkj1{!7$> zli^#yLMPL`Rye}^m$+TgOiFJG3IXp{esb{B-1CpkukZ%EL`m%%d_n4v`K{j!b%ROx%5LCqi&Cyp=~^a-&m zxE4st#12GeR|_r+91(c71X%#ep)>);(%08`M7Z}hzKo3lJkqi)4Q3U+ z7+fuzX;P}p(v_96aS!6uxY%oHs54_>ou6arTKflNgHg3m|PQ2!^OTWD$8OWRc{x1&-(pzT7gtJW`hlZ;Ik*oU5*+jJaY zhla;Q3T=E)UNg}gA(>>NDiYZ#?GmyRqa?Q`2r;Papv@bY2`Ar%Mq}#`%zz1WkhNUP z!~zm_4{xCX6Xy%GN$-Q$alq|tZX@JbitA!?R+hx3Bw?5uI2(HXFiZUyERcm=Eix z=Pp~5jRb#K20B z06k)Sulvl1qx#Z!8&Mx5970SsJ0Wb6%GYiYN6OXZM2w`rp!A&XHuZP2;HkWw3`F&H zG79Oe2B8xmIuiJUqI_xtx?EqL&{yqBr_XbiR&YIJ{|YIbT=RTn#x)C`ul$a{)E98y zMpiq^eik~(E2<1`***$*$Xzb#AD^h7)`ELeF{dz?SCYIGZ-W|7X9WW|9mZx{!bv$S zYVw(8HbWLzS7(?8=Qpscb>wGnBQa;p9)U`5E+;ArWCTB;bB6`6 zr+jR#(gF9$|HhFw9oA<4IIPM3;(QfR?lIvEh@W`Ho>5 zE!>K<5mNpG?sw2=X|MeeU1wX!bH}#O<~K3{auOY{R98?ZG}m_IFPyG9aOH_Z)gpee z=QMkf`pci#N#A;G-rN^8Jg^rjDSSO&BMzWc$#i6uy(k`5P;&_P=`V*h@dUNXr^#jI z2yht((&P?pGPY+{Jul*?am&5a}km3Suv)vlzV5=lZ(i90CA(XmKUjADt+hO={Y z+;>+$0eNJ^#xLml0VZcQ7%>h@WNy;kpCy|bg`=#`4d#N}q)D_3AY_imZ4_4o{#jJA!0So0_NocD-ZBJUC!g!binPvJi}K(lq~tlrbXMLOCZ!~T;F|MCdhq)|4b zQ*O}*{xnVh5V&raSWQH4R*|P=t3R>Oc%bJbKhX16e#m&_p~DjTW)!$kc9BhxUN@4Q z(ivsiTA;FTtUE&XJI?LK{gj?rrkx`c>pjrdH<&O~dfz0|;2Kk?T{nKNSVRAq8MN~q zG$l5Y$`<8W2q4`iQWI-p<46)%wtby#h0RQ`9mQUx2U$weII8X?Nn{zCac2)(%^6gIp{7zIjn zhj7aW)qo2$ObOtdIZf)10|s6=hO zD~T}m;Ts3ws1{hS{}@H9KU6{8%rTJOiwEaH9^T3wnJr5lg25$2tGI0H+<+^RlKhVxYH1J=D zOr(A`tfYd2bOS!w%cI)$)XR-_lmyl@2oSvj zwqX_ZSNTNNmwBN%t#!jKTQ>>!UEjA}`|2|9JLJ`9*1Z}Ia?jYYce^eXVE5?@#^qQk zhHxiqY#~BN#kB8(J!qmnkGFSgyazjuF%4AqV;eS{)Ni>zQ!b9GyUyJcP&ZVPHCU!? zL;#D0|N!q`P-NsD8# z1N+|+x_UCfYgv99a=R}Ybgg|bky~rNDywc=(08fWj<+jjR!el=}i5hzb1=vC;ei=y7o}1_4aU&^+5A%q5YN zAKXpnXQ1as8RJ#RS;a(Md~5(q#Nr$cc1gU&6sp$J{BM8-=fj(E1WRI~3H|~dKA;Wr z@LSN#=%#(=j;R}|%ZR(hzX0@gY3{wyL1yJKoVDfTVG5C-#q7tIL#=ZLKn*$D=s5kDQ>25~Q$o5vB_#1vLJ}{h(W?xwJ@ymr-)M7Q$(rkDKaG07SeF)a#~eUA2z=s zLA1hHdftVSx;?d<=7N30lDnhh4>EDO?Lj&soI=y?Pab4H(;j4Z;$p`K$AD9?tvej! zEkqy27NV8JFk^M%V*O~|LKN^I%brTpr&#dJcC;$1uamTSZ5dko`~^HfOz6jEUU-oG z$5;qTTu5H3uiNqcnlF*he*4geI|ge&?rMliTu9NVug}N#V4?Zpp%3+gh1hbEPHg#r z_`W2*CA7wt%i`N4zRlv>if`UR=U4=f;2e(VDNdWfjk=r+%tZP;_S9+^aO|md_@?W>5{0jbofB?A@5aMpp8JxJF~hYVqLtMy-eGzGT7OF~l#2YW`Nwx1Cgc!n?#O6TurE?PG1&_>e!=O@I(>qUZ* zuOM!QpnkxlJNu* z`qa~^`$IqqB3_&x88)Cfs3AI}{!rrm8-xfc{LftU%`N(?L-I@G3Ig}~CkR}l=+N~~ zP-pP#Q7Z^V{!$V0VldRjXulufBVMN{Nfg=b`9wsEEAcFz{Xg+)wabhKY19yf<|Ra$ zY}!LzNcaazYbnryh^7FSYDa8E7o?;(s=b1y-y||)D+pzDXj`MjUTB7NOh7-!$l+(D zl$=!l1aVJYnmAI{uE!#2SwVdI`_!|&DJw|g{eBqTkpz5=LPV@ePp;Pr(cg32+f_eC z1j`q0?P5<#0=w9fmA?Y}p21ySr6`Jq@^HM618h^WHUV9A! z9@DFY<3j&^B2<9d^+3yd=I`;FDU|Cvr4bP>rig&qh(X+q=on?J&`xoXL*q~iu@9;4 z(9xP|5hR$lXX~K~ha_O6T9f;>1L{3lZ#dCDA~MqN%dk~6CTta*h+rm!3sqW8SYHhP z73^wa_u;>p4QKbs>>ew-&-T^*?TAks;Gb5hkJ>BwfF3pyCCLft;9V2Cl?(CE4T#BE zaXE`0yJ_y_Y{S^m)iTS!oW-VJ&PGlra=MZ^zk{3`E@uH0WZs0#FgyaL(Fh6HEK=EO zk)|}-B>Z?zp*7NqvkP=|a0(*Ehiqk~<$63GAS8V|1q|s+!S);k8?U!j>M^hN;BT|x zsY%GIQeKpYH4HJp6p<;w?@A8xJBdLyvYI@Ene?{P2oFj0<<{8M#dgGo!B3tfgj_P5 ztDue%eAHkBYi$cHW~S%PvWG?@9wGPPXoZN60mo*ItS8SjBRLU313wy5W1fTGYeQfZ zgi9TUaQp$Q*BZJFH$KF1DHa}_H2eq)f+3=mm7;D$&{_P5oZtccgj|V?k~mC9Ayxb` zLU&(X6s!Ee-q5mgXwO#yREvFiG5vS2^sv-<*T$*#g-7W$r^l(D-430Q{DrvWX|Nx_ z&u~Wt{nV7Y5>0p#;Q;fn;R-MvQRR zg1z#H0Yvy_qJ+S7XO=uHT^aomjg0#&K^(YrUCDhz~c-XiE?z*HqPjStpu zp&2_tNom=%^N?&5r|2D2&qrYzL~H4G7;Cw3mar5AjG^`iDaV%J-#MZ;iMCO0DwzUy zKAaW{tLRrCpuG}53?T*|fGtL^@iShnKK4jw7CzZ*b0={VF4Q?hZytiK@YA`E=7dJo z%-K#7G}#Ug;}F4sK&_>qPzr7ZYhGj{Z)hT$I?bn*L4*u-di2Z5gEL3;?oRF`%Nn_)LQP_-)%GMBt!A3>pd^`oYA^)K+ zRFuaM!PUqf&H=615^-V?YN^AgR@=)HSx77x*`qc*ixAXRdHgOCqGGtpSWz}B${_|G z60E<-r?WHy_hY{Rmb*nK60(6VwB97vOQ*rF{4h=tdg6Yy+$Ws6kL76pjxF!rGxbh& z3v~waRJ&iOG)v@9Ksc?!cI11%4E9D&!77b4p1o)_^hx$JVqyu2;9|nG$4A`H$^YFFp=wv(7SNX+RGM7 z2yL{)Cj!lD3MSXe9y@AD504$Jq`3!mQ)LHm1#8h(3xb%YbojxGA7QGa>mdq)RsSsv zt+T0PH9?*x0^(bm5kFx_Hz@;O^D;7&ictN@pAmS1e)SN)AOQAGBt_!&6GU$D^8!sB z>ySaLC#4aI_5cW){CpZYZCTMwuu;Y0mjs$RsCxcoa>i7637kJk56|z>JJ$D4WH@3& zyVSQ^Pod(;wAhO0Q2~%A^_J39uJ96W(IHf0(W^-WPfu$11S}hYA7~sHE3_;>HHVgI zVZL5NFr}*OLQvsSV1J>cjl}GZvg?>Pgb-7T4&Np5pO7S1oyUWBBoV|tWP}xRP1g3o zp&mn|16oGVdu9+nIq;Qw2{eS;Dg|MT$;iu#uE)Hry^0 zkP9I_2=nb+6r)_?`Rg+3ObDdIgbEvBI4_iI$@2j0#>dELM%dE&`_QObX&FUZ2Lz_% zD^bCa@_ua!M3}Ni9%_Wsd%so;lT3FO1gaKV7aI70HlBvAA7TyO(r-uNv9w#Bym1PC z0VH&b*13hOR#LTv0c|9TqE4Z6F_Dp_S_+eNRX8!&(y3Yx?JI~Q+(3AAKs$;F0Sc)_ zh=7M80K&|&$Rk2ScGaJ9DungL$a__mW^_<$@)8)B>pdo;))A1TdD^`%!xuOVw`OfT zd0G$y7CHh^grEy3{CWUp9aik^%#Rp;nfQ^{fE5-Cv_~Ga)goSwU~FLbkT&&IOkzRO zp>{rpf=JO$8=(`mal4Xl^f(V9lMd$9@h%Y_8Gyb#2&g6UJnogpWGPg}r&+s~vHXB(6>-t2DgsojnHc-D^Ol$P~4=0rOv5S+FX z8$1wmZA>Q~@Z)!t+ChLlSVTZ^l@1d2lMMm6S|g{0P+s$MG#r2_V2vCOjo|4x`C^sa z{e3AMCKi5}>~D=J2pk3_$qlcGSDoHZk@RWgZ~#C4QjudWFVj|5Qk&*L-}TsnXvVIO zdOd+3I(H0fvSW(DLZXV%s{Bv9tLY?FMB%L{G~9$P_b0~p0nKR3+At{y=x8$3bQb{h z<#QD|C~o3o7SI(!b735Ikc=RK*iKiv&sC8aN;FwBv&^s{uwEX^D7hTl%c z0KCmMiBI+ewg7JrjcSV7(K&UdT)NQEH%y6{)hZK&x2B+02%Z_RN^GI=dY>A|K=;!R zw0 z0+`D90X~3wrK^}F&JjHo$s+{@Mwij#@k(;C`)>x~V|+AP{m;!J7!KhFG0rcrEMJ5E zE;Q6mM_PPLJ~9B3VOJ^zt{}kfq9RM^cP34bW2%4vEn}!7md(-OQH>^jdS@14g5kit zfUu`eP7~;WsyYIJfH8@sQcLtlFbA}=nC#SCok+qB-dHjZ@mrEp0NmUmz=dfZXbm7# zh<2O6RxFiX(_c7M_=jq?gX>ZKpr=Vk0qQ9pTF-pwP_OjOwtTBvBvU;O89tgnfQ5!VE^a8iI2%cQ4Ah7PmZBUyE2*HRMdn<&Otk=$#PATHzV04IVJr?TJi-S z^D0DA%%Ys51aai zqhvacdd+SRU}Wyf#z4f!RG`m zh`e|G0njY|HmY1rRqDVT8m9x3Y@cR(yx@d(90l8vm0_>e>~^6Jl`oH5Rz8dO7`<75 zfp$OT3YhqpVY?Q;8M0@*HVfxGYU9YI&4rGgJ^MMr0i=C+l=qX6%=h-ey!H9}#w!EH z@Q6yS9Kz7sF*`iY`$^d7i5Dp`i}KfgtXk=v?GbSxzLT5!+dDxnW{h#Ab_@+gT4#rw z`qH&>nENb8n=UTo<(V_Dy;9qT9J93_ATcJ+UW8`2AkHN2;D<2t^^QPc!AXwMNd;~3C$790%sPxJ~vvS;M?2Nl2v)1{f zxJ#{|_qZO#5`*BnG6*BT{QNhU(C+d7iB{t0 zjser_aErQ}6E}^?3BZCJlzH73xVPiRhfhnPaY8p-#qg6-)i~=0?ES}(stLA4 zo-1SZ337^2ST!W)x*_?{1N1O4W}g_9Gc>Z6*Lu(bKLPJ7uywiI`_hEnT%ICkQ?c!8IVBe|QT$ zhtmC8`nSNp@sLZ7kC_WW^CqNOKS{H+u@Ec2M>djO@kO)Z{tCZ_t(Mpab_$l~FgD`^ z6#6C9I~#sb9QFyH&~AsJ{boSh1)kUb17Cja7x;$!bi*Vu1+-^GT9=+SG9gU$cH?8_ zqji>s6WlNrcxeUmSMbtV%s&g-uoQDFZ8E_!*_7xNUA4Av5B5qt`v4w^7dWZ;QY(DT z7umc^VTblhNXK&ei$OmFwx!=eReNl3nJo!u7JyT0gTDfn%mJ4KDewJ!_UzDo+A9z; z@kNgWv@mk;0-I7I$64VlUf}Sy&z{X1E5boMzd!Y6uj9WZxh8~HJS%8k zO7VWB1M;(?X5#l0j z1_VzKD%w$eBrl-fpG?#9z_vSZJ(MDiCD9*ZZC?VS3BMv(GZvipn6W~41N6ux%*m|U zR*)VMwD#|~VOiB!Jlof<9l>xDZEJVHs)^qvIe}>v+Eyq{{O}9*m)EX?ofRMR2>OBY zV{4b;5p$th{W(o=MpwJ2q#J-ISY;7jzq!z)y(r+v%|Q$iEC=4-H$wQiQc!z`jGz56 z1(DzXY*%fyF?q3&+l? zZh!6s%t&uX=v_J#jbbqGs8|Pzy?RZtUk)jjdl!`py~juP^j6)1R@jtKNtK|nJf{{)>MaXs--*4oM_4ni!g;gaHCGVvwMq1EOLG(h|XFzF;&hLi0>}Gb?@U1lD8vrr=l)`Zk~Y+hfqv8<_=; zucZvTs-&z}vr{SZuNS*6c6mCmZ{bJ*SU9?Q{41#7lKKbzMbbPEvStNf@z$MqJT4yX zR?LEqX)=ZOw8&)y3v3pvIfyB^2LA$-+{A`;1lRgSP^ zW-dA!jH7O^V;`;)h}Aj0Xt)Y1%k!hRYqmJ#TT3|ZAWNC7C#fL!5~R8KX*~&9q@4Ox4k=p9Cebf- zW8L$6()u2s@RYuJ`xWNxx$GS5dE4~8G9diz68{Z&WlF5+xNs1yP3loMMJ)xJnQ+>z3OeR zKtpf*N@HlCp(nA9=Y=zvn-iArr4>V-g0hCJUz;`_8QDx@V(Th9L?+zUcB=s}*kiTG z_RE;y?@0hb&(lz3=QJ`lQ#KMSaEV0H!utfJvZs4?2KKs5>B-rFQxi5GBr1GRfe9)k<7W7M_J}DYUhs^>h42H}`dpr+j?;$~ zMh+EPFTrgRxRgz3hqLL_1LL7by`@6lq6X^064FRe2SPFbcaY1<)XQQaGVOUu)IRMi zmetC7>CZ>mI0^7c9Q*)G@59+3PN_lm<)__^Q;MYNo6@J&#^jB z5-f6!ec*}MbAJXk*-sIW;fc!MFI63{(Az$C+z|Nq`n3s_*WbiFAn%P%V@}{>&rbobv3|6k`jVrysLbk!L5^{U&Sl(Aj0GC(2 zZ|Ezzdt%<<@ZRAxyn#o z-i1zM)i%(zHP>~j4J>ZOTz^SpgG)1poBI?_4~2ne@MvXL*qys;?%>q$QC?vINuG-ELDf1FY- zytEN9%JS(7waJlJl~bhF-QP3R9BVgnfssaTj+EBUz3Bz#99ta9Nm-m{MgAZ=NGFS% zhzjaWl(1_Zfi=z))i+fCAw-L~2WLz9U>n%mzEgS6M(+$T_I^ zBpV|lYu$a>NNL002rP6)f^udVNff|Xh6J22Nismo)@3pEZ)VE-?svEg)7}j8M0yr; z`$uMbMXTz=%~Pch)B1fqHw81C!3^OIyTLeK=`cT0vrXIYT?reK)yZoV6j^F;(edav zsk6{OYPBq4KMpSIU6*CnoJ2d;a(m>6~tTsA-O(e=UH zp0!Dp*B7Ciw>Z4FIE^fxI?i0Xq;nxoOj5;d2eX$)x9trE{N-8Y+IHr!lC9sA-uZh=qyl| z)_QaXnk#gr;ITOQas+iOj0@h_8(NXpOHH+%ax4s-x}KQ>H!0G}6TV(5pizo!^hUjv z2gva*lF8&$-(>OY?$ZKDFe?q+JHZRXQBJq3jg zJPQ>$^j;vhClVe;qeCc9+KEH&$^<=3Rt)Cr;d8ikYkDtU)^qWxp|2str#%G;w8hRk z%X`?^Y>t(LKQGMdc9_?Vo5NfY;Uxr#iJSLuT{khWipCt==jT;1y1lO(BdzbsQ5U=q zgf|A!A_mI>!pe|shIykK2~%0_z>J9gyWm&_WR}}>!*9xXqoovdH4C=Wg9{#Md4a$x67e)ce`CST-?|&R5OOE zhQ}p^KMwYq{Y|uY@W!okWw}6*Vg1c>@Rwz^6?)nRbzzrU3mtlI@U;wMP?mGF((Mt8yi>D4%0O{YFCw5QO9xZrih`QEWI!-DSIUawk47=xlKSzHiyJjbC%@E2dS zxs;%uNdY;Z<@UZigqqaV&#=@B!%|R)z&)&4q6=^)wLTuE_JQn2_DSyIDEqhECl~%d z4}6XF&a~-rbX3UOAU&r#5cMe6>Qkv%E%aqKY`qH+Gn|$@!}{mn(QX$ev(>ll+r-Y* z$rBlla@UrNq$%8<9QgDU8^)<{>d7sB5eei$=$5`RG`wx_g}q%#fRcmUk>bG-F0m$Ck3q))l*#G-Wc^&f zjh-oVEcMs)iEyyFny<&~&lm)+P71r^{GaWh4KB0vae@Nj^NDWP-)0jD z0{sqxKl6RUK=tWJ{MRcpS<;NWm!%iWpiBJ|Nyq;QLso%xbzcguv{o)ztV()9b(K6wJfIcXReN8~&GA^FaJkZ<|+k^7Z4Y`45z;gP*zghNehK53v?C+$ z#}A_6eQ41otP?UcR3$mJ=EyqNjnv%Ob(nHjO%iIMn@@p<&&sLguFZo`i*VXph|}g< zaH=WK;8UH)XYDFJn`-g64Y$oTxNTmC+vd%+p(h$CROngx&gW?*@??1l-;1INj0rXz z2Mkukvhi;JCvy)A@U(rC_94|;w147Z)sH8A%yGGB<^k3bH?V**UqZBRFxT?Fub(^V z{et{F>oQP8`y;lQYcXl8V|~gJG2zgp1Hom-5_nG{Sln$I$IOOq0(|fw0mJ#;myPKs zUk|joIs1!Y;s}1Z&IBBYz3d35IFo!w@|G;N7WCy1K0g-N&A$FbAp6DF%gGkhJt@5v4>gb#cw*5ehuIOHQwY1CoZy(X zvl6!aTyrKpVA+}ER~Iv62J zX+b749W4ZA8hzZ(RX7BCBKjz{nc^9FH9`;3oo1tKl){(#H>%d8GM6ViFSc%=;Dk8e zUxg1e>*z_+5PFxB%foQ=&;y+-q5WGXK{+(~i?Z!KOSXsT-74Gde?HsD$VVt0ypyW8 z+hyW#jFRogQI$6a5hpW(Q=!FQ5Se~>8fcVbJP5B*kRu}>l>i+p<$TPk)bzI`*yR$8 z1f6z*g23}YV3+s}v;6|Y1htW!f>iMzPKSG()B?j4nvY%KvtWOxk`>2haR%zCG z01A=RdKOuSR4iNei2}iNDJl%l56Tp~UmV7R@t@{v!!w* z*+t?|Im`+OPSgfrlOGE8`GDLC$RO3#6cNYW4H6MI>PRy;RT1~% zLMu^l@0~5Rp{F!OR!u-pmS=QHI{QX{?2jSN)HQ-tr0^2g`%XA{`OS{mLTU4MxP-5`vLS zl5df2rk@v>EdgQ33(S^48aKXLjR`xYOSg#6PU&r(i4t+)4>Op`C6tP54-s_A7Ad5w z`9)A@_kVSh$JH!*E2{=>`^a>OZnb|bMoCmbYW+yrReIuRwJ5uQ)gq48*RTh6yH#e^ zhwrFfTjtOCQ3lzl1dkE`6bcA}SUo4!TX?-Q)?22X-dmoqqtFO1klxZJTiBw3y@e$W zOl(!S3+qK}^8r5^>t{!KQ+n=A>Nbd(IV+*9X@)xF>`vQT-n2e-XdGf*IM9spvB?6; z%$b$2$Ms|;JgcrJ??_5Jxa9=AtIkwpy2Jcz<|KPRLjL4(CzPsB;6URkt=5U&SL@!P zitR_l2k^u(vvVJ$i>~>X-UqRd{APiCd;hSEY5EFvL~HvjQ9g1%)@x==XtORlxgU{t z(e5>HM;2wRRh&I>X$NN~YFex7-sjBc2AunS&Rvsso61>WjR31M;JBKz4{iL7EJC!|@N>7Cn@Wwro!O-Uk_xY! zy#ps@ZxZ{$*g_IG#ZuZw=_AO$cGCLHre?{yU&b}vRzf0`HXaBv}xwu@q4SQs5 zDdguvFcOvWA}EFAJ{K#IqG0wa=(~#MExRvf)nv>11^DH{c#&~gdg2kf(AtYwS?s0* zhwifI5?9qBwLkezD)({V97Fddm zD>xc;>t7J0XH-&Z_hC_j_GO_*CM;))vo{#__5A09Tjb_gL2%1fFcb_4o`e6;DBt3Z zL1TTeK`%!}Hum!EAz>XT-(Fl>zTH<~JsTWiqR9`wCpZzf<;=(cwd zA>V%12oHdLM$}|hN6yN4YsI;;e~?J0?H_o$0~peNzS8*th{jEpd z7yO7PaO$5N8nRO-TDIScK`z? z-G@c>H>hV>z1{WkW(SPE9d)qGNoy3Y1X+Hd0q8MBGL8u4ML4(}l^*L;=2T&pnLsdU^(Ry!EfU^H ztW1TUiequ%g<_qlokwMi;Bd;i^bJA_&m+t{pU9ev_xG0BSx9fqFOzm0ucstGR&u~Pkp1JEG2_v7ghe?Zsp6q6*f(EdP8&#A!5SdsM zOsca;g5{h?fG$Q5x8;;IUB-Gw(eo7S`@>Lk2Xbv#8Wm!#C2YHY)Xy?B%SD1kEyt$O z6IGw=#?*3LK0Wg3jd_^EWGF94=XSf>eE;?n$q6j=1Fgx_SeTI&`RC4+-nRNg2>|{f zDoA|mGD*I@(&Nt%7@uMxEv#Hef(?h|l=YLLn-}OK&GyRpqDgJ~c$5=WI;qW=Yjsdt zh;eN=%qW#2CtW49^JfISo$?87klm84I~(Z^U1 z{Zg0%gx51h4BAFpfVdO>w`T;ro$?8v_l%Txr+mUgo{DPdoF?pqC`VNa5It8hhd?m5ng@2&8g z)(gVglN4);?9Egv7e&^U=0}!w6@^C&ox0($+-QLFOjA;Yi`tdn>42RhJU=#6Nv3aq za9(Lzt93K0Y`Y~mrpMZZyU&y&Cb}P7!XCyw+7^4e$`t=9soghOJ*(P{OqX!hBmiZT z2s>(i2x5SB;cM7o?i^-wuO_fkqbh(i4iacL%UFB!PKXiyJy;oBWeu!SNPH&vYzFJO zRWPv>wMg=cUsZA1zDnhUuN1x}&4l;wt+c(fVR2*OB8xRxlA9Xd5<9~)T)DD63Y2xl z7|%>!m*od;Rb*3Znh_<cT&f(9x!R1g`E@PCv0PA>TaN6E22L;Fj85!X> zRfr)O84{S=ZQbpV!KVvrSRulVBHj;;^Q8}bkJ>JuJzLY`<`r0@#xY5R^z3*O4G?O{yrnO7dTZg!D=Wo3M!^(OmO z@AE`R&=(XG=2?pgAtNPp*k$sw3Q1Gys@)Nqwy8XQit$uL0cUM^k;Zt1z!{v>nRtwX zOP}HHwY&+yARqu(OI08-3M5D5NW1{y;L8wQ)Q}uJ*L=Tokig6__y| z>9q~XQ5;o{&&V(j6opeG2@qGD<)*VdI6ONWWMyOsR=rye8ZQV6^(4N7jb{m!SRN=p zrPvMA4wk38UCnLe5v_}8Fk*-QkdqUBL;3H-AD{++5g7zoA?;u|AtPfBAg$0(D!{Hi z@m!qYk&|D2SSTmHJdi$KtzUgKtv4UC(79q!Q04v40RK*1sN2keH2j}*4dVJ6w86@lwf=hY0 z)~1lB(l659EXXg1KlWPbPcPEiRdeL|n(3)j0MMkTnmtCmc}jSx^FzfwJmB4F`I+HZ z|2DCJk6d5GY|W`r6Wr>N&GpxZ97PGO3438mnwDqP%5*Pu3jH!kAe8*A0@5IbOC<$g zZ%$E*+;J-kPM0feu%*djRFTyd@0$&xHk~ich2A)><{&e z^Ybes1(k8o7hk~>0X16-5_&AQ5*o+baWgI~GJZLao`kT9R4WwAjqIS+@0aX^fwi%L ze)p;Qfj*OEoSQdV+Yj_`;!sc-DXfIO*G`%~H>J?(f}gw~v~f_Jbu|Qz#_M5vla6k5 zNOOp$DXbN;$jP^k?_p33-@9|7;5RB-$0Aqb3PrsHv*M#L>*>dA)R~2-79K%Gtq{~Y zBCm$?V(V(Kv4!-Mm! zn*=geV?0^WUb)oYDAUB_5DXMQcgS}?L;P`4k4|QlGb%kR3#?pOGcZxOnl*rHY2|8Q zaQZI3p{*Kt318lk;n3i(>BvYN5?t@>$e5sYWLz?&BjeH`fz}!3Fp1FACP8Vkhsx6% zUUD^mN-3G+B+);KaYkr4mvFqS>Fi}`&&GIY<|nelO9TjOA5*^Y8S1&Al;sS{R zf+w^?!EosS7-ZAdxN1V9Zx~#_xucOl6YkXG>($8klNLXW*j< zf>b{`r7zx=@KBt7<3mnkD3>g|!3x>Wf?3(@XzNJ~ymQg*CuSr-h9fD7s0EX@C2Y-h zD8|T8c5xb0O4rv2DkP`JQhN$al6;arx1+Tj#LQc|JB$W*A zbaTPbfzjCy)!R%h3X|6YQFw@i>r7&(h-3vmNpNky4O2u_Ze-*!a-tm~4rt(tmEptc zK-RT=^5Iq+M4{Hp`j-3t3*X83skakK6aWs}(yk9axxYouf5NNa1MUHSEe`mN-ZaoN zvR88Gwy8m)XDBC|OQ@)j@lPuPnz5Br=vCT)(rRA~@)ZCW03Qz38=dUD!mvo<+! z>J(HNo@fhve2VesPiv=yrmYRF_>tQj%3-d^b1+`?$I*AqET^^Pd`(lY28yK=OZd^! zdmz%t5XNEi&5958WTr!i(7U9+>uKcYG;^G3d#vgX-+Mn(g&)M4PxH(^dqdo%5zoC))4vCQ=5yXO05 z8|P>L&UmVP_u?Okyu$EmRZEpIjxSlKZbiz%M4t1%7;1C+oo?wAEv_Hk!KACg2;5S z!NlGxiE!o2?9mGtV7bQ4G&4Gsdu(xKawxY8p$WDCx}+06E6zxhR%^xE@aa+T9z_JD z0_cBhnDd|`yHjrzjr z*~?*-ub1T>zSi=nyE|g=uU6j@z}|7g2t`YB*fUTeXJe2+y`QYRz#6xoGo15Q2B+Fc zOtO*4f!%EGL#28@FdSP`!>^nBXPmD)<}5N~dURhBJMsib(_at)s)>L3L zC63|Zl&CUq>x!hv@}uji->nx~o&kV=B}UMplQ~YdNr%%XY~vx}xaL-Uq3vM&QFZF5 z;H8-SrMRC&PMzAstH|AvwCCWU`o0zy*Q8r!W-l?XZa$(<_&&oR4>6!YBZ&|HoTo!2 zmq~5yp-ka{u}z=$nR=rp(WKg5C>U66l`ox!uSF0$Xk6gys=jI)O|{8&>3FKDy}znP zTT>)%w5nR|s*+69<+hC%^61p2M#@gPeZ++}(SpNli}n7`k=!D`=+(Dh9J8DC zo(QCxOCDzigpohl|A4F}${}XTR8a1k*cRQfhcAxq1r_~TA2ORIRI4KDM`sqfogbrq zbMM|y687wZsJMI@d(d~B@h1QN<>sF0(uMNAdH+q54(Jyx{$^UM>)Ya6Y;imeW1kvi zaau;4o|{klgw?{K54ToQ?@Zrve?btWPMjy7lQv+?GUI2) z8B>OEa5=Li&bVaA5q&HIGiPST8>4YNXJ$!);ilGk5pKv4@B0V9otcM{(FmkDDfj;lRERPMCG(U zYCHKefua?gbqpitNug(6!NxNTTfamhMx{UWI99`zXHAEy8oAbbo?t~qyco49@8+h> zJP$$3x$q}TN7BY0G$-#H}Cfll|0#@+&}Q7p0mZ;#>+u`P03To8H9 z#v0YnZ5k|sv_6Y~(r0Pyw*bw`yyB)W+t3U)6QY3vUuKgzga=w;_I7u!aoD^|N|-2# zk%fXnT`gt9xLL&T%x?W3f~5FnIbmj<;T+h#|-B9%e;##2m`5LXs?J!&U{2WB>tIZF<@WI`##LY8+|5;z4>L z>01tcRKOahC+DaUW0yQ((7tPg`a0O|weLDd%t8_WnOc^0FM~Y0att@4Z|1E!t^go- zEVwBdsluDw4?p~{;wE5eGpS=+a_ZKhS-Hl^(A{I{tCbebch3*|DUX`9D*2BU)vpYF!TS68m35VIatxXR3 z?jw`D!jMV;X)+KHOH#<=&3xQ(1#^Xc-i5@-x5`pw{W&)p0I>Q4_+apq*^ zU#Qcxy_fqM&1H?D=HcRs#LJsJflo%SOKw~+oWu__KIaL$0w0fFM{dJO`at8mo~`b1 zLWibhdS9-4p4Usk?k#CQzu8*&Q#qKqAFH~K-z9C(`3u_MkA6jC>#^J5yjp#1U^8uS zl)26yZGPWuvzwoX!0m7p?A#k|egp{`N4(Q(FK2|ghR%6D)CcLBirL|m&FoNMO@E5; zJ0(zXp5IiViAGQvPhxalSrCNprlpdBUv|}Mt+k~Uk-#0<2rgc2B?D$Ko5g-raJZS{ zmzzz)y~7k|#0Ybk>OncR#vto{sFu6}nCELxW4QOkdWf$# zA3iv)l{gD6KTya{o)^p;oLr!2w-zfZ?a{9R3TWjX=dSgj+SSY{t`^~nZ0pq7-5BeB z-xRSR6S$ho3E31ms?0ZGc0Jk2{xC&#J6CfKE+L%3r_{u%VoN34_^We$nZ3MViz~x`ZtMX8PCOz z%!Dbj3zA5eHIMxpf&zM2ymC>X@>8pTx-05T6bGP^6)i#=Jfo<$*VyTB{sbv$IQv8E zT0!B_7YPLKC&MMP#XQO8=#w}_#ge$TNY_*cM@TDi{oOWfhy=M=pyZGz-`b~4zOLAd zDN(6f^M!%6g|U_%!fGQ??*C3Nuxe%U2iY7WU1nzW=5RpCi8GJgA(-YPX1;vuPST?Z z5c?aLpqwBY!pMQ~ku)Plm$gtOmJ&nv6cD4X z-(N+!O(jI0qS4u!+FNZbH%t?%1`biaK;I(&zMq~J3EaKc((i~G{26j~-eB5Gsp&kL+yirp$Et=R2s>l$`_AoLM4N>_Ff*o4Nn&-KUS3v=7GqdO!{Ab`qY;&>X}065vvPj*S~EO${&+9sl45 z_=TsOe49mnu%TO=;fwATXV{;K7h9WDT8eQR2w+;K17t`Cc$MZy#9|TQ z^EOh)IZ+sEdBBFfm$i>R9lsJt>%;3<_Cb_znw$p#9K@^zDD}I&7^|>Z(k#u z%ZwP0j_~&PbLMbF|1UqWnP_N-f33W^%?yNRlQ;MH+sH19$u=7(Z*I@8GDNo7Zt+LY z5&bZ34h$1feKO?!oV+>lhl2v9jL9SM$~##Ey|BV zM%fW$l>L?R<|H#SB87etbr^L_T>j?r=JI|m`6_vH8b)vytCNB9=9YG;I+4ITN-=Lm zJ&KCSi2Gc5a}t{LVqyM_yg8NbfN=k@yt!!F4zfr_rJ%;3CZHyxrlIDcsGI)+d2^DP z8Ck{Gk6Mq~E-taU`D^6O2?3b7V+4=OH_iCvFIg`@Pg(kij5>fHwR# zwBba0ry|PQBjdY=)yN2uafTu?o-`86gX!VJ<^f@H2*%Hulbv18pqOx@@gCyB&cV}q zj{Q@N*7#JE)(99d2`J_OSx0%N)vUwAhSZs^g_c}jwd?JTJFhnlPgPpgOOin)w$`diI zwnTSAO_Z}BIR%R7Gv#%@h@OP7u*qw$;1tMA{tqAuw?HXK}K*BsqPtGb#$dJ%8~}YZ>dqL!$-~ z;fl92nB@rGp1f>v-twa2BK644ep_ytu=O^vHiHgeedPzte`}rAok~x(>Xh!bDwUpM z-Kz9d>n72!vGSGGW8J9q309WUCt6;mPqxyOKGm9}^l8?`N*`lgp!6Bmxk{g94Mh*^ z&WNndur%c~*XsGcK$2s1D}8}wDLv2XQu&QQkt#dw7>J|M>N%J`rdM=9e&Vob&u*gZKaM-Fw?M+-Bb@_(vlHyHV5p@aL zE~(zcRZ*99w#yiAVrkT+%y#j36a7(_eC4usf_HkAaw)Jf#bsrTm0r=q>6-;nHa)Iw zil73<+IZ;IgQ01=9(GI!zt7$;us4D`R`~_~$s^RQtchw@uRDX&C17}3KYN5?JW-B`DiMyk?Y+C4Dt1yG zuuHhMSQyfaQ-j4lhSMA*#1WoHRvZ%$8j3yn>`b;429`0Nd%#pJy4$5DHbV7D)YR)RQT_~{fd;_$Kal<`4Pg3?}lZ2to7$Bd|k!zRyeIPZtDNiEuP`kq*Lo>L%cHR)rw z(kyr+&X|#(4=-4uYBzq_^}-4?HP(1$OQ`V30gb0KQJmsc>qyx&-pu8ZZ}0L6SB)`bN1^M-rO;+ zd%j0hyP5|^JSxMc_k~S98~XPJdW3Zhj`ouCtarh$d7Nff*_kB01PWL9{5wioK%)=k(!bv#^V4geJJQVrWn@75zp)MxSHRjgwmUMXUTvc-tbua zB`AG~Gx_8CD==*;e1dFzZG4JX56PT3`XsS8%?|W*t((DUV2>T=S+9_|*~=OFFFOY* ztaK`@Jks(Rtn`4D2mv1lEBS@iH=x}xfM5Yb^x?i5v~zT%od{n7au`DCkI+A*YaX*M zl1f0pri=h5e|5o$i-~T1_#vnYpC3adiP5zc_#>r2W;abqgy0^xW_())1Yb8}U2-~u z3)9vm%Bdq%*3~ygJO=P*j1iw&GDb{PW5fgn%jv_!6_5+**k=qAiWtE&R>*nDwXCN| zgH3WMD{i)Q>2)04TV~@P(CT{9u{>-b4yCQZ=@fD=t7FCOlxIDFx8eyIvCYSgkFCC* zt;HX8_&(N(!b8&bZY}QV@O`9Zk`jHRHYHN)5I)JpGVzcOOdQrZ5L1DSLjd;-DjC9d zw-B~reM)gX>Fd4Nm)wZ>F&W#sg;)-`Tg{J)`O4Zo@@y@<_o7SHULm|&oi*Qa~3g_+nO>X)i zuhZw0%>h?zb6*TLbOjq;aW&r}ZF#!T*{Lqx-D99J#|l59zB14N7tC_08fjTF&)uk; ze2{cmPIvmGAMg@w#5iny6?%)=U6k!Tx#{MnQ);@+56!(M+GVb^b~2?f-FE6TqSNga zg*5NCh$`b7x3d%vI){@-50GY_wdw)-QYT`Z`=(-ugA9=kM?}i(;gI7R=^jU{`Osm& zV}V>Z9+(`!ZZ?ZwM5yvu$!JWzgusw&k2ZL(3Kn;TZ%%J`#T+Z+kC7tVqrOl!$LuT^ zQZ3Iu1&YwL^+^Qbnd)d#haf#cgzd6^@h$2DjD`_v`4$f(nYsIe6zhn!NVps!@P^8S zS;nrh9ExT)IB8jqNyz6sx&Pul=I%>0@aEl9H^gi!x)=6C$AtDPL}b_&Eqqipw-gyz znZA!%x56bPb!;S4pPeu(a|~=uw$5i8sCIc#wvJPP4i&7ip+_3K@3`Fwj=oC0r8lH- zjkh5se&b%g6E-6^=2-r=3n7h#HpK;=dW2et+cYZVJC^5qf*UYMZj{4;++!d+>^8ru z8u=6Lt|uIG0$p%{P^TM5tpIl)i1#(m4!-hNo>CG;6&+Y}Rt+QGXLVRK1c1ivVp=m;53fXzuxAi^u)<97Xf zaY_QR8+xVO+aGc~LzmoaT<}nwab2J*ULV{<$EW+R8%z-=ryIR%FS9nXp*rD9jqB9L zHl+eMVh-w9$@xd7cjn@-S7WbZ3eK3HBQ)6MKp5_G?Oq5}r zm2qMQs~tLSbXG71`7=1B4>LIakP{jj1#h;}s0s`6A>-@jZ8yuS2Qfyhs9qpj{h_VKL^i_0(V0wry>A}Ifuj9%de) zQP=VabKvNKHxImf;PBAB#_^LMnB9a*Aq0eglkX%Ps2lF(`rbNcor^~voofd#oP@^( zJkON&CMGAQtP-M0ki^&|hxet1pf+ zCxwR|E;QTQe(Nq6de|KDtni`nV8_X{7ZSP?J_@`a5tg)<(>mZyYWlTsr5R%`QOs$F zM2j<=P47r^Gj_u?%VCi@rx$LqYdFIEIbMNPzO=(piZD1=f`QOsEMd+P&ugOsA|+! z)VEP@px#0K38h^Sr=5qo6g3020Cf|p615R^H|l=W4^X>MyHT&8-bI~4jS%=y3sBXl zJ5gIve~L;j!s5emWqBKr)&qqx~<)CgwZA1xo&;zK)P_3wgsAH)33*)pgsEMd) zsOwNSpjM##s5?U`@f^t`&7)n)bdnzp8XbxmDa*_6_%Dy`0_)+^SOdCKbQYU(_iHjL?V>4HW1 z`L>H#wfy-D=MAuGa~I`i&R^K?vgDenY14)c$*lI2)Yev2tS-?jYN|c{l6udYlF~9y z3GTXHwx(A1=rx|InvznF?l1FXd1852Roq%vQn$fVQ4L&mWvlh74O52XRh5<0mw8s# zRO=g&ta+*-B4Q)<*zRNv;QCaJXo2B9jdEA)zzs){>R@j?z_YibVO}*}^s<^$3)TKCeW%Wjt?x`vFtS+gl zlFY!Az;wmxnl-f*Rb{1~iC3dTz&1IDdW0| z0TETb^~byBtnupg(mxY#y2PtBXl-jN>U5)|s=tDyCRGLk7k%O^xWA>Qx{MxqB@GA7 zqe~I{;JPYZ;`NuirnanF`ayjScqlDfTd{gT*eH(5*4NT+XfcAB{+_Aue3inFL5|Td zYiM>Ay1%ZBo=7XW{mk%Z$4fL)X^CC}xWnu!AJ8pTr>`r!!zim4V5F5Vi4HJSpk7wD zrh*Pdqm%lU=5ACQ^@6~4CI5w89^6k=IQ-mpUsg@6)l{!3tJW!lgjG2F+^{8ew;2+! zK31nwRevgH5Ywf@*49*1>wP1UBq76FnQFnBmRqs9uBN`GT=x`Is8VK4n$(An1@@pP zqx2B^!;~pgv{|)vHMi9BIo}S3r zo3f^2{pvbh^D%~&mgNatWp()9=v%VTw;=86DRUPrz^ctHJKaCKsy>^!KtstmR=4QZN|Ku2KX_*n55EN^^?D|Gtffe`My+zQ?RGL+E;Cxm zZDn(6)^jyA-?yZ{q--?f6C8<2gPenh3{4(3+~q!J#JMRW&l{CG`uq#VjJ@z8&$#gy zPq^gL%O+m_rAd>om~!RRtFBI)HvO7wXQa>c&YFGQ^%5I3m4@r zUXs5Q?&0M{H{HCVc;zjtN^V_UT2_9WzoPQ?sx{R$wRhCj>&Du3>o?r_<&6!SHphzo z|E=!P&itFG#s1Fp`8<0LREj_M*Q|Z^@AU9ZTK`|1_Qn1NrtlT5|1X|HfiLnGi|_gW zw%+>-{@Ggf|97{5xTd~8Hnd;p7ppo?mbVUC4-(Dao+^On2*ZfkIxxjl6EJv+Yo_g}mBAHM#N z_x;m9f8+jde(PTz*!k_22fy>(?>+SWA3XfXzy905Kl;PRe)RZ{pLlZDQ$P9X(?5IW z+19q_+IK(S(Ya^uz87Bn`AaYFKXCBSE5CU4wZpH!@#b5<{MFlCzy8f{kNobP-&;rD z4Ilf%dw=YH|4$zr|M0}go{v8Mr1#TPk-vH(IQu~Vg(iak>GJvu393yfv+q-(*iNKaUtT@Y8a0uPiOS5(B@yT<*7^Sf{ZMRZBQ+Va?h; z^CEV8;+$Vr%a+;>kZIgz)U)uq!KhMc+`w92(#ou@tB?g)Zb{v0KYDiAt#t+)ZSlLI zq*@utN7C0wSJKo-OVUAA6K{j0A@L=y#L@Cgbfc~m4@s}CLYbEOjk@}%TVYvgby?K1 zlx=`G=hjp!-+Uvgm*^5#Bc4Whjc^i1!(WmW9V@PQ5{97UiaYrO2G9T$umK{F0x)m` zKBbVte9lh>A&%Cx1Qh3EJeZddfW zU!dKj<#JT!(XzA}Z4FPv)M;f}J%1J0t8vf4UWI!ZKG17;>ZSr;j|y3%-G*xk@jOvi z1HUq@RN1RFUB#*lJ|(0hPzi*kz$~R*jf+4h%=kH||Lji$KkP_BD%XGn zy0~UNVK060Hv=387&%iE@fg}GQ9Wk&-<_dC#q4MLzw>AO@A+DW)`F7X+2X(Q52yRX zv#j8Vg@5e6)BPI<_&0qcL)(Iqu=CJwj+!OEGvV}o>-2Qa^ndiR)BWM>JPnS;kK6f3 z+QkFR1H)B3nV~hHxFY%*>mw2qsMl1vXVNN_Ppw?21maIDSD{ z$=WjsFq(EBlpiQQXAoxKB4#B~Ri=L?!j6Q(k_tV$rY;{kR#llzf6>lMfC%JU3&l&* zE{;Ddy+>=0UqY(T=kv?fl+^kmyldJWaZ!4WB2#JF%Y>=#ORY-Fg5Ie2M<`^i6LnJ= zVxOjERn^p&<&;#HR+VXYBrK~Y@q&u7b&JZgA%|;kOAbpbR^J{aG+hpalvzlaWu?CL zt06_-R;GRF^IS7aOEvB8SebK$09qR>HS02eeC}yE^-;|f1?!!-ekxO8jLM{Z&Wq21 z-l{4_b1So5X+P2Az-6f-vC_{4?kt0&jq0e|e4wd`mOd8h0SP5EGGOIs0H`*LOKwf6 zQ5D5WCPIW%%2869c2q(Xl-1Qkg!4fGYl)>ne1S}a2@wKf8+7VgA+Hr`DGJWHP-yFF zHfST1&8{0wJ73wBl-Z?tFrg4SUzx)FQ+7I~(aO;p#BReT{tKa40^Q1lr7;?B3`A{? zgp8Ix=2%VLQd?BB)Ei4#;3pYHvb;gs;90%XW*}c;dittS)2W3KH_G%2+Kg ziC+M{H%iK-{F^?D725R)R=Z_ozJ9thU7uc84|hviz*Imq{w0 z4X&L$OFD&G;pfL7Z@0pJ&6+h}dqG7tm2}P-E`{0zDYad((VkTSel|EP%UOR`kzc3Y3uHjRCsN?`+s0&A9X+L&3d(#E8{7QaNV zT2{RdqOj&rar2~^YM%=AH!~|w)4nFIi+s6azMk5rmMcoLgvbruR~w^RY<|U^j6lfN zr1sRYmZU*_+?xe8A%Olv<;(5O0)@)7Q5r@Mf+x$z6K7!&N8B7|?C9smFPeQ^xP zU=;9{2?8n4U_DV57Nmt^E z?m|hrZj`ujO-LINRpLGlCGOKvVyAkQJu7Obp{Y1aqVD-oU8-HuFG5M)RVYbk4a$S6 zMU6qpo=jksa!B|_l)&5+)xUx+{sENuH=`t-uc9tTeJg6;i7xOxh?4xihmvqlqNGeO zp~U|+l=!ED6v2-u!HbkX_KS-eV)|d|eztgLOXqCiW9~6M7XN=z7aZJt}8DQQqz)YL$3;*{6%wHQ|mVPY#QQ#Jw zWwI~%B1(X6ln8&}uXkvsiXr_~et)aBB=V&O{{C9KzlvJ>H4ew_&eTK# zmdIF=@S=;XhrjL5eb%3yujj14zb#z~Dg!kQH5D}(dILajrw4$>Y+9YXyHse-AW<1T$62fyVRaasZT5j%o5tB+ZC{hF%k`q|@+y6Tzr ztNqX<>#tZ7W4;q^+Lq;*1(a6Qv`~w?)?zY) zSaeOe32=M3iiP^pTI+7RtzF$}tBbrS%_KkqC?rr7v{j(gPKa2vDp8R6eZS}2nIycZ z+uiQV=l@4D_ulh%&w0-Cex7q~-B*`;d>)U-kH2iz<5`U>|3&5Rd;esRefl|TPxm}_ z+S4Cf?M*!WvFUTKZ4Az9`1Us&zV@x)?5|ya{kN0BuYV)hkh(s2?e#(9;%UKeeS6L~ z&L2H`WXNs$){o!ojToX|Abx?)&uSXQlisL>y@B&(;SZ}cBg6*Vyu`p z-4yYtsGb!M?}(MRnZ6z~(yeQEw#8c8k{>rj?My>d7a8H|KwY>e=1a%Lj?6dKc|3-= zVrIg3MKocbWi6cQNqxaux0EADoo_9i<4K+`rWIM6v*9fwZAPl+&i9Ghxwt*IdamOi zX;&AeMs!wBB_f#ChTs()qP9p>PY>4yOy4LooHl*cQPVa;Wyw9uues)${GTbRO;hwF z9AufID_hjsW?Ou1YPBhthCct?TaC7g(BVk+tQ+q?Rm-VI)teQd++Wk46)L^#a(xED z)cg(_Zi|WDnCKR-17PzjOpy%DHN_yxp0nYFPxA%-4xTJDiP07z){Q! zP30T(E3dw)!w_3c`??T-H78{1J-xE&ruid~uBUqo(Diy#To;-<#W4!J)lTtwhON)k zoy0JYue&^J*UsuW;Oo(S-FV#;=cgk*o`5Gg+^}a)?~BM6x9-4WSDFW;1i?@F4stx}3;EQWCp$(N!sjH~*t?(S6Nw z;O_)0?KQ1-zhN5%Mc;mNPHz)r=jd%`dPEuQ15!;4S)7LNZ z^mX?T`nu!P^wryt&1S>x^5vpB80pe#x^%~1VOJO0wZ(*A1qtNp0rvD1=`SGR2T%Zh zl{W=ahG-^EtUbooE?LmL&vP`J^))vUIwC$Hd6psCgg4TDqrbeZuOQrR1H5T}+{$=U znRBNVo;xjYE?5y+)L6w9DywIu0;brSdG(!a7Lcl}E+scAMS~uIOu`TB=tRhk0_09p zki&c4V_apqamn#urbDGOz*VN}GxW=J4zEbu99lq%pJ#}NLY(M?SQ%Q5Yn|9Do{x#H zax!Db|79b*HP(92bds$gk==&v4<(%WetUXorq)9KWQZq1cjGFSg_>~Dt&LeDvRSiU z#6x+T5!tTQr1fyx*Xe6Bots-dx&Q}%#SCYRh!L8pYgOG<+A9CwRrt?K%_7Z4b|x$G zDd(#cb9Q@jd_ruz&?yYog*Rxcyn2N{kSatjK+QU-K129JM&zBw59{_Bx}#^~R(k*$ zx?OeD5bq?Xivk@zQ%XB6$ij`;4uhzE`&Nuy9%hPzhfjO*K5(+|U zxwR=9i#)AazjmR&S=VYd68vdjTf!+`1nBGHxrBH+5$=jb4g>tp0{Z7wRrp7yst165 zP8~$0Q#c_J-k1aSS%ZPCivoLuE~)?sf2i*=PTDI5gh({k7@&NPF23rIJKymG{C%T! zdt68tXBy)5IBfF9R4q*V-q-6<}xX%oD8T4#Gj(eK)_QC zaS2!$wF2FGr=anS%xmCJO6<=C^-sO3gSr^_Q>PI!DP9b1Rn)7k0z{IbsGi;ffpRm@ zd{i6Qb(JV?uCo2jqIz;dj3NU9%cuZr(!~~PL87`87s#gSGBWC5=BG!pS*sdQuMJq$ zgt`y!>Nms3%yhOOQd_9_+b_Z2IE!;3`7x$?)vtlkP#>HjMy6>3K&-TuVQ6}KZ-AQ3g7O}8DDEsQ5bZ|!7DMbc z#@AMSJPV5y>?|B=GDNrTG*cZ&*bjx8P&FndHtBX@6Qth+!>K9|egfhSBQkrOX8oLP ziw$wH)eLv>%@tm)^?OW=9E#80kUS?5-c{$@rL7vFSNKw6bgRu9w>kigPOlN!l=>5X zbZClM!;X3En13w|snm><0Qngg$YR@2Fh6}FnDfBB`6@)4V;DnZZz za}p4AP3*dhRT2%OuC6^52$&!OzHJ@zHx^0!1~H+iRG$;#VxZrw&^)qkGCJm2B4ToO8QSCBsDhk(WntY} zM5HvzcZ-VydioE;4Dp&FdSc0nH&voboY9>rS>2BLW5CRq*b|GquCJlrCi!V2 za{0K%b9IWdLDfo$$6npJG#i5iu{IRM#Ot~}z10(I-LJL8smn(;#bIcHsfcw-0tQvBk5#C4*&~yz(U~SDtI#Q;%U7_ja6IM&Tt!BZ;rP_9T6Gs^| zM4Cq3axpT}1-)%E^tLX0B-LV9Z>uRhwDJ-=w zF0?N%2BYac2XKf*Afh*5@Nr4OHIrjnRhp0iFhJfl;M+Nhu2B?yB7layr2v$JjwueI zV%()@g6h#csH)!^RM2kIe;t&H4xJ22;_`sF7zAB2EBw3!!>I_G02DP!Yj^x-+BJpt z#l<9OMR`;VK#8Eqgith?r`ACN#)P5@RVxt+fY7P<)=NTvCr{|>Ai5=?*XviqPR#l|7kik)hZ_zaMEx77g(|D$df zFKK;2Yk3C9Vnm*e&)!0*cT)ORnz*9xXH%f>XPs(LckvRf^)A#F7nho%rp&M>Ej=0G zPJ zTgO2QN5^8}7hwdU_lt;7L3^1rdFp1ruC;VNWSi@c;+|AJIqbkvCriEtau zpqHSCck1B|U#BQsR1G!x6V(;|;b@39SLz#3F8m?A!jrmUExP52yq*wSlAi3Qn?QH4U-p08`*Co zyc?s@S}%smZNhwOLK|lIUMa|qn;kQKq(HLPU!lz3a(e#Imz$nbvD8dtqgItUHA`h~ zj-^geEHwchk#m-SoD(o3Dg^Z6Sui@R4T|CiF$>(1T|gzxn`Gb^70^mycS$GUa=0Ul zb?fbd#%rX)RGrs;Bh_H4-y$0KXSLSD#I5&Kl(d#DD3kLX4AbEv8tOXuQ|~WOz!W~J zS}?`6Ra3pt-VM7&&R2S0U{p8sbVH20gZiqN1_E1HMs=xivLPDBCB*n@$A5e0c3^DRFTi9TA(3;0#zgZ-#SwrSR8q?EVmku5qjX02vZIIa8Ir3tx& z_WMyY+#ied!+dNcGOouu7PMtX5l7Spt@(crx3_2vJ^aXpv zz;Rm5_AQ8Q0h1#kMy@psO%{OgTRRI)aqZ}UA z+6j7jdVF=oFsTni?}esI0~N+8y`#F=3?+9_^Iodbw*R{TpTv8bJ%*S)S^6={f%vDv z^GVzXQb0v@G2L((cb)=r)TFiS1QLJ*pxS05TQq9}9*O^(wHoN_&k_Bl2c;0`Z;E3Q z{d3-v&sO*^NYzU0-$CpT0{h`SDNBSmLH|{*ssZ%hLG*{6pwM532L>=KiQQplDe6avCvEfA0mA}LLXX;61+ zhY}0;@aDKPaZz}?q7|~w9BCw|@K9Qic$B!iyjNlgfXClz3_1-F}SY4$*ChLQ)4*BvOI! z-!ULbj-wL_l4@8eg-cI1Q0W1KlJLR(UndSQuOn18PCa2QXy2av#^7>v%dme$Ibrb8*VmNXIXXhfqdTAVR*}`NS^;nKDm}IW45Sp zGVkvWVgW?#HY;x^(pp{uo>bo8rxY&}H_g*pZ;=T`r(Osw^dv{a)nsN%nl!J+ZZt6O zWze5>XR0?_axcDF$tMiqw zROM6Moz?Khp*M|w>9p^JOPoD`GrP7lTXJ^3!bH_pk$hYBbouHc6E4g%vL$7zR3KY2 z9Cv*fS7T9SV-&-1YB7w>C~Y@J*`iy4^)U!kcm{W}0&urB=w|Q9XRpd-2a!F&%}(dD z@5*Jvv0sbO1=*W_&Sx*kWlN|q`=i+sOJ$GEmV5YnX$ef>>AU=2ZJYoovZd`NBaK{+Htme}8b{ALk2CNMZIC99LLt zog>A>Ww8Xc-ehcH$sdsr{>8?^4LvwSql{eY4WDWW|#K8;yfqQjemSy>`y1;BaYl)!Q6 z4gOB_Hs`~D2LmpUz54oN=XgBJ~z*t6ROK!%U z((j%KEhWOixeonSx1I*M$ca|wzwdBxgcqg8^sSESjVjypRBa*9pB0?AUX<)2Xlinl1xBW>D}W;~U* z^-`2UrH@TFeRUWW0?}eoF1gN2uH<~6w&}*7&CA7~wX)k<>kVWbAi#NGj#|qsJb7b9 zfGUO;iOtfMT!Iu)hm`5zIz+h*Z9Vm~-p?Q(-GnB9RS?ta#Zu?jSmny1I2`O103Q6s z;VT2yo)HN0@TT{S7X9|D#r{tJVxR!#us*W8q1JT1&(*JllUN^+D^cMzAVRNcnV1pq zfgQyrBpgINi8`#Jz6jsai&$5ikbsLmNbu>|m7#vT%R6qp_sRe~vfy;yn8Z;wr=<9^ zBQUMgpnGsyA3$;ptGS18&6YffEV9b6$jz4gI|~M=q<|O~m;)<-(OiT^jJ>KIsW^t#u!WJp7B9%n+{{V0aUK2ceCG>?(ic&!D~vZE*t( zHd23m0vR)N{$U{uR1y|t8GJge-^0~fCj(NG^GzX0hn*IOg8yNIJ<2RxNOZU?#U)$v zr{Osz<{8|f7D13L>CPvwSIKwFvArNsozdV`E;9q&En?9SvlamU}X z+_1|mnGfe!n;%lhEs=VeT(mv`*)~(RCx;+D=ej5XznLKf=TY(Ja&wseE_B#nH^1uBJh{->eUxNhOx z`*QaFKqwd7!?f!;6eH5!c(%@kjVgq5bs(Iphr&?#fmt9qHTRmvVnh-Jb^CnrZGS?A zc1`FzUAI3iJ}tH+M3znrSp0J8a&Sm~3bS7Z-gZBl0_(+wg{&CimU5GId$_29k8VVt zmM@4jB$#+1RihA9FfK|yfL0RW-PR^=9E&CxwTmFS?+90BT*R@lT5WL}y^(j(!X$DH zZP6dWq8Q0F5qw4n;v0P33h&b4EnY#aHhh`LqY^DN<1GVBW}+?e6G*n`Ul1qKdmb9G zFBpo+u0EKv=cP5DgFUZM{AYrI#j$M3wFS~Dsn3>t6L-o;O5v`u(bQUhh7MFVCbZTk zF-laLC#nAP%$6*Q)}6~n#vpNk`e9QC#CB`%m(zPsr`TiI<6R7Ul%s2YC;OXhcK#QH zq#AHCB6PUh*OojR3C!$?yNy@@+jG1b{=wYa^(*yd(S(z2A+ zTFLl^lC5~^J^z$;zAN6If<&8;dG1Yj&3i(J+58H7V~Sx_)#yn11`}-LexyL`I-nV_ zHLmGe{Y5vwk$D&hhICh5G|QjL{F^}C<_&B@3DN<5_%cSD;&o*S@eAsRRgT{QB%wsS z_C-&Wf^&}y__8mV*f4VSFy!=h;m5Srkk>(U-puuPM5(5NYk~ae;`Z!^rQIi)Axw4D z@uOUIAm+4$Jf1ONpWDPUaV&(RF2mk}V?O5bWPZ_|1;pyqi0No;6Ni%UdC06x)1QH+oBGO3XJHhzdQeMW6J_7TcGd{08oQE+Hr$@M zl%+fR3J4(CbuKc3r0YSDWsC;BiV!-19`7M+=-YVPzM>*L?3)=%4D#FtyaysCJu?~3Q!#F!J zh<}|J7cQ#hd{&ndwp^%l{~=~`-~nk0-a>~%X?LYwlsY~09iSnW5>-8+yEpmzP^J+e z1dH7iU^P0Z?<+wVotpScDGYJ%6j8hs%ME(-J}#iuh{6@sFuaY(mWK0T2*(8sx2+Za z%2ZGf@76nsn=sX)0jtle+cV+g%KHNbZsVeDpvwdJ%}$iE2j~bp;dX$1VJBdTt2MtK zEM_3eRITV?*&`;3#W1<}7ugXLg%$#b`6n7KlpWmSc5pJB2jO;17c6!^8>=uX3sPsH z&x~+kpWPlxM*_OiksFTH7T|ct4;gQX8ZYZ&tndy5Fy5obH8EtQ3gQMfIAM^1gy@+f z#x+^`xa>tvVN}3@)cK2Pz?qad!l2Q%>+2Lt^f%c5&BEku%`AsfgH2r2Agt1Y+MDNcrQX1|HO#6vY6W=f1rnkZjAIbdNXb6is zFyoY`bu)VL(QmRWtO&Yjf)_geasy%L6^8w@u4jBO*njprb=i*#i%duYv$thlu4k*; zG8fI^^}cTAip3AeLW}R_1w9ES?4K>gedppP{6fbAKo&2@EhUz*^k*%&MUmCG;6-h? z$j~tzL9juO4)chLmrE9S^Bm4)g<$knG z-$^G2?bLvle``kCHLH!!%~`gnEn(m&SA9+EmVn1_YO<*jGIF@D#JZ&zYcJ)SE9*+N z@59dZLK)iJwD~9izmED{I#blPcUb70k!gMDa3rQP0e$HdZ*1u`cvG8t^2L@;@msf) zq9Mdv7OmqJ8x$I5da(h{_flPJwlh|WG*4%&n3rS;G_kmNHZHd7P!ADM+6u|;i6cCy zcROzAT5IjXO?g&EDsx}VQ2S?kXx@5`%!s^>ZJ`;gti?GKOst-m9EP(^t z=l51EHNNmJBB#+;-X6m(ukbEi30T*bWv7)2;r}cqL~MfZP8Uy!7jcEn`vp^UXC7`s zgYaq@;g?O{5sW4Ik+}C3XrG;fM$no1a(TATA7{W4Vyj!f%83X1Wqt+RqjE{i%mwWs zppW_t*k3dk_;Y2)>eG=}xSmcPmL;z@nQG$lR?dw0WFq_PrsD5_xB@8HFpv zy>;D}d~l*UBJ-U+_cZC`o!-FW3CSIwoE9>cqd5}b8iWw&O z-}A7axGi`Bi4Mlc1VS!z9oQSJie0I%kxfLG(>6ef%do~e`VrRf{i#lD$d>#R_t23) zW42~>@%!ZYZlkRyZS=!#qsd?O4O@r3xab1f#&l$U^fh$%h14euMDj}e4X@GBhOzXz zP%vBadEA<0-ou>g)A|Y+3YnX(1b7$>y5HS`)~pStG+3~Ejr(&32SXBTN)i~hG5enLnNC0y4<|>a)K<8T(&H3ZScj!yLI-t@$~*-9CGVhT8oKEiHpLJ>0BPj zOb2q4^?X$(jtl)&$OC=qz46C{V~JKn9lR%j*is`@Bv%e~bh4N~kP81VFM<2n(7DO$)4F5-ZfK6@Qp0w2uZ1T0eCo*lHsRo$>9uk>e`l`CtT$M+r zy2@k-%H*q>H3o&~pW%ucV^kDwg=1V+0h~9-1&m3cS>`mz^VT*)^lPoZm$;AshIt{c zAfdpQw3akd<6s-Wx!Vu^EmM=sp*=Th)z)4QY_xfj}xsYmOG%LQNqyE7OZMOn{DDS~EMtnh*p$0KksPs_NJ`V#UcyS^$NbIr zX4ju3(t?vKB$6=D7J0$=;KKWjtUFx)4cQ6tC9@jfinV4_=X1F)NIzT|mZjQ|?csm` zp-39$K1EyK=&DV8l@;?qjm9Rl1Qx4-=5Kz7i9qv#otnxBbM@<-zf2nDSeg!WdMUx| z8$$LC{!V=&rE#YoRF`q;QmQV+>QbaGh3XRE#lB%er#@LFa7_yO%ME22hE0NJt@|>F z%D&Nr{XP|s_u_F)5U<4ZOvvJTiEh9L8@g^=kjpcvznIRC>j_Q>`9^pt5P*R$ni(mfhw0QtGfV%TJrK+Bw#?1E&*|-;?&EcK z!l#tlQIK4LTlYZXGRS(b>D*M$jS}X1_8X2&fOW$U zq;uE2SkVt^b)VQK@^E1y@~Cs=OYX!SvY5uI3Hu8W`+)VUSPJ7xK9?W~@XXIB1LJG@lx%1Jv;RTWl6&*f~-G7J_mrMKv;Sz&BP{!&H9sgD2O@N98G;R7J2d3 z(bZ1ktkYxSDShYOzELr;1>ugvW18_a`ah{0oa3ediiu9`M{Q_ya_i=sMnGU~hX%(D zy@~YzFQ~2Urqi*AiyUY+DKPU5h?Btq9FxUAOw@l9L=io*UDqx~{NM|>egU1(E_w<( zCt}*eyTn-gA12zh6|FlA`-;iBWfeyw_ki^dNAZkdPxDtU4BUeK^8s4# zl?w}R@!1OtD;E~wia?r$#kY(Sop>1rXv4Z(SbB@LI*O9kJ0o;0(TSrDDi@Apnab*7 zXnHUVD;EaYUJz4__Cl$#C;*F4Tbb_Zx7vz!_S@B=)`K^p?QzLrctOgii#P1XiDu=( zvQ!zCbRi0hKvKmH8UQ!yZYZKY?kU2Wbv)7?*J|3pqD*Y-;@J-gMF4&u?hC%^`$t_^$({!t!MLfuX5qV3U@ z`Dzuq)cS&HpOe(FRzVDpq@p)>VF5mhV==t9eirPfBm!>a)YU_;dFKM^HN%eJf`}Ap z=VVsFf!w15>Cl?bfACcZU5!CXGSD0+nz- z5)8X_o~+i|#0z?l{N*yA4cV=C%j9;PsWB49QBe_+<{~L0zQ*E`%D`PnYJk9oXzol0 zJN6r-_ucwx(?o^l^qk*8yE{9@9<7+@AkV?#upbr?^E1PcVTd1=LX}7Up68&^ z+duRZoQ|lE(r{vg5_qyHnu9c3t#W|xTRqKGPrLAxnb9Z* zuz{0|38aB7M?IfOtWphah)Ich4Q{%-WSRHqw>C3-g|%o zLL`;!pd?xC0n^!usS^|^iP>#+zBaP@D|*`-Jf58Y7WhYe8;pO%$IN{w1NidK__qg$hprM0UHsd713NE>c%+emj4qY2M`aKV-5L+O zHHb>6F_3X5Glar8V6;LtiH$;G9A2!DQevZ!D5tM>@sG%e+7j_>OQNB$B;whYL_=Xo z#Ir4lhH&;1fow~np|B+4*_K2@VM)Zp%DHM&BA#tYG!&LZJlm3JC@dl#S|J){o|z{H zK*V#=!?q+c3QMA&t&mYz68&sTA|uxPi4?X)WE2wrY>A7)BL3MD7llRqvn}ExC=~c- zTf{|IuNlBUsn-m`zbbSozuuIW7pK-QGGkCdDi_dcs9QWq)xyxs-?#2a;bfKH-+H># zB-TQ4^FUmWkxB=}S^+f*%|NL2b)g9cIPgRR_GlSyCL!8Dn(=5RLl4YbxH$~nUCIsI z_qV=v(`jg19FA%~+9V_T5Ic9%*wsO_tFMjn*E%x7&=P1J+6nZVn@&S3@b*Xr1wnoW zHuxL*YRCepDK9_?+6A{sYAi~|#6E~@z2_+0RYm&Fqi7(3`pinA5yrE5Qp1!5XuTWI zZs%^8Smcm)JGE78Z_{r7SKO$hva}`lszAJe$a!t(pI+No$xQv!-0SrdOi$$9sMGPEeH$ST7VXkB^YeMEdjMfzi&h= zvMZ(~I-rJ`*4sEF%X$DsquP%efalF1s1zyMIa2~xu zeZ41ah*3~@#YVAhXU5v&J-jPEK5crdaeTqs7_?WjeuxV;km!iylu6iIH>zPIz4Q>y z!Q>4%m%}fu723zxlUSO|f~w&yNH49)nvsP;oMu&;`i!+Oig-Iy9(z??W`?od06R!J zp|M2zlTg8;bY-DF4BCZIA-G&tU6lP*HuZD#fCqz>F0DqaT6K{Zy%AKW0&p#~exAk^ zl!7w3@Sv6;z?7jBxcUH2hj|=6f9yr$@n@q9?cvSPaZ_VfdjgnPdsG-r5A${PVXZG6 zLmVQ;FVcoR7OCN`YwVH2_eBMapD19!QLkWO`v!qxAwePC!~ZStpckm@qNOdOT6*Ngo)cJ=_y*d22zDgpWNo2cEGwW+mL7gN{!@ zr^-g1Jb-@mUI0oFKttBU{`>L8_g3>U>DiVJhm&K?d)sR+4aLM>d4kC9C+T+7087j| zz!~%H7ux_&0ehxfAHMq?d0v+&w;% z1FVd<069iUjxdaqu!(67^N6hD3>;9Q)-oON8*nrzkwqX&PeV++hR_jGm8rnJo&qW7 z(+9kD>lOHVUWM}=hzyYLJXk#ljjca=Qy&P8hl2Xf_X73x11#@<0^XzElnVv)myrdW z!t(%Nw@XW2yRF8BZ;)#N13nxDQy6PgV!+!v( zg%{;{!~atJ)q7qU^=8~U2(Qm*z?9ycsY3yq_vTy$kPa}16ZtDa8q}vt4q^2N090MT zzIz_)^O{9(EjD_N5e4bYC|!HF-7b*)6>$yVq}O1>{WZ2%6u6RRB{A^Az<{JFprpa# zErsrNSUHB!{hyGxi0k?zx(3zpX?3~?)*Yt!d+&s1g28#k8Da}0EQZ%5(n^wIu}@0U zYm9K)H3kAKbHen0B|cd17HQVY7@+p}MFj#f4#F^P`{YbXIe3jPeT_W@S?)x+`q98d z4OR&n6|0c6^gldbPF;U)!d6c4gC+Ft<1}iIV=QCeZ_@tnjMs4L4w=rKe&D0N8rmJy z$*sprdC4^?k!JNS#A?bQiat(Xa_Lzeqsa|ECJ7kw2p7EoXFwvt00ileH@|)e>ko!F zpo@tX;)des1AazZsmw#nL}Zy2M_KULm@~;+%|~$<=L}$R2i`MN;z%s=lxAIp$-%K( zvGN_d)fJ$VE?HUSOg@Ogpp`Dr6GDruy(m~f4y`!-HvSIyt-ZIJPBb=9ONfQ{#+*wI!Lb^5CZj8^ z{E1;(R5=u~}YQ z^g^fjth#UqBZUf!Dn{Zc)DDb>$EWUY=(CnE2El8mfa`R6l(xky_o z_q-qyxQKcIP93#pp)ZwUCVrEjN;rk_Iv-BmSh=+Y3D_=`t`f_(F2%jQf(3OufDmBT zy#iZ69|{Fs)BS(4WWJZquvCtk| zvH9sJ`>Cy(hX|^f*a2|R5YO;%R`EyEd5~^NtY%{Fu^Xn!HVW$#;dJbRvQ!+i9>uvL z)!x*XU#`a}BRl*((bl!TYKrY6ryp;+QyqbAI~@ zt2$d`4l?0rk%vpcoZblHc*oyh2|;*b*B6e|X<-9Kq=zR71u?J&;QLAm55qo>=K^BO zV+qIUT|sDNaZ)z&SrVH?dc$WT@Zz-w>=ssa2F(eAB<+#TWvoAXNPV%X_l=JLu8B~6 zTy${0!fERm4vv}7INrG6&E(ng+*5cLRFe|go!md0?R^6E4Dk~>OvMW6bV1De1WuAQ zk4_iyU=kM@`hDIOeLO7tpUlJL;YiWyY;1h5zB41X?A&9(l`Aaz)vBGsC>#vBb#w%_ zznI!0xXM@>Eb#@*-qVU7ttGyLAK|2MjF}enczJ3PLidUoBq;(d93sMuf3r&`Vg@TwX#P4;&{ zihx|R%Z4=D6%)I;nn?i15C@vx>yP`;Pk${16iyvsA380rp%b8;)=zQAe=(=f2cOlw zc$B3-M@c5@ER%KMF=&}BJ-0FkF%?nf>KDA~HflJNy{V~jrzPYAPMGOEcySwSiE3F> zI&agx=s9|^Qm_}km9k;o_Z+tWG@e<0&|bl}+YhpH_JizL-|+H-h%Pv&M_xCy>Su`; zIW%oN6AoT>(Zv#|*q9_w?+-oTa%WtyFi{VOaxr z@!9P-*C%S?BzUJ~>vc$3j@`Y`hk( zO<@r!Q(q+S88!fc4TJzdH%$Vd`L!HWO~3+&`ba<+J_X{wg>aIgY_%+#p8$+n9;if^ zr9OoGTIt^gAoCRg;+3`ZWowTwley9j3v)vvOYW`xfPSyv+5@$rTeL{D@wK=;=!%OC zHO{z7^V&8td`z9`th6TF;q%lwegFoK%Q`3;a`re5`Xa_e;`xosB4B)A`xq^qrVYcn zW4mv-z7E14eCkDQ33sp=ksneph&ShB1CPa9L{9{)O$A1z^u{-MbU9gfeD>D5Yxhg( zH+xgUw>RNjd(3nmQso_g{37S4KiOlVE)PIEZhW_ZnEfGiVVF{;V@~n#I<0DBbG8W` zX&e(z?-`Nsbxr{qkNZ5FwAE{}*%2P34o7fBcze3{oWr}Vy@ghKxVbZi-toK6Dv;HJTjR*#uX!wwX043AiNUD5DvTUv8ma!1l z&gVY0ESo*fKgYu~_Ui)EI43mmloDDTf?^R(UN5Ed6G}R-qcnj*JTZ0oPzf#79$98B zRRBt9Z2g16(>_Q__hXYyaVsT6BOJoZ7T*mA zl|Xdovc(m+>zmBGxkJ+sqFi_>7zH#X)*DnBF_VLH5KWnlbf-Sc4v=tC#ZdIcV~e}c z9ybHzi_ zm3x0zz8u_I)- z&}ZxImLtn~ivouI*b%}PNqJWN&=GQSq>yD3(Evqwv|dq~Ry{C4=>iES3Jya>0CL)y z;f;$7UKTXNu-Tr4R7YSgo+}`Bqgk~}%=tCtr3nq_e$I*1EaK^x{R!Wp^R|Gw`WvO@ zFi3DL^omJl!vef)19S>pu)swdN9q)cnMyi5g?a%`9Mq1# zO1(gz`lhS*D&1lTy`MzCnDPPjiX^=ONLC+Fn%K`126*-AD*aD%Exk6oP2Ryotp!;Z3* zcSy!GUeXc(Cy8XJVmD|?%$%M9&&Nr$8;0mo5*a>3xJ3?J=-gcDZNwP`#GSQ8qUk44#M5dl_U zhM#e5VtI%=zN#WoCKlP$@TUYgAq(SsQ4@e?ja7QM2YTQfOq1c;GB8g(Igk^T@a>V` zpBlu^j-M}vzh?~a-DE0i&YljZ%m5+A>Dl^^sL8VvINkt?@K8nB%D$hTjCHw_=*i*E z53VN1e7obKlYC}@t15Gr9ssQ3zIN!45|whOjwDyxfHEynC=Vd+55%b$zQ~39ak$}y z`wjc=kJ=Y>R=t9jK<#Zf76HbRbwH`mI}j8-f(QxBK&%L~Es9{>DfWW?r^=&aIZYGj zxU9fg47E;TtQS559-`m{Pryl-^b6ACw58!d-!NIu>dJ;U8on+_ad3uhz_=Q1)wr>! zGwDMzo_dP5YR;If%Prs;p^hq6(9TZaI15~S8{w}J+hOAxsTb<%dVMeF-1!BGzOdsrKtoC)p zw8xDZ@cNZ+qB%{s>S0>c<1>l!^c3G?%7kn_B5mp)nzM}%fS@J>8bvZkeF>)|(hT)j ztXxFR2@&HlaqsuY-Aw1ZimmPSQw2rcCd>fPv6eQF;DX2Z z{$ysWPXVMB>aO8a9tH4G!?($ZDC4_yF82S#`Z0<#U@HycvxkpYcd8y>T2v?DZ z#$^3utvNQUEqZ|aI1{0XI4FC5WkQ*iINq%-7D4Rqw)r2)!IoDvfW6}dvB;#R8~?%^ zdr}jWp=jR-x1u>4D}?w+)}m*@iRq=d-+leOoF-GnuW8U9qF`wFc7Z(MCnt9aHGav2 z;SIifDxNDP0lnwy?|6R8e(RA6bZO%J;(`9^k;&*UQ+1JS^4B^3CTX|UU7Mwu9LBEO zO$q0^PiJAjCVW}-xq-vGFLIt(M?;y4vk9v~TNc%j9By3JhV^alr3ykj-LyYf3 zMkKYr@hsp8l_JAV?eC09Zj6NtX9|`x5D8zQwf;NaqFAtEqMcr+cm%m{o$ncb@DL|R zgm+7hj8B$@;o^-$)+WMG({c`6h}$$Qb|r4fkYDC@7nAH5>>Ui5xAE`>LTFyX*G>M+ z@wZ`M+M*}Hr>nJ96UV!J2nzl!!0I0=wk$VDKzjH(@wQvg8yT5~k8+LQ1>JnSAd}YC z{yCsOL1MxSk~&s*cm5&ApATa9rheYjGzg01xYHjDB#0|lfFft3K)zL1M%3SZ#7uXT!} zrf-M!#7>$Rp5z?HESA5(+WZb8WUf13%E-P~S|aYe8I||$q{vKuI`=XdFKkA%?4asY<#rb!?szXlkd3V=Ty3c#Np4?vaww*_Dv0PN-W*WB|8-95T;IU4TS z1P{}A+o=2}F2&JNJ8zv@Ta}Vm#G$9WamtlyLu7KRs%okFaas~7tg5<8)pAi=cj|I$ z)yiMX1!}oU_d!=x)gpD@Xz?q~k|BPErr2zK)`nP%+s0n0Ny_)Dq6^TtOYseW(M$o{Ec|7F-zNZsUS8QkU@1 z54nyi58QR7>}bQ*nCb{6a*)8G?#ZeP0pS zRXw~q{Ppu!$7|qn$AU(`zhQAig0bNX1RRz--F1Fu+gfi1NbF3@#_SPl8T8^Z?_F{k z_3{a#qxUxCV&zl+4X&Ps89LxXw=v}75-w@PXK$R3Me=1!>bcaRAJu)GkwdAoA*0io z5fShFVsQh`%=;KtS^{7}$5{QwU1%>gN^d^egeG;Z`mm0KhKul7IB#TA>Bz#fOAXF#%N?;8IG2=GsWlt=takGQK(2`#jp^YVD$Jym_}kTf7lBh>PGX z^SrEIzlaI$FEGR|dkGPs;X-jc^Yrlc$R@E;q8>UB`K`7{peB?i?CKqfb=AxWJ+fi` zcZ|sH8&fz~5B+V>@YTqMk?w%oZ@emps>BLxk|i2&eZ9PGxflyw3u}pqaC_{6qSSQg zKkiEUE%*?1R<5Q)**al4{qImG?%PgJ8TKT0@=HPsjzdZ=Pwt0WFc0wOxjUG32(5Vy z%Ot3Hwus-k?3nF6afUbbJ~HQG5Gw=9Xuc; zjy2pm-&0ed^u&imZ^gZfmm;50LiU|3$>2hU-qqNC_>JZ1B5vp!H`M6jHWtr^uj#fd z(J&@1WINELg77x7q_*ld9zv3{EqINK`|d{4pt3yZ7*YS#*?8o>`!h1qx8*q#@LEiG!R_0! z0l_^l@H3N@_i@Wg+>t1yt%Lz{+kWh0!bW2rh-k|SnS;N@*#s{n&06Q)pS`lo=dpa* zR3s)AXK-&`doYS!J8@?*^=Y?yowMxx3@k`^ez=7+m|3_B-)|E4v4UZrrLXxi(ZIQr z+tE;k=p1wO&di3MY<4{y6dt|jmrT@!>=)v@Rzr~Z@|#)A@$D`>s4vHB)*e=Jaekk> zi^C<9<8c0;S@JlX|G$Cn+!ON$XbUoyTYmz}4DbwI?*qMJE(orCO!u;jV4wgVgW|eN zR8X?w9Wvq-8)MFtJ3m}dLf=$OLTv!4wsWlv<}K9Ea&XS=mN_|Z`N1GK|KEVG@2x>G zX6t{YJIU;qTI`pbNnX#;PU!Hq z9Dvpu0vD)!lr5(W_t=MluKyL?5LSNPWPdRsGDXhYy4<|UBsp(xaTd$Xn~KK-dQ?!6 za5usX%pXNRg4FYT0I=-zA*SFXSM>s^-6jH9W&)d_7>83|| z)bodTndyEN%F|`|R^CQNYyH`q+Dz3nW{+{T)1rn4*qMO6eimIN=u#0ewiI}Je7tLZ z|7i0oR1Ed?;NZ|ldQ9h@c?evI(Jhz=6-jI&erT)4a+M5W1Fypw?JUIU-`<{Aaez9e z$LcBoU)~eOPRYdVO!CVdACA6$#z(gn2XZj(+c@eSisz~qu_suxb36ixo%7EjMC6#w2kH2e zJtll#h*kc8M?cN~iYZd$@BNHr)X}% z{wLBIE|REWyUk13UymC0*XQ6mp|fgo5X0!Knn%>`tg0tsAv2k9zPk*!uxDY@!G4qB z?ih`Xcqam5IEQ?vKl)wCIvW|9guueiH-HZT+aWs0JvQ zuz$V)35NaiHgzGO@x)+tS zm;2S_0d=7_3wf(?G3~pecpu_#=98cAqD? zSAJcPj&b;|)@~3%}t#iq=>eZ%>I?*NVby_*% zw`+(z%6@;i&9?*A4MJ(bl(4@UaSmSj-1vq(MCrx2NU!-P6bJh#qL(CDY_$3oate{JTN5S<-6f(q{@~jr;i<9uFBdzrwq?zKP zvg~C==!k~nUvOyUJvim1w+*LpVYON<AbqeW)1(ji@@7YXq zJDsEV(U1^#(z#J3T7E1Y_jtqM=at2f#mRW$PJ-HP2cDg_%#;rJ3KmO;2>r0Cv+Nk% zvGqK33O-rve3bpvT8@o$-RW5WS-(I+_d~?_GIoCpoU4Y|gDINS_aPptR;GsaI!558 z8)7}xBc5kaW{iIqVc%efzXSQfbpojDz?~W^JOS=FF-R=ub}MZfe)-GXePU7r9%@S3 z{>z3K-TMIK<81Dn$&Eun2lOwR+(WDnrGKrLTG2qkLHgHvrGLp1(7#-B8?ndI+(zS% z5DA8Ex(E6U=wIqcQt$fJ5?R#AqyyHrrFxBJnc-i@?9=8}Cby}|D3copkjgPgG%6Lh zNtdKp%rF6Qr&^BMg|0~I3hy5OjEn%la#d{>KV$Xty7Zm=(&^592q{6JNgNCR)_Nil zLgtF6HsS-v$_mt0wP(%-~E=1V|9AuUtUvV^FokgoS*pddrs zrckp9gT*&$#O$pHPrnB{F-~fqTpvlC3J|ORPr;w|`CyTLe~4 z;cg1Ism%Sz#VdTNLa|sL9krMT^@zptNGX}3IFo%JyJ^dG4l)%|Z88!D$EbaA^(?%l zWeFp|UH;Sz>VjbcVTG4U$CmQG;mtfWDu(0wR(52X!2RfKyU@9J{Uk6k>1;E^;xgRV zUHcZDZKiUzx%J>|`#ht0u!^soZKrRPBAON8Y*W3$5}Q&DROil8ox6LWbNiv`DRDS} z%LCq2CCZMIfXbIT1ec%rfVfPRWRMj6zk<(Pj~)FI&T2{?HTVl>S%FsdAvYb9w=EC#YRH2dcI4sNVc;6QIaX2$eNr zXa1^tKSy1=Pc58dxl|87eZtCl8H+gh+QiMFNyFrsPA=Nx(CiI{*s8A{jy4fa0kOQY zj3&0EPkdUt0pG*xz@m#d2*XT%10h4xpE4b`zjfsF#-QlJ{#JaqCESI|7tz*t8_y)3 z1WiVup(*l*l718$+cKYf917tdH4p=x9&V;Qfq#`yf1wPr?d{DRKu1WMUkp;?$4;Z=)PC1^}O-8dMMWGaU7znXr?~iyq>Qj zfE%F7Zp*BFm6_~IkxKXo63m=Zot!~%Z^HStwB0;fOACI7O&o*mk}5p0aS~+zaS!4fw;R#L0j|$zTm5eUqxGDW3DL^P4zvhwh%|<%JXG9SDq2L zvW9*0U=uvP?uw6Y!)QkcQ4ySep|!NZ;;`P`lf;*>Wb*SS>`$H$xkRa|FzU(=QlFn! z`S2bV_+;h73vf-HQ~5AAt0g~-@YcR!xo=JSQ+a;xtgB%yA;$D!o~wnUho$vEL(}j* zOf}PN-C@^MB+oD_AMR(Hrx}$G^9aA>w=pbfaNNao^?*R9{F!PvSNCDr*z8@nlVuQc zDt2ZO__`Ct(QRh)QN0wOLA95#oYwLf=Fx-!*76{33|qcX+?7F|T6lTXvx!*JJAp5TY*p<_j~&-L znDyKx;X_mgmbsoR^5BQ(3@#&_S0sIxAH&HXY8MnLew+DY2 z{2jtye`*)&f)B1i2L_MlgH|6@4(*j1_RQc~vc_xl&gPfFGBIM@QDAudcvXg6RBX9s z`Jj65*S$>4tuxr4^B<`{g$_mOwxO#={e95-?EU#rebhLp1j%uf;fCXot$Lu?3KI?WfofWPh$~~{2+!&ihz%jtvcUP`i z05UP0Z+cVLWzNe`A9xAj$6Qm;#a|GMiW8Whl-L3PYP)zg=G(!2w(PJz{jTU1QMpObUxhnj0T>*#MwI1f_UNjQ&EmC4}-uQ=0z6--AEckB4UH|cWDOk2xg z{g9cE&@p`f10j1jhh-DhUOn>XhK-bObIY@;Qxt&nOy^Nzj=pn$taX2~7H{RtP3M<> z)G?j=0w#^x#eQ6HC3*$kK@-`)53JEm8VczYc}wqvzg9t2mpve zoMPOCn{3HlsE;o$;-3HbH9=fxLCG&4{sOs>6!`oa-NeX!0J-vuXgA^+Ul+tEQ1c%-cn zM_2WC>ZPiDJdhBbnLExx-E$Wf;iyL_PV(@^<4>Pg@&sRzZ+@i=6pwFFEQ6E4R9`I& z%9PzS=-`8O$Ag6e#%;;(7h)j?Kq<$k%C}~wAD{#j{i&~7>!klRbxA^4lqpypq{0Ms zy=V{SJuKHC6F#~4hzmtgw&cy1Bn(OiH|ceoO#WNnF!|8}YheXuvY#Na)&W$w;!qSI zG)@jVgeR@#SNO%(f0?DV{!~7wS(cyjb7$ERYL+k4G&2XfV{q;WTRmhZrGM7}V2 z0sJHR`Q3!CPo`AaNAT)AzTA{=>BfA`q4Vnw0-sY@7LriM7ZrX2XD`1dGL^H?yn)km zb%*Hedm)ed@+N=&rs)j3ALj~THtgo*P=2J9ZZ{uNpm&gE+TsyB2|=YP(uMDAwDYSi z@5ryVoPm?c7oZSMCT~{Fh^=aAmB6&+$6M5jET1zopc4Z+=W*(<?*m7%OsV8M(m+^$`v>+};IM5y6IaFne zvn7*oCr_A#Dj4f(-JHUjdaY{cZBR0luqWkF;_7w4U6*chP*d@pJfm*`C-3VUw^UgAhroWKsv zFD@pA%vPxEupJVjvDC!=4Wc@~jsQi6Rt8eYaqtn|q_I5VC`$z&JVKBcL!R$P9&7@j z67Leew-dhC%y2K)E{-7qUopYCFs=ADk!mLOq$zy4h-&Pjz-Ei@r|mj)ewpliZZO%B ze?r(G=3L8`JS^`ph}O4Kvrs*OvubhVY(h+}5HX<8GTCLU2$W%5rHG!BsGT!XI?FyzvdMJ8l0Ljk0$bT+RIvvvwgD^7o%0;7@JfCg#3y@z zFhIxMp!WzyDr$60`@En3i*9C~xt=*QbLN~gXJ!}$*7q6k zP{UqcI*?l%o)Ge@?l@%e+OCdl2F;^oAaQXEH@YM|lW!1y1o4pzlzp;r+u? zokeh!@I1_y4&RN>+}RKGFWN6?yu6ROLN7$;F)wv-R~3(0$T%CuJ50JbSHg1zzBsq{ zuBsrq+K%3siatLXUG1N?s?Xgf?PZj7aTPJXgy(3T5)yC{zJ4TtBWH8^)cidNF66^5 z{n%9LpAn%dXT2P3#|}!xzACXi-pU!>IW9XkP8fIqaCs+HhbA zFWkqR;G9KCc!(CqQYT4e%l_3}sf^ZTU3gX&ou zjCS63gx`S~lVJ=;cznt;|5DSl@kxIc65aC#f8>aq(eu3c6xsfk za(rDIlSC+B#x#xjhAtfrx*i|FLah>>>QwMt@x2%-1*ASoO^KgkALmvxy?_)gkQ#c5PyY=?nkhNz?Jfee)T%|Qvza0PEDPh~G9_n0r{F5Rx)Cr^0Z zjc~OVsw}7C3MrQu{f}81&MxoRj!o8PqX?o93*ipCENDP^C=GgyA(Hlqp1TXv7L|UqXRYtt3KCkUjlXrw>8P-7+9nCAOl4^%` zI<$k{RRVj(;o6SP@e5Ox{0AGI8s?W5`l-$bJq34g7mVWxFn|8-*`1uAxOSdDHrpl4 z%6z|><(DG4@>mr)gBqpC88Dqv^?9rp%chM$3$fCv$8ZWXaXF2p}VLpZI zx9xWb(Y`zfq3=0`Bk%>1D(tttBHLWnx1mCEevvRIN$kfgHj>cwJZ`zXw@KB~AgsxBa$$H{^69?hx?>N?q@39a2 zrf!wX{ooDiT?=!Ah;8l%J9+OjYgg6{qSaDg+43dI)%IY?3iZsR(kN@ljjSJ3drjt;X$cDk<%z7i-#UN>&QgD|n5SMw|yI1bs^^z_3J-=+(S9tC7jas)XlM z0Xov>bZ?v}vr3q!m~$$DwCiYzla+~}6IGDYkf4~yVaIr_ufH$3f+&skDBZ0n8| z+MPl4Y4`N3(I=0r~lp-T?%GS_Z*TQ*VFotvcaJ=XDq zNXNQRmJ|j>o~w{|HhCM=-6lp6{@BeOlI7I~vczr{5Ugj#&o+eA5-Yr5uPjg(@z)=H zNQId{Xq3e=RyadN)$n)PL-Lj$2_zqj4c6HmOL#=>f(y8k_NtQk+T>5LC&I%}+`MgVHyPwXB1$+TB({{3a1RPgzUJn8wwZZ(Vamt@)XG zO#x5$p69QdJHl7_Ia9BQV^dBx{`X!&N=cZx zA`{;vpqkD%2{Qd7%*C(=o3a0;;TIA76u~HRWLkJlm+5?lZ=YO~AZCfam>;1*hB&JN zT8abYW0GGso@0373CP%?spW~De9#oA+YxZ&abZ+2+lv2Va}EfNkD>SmiZiM4400+o z$8&&-({NaQO0O+Wz9%bkYjw10Ht9tjI6vJTDaxrmx<9{Rcj)3&KXI9|$O@c|7oJ~w zZKUe8Xw?hYQ&HSv>0Q{F0X;ZBvj?l_LDhl3BaiMt_f2$e<4GliO3(f+-LtRds-Bf@{izgUs;tR=_3^@Dzm8S0*WRr9_8$AN zz3$`C$V`08;c{tn{2L&{bbi7?O4DC#E-pxT_FkbndN#pt5}eu57T;gl(eIH@I{H}Y z=mP2J5;|JRcBb=3gi&1A0;p-8_oQGh}{hjgr=;9o{ z-sj8ok2Mz;B|MK`E|?(jB?)wef~NBy_yi*|($)Bv;jU4V9`b)DpJ3ut!Nd?=PIBH% zHrgR|o6eh5Y3RR5rl9I_t|CbO=`;#6UCwj*1u8;K0fGbJce(BzHqvhvS#y!Pv?d49 zRxz;>uc#K>cF^2^y>l={vAQ2AmZ<)K`3%}8>#a|fwlZI?ZS$*)stRF(H9!4?bqg|| zE;-*WS@%Fn-(GE29XJ50i-A2hyT|&jELVcE1EDG&Q8$E{jjrcv$3ow3lu*;Q7IPym z`bs`Xrk{#@ubnj|il$HU?Fmn_Zeo342_9jHSRs>|cNWzvlL^l!yX^A&blwm5N?tVi z8xwKNxjpj$#`+yxErkzvKhyz_?a3_0Zx$AjBsHeFHB!hHtgPuAOoSp_rY|Q+#Gqfr z>!mZZ!ai9xn-9wRSGePEXn%#_bZ*0kvMu5H;W{;Ijz|_Q1xqOj&)9h@$G`{W+z4nf&nY;*E!E(7|2Dmd%F%ldYB%Q1iAjD3n;#)Wedf5OAIfD>qO;dM45%ZA`0l>q{8@s zFiUVR@JR-L)OifS$j_HiB||If9KyHgI&vk%29*JlryFY>EBbf|R#j77mX5IJn`ppJ z4I+Pv9J%pjY8iyZD2 z2JZSFgBr!OQHN5z``xqNR}7iGzeJtC-YL!49rjv@VF<)W3N|00#w`i)Rl20^!Zs3d zgROG_u*(pwgf%DSRcw(Ti*puKb!6=P z?N*FDR%t4UA`{*Wc2pCEC$&7l4*Mp5W#PFGf$X9F&d#Fchp-q7XMM=6hr5e4R)KOnSz>;irtw058}yEj`$o7y8=4PDg0)4LSMjcegwIiOz$aSt0jwlYoeo#j7>! zxn&*f%;BJ+3d&I-InX>F7ITKr(w^+l2tV;6)I~a7fy8dEYm9W~)q(`nblbNJ)YPFW zprY`H$-q=|l6C`|0x(lvENEs(fkAUoKJ>QJi`<7*#aR|~G{09u`>2G#UIP2Vf1$GR zJ(t4nWR|xHMv=wbXnJ5X1sd++oP2k2O@1|-tu1^5#ykGj9!asen(v@lpz8~|w-4fX z7P`h@K3dO3`Nez&iX^O9!n_hz3Ru+=-Ywy%D1$a&*bNZcE1`Yi-vnAMsUg526dZR% zfb4B4C^34rK=;$&CfhGP%l+*GI|$>FWFM&x;=oH*MklEbA}lA>Ny!eHpYEVY55!bD z8pJu$9h9g0VpB#H|7HKwJ6Y^Wq?{x@se1icz(gIuL6pM3;kPaxqn0Ihn2*tAIs-er9UOl`tFK2IW(WUcyaa(LDAeyC2K zF{)j73frMk3!JdOzAZ~8*3tVc!9Y3}u#n>r-#%_J3he?5FyBP3py@FhI) z9(2#@44Qk@Yw_@wumKOy?Fh80@zLL_wsxKAq5%ovU=p71tyQ&z$0a;R;WZD)4Jg%| zy+&)C2krkJLO;Y?iApR>$Wd5A(o1D><;{gj@Or=<4XEGXJ6X z{gvCB%PbG&W#B`WUK*5KQ`WIYNo{&XExTyD-~IdNwJgoU;O?3OvW|Sxy{?#rYY(zf zOmKF)vQL# zfpGE0gP{@DJz!>x#QTrmwYJgmMwLv%)9t_2na*%}Zxd@?&5 zvH4jE&u<9V^GM@eV@S0}&6gS|OR?H)6{5%!WO8t}NA<5YlK$Nksrukygb;VzPpGQP z`HFntt7)J3UA!A#3^y|aPLSGvz!>+Ny?lD)vt4~25Q)p{XOwd~T^J2zqsbl<(^VMf z%2%4k`y-WNhh|n<%dmEkH+zv;_gZICKw@9~S%&D2)q<452XL%S!p6ruojT}`5_B~| zn^1{_@-^U-$1;d`zIj}ibE*xm4>h^V8bJi6+15LV#!t#%oUipwHi=BhX{q%ta`h5! z&d{a)?FfKi?6Twug7^14m|CTk1U28$bC(^W_9bI896jIF0ZIyEtCBa2S|vo!M=LDS zwCtB1us#+Fz)ZgLDD8f$Si2jN-?qDfg-FuC$7cyLx`P(@^O8&N~nWh5&pe{tHaeT2Hdw>_D)C{>D_|DXcR7Tf|lX#Y`>s!pI0 z^d02{X^cX{Qp|(kz`78fvUPY!GU@m2q=y8*MUvoNiqUdlxg>2M|0ZkkB*}1j{uYL% zVZ99(U`;$8ltrD_?IvJ!sq)XDFzdF7c2buleN2*`ca$A8NP_MmNJBh~u9SrcKJ5pR zZa<{#AbTK=kc-C&*|cE$WDCQV1&=8p)3oe84vO^2EQc6KzE_!C*2nzedY?Xyq;!zl z2)l^+t4urVJ^pe-2ivmJdbu0oc3dunK;_kpt;HK(e9<>GAN{7yfBt4D&C`<+nh)(N zwbo5mL8U!IAO{(X3to7uEx&*e?nkL6WT?^=I*HvYY|~wlk0&?v#(e*b^bK8?ySWfZ zwzqcHFrCyoqt^7u;UVrbwr%&N`_rFTGoUhGILMA>fp5r^q7Z=?6e^ z{k4YMc?OZ^yX3*bCekqiayAC=qQz)C%xwZ+aj2YqD+S+Sfp4aQFYjT2FFrmN5dalc zdRSJ&NFM+`AJ6mGb(-JYmSf#Zrz*&z-zx@mpA z%Eb6N@cKxlgVl`J`v8O;f(SxD^yfvO7qo+Ch7) zyBP9c)|Bazwr+beU2S&9JhNtp%L;u(`T_wp<{3xXzRg8mRE`w>mQWKhx9i_KTa-4V&e^%i=Jehp@B6&R*esGlWaiPq~VggU#Dk` z9yPxzbmuPsxpaPLy#Ac2aP8jMDWksXr8}haH-cI^91{ijrUi@#k7958r+KX|??aF+#gEdTZz|k}7euOBrRZ?LZtUud2R7DUw^wddl85P} zu~0w1xoFRqH})8EYx4ajq)!{R({_<8Y>w3*EqsRYlv=Pgy-+-K;btPNN(L_27F8F# zIiA7ExyQ@~@%@*3 z0Px4`Plzr=<|GL+oi~URb$&u0O8QMwU)1?2Wp_FE6F4Zx=;(4jiO(TXrt`HsB}EN# zt?7K(_BSRxA1@I$U^@BqI(7vkU8vd%goA*$I3JO!kt8z0`8wSK(qXSj#8#d!=SCv#duRUEL-6hHD{L^_Df>(f96BfCO@vvPRI?^9I zOo5i3i&@M`rqT{|l|; zX?b~yT1G<9WW)S5dize6clPmsCWuHEbKXGt0Zg;N822jIl#G?>Sj&x&Z8zc3BU%k^ zs|B^H9@b~d7(_rupjC1UDLXn62kW6en=V9An%MPKIx= z!=>+hU2P@1fJ#90?QAOv;h8C(L*k(^|74MnLg0;!-iY&MJ{?;M_^^(4!&=v}cizEQ zEe4Qo$jndekRG&4lMXO7nNk)Jnwcc%C)%@0`$m(cGKxr$8r9Ia-iRX+9z~W7caTLk zLM30W^+$B-BNfhN~XeMN|+49s|+-P7; zWoX0M&oB#JcFv-N=WOzIIY0anB#D1!;rsYxwIXV&ih9Y8vc5}pMf;J&VugQIL+(V9 zz@SE*50Z*oRSN%zOK^CTQgFx4dI{ z>ol|&qx^MeO>do^FPe*R{_@tV^3hkgZ|O+)w9XQ&^G!#*!89b8-O0_D)gyR2WpOUX zptEB^qc}9)JgXpBxxXnN%UWI%W05WLDS5NAbXMh_rq@_Mcse${hS2+^vNawnym%y? zw1$R2WybT6c);9e-NdJ?$!@c{q|+MDlUdyk9#Zb0tLD}_gL0`^t?u+o7AFzD6 zH~vFrl1xT146E=>yV`JHR|&ZY#4achw!@s+=dZNf8-7JPbLOYwk1*Vf$dzJR`)vu$ zR$_rtkp;3j5A>X{-R|~w;;w1-wN5XoYhKeGE@l5|$Y#QXM=NyVv-UCWLBE@c-c2;UXjwVnsYw#SN1fWuG`uCH9xPW z7y2uE*SUNsb8@`llgz=8sXW3%$HY;+E-G11EC1jKMDuDuNNx5`Ut(WIl}-05;Da$3 zSNr--+-6LT-oS$H!hsr_f#Xq;X{~?MgyaMBu$6~?Nl!L++w(%p&Gy^DWU$V;`v>y% z%(T-&!%^69odQ=X$~$MBenu)gc3cLS{B%dereNA>?v3Ba4VtrEwX!xurL!Z4onf)p z;r)_NgHa5=Q|zG(I`(uThaKVJyni$>LPj0}jbg(btn(ZJ zgl6Gr{`#_?s6}U9`OMWP1v=lzp*rDb%!o8a-l7iBX|>Us>^`&b?eCMx+0EbVU1YfG zc{9s=_&(BA!9$@(>WaumgkQX|3P~sx)G9$2R5317L86t6&#wAzM$kqHI<+d65wt;q zN~&(o2)a&!hE{z?g1AOlYP^A;`CaiT?%T)CL{zsO>Ax(hK>QLc(Nw|efaG72Fpb_M zTb`QVwo+OKh1e;+A9+fjFXG0V%`YW~M|jdS=V|xwn&i>KwlppjmC4VnY@Et*M-lEb zKXIS=S>iTS^H(Bck2y?#3leR^K@S`Fc%hA%Oto^U2pqM<( zdH-*LVxmCt_JT|(enL1<_}pi5&F-gRGTWR>8Vt$L!wB7~N|c?+Pv=uc>kffP@eTv>Oq z3C|-^uM*jljc$@IpwVJbPNS=njYiohEvNZtN!nC)`KVxDg)(%b=h~%}B|MdQGaJ2U ztW-CS&~&5o_!8~7v<#ZdwFj#>Rov`_=B5N&d%+xt4-x2ObfbE0Wu})O48|tAevOCy zkIBEkMap|Aa;3`=_WJ8~ZoM6$M~=tE3R*aT`xL!3*qRM10@jX~HAmKg%9pQt+Frk8 zzn^h!OFJ^8u`WRPuIut=cLcg}c7QsVu=rn-tNFhh@2Kov{kClRz6oR=AoH7_2>m=& zwhYHau5~#?=f&_IG*{xDw$9>ER4{rh_mlFj$7fglRjqgSo@#+=6Sgof)sh&<1?)G3 z{6Ni96rtZt)G+$%#LVy<01<7TS+EO%xt%hSEwJ$`H<}|a7c0FssC)iVRs$-kiX*KV z;Zar%cUr~fjK3#VF8vO0hsPorhXyy(-Nscvbg;th?a$WJ*g_hDYl=)n-d3g1df49Z}~NobaI7%wmBCbL%eF0U2)k(=PN2{gu>jAi`KD0+C>3 z9VJ<>BWDIpi_azU`K%H7pL zC{FdKHAC`|Dy4c*Y3S`ztBYRqi#7P6103@wQQD+6qrYS0)-3@qv8qOKFijY#_?>@a z>XBUU^mvJlJ5%Sc{=b|5Jtl;@8HHJIUCebU%8r7A<`|jxg&DF*8i*+m;mGGGR z4B&?O%}G2HH>?ksgZ-MC!Uz03_gE$@Lu!aR5C0+~A?xM)@*OSwKsz65=OY}cmErUn z-kvskO$rqJ*{n|L>4V5S)#mf+O#A0@gqb@q4#s?+NBTy%ua84k{I>$YN9b+b54JgK z4l`|UX*~hQpZ!eYb!f?@QlnY;Egbcr7j&sH9w1_gjyShpglxji(-HoD5u=DWT}Pan z8DZ_F*-VW11=dA+PRLMp!QJ(&73j=Ow+kM*6VDv%plR7-S#(eNT{9V_{Um!H(J#=zN zB*Oia&V>|Jp2$NTG^P>aBIx046?ahIHPgik0l3n!8&{;c&V)IAW* zDFMJd0F?c7DYVf1zEoxI@g@EmcPdA~&KIzqfE^wlj4Dtiab8VSfd`pC%DVS8q530L zeTcj1jY(@bx6Ifa^?G@(u!S@X*Xp#;waI&k=J8v=Zxz33{NC*&ozvmW;wS$*v-vrl zIaz9SLvNJ{B=($E-zW8phkhhH*PQWHTf+V6 zG5Tf*PPLNN%Mpf^5f4-G7=0|X$zN|zAOnRD2#!h(i-WFf4}M34reXA z-NyagJ{iuJq0Asd268{dF>KM6)BTI3w28~Bs^E)!T(u=_QhUbBKlr`un8!xUUT&)L zU-ZSQ9g0ox*X^>7(X74LoJF0-QBxRJF{y!1S0#h5+Ha0Kl@uZa`rQu=UrysLOKm`H zvbX7BJwN#U^2obbly!dDS2z{3n&1+Z3xm7X~H}d7HC3yVLlUx=^h30)gV!rL2tXxl()lZ9CNy zq=MxWP_qTpNFF*viTkEfsfFE~QXqZy6Dln9p*Tl{k867(eDo~V^`U%Uk#$rcHX|#{ zGxYo7g<`Bn46Ur;6_*~;jEQt61mt``Hogf@-jOAZrd9t?pb>QA8SumMTtId|h0RQ%H-n#O6|IiBJre@M=YA?nLtkTGc6Z0||263v8k! ztxzzVU*6?>nhgLUZY?u}j-7G`^w%F9HyiOzM5Wy2k<*QEw%`1a8@|<%E+pLY-8_{f zZ;5bd3w$$`lie*>l-k`rp(cATz^i2Gw#ob?jdb?dFYD~VAYt+6V!k9@{o-=fzaJ(0 zcR=?_N%6Q&vu|MUb~%=BqJQb$n%G&6@K6~wk^#k<1k%6Ky~q1>|GpS1S}xt|SKW(t zKF;||p0h%=t@`(X>fg~d*}K2k#kAvXfs8hlk>2iI2oJqGUT)wR*u7$bMfYC#W!>AU z5!;hBu#XXzHxnlR#xo;%lRm+|O>;O<*XiG)!xPu~D?6L(5V$uZG7Gl>tF*}ahmv(5 z0S7{724gvWN~It+CNTH}j4Yt(3l(%Z7Z581Bwo(>x6`3K zee1*SE@vgdSp@e)_+vWD_(X3WUd#SSI(y~vX?W1O-bySIP|qjSEXOZ%Sbv^LcrKS< zDWx~Gy}E)`^+0IaCONDrhNKuppOq!A3zaH5jUI~B42K`e0+4MXsF!zWE3NG3E3(78 zcqT@@z9DOJ|; z@yy{#o#ngH36%==y$Mej`KkLXz4!#o&!`zq!J%h@**y}*TI8#kWvCT!?40m#sdTxJ z^n_<4IWeVEccDp-FP2qfiC!kKpM!a^j_(pQ0p+VztVhLm>2J9=P*RU2wVb7WQ`U9{ zD0W!jsY*JkSDs?nEeBajxldFMF>14^gy%8h>9D#!xz*5?Wc9Tb6|A#+bqB~AZk-~c zm>MCWuj?+Q6u~bQfmLP)=OR^UVoshcDkUZZBL(iUhU^sF*h?&P3n=ZjB$3pgU*&Ka zi@K-~*nDbzhdHN|f>c&RWt+CnCm=R^pY{D75t)=GM+r)If+skW_rTZ|FKMEMFX8n& zjeM5<$^*>-rW=EW|7W$=xdL6;LLGcNXAa7r6|E~Etb&he`TRL8pKS!@vGeDd1vKq4 z3vVDGo-GBz4PVR}yMWG9choB5j2gZIb*!&Db82HJR<$OJ!K+M#QdA_*{FkQyLM)+FlDq04% zBInf<4w`nG&Mvk;S?3*qb=7t8q8hX60YZc~ueu+P&wPn{ey_PYVAhh1UEezXejd7j z7YB0hc7)Ep+ZE2oE}>FQrZfF@bnz~K=V2$uGSRNI_&fi>&e6#nvtlYmb0t^%8Qj=1 zw@B&Itfg3CG4gXGXB0T%s@vjV18~3@zsFs^%2%(7%rf8MUM-Cr{=(Be=4ZFZpFM7< zKySjRU;^pp@8_XGEpuEgJuQ?1Mq1I+hx4{@tUM7f^qEh}<00&PMmj%Act)NkS$kF1 zfK0y{C8)ebFdwJ-qvgC>CDSRF6075bB7NE69K1k3$A|mLsh2KD# z!!sg}vx3RSVItdo1?mN z1Rs6Czq#CoB3Suqkke?v=(t~8K{F3Mi|^<7G!$yetM!okE^Rg8e4p8;ETP`F_M>j5 z_-W&oq7L+%76$*f(jdrD88>)I(_)2Z_ynch0-suV+-*vMgFP(~s!QKIRmE}d4)ak2 zhu@-=ML2z@T0Wl!Em;)LeuJbV`bHi7Kq@+p?1KG-9lb_H->4uV?{h?2Tb|H@a#}`K z%ZzmrVy*oyL{=E%C%vxA$}rC^ZM>8Q;8Evo6eOpKJUP1JglCeS=9A}06Lp42fEcm{ zCm6k}q{ZN~@+o&4qKM(2Hu(a=-EG(NVch`UNI6Gk=vD78!={Q2-6|RB%M;Iu!>g6S zl9PSP3`R`NxnnB`rH!5SFRIZe5o5Anon z_&ZFlO)dNbumNLes&z=WGgOMsnX{4ncpcD#!ro?`KJWVbpxU$|NV{`4B+(NrQ#3pq|xU8n#Vf~Q{ zE;71|3FD=hT|VWUVD&aY`lWdJHFwx`cUDKWqnC^|D_>mgIg)`fOV-hjnd}= z^n-FBmafCPDvhO#?)~!qJx%&|Kf?M~_pjJ%rQ4mBmvwvpU4LHDuiSxvOjhQaz z+rm@uPtO9IpGxk(+p9%usiKC5g%Vs29X+NM2r4^6Yy9T*a{sM_FO5_fa@+FFUKOw# zE$}qiVw(Mk(3hK~1nYDUY0aC9`==<)Nb%$dl|l-&iZa4;l>d6UKSe65k;=YKQ56!< z+VeRLQ15vWBv<+|_gbud538EzC%-%Nx0GSsul`sjbC#!!9Zy+qdx}Yw9J9bQHJa1k8mZ~;B&u}! zm~XLuv5BkiT!0^(=I;$*IL>`NY_O;*BI|(|fr;C2(_tOn09#C9i0lSIMQ@}<5adXa zOqr-{vi~M_lmnoY?@TD=I}=Lz&V&*iXFz%JWuk&g!YS%9finxt+Hi8OaXKswXKMzW z)R18tCpfjwYsihEFN9`EL#u=4P%P}YLpX|5^MrK+{8%jokC&U7#wp(HG`T+|=IjoG zx5|AOl|J{Wj4a`-1|I6rjGv?5ZhY=wqLy`PN*jrx=~U!QO+Ia=K!3yw+XZ>v*?+$u?kY&5q&W)Rw*r5=gc=BVsy`jF~N&e_Rz4_<#PRB}#RM`()s!E+q) z3T;j0wsj+YllHMOhAn1JV-3fI|H%EtgR#Rp1Ne7lwRME|o3jdFF)M^8YDBIrGiPx; zcCS(%U|rIP7QjAItfXFRI!D(?VxBFzs!7HJfFuJf5y2%5*Gq7Cvxc77O_0}`eZ-gM zKw|BmgF8V9vom?fB)d@3b`cu{4u7n69Q?;a*~ntU*{d8YwYCf@YHt;+#E-l?%MPZP zmO)-SIB%zl7K%#0iLkYuw)3X^1M#!KFJ&sECi^$G@Mp0Z-bml*bwemRHZxhwn8?Q} z$Qzs4J)mSYcsd>2Igo>fRZ0}X1FJfK!7>-~K)CHj(c z?sWtQ+32+A93~dGZe}dT8?;gP8*E%|@|!=CFewDH?{U9}Fe2Ka2Oirik129@i*r@8 zU{d5CWlnz815$}|BPn_MOJz2l>(m#WuSqk7={n}UOycB>{ov1%6PcIMB2!Z9_tNvV z5J0SPlH*I}YjQnSn`_#r#XMX+^`P}B++xtYy+c}I-mT#|5UiYdOA}2QX>L;V$Mf9f ztZ6RmqE94ox4&}o|a8tcBva#?XiFR7|LHTqLw+Dp_BD=GyA9O@jnn>dFF6W{s zweT-|WS7&ApHYLTGv)-tsBSyRlKgY2?6Y`fB=K2zSeJ8RD#?3DnDG}QiBH2rJ8ZBf%W|8@VZO?1=xi^Yn#Y{>{U;3H5YRtRNWf?J_ z3Yvcpn2&FoR^e{@IR!Jj0+Aieu#Pf}VVkVhg!P$-Xx9?gn&?sfX8i7lP^kVMn--yQ z7ZV_q%_~~g4R&CK3Y;?*BW8S%^ObNdNL*e=^h%ms;J!{QW2-AxmmDK`j|rXPesBh| zNN6%dFU$QP2Ctp#ihYxI1!6VD%~QL|T99MA19v6+;>@z+Ni214R`QXJqAufh7m09q(@ud z6Xe=B3zbCP%Lx@n-YX0hL=ukhm_G{=5460 zW|p<&SxMUmQ|xYQmku)JLI#{&zRfDZiPX-4xAAO9pwP2AAb&MxFUdDfQOR$Tz`<^`mKK` zGb2@3Gb^zf*zy_tuqA)HoR<(p<76Wq{bouY(M2a`8}eD}I|ms1wdEbPvW>9}ybF(I zjU7jqw(gKPJFl96n?$VzNmx|E6N)^c6zJ;oV#*PB+2w9ZCDtS_`JHN!jBkBZ7ukYE ziEFLGh=)%ILaL=@7xhH%rH!a$hFK@#1O8ML0>#JO`bY!2G8OA){#jZ`4}Fax1|uQX z(C(U-%P}0_fbAbjB#`XA;m|baOyOP5mif36(EvHIOs@3043=t-^$kL-50Idf2CE`* zvdk*8(j;8lt$j+y#^!tNQ4G>uRwLis^0v=e2%j`)U(@M9VK;1}?1cB)$m7rGzZ zAK2os|8XbRGXz&R9qB*xeB`yfP%a0O{Lvy#P|MAOk?yZ^Ph@U*n*PY+BOB`gdW8Ov z*c9FXA5H*R8HIy&dckX7XIp`eLzkK-;^4VI@{4FCTYzChPopDH27FUC(P6PaW0;5DUvZ>Pm=fdWRVZ4;9xAv-K|5}|5 zM?VA3YBIdmYHy$z$F;L)9Iw9hpQ;O=J>p>+sk&*n7&U-sSZ&|uk4>F&j{ zGJ9X3{239;%YTcaOihP=(>+69J4Dn0gG7&c+VYyH!*Xo>cO6m({uT4eQs-L|1NX(Bq;Py>sMF@q`P{cN^g*qOm|WadR0ZAQtCE+9=4lyB+qHe z{lL~Szm_iHFzq<)DYiyvkJlQkJ*8Hb_LNzN@0P@at@o8Xr`oc#$8Wu=J@c*Sv}dvP zl=dvKc4*HE>tXGwu>Pn$jn=QVXT5d1@|Z0$nr_klcJa4s|0eNYrTw>xzft>d7ymNt zzgzr^wf{cx2en_8PODn`JH&so_RB(Qm1@5XH*2i+9}s_$_IHavNBb@D_x(x`VD^gt z9qsQEf4BC_vS9s1`-Q`_c4>c+_#e@JQA1hxX}?$ecWHmA_;1yIQB7GlYQHemR*Uvm zi$A3Oe(|r+{`unnruZTA=Wo;VSu{*D(tSOM`*?d+L8+bARF!KE*X-hz{`+(x^i&m5_|4Dk31pN#3(FO{e`aS!<#fKv#G;F?#iU*pHnT zGCRs2_eW>BOy@-Q8EfTk&yVGjn%BZt=;N2c7`w%lSOPLOsoJV|jv?|G2U?r^IX=VP3ET8C-uY&cS@eKSc5*+#8Rh z6vVVEaJV~w>|&kLK_!ofsl?ySFwe)P3(A>x_4*pKcCpgusCQCo&7J1c?pgcbWJ{G~ z&ORus5Y4FT4*l|)yZoEEVL|>~8?5YJ_q{og;UYgb7sGU{W1Gz9Mu)yGKb4A2>F!>A zU)-c_KL0AGUN#ilrktsNjH^r^I|zABJXlP zI$XIx3ycb2^J!&GBm4yBzrMJ7D(K)z z?Iqmtyuzw(U*GLBduq+@8uM-U#u%f)A8jnMo`Xf@KtYFmoA(JZl1;a z<$fSBg$WfW6-alifalD&ju%rF(l8fJxv5@q-mf+gNf;6Gwb8j=C%p8ZI-&od3eO5p zi74GkR`o-U>UNB0hkPF;JNAyK|``vmAPmv;rtCjt)}nmuimwvNBSG2@02 zgJ{TU+rr;~!3@nsOrPyP)QQ%}2){NvHe%57*4Gp6<*gt0x!1vyIA)uquiO@XT)`Hx zT!F2L&(*(cE`w|BO$4*|2g|~wcdOtRhUhYe?dV#mdZ&6Aa^c8wbW^-4dkrc z$s+4+6aJ3{vXRyC=@ewv9MUroSQJD1q}ORO7jpLR&QU-cG_PJSjKeObgUfx>TU3ng zLwA7p2d{sD4`xt`cVN%xa(IWs@DAyL8hMLlx63-eK>FgXbYI+-*%yU0Sg+Ls`U22g zp>SE(qv$*X%K$@82bpe}ahzEZIcdTCN2?xfa#ZiDDKzoRIiLUA7HHvX4QY z-OaDaZrTCGLlg@SF+`eYLJm#Hp$R#R)qDH%5Q=}WU-0`%7J|#>xnH?I3-Miq-7jMy zCJDI(vL(VoK!-8lPO}gfE>SGRTe5RYn)$F0b1opg?995vP`max*AA8_)T&DF&Qmwu4Tnk&0! z)Btc;V7GJ-7OZqy-;iw*;jqk>Bsl)i(Z1yNRPjZk{Il+0FI%h#X}U@)cO6zbKRF+0 zj`SsYv3HOxIGz1>%ym*}{k|kRPw?3+nTiw09C1$SD}=F*Is#@jOc{C#sU|klQ6+2Q zx^h38Rsh#7lArsboO6%f*#gsMxZ7lw`s~dsc`r-I1^m^L3)L%h>#-3RZm%=ps&+rP z*OIP*{TN@}{zyp+{`Q}gwBm5x*#;cm6Jq%>;vRxq@DMDq1XC+R2Cfh*FcCzdGHoR- zxTbG}T0p=@8BZlix676?cRsQiEm-nePjUyS*iA!Q!bermU@`ij10uJ}sQ3)+L_e_I z50TSuo}^?PMea~3`=?8BB+A|a)X7_L%=jgWABWR`2^F3f6VTVVNL`HXt+P;S!F_j7 zZ+fee8PRh#J($|6oW%TKtMdL=BylfWm1EA6^c0ZZugsG)PRqbzBE4T(Ci|5S+544p zr)8Gl!%MI7B&h0DVYS&P6uAo3r`K;@CmkyO#cZ@Z$xA7I#XV0nT5Q&t2Bk-OL>>(* z-;WtUe$V%y>Iw%+|71Gol&ImY0g47c=t*aHhBcrBIf zkqd97m7*n5pjz+@>9`rmxD>9%Q+@VAIS7(6aaSWwae=0@Q2`-Rby?8-vrOh$<^r7c>p8;Ao)2t|G(1%5ko9 z7;i@9^ zi1Ym=Edb|_KB5*4=+Eip2LrJSc?NH50Taq`%^0C0WwLOnW3<+tD0CEv@u2~8gHSGs zyMev=ZWpV{pz0ec#XcwgXmv}17d}>(tPc-QF5EX%MxJ6np4f53P6`*1*p5@7dG-gu zy4zP#G@x>g_fqXEao_w6eDY4iabzzGxqOf01AP26_k-Ef*M|zGFP0#e1Rd*p1d_*I zGbI#-M@#ZB#zvAXXZqr>tNMm3#f*q^RzH#^lJ z=QO2dT>)hKBzX-YaqVTtS--g>k&skc?azGyPbcET3CMbs#PrGccDC-6q-rDuq8Atv z7s@*HN@}FAO52MnJ7`CyMqG7;sGrpGoH3GE`C!28(Zbr*C<+}#_0wZ4V}+3QC{net z9#CeI4$XaGBI&Ex{k!e73%MA_?s*^tv{js zqF{7HiA-5ntr!WiRT`YMuhu=|+4`V4cB1rtZRN9EHsWi2-RP~2{a9Y_^6ku)&~Pu0 zew7G!h4N-c(RRVu|Nrm*%NQ85npw%e<88OXcIVsf3fpb5-S6A(owoa^?e4eT*KN1g zc5~L~@<-V2QMNnPc57^Rk?nrpcJH*^-`VaXw!7bUU$@ltag$JlO#?asE{ zCAQmOyI0um4Yqr`?cQ&@yKMJO+s#^Q*JHcK+is2RF1Fp}wi~kDYizgOc5k)aU)t^; zZMVaAciHX%+kMw|U5&c_BW?F9w{W2jRY3~_bI;89G-~G6`T}z^Lv+3cUn?s=xiH_?;9c6-xO!#X($LDa z4c-+?o4sq6F01!0B|H?WU(*=!hSqvluU)##8(LBCo#{=&v3ljjO-q|D_pWRJ&Zhdh z(CW*lbrEluYF~{=FqZ#lkXJC*BEBRUAD3*6kfVI-AU4$ zsse$FdGQtazi4ekJ+t&g1`m!mBuz}gb<#A+mu~mk#`*@C3(af6!?OCzR@T{RWd>5u zNj9G9*EceM7&(HSfiqRoDLjR#*-p2HA-FQMqN$!)$%t5$nMcxpHGb?&%a(?gYOpmi z;BTQG3K`Q?5rd}sOT+ce0-TKg1vU|)Q$zJlYgRJR7>qIoWEzAU!p(xzbxZ#rBn7mm zOyTuQ=RU7!OPekUOXB8K>m|LKZ_6QaA(_yPYgaaeQj|)H z5%O2BMmH?z%DSet&1;v3yyvV`t(`e(QVK6YO%w&G`OJkWQ>GZx8=KZ%(gd|@SPJzH zH>_${yRPAM`rk(7ETQKU^7A45lI%3EWaeM@EqWbk`JQ&CtXa9ft|?^9g5EBxpD!@h zW9MbenYCcl4 z8tPY5PIAGK!uWS)eR56u24r*Xx`iP%872Je=K7|27k`W50%-#7)7d0GxU@Osqpr&U zw=vwPBM8@Fx;Uej)o$q}^)uG4*E!E#IBP+=HFjY*j;!n)XKtQrQ2yY8!XfUWp~Hrc z@QfT)JbKI#W5*pi-aFx_qe~_pb8P8x$4@$8@{|+HPMTVN@+n_CwPM<7mD8(E|9Z7= z#>|>oXPoH|%$^ghojY&-Sql~}!s37Nx#yk#%?mEPXvxxx>z36ozhuSAZ>?IrreSU4 zrA^JD@MY`PUw*}vS6zLL*rWfS{m*L*{IAqV{x>k@%f9_QGWPHOYcsz1U;p&2M*2U8 z@!$QIS;7V*{a=>x-~E@&@BKf!^HuA=*sCl4-yQ*u*3^GV3*i6cCVNoa4UY7GS&ski zzhwR|w*LQW$bXsvQqu_jOV%h~X@8MzQ}UnMn~Wcr{=aK&I#rR8_G_P<6iEMTY26TM z+j!me?a>>|8)G-!yy@HD`R*;>`~DAZ{o#*({FB>$`m@{bxbx?C{o%))y`O(KZI=5}#@%YZJUAv#y^W;-c@7?#z{%8O4*XRCr z;Q1F`eCg#^UhRJE^*7%9`#;{Ydftw|^UrtR>wW)&4?p_X!9#tAKmO#?&puE5Z!ZX6 zP4NG#1>t|X{r}VT|8L{}KP|{#9j_MT|LOMo{im&2bDBu%`rk7Co#3tIpI1DW^G`+8 z)}FX**@^mNek}@ce)11K4VhK3aO!*R+ROTV&qG3#=!Nx-h~YY+FMLV38D?#Ec(p2g zHZp-^_BA%G6fHsR(x$o*rEG&Tr96HO@tdZ2)+2^e4}{5h<(F4iW-x!n13~llb>Vvh@bo$G;)wJa@iPTf{BMTQ#Lt2MAI}@c(foGtE5i0mTn8r^T(ni%)bS#;HFH?qp;n^A*|QOmX(qZVy3MxDIb80C1-U?dohG5N-r&>&;XGM6!C zQJyj8s@^2t6>JJ*mN`5k~l$)Dn(7(1=rV>9?j$^!u3x;&Me;kzpBe7Z?dZ_saxmjEU(HX|e}Bn0mN*>7eOV4; zm()QM`h81(4oIWNd;w#AurX|b9`h3nR-h0+a4&E#$#xi>{L~y$b4*~?@%`cy%*-$H zWriyp&d8oGV`k8VLSw>?(Z+;OF=KNS<8q`i!7U;-eTQkMcN-YJSPO8b<>AD2K5^Xp_*_zqoWeGQvj} zJB>jboQ*k4H2$Qn3JTEkqk#DVEn*CeUeKQojXuI*yv(n9tgg?Imu2KReoPzTESP^X z*NZqMy?~!3^$W~|%Y4raPpt{GMVIk_;gI#`V%j?-%NQ~>zs!-JC2cJmeNy2mM~8}x z@yp!C5zw1a<-?kW^eX&!dxJl(;;(M zV8C!j)p_3(hw(7K5f^G0#Q!G0k5VuUSMjMZ1;Y?va09~#U>Ig(mf;wjWeolxr|f^V zcQ)WrRc9W5Z$iT43kC=uVG|fw>PHuKz@Vszi6MME1|498plAol&;&zBNswS&J5X)W zM`=oJ*T>Z*Qf*zU+bQ*P%eJG7E?v7it!ZV^+EHVxtG46Eu2|i6fA2YG$jvBywyV3k zPrc9c&;LE|J?FjW`<{F6dnQ_*VAzuhGpK*Ht>dnH$*HKcsr#MD*Tc@LKzGS9H zKlS7`moJq+0j|l}ik6!5hjn9_OR1OA?sCQ+bB-^)>604^!d2|q*EZAgAH(&kjxKAg zYN+I{SCK8tl%$8JOdkv9>WFSFQ`QA!U34UKHnEs9i)d3h$&;BUW9w6lN$oQ`i!;O0 z1*!b`civv!{Q~WM=O|YOq>}qVCHI5M+G44k8SM0`%cZ(yv{Xk&Np)>ds&`Jvj?38f zgt6VNYb4t?*;?{Gi!~0{HTBt2Aby=!RwQN7VNzCGXvU$KJu+3%Ssp8kcxJ6f zeNC=lY%G+?(FHQOcD_vZ>SVCQq}R1ZcOm02S8ndf10$vLDv|c9`5ziFSN1%eS86p02-hvWY&|fB}?<<$t z-4#;yEVFai_5JHb#)4k8Vd|~igeTv?9HF`i!&rNcz$VUxzPMf)?Z_A_+c`WnMd+t* z{26su%|g0{4ls%P)nw+q5cA#?NnVV%52(BddlXycn)UoJgxU`dlOX8=q#L3Smr59$ z$6zajt{ACXn-|r zsZ`8lOtOac&aaU32LiI3b4yqYG%-#_?k>xkv&?6vpFb$F2i&LS86S}G#2-!k3g&_U z@ngR8-pR#sa(AhiSutH4(e#PCdFB8?edZvn@{`~lwWs;+FMYQT`~GxZd9jqUhA5wD z@3m^Dk0;)HL6h3mzKxyIZq_`M(SObxU(8%xCgW!^YEmO(nzrsDkqf{TnpWGyrSt2( zngC;w@ko8u%&f|cPmfJ`6L=<}o+d;~cs}7dWu~1^)Mn=dkuL*(d-!$k{v9^=w==bF z3y54Ui97lAY*5=`>qq5N|4tZNu6_n8%=yE*8-~dZq$_%3#E`TeduYm*x|x>MkTTSOo8nny_Uz;HRMKOpmI zkGauOIYrlTd${ZBv&+JASvW9C>h=X?7V~(R`MYFiQJU3k%-dQjTl<4@4)?Md-6JHh z)2=YQCB?FY`$%am_miFO8R|Zf&)zR`OkB&)`r(a{j3vgHU$6H9^hJ4kuPH#Et|d_77_B_4q|H4jSaufH%FQN5c)Rzjex)H{5o$^xlCd%nbZPD%VZLLV$xDO z-|6*IvqeUnBJ%R#GH{b=pd`5ru6`^>J|H*}6+ea!qO{n%nI;|G+O zU(nN@^4B6af$eK;pUDsFxeYgpwCZ^s8`vtvP7!v7oSVoq6xSGw?NV$P<=OVe709^P zM#j8p>&et)wU@YZRFG0cOT_L-hE8b zHB>Ea*iZXKDM&PH`b0*I=*vTCo>Z?}gN!AzdYINI)cckNEKTBITANyI_dibdLSyp+= zx;I8QEb8cP>{-E&k~FQTk1R6IDPJsHZoRka+i`wkS4=KEAAd<%T+kF>eM!Evi{368 z)ng{l35N9#Ut-$h-S0~9wZavv+q&m(*tiUzp!T@+bCH_DW%2IDOYk5P`9#4HeQV?g z1xvAtFXXcL`qiDSI63kgQl9gPF)lwMj}WKpu(b`+fInCFV1gC=6pPcD3lcs_8rnB> z#TTybXldt7dBNh>Rd z7!M+(J8?Zc&TK zXIyD=v36@L^>?jrX~C_MTx?a%;tegE+FcpzxyKmGIk(uCG{*Ay#x5L~8u1vqHD`nL znls(6PYj%t@bBwXx1<$PWAaJ6`Mi|4?-;GEbCKH%SKu8LH}&{EYoWzevwTj&HdlK7 zZ2Y*$S4&|u=K+_?oHS}oSMHp$n^wWyk_KyO>{-LdJaUd13GefdUCm5+pcjAr+8W8xpDY& zy_(HbV~?yVT-F}v`{LOJO?b~a$2jUO@$TBBXTQZa!FarJ(3_9J&$#QVm(LWK&U)sS z?s#;=inf+`Ln~h=o7Kv@qswoPU}uG#_ueVE_88M@8`iIUqilLS1-E?mTZb|+!BdzG``I^+nR)Y(VcIs+tJ~A3B%(@#=;g{ zE!Ri!^RDkQwvkwUVY?xsy_e+#a(zQYU4~A-}xw?X;2Ie3eix~C( zFz4UTk^GtUpJ#<+4v)X%fQA(;cMbEjBs_AO@47r4=$m!(y_Gkx=AUS@x--m^gke^y z=6f$s6y`fFD^g=u)2e-*ER5YCth!Nv*MVa<~s0T(RNu z#?RTC?ZTP|JpwMQb*x8bzKuV|1|{jj+QxeHxNwyXO2maHy6^-S=IxX@GL6=r)~z1* zxiD|6%yGR7^Y+RdVHXa$@S%A&{S+4#7oO_Eu?Bm-$AuTVFw?I&X1nmEE_{p&zvIFo z7yi8q2VFS#50w7pg3wRa_OtKL9WI*o_ms9Ocw!e7b@ z_vVG^UqjOG%nN@dFRbHJ$6z1G^#w%n^pEez5Bp9TG5>si_>YbM$EN?^wx6G${BZvD z|5U>fUgm4vd{CSlPYHkLd>@s2-C~=+oC&=j_>cdqc1?X@Xg>UTQ2E0?ul4YU>LT=| z_s)OsSyms4SngZm_*%lY;;$g27I^yxc=HtV%c4TK-o1^+8 z?!Nf2a{R$x_lRA+`Qox3^U87TUgM*q>Ml^|Qb@%=q)|MHtniX|)awrec#&mMRsWBV z$h`NLKI!Ts>sZ%!{>;2rSf2q;1LpyKe)}uHXL;!duY*w(8aE?38|bGMJ=Bh-I~C}& z{AR$jmfQs%2d{x3aZdn?!Qr11_$T{5Bjh-i;*F_(KGSn3A98!tjGsmGTay>bn>9ytU*3AEla@W~Cf4@BS| zCnw-Hf!2@A6L|(iY4=zo{_XQ^9fsk*1ll(e@b8=~3wYxRjDF$ZH*)<}-fgDu3;`hQMR@!<9!aKO#>$vEJZ@R$7?}K+;Xv^;Rfl~jdt3a4~P`(L- zko(}D#%%lyJo6&zADe#vAN3EqX$^e?y>cH|g{++OJ5tWJUmY>8_6>Qcm3Nve zDLdT1j`Xxq2L8sy_PTyQF~2XE`id>z&Ujqy8U7;jeq`m&tJrseteo@NQ-1pz`Um!v z=Uz)&AlJc1eTBN!z6ziARa@tE@S{NcOd5WZiN6-v@9(BQayg$kB!3e1_asfFn_nq?lO{uTcZV+G`Denb`Xcy)2-)0U$_WSp!?@u7foIqVEj{xn+LHJyts;rZXSvfn>ZeHbsiTO>psDtCh*vftm$?<1$aa#QYM z9|d_(UJVW)EAIgNk$d6a-)sAo-)~C&s&4*!>{AxyyTJ?8iSn%Pk!NJ(-9Yt8xL_~k zB0oX+450H^9lR0*b)JNGJH6kJQ++(|`abPNyC@$72auJ21@N~Uy3{Z#4>L-*&_WKK|-_R;>2YSEHq53A4@1y%t56V-(cH}U8=po+OBg@0|DWE>j z{BLoY1hibNN8~~$vnG)qCnw+^?lZ;FGr9cY{| zd?wJg>x2K%$!Yk4CvDmo{2kCrTK}G|`ll%0&zZ~6E58mpk>%;ZJzTn%>zCjz^vW-R zTQtru@IL@r_B#0L48P)sz88)?gC1FV(X;dk%OfQftDo;Z+_m^ zNdm6?rIkbQqF+(=X6(RiK;!HFt*e~e3qJ!iKmI*ix}PfrI!UWM{6)qLaxeS{xB^-C zZ@miCrtVd_=OxOhdN{XVOZnDU=+Eet9|dV-^U7E#QWK zrwxd&d$n4CsVjIp(0K(AgGz7c5JG`#XH<}38NXX`SM zL{7r{fQbWt|F^hnqSyUd&w>|_v+#_!ZJau|*~$L>R=Qtn@jK+7{Zz_h|C4zDS@}2+ zLJq^v|IV)WvhXU8Jfe@mxxHA*e^JQ1i(YvyxCL2x8R*scaBiQKvhJyint;xqG1v>SUr5u! zn}OO)z{gCnal&x*pR-@)0#8ElI#7<>2@juU^+CAxDDtLyIJYm#zyIlG^zVRG#8Lj% z(c}YJ`93g5(;mxuj{Qs5Bm4Iy`S&&HUZyj6_|FhW`7Mw}RxaUXLJHZxcS-j!-3g|1 zUsiq-RO>x@=HMPB|NbQ1le8Z65J&kr(2A^_1?N zD^H{;L5(RKRNO&dE-?OM}{pI+B->vKQurN8EP>gulb$6qpIDnE$W(YBT!L34g* mr%#=6e0b{IiqbhJk#$s|!2m@tqbLJ}<6Vzd@v4&Wt| zgq{rKusP_x)mCp6`Xa5jwH1pmSQRG(XA-3lkhVdnMoZhBPPCy$7$kCj-?h(760Gg> zJoopn`M^16zpuU4+H0@9_S$>AcRnInB}ua3zhOwyPQ2-_SUmszV*ttHFZs=Q>4h=B zy>zE#_HQqpzwF+Xxyx64`Jp+riwg-;=vSc_8=R2Xf2i`g6ba?Yr-} zZrr%6ykymVC*N4`%kLe?Nd14{iOm_mLU^O^*^F1k`;81$ykE=c!ux?IHf8)2?_Yke zJ7cbh|4GIR;{A(^XT|%M$@l+=_q={MK@ly>P@i!4b# zV1hb@zj-gFNs<#EO9(qlEaDqs!V~?a-jWYrh=1k#HVGy0hX9ouew)F8x2#ePV(qV3 zr8OeiCap=Qk1zb?+9dm>lJv+@tCaJFq|w3c8?9&42yo6OQ2)i>b-{bq1d(=488Q)k z)K>xLNP%2*^tu&y-xa(|l5W2b@u*W;o_vpFqjrn0GqXvZQ<2b(e7VUtUa7xgNs3&z zV&#gZh!A~snz)h%kbl%)G1a%?p8LOzjGM1V0&pNvy(3tr0JS?)e0=rz3IktZ;42J# zg@Lay@D&EW!oXJ;_zDAGVc;tae1(DkXAJlYjx2iwrP?M%*IUxC^op)e!|S%TEmpkR zw%G90w#edX7f&ai(e*AoEz$Mo(W`CCM7;Q~gK3hxqb8WiS;Qj6(+VQmdMemfha47* zB(dnCj%xNY#f470EfRZJ1iOM6%+g>noa)agEY)=^VEqA>Xt_-art=>n#!#}& zyoTap7DLH3l$?e%Ly--iY$hPqm&-g(Z3BVGJoad&McY6?*VpdOky;w_WGR^I*j1J% z`xqYS1e1?{wmeM=M`~(<=>?Huf_k@1d2JFC&v!&uipgw^klio2Iu3f|Ph zYY<@JRy_UH0UtZ1d0Khrx6>rmyU9@RX_0EozGBuDEs!l$Rj-Qjrn za(t?xO@~8io-sP0?={SOV3AQGj*gTPd(EMJ#{@@O&d$0o@$oPtO=e zx%-o*SNh`kLbZK=!aE#sY(7FMn$psD5Fdmh#o6)(v8)6porSo#lf6M?L|0fQ+Yd@I zohVXYSMb|Kd^wt3_huu)T_7-x%pfKWOt>lG0Rs8uf0Dwk`OYxM0c=!Z65^A2d0FNY?A^G0za8m08)_7?1kuGJfV| zi)5^pdB%gF-8W@vC-tO8tMF+VF)JZ}e~i*5RxDnZ+P}u1-(HO&U(i)>Fl;ncU^M1? zT$*P4TH3~p)=2QYB1>>WQ5uF|t*ovslA6vh8l#*WKG>A5&DYyXm}kHm z)ynWS)BT6W-C85Q3Jmvt&D*Pm1|6GsijgzO7Khv1?>ja>C4w&9mANsiwM$#TgX3FH zS%UVKQ)!OyN9Yqm5GqV^JnA{!63UhI%JG^fPxDT3wEmL1?47JeG5{v?OtrQ%ubl?o z0@+xxOjq(iZZ-srvmRzSaC#fKntAd>>hfaE)6G1SQ2<|um}iO_Iiq=cP)nueIm#@e zsIGJq!DyI;PNS&-y~?JS3~Am@l+zYO*aXe9Gbrn&X==xrc!pkjM(s$`Jg;e`jd-2pgI~%M%W8M@|i$`X)Q?!NC0Ux+evFdB`sF6M*FiNrIMd1@o7qy%kqf8VX z*UK_aKXLL5>v25yp4yQfuV-E-yCMI57P9-*h<%>sIp(9$qt*5szQwG^`W~Sv2#|BA zK26EfYNrI#S@D{!V#wau6}pBe?NvYBU)HHO;^&tRc< z(6Ol!D~%+pEiZTRkI z6A{!ry~ez|*+iCLp5FX~UIA1M=%scal0rv~dCP!cwo+E_>6P>{*#fd?N`KU2SmGHh zbd)Lm4O!Lv?FMtYK(7^NHOCwzS)(-wAtNYsjGfD(`K5CHKF!->?R0l*3lhy%&66nf zCK|06rp#}<+LNI8L5iooQT*W5=&ffUKPE6?D0cK?FXk3yKvz0}uWj3O4+r98=1FYx z7j(ruoUF&&`0JQcm^YCshTND&G5D#>aFM}n{%!obBIn@foK*kWIeRGQy_C~)42;>& zN~c*o0~X>?Ug+s1kb7G~hU5tMfgZqPeO(tOOcHI!07Qm}%ijIYVs{Jb3e&lQlO_!Mv_ z7NoHZ3S^7a3_P}4Fm#Uyj*=2(p``^sC=G{mC9OZ00LDD zCA83xzSfnRaXfY?ex3oaHn?8%ASusGYDnK!hl+Ay9w%W-TREK<5Thj;vcT`wGx1Er z<7~)6=f4RgkV>X}%#<8M$uj{7;!7)?W(MwOE2lZ0Qy?jF@}cH5Sk$P^KxlIQEXY`y zEtsOo*8P~`^gAv3>>DlGLQHUWAwMQd>Y7R^TD({aW>xFU%een}i>YuzGOPE<66PVO zPBZQK?e2j9JJXcL5}1(2YayAX>9#gYcFA1jQ|lehLPZXp)BZtPKA11f+HT2K+ii1{ z!TLJl7(c7Cg^vWsv+>3%S+B5^@E?FxS-Gs;%8KPmcVbavhWZVgq-At8*mfQ+!GxGT z5!316hHSpMpFhbah(KugOjvdwI-X^Bx_A}t;ren3|X`~7hm)Q7$HhZtLhyx zFbDz#M>J{znfb4?K;CjWP|Bad7jH)GfUBCVmZ5#0W8B2=Lo@1?QZ@fNK5A-I%+hro zGzGKcg|~*%IVophqtS^<{9;tR&+AarA|ssXV_D&&T&Cl;MNjhUJq$nSQ)+jt4kqL)}O(oY^K3GfXTPwAUFk!ZFf_sgONvYsSDcjFq9SczF z>pH?G8qWtH?&WgG!S?Z*F_PrIxhcb1Ve2S}&@!XSPnA~4Y@w{4wlv!cBJnxZ`bvZE zM)idrxiKB{YJ7%z&yd94V_@hqtHso=E93)bP-TW$r4>~odnlchW~-(Q71jJVngDy7e*$S%w}{lMtsd~hr{@awiW=r`02ZP#FG8pJ z4ws-M;O0N2gl4-G9K+_?nWf%XVyh=24(Mwwd^IWzA89-n$Z;=}o5!;Gd3Ln38hf3B zgsdGiiA2&#D1cA{?QNA#EYgmHY56RI@EfvJBUWP+Q-~Oo9!b(T!EI2@v~v4KPj*dP zxwCe+O9DSXOZ@ybz~69pT|rla>rNIu`Jv;Hc5Suoy1VuLx$&YQHvvh2*oODxs;LR*8&uTAALnl9)9s~;gWG+3&tsv6SRC)y>Z z=B&+iYI9wDKCr=J{JUtmgJohJb5XUZOkX}^+|=Om@p`OBs`-P|Vx4-G)Y0JFIkOC~ zYUcpgr8d3tOyMlMV^cp+qEADEqd-@V{WIvh?h&AKjMEs6(@R8aY@YzWN?#7(t2JN} z?P&@JSA;l$U%1w;h58%oF{#Ep0|@|qH8hbmK;?jOvp#LQwSezK&8*y}RSdBVts(&m zYMHFuu2tAJmOI-jBqpJ;a+ZMp8i+{(J@-?w5TzcyVPFO^gOcy0~ef)fI2K{ zs`+w)8&kYiY6A?KmEVQ_n}ea6z0dzb!?MEeu5g8H>Rgurq$i*c4LLS#MH}pV)_Gr- ztFYeb2y29>*%SKJLMs;N1NWV9>A{Kp(`%f;EcIiTdaIS~3m!*3!Fxrb^&ivgoWa`Z zwK>6sl*zA#WNWYr`GT|Agu(@KFkSsDO(`m@m6dU<%5JT)6)vy`r^c^AMvF3;EpVxy zS5C^g6EkQtT#;~NzLP!=Jcl7_)ZJFLaG9$ zPM-0ZVIaoJVp_eO-+(M_byK6|H&|Gdzk{YAF(3&3i(2k?h?e#8*}mjLi}#$SD$VN8 z1;D6DGFD~t?=Ph>n+^K`D!hreQSeHL7v5r433&(kIK6JFa>w+#8-h0lSjZXRC%=vf z*QjAVP2-`M=fAztWodI3&s9#6vgJZMz@8syYmj&k8mmVTs6<3HpHBKl$D-QZPErE> zHy#0@BnYP9Tu2c$nr(PxwjW*ku}zXTc3$Rn&hXlU`5V2?69+Eq%<|gZP4>`O%rX;M zMw>k|?r=BBp)6MJWD~8iHoJ3&rGhF{cGlHzq*m!EF2OwQpgl+_al>mp|fL;{V z+F7CoL$T>%nshw&{P&@T=yo?ixC9`yWmXv8gz_C0G zDyb#p7}w@GqnuZirA)xA+yD?d_*fvK6cra3g&`LfHo0il`k>s%oRhsBni|Xua`;me853`Z^e6LdG~H3((B+ z^Sux`K(^qbswxl;2AtLmP$6spL2|Wnj=K~xK`))n)6r62Hwm87*#SO-x`&S1PxkoA z^>V{US(co{@R)0$E7w3Owt0rYgB^SlzFR^=)M0c=QZ7V4u*Q`G>^(Iyn@6dpTDcr) zmW`e>>OBeA)$Az!dDAp3yY$(a7F2Q=Ftvm}7g+mNQC3hUgpCLEC}MaL$c?;ikG*j( zHKpVOGTokuJU>K1GUaqtM<7l zm-6@g7!)H`Qp~#VJLsxr52EmmC_KhpQWS#xM8ZSG0E1E~B{-2iSmbv{L*rP@GYxy$Aku>xz-uwvQcg~<~W5K zBg)vCiUZI&`FP;V&#$NhNKi~`Ac-zy8JGuMP+)uk{sRaJfc$Mr-{WK*`Itg)wUj#{ z%z=~P4%|o`*l4p1cfbnv&*}&tL0e6?(#Q@+8gFu!%gr|g*l7T|pCD|^vvU9}6-2^E z>LE+#*sbHEHj7m3?r8jnrB1fg*{`m1($F_6x+PiB*QlbYW<~2$6?x1)TQf-chU)Uc zU1^e82TZi6#uPKalRL(aH_l{pWZjkRKF~bf9aAoMA670Q`Cm)=$*r++7gRoJ^b#UI z!TmnCBEjE7!qo&CDkKd6D|lcU)fRdnne#n%cG}%TYao_k_1I}CDD%IdTF7W?M*jQO z7-Idz$JRuE{}u`Ap6q%^YMBV;P6WTk#)l^4$J%?-e7fxw9~FzmC$K-{cej6-Hjh<1 zt=+ooKj-PTbv}M(2^Gf*$4-0zokw?F;O=fNqE7Bdr+P%Eb}arsbm|meM=DjSQzjf! zO*jBVp#Y-Y8uP*a3pfN22dv%mtesVS?Fa~k4>_B!gx3C`Ep9z+|ih{?o10v7=khC2T(JyZdTIOGxbVF)OKrH+=-_(o`t6rx8Z3iUw4Ky zkjCeU3o)^A7Yf5{EemV)!bPMP3Tw5W9gbPH!)VL*A_rC_ww?FPL8v~{Dn^zg{42ya z$ow~V5;u8hz2Y?4_t+a(t1cG)x zAN5xArPKj3{4K?}Jb~z2MD%Pk+O95@&FCvd^w&i6TBo|yj=2fBe~tzNd=f>gOPx}E ztkgx_tLsqL*d)cqid`M7*oj3yt@|rGXnzQ?B`)HbcK!!&DtidJDfb^I1E)yGvL!%~ zb7gkBe7n0H!>=7VZb;^UTvMPoc7%;)A!+yVpP?44iL)Sxp2VjwZV6zZ@kuDqfmK8} zqS%abSBJmB67cZ^`hjIQzWF|U;!SJ24@E5Wpa9>Qina5-BGyi^Kc-Kbo9-l#=Qw?s zoc8@4pTIAYKf>pt4k%`Yi}RdK)Pb@*7lUn1FS7DAC{pTPoR{6$hm|~3DzzDXNH^xX z;&pzuI8XMYviZOoENbUtoox5>j}BNQOzEt`>F586y6f0nh->~CJ_{o3ZB}n9=KBex z*?BUn$9kxkM}~tKM#cPj1Q&tJ{cIsjF^X-wC4Mcya?@IWxjct|h^h+9@|=y7GC^24 zKH;m-Y~{(Giz3AYsMxfrsv>A17nQ6Q=mSC9jgfd$H9N`spfHk_;I5UM8?es)20D=m zO@OQbcS1R(PBo+FGd%X-G|{PS)J}D<0VVC^dj*l{9=qeQh|iDS@R*<6jd>uFODjhRlwaymqs@?#|%(00{cWdjt}R`R#xf)r$s6po<2@ZrAu^i*{a) zN~kR~betw!U@0ADlwb*e8%vY`)b1!S;O+=wdW-T0fgO-|B7Oe~@$BvVPVi4vfdA?v z1Bzaq9SYs3RyzW0trMf{q6O9LdVRHx{}}UZfInXiLHAJ&`&{X(tEE9lW3--zS$r(3 zw7aoYhYe*&Bjq?igXF5AWz@DbETcSfgA?oBbkty)*o4?R5j+>mBpp_>?tP#F>`vu& zh>#P|zJ&~v^m3bzzk$B8Sx#6@4w6E_*4W)48CJn=(bPcrppuCVxs}eiP0P@3L>I?e zv5vz;Sn9+Kh9b8Y`s@k>B$S_0XZ*6l>A{=BhBArC;jZAg!YVuTzf;Vi$#IN#b-JW{ zh_0VkP5u5kzzXnJ7GQovS8M9fS;*|GE9_)da>ma=$cd3)*XwNj6$107@CoH_V5j)S ztkMQ4LV`p+Wx)!;XU7WvULZf-E8u<~d@f5cf~|2D96^JZ5pA8+XagDr)LF1BVLZLl zJGO`226%hx>apSjVlh8pL%i=@EHXj;SO$goUWA6{6Bz)H?0#Y`IlOY@5lpl|G?cJf zQajE{y9BCEDh<@Tm@G7Zl|a4Yu!#y4j;IC})#un_8N3n6f4mL)SCl_tNm@CNH$bqB zB)?URvI;yFH7&JtjBFlLkT#FI{KKFSn9r`Z zjG*?HXQv%%9F_K;XQx$#Mx`kuX=)-jI8IHBX-roWqy_$z?@WTJRE>-z}Ojza)(>*5mv? z;}8oKFm%av%yD1D)wWo68WqlZ%q_!JmZM5zu2Y#YQXx!KMgOYGTfd}A)K`t!Ne-w{ z?8MMgW84Wej0MDRKczWMX3*R*bWK|~4KI-$xuN)9h@s}hD&`#BWpP)_%~@46WcaQ@ zOjB6GBDamEB{h=EfBuPKkO-itVkZ!T6^sobdEM?kP!qH?AKT4KAu6?*a%?8n3Sy_I z1*$_ZlSzFtI!ePslWB7dBN_X?mH2kTRLi_B_z*B}wpQsPcLKa~w8~tqGLNjVBP5!Z zB+=TcVQwNPmX?(+a)yCi`wO%_=#4>`zKg*E9cQQd{%tC0fB(8{-WO7Z@uuaLTmHTj z;*2GfiMxU{||@;(r6s5 zv}>g{$?%5x4!&AokWm`dh%H)fw=mgfRLLsLIas*lpN2gM^7lwn4od2N1DTjS4>_P| z!?J3-eCM;kdqG#Bcc|$mgx&2ys}5X)2{1KbKK5htJXf?DOh*D{hOV;{^U$bNFFYf> zvmgUzz#T%^3Ndx-<@Q*)?HDv^Uo7K?7}*HDfEWJ>*ivs=2FueVFpj>SHmkMlSg~LN zZK13!v}+5UZ3|(68A@xA>lEGc(&r%w&h9jO*RbPHOF-H zx;Q5J&=1;LTa!HuueQ*oEzBYPyCFwg-$n%;QSOG3+-v@A?nfwh z(Max1|2FrdlzaUDO>S-dX z98McIlGY&abP!kMeFm<;6b4)UC_X4Sk~HdK$-RY;4b$a%LcMNF!0U|3Y(lj$&spK# zMTw1nGG3xYzP1K!>$?cS*h3&DU=H`&DL*>x5;bNsyaUSL^j$RUQd25e{HYatcE!9FrD^ZWV?BbGt46Q7E{UpsK%S#vFWf|{&^dJIjqVueN0U?71OLlPwb>wJ%d zC96@D4LhRRKe-_bo4CE2atxb4*zke!qA7!#0)y=k8-kmUuJnAejbEFOPIyS)j9|@? za;NB@PGFo8U^I~}d)5-M7(CUy+#RLebtMs;e8Mwmfqko#AY?yCfd)g&vk#)PwK5En z2fj6^^yt{<5%BFz!j}RLE-pQqa#RbYpi~G-0%MsRR-su|OlglNDHGe(sM_;*md>g~t6 z&#Y3EgCh#OZZzy(jdnIrdXh8%=)b$#1bvvQWM3^OR23Yl3`YWOwMNrYCPWl%2iSQr zkcQQXjSRqM#?nf6PvcQqrx`H2csbdJM_}jy2~%M74}+mAhhm;XglE7|m4qRw0+0@2 z51$CpCi8`?aTnw0A^R2C9v3F8F2b^q0bq9d|)e)7S9PR7u|3r8Dj5+ zE{6t{2O`%#Z?4mQDBUcfo1YgV=uN1Su~i&I?m!)Qom^rft4->?W@@i!Bucy ztHi$3Tz4Wgi}q%eOJJ_eZ--4Bu7u|;0#9R;U6{1n1eGW^!PM}`?IfjTCgEB;LGjREv?pR~`tniWM4@M_X7?m8d zL84pLPK>15MIAyolRhZizOje-*-s!(_Q+tuFxGVgAsBS(I#Ng>-<;6LY7~P9+#LU_ z7(VBsF9`jSLRku#KAo61K(w!uQM?lOWtyVR&SW+{PZ^ zZfeD7$HK<4-69yoDc#abt&KrzWaW)Na?9>i7$R1Rx4;_rJJD^B5?#qGi1g`5z-p0P zlWolEr^W{wW%DckU`q)5wU?SW;h({N50W`(r_ZtZFDR&&TjE}nWgCcoAi%9A4Lv$m zulqCw9<5IP&YwqPF-P|}eY!{XRR{Qgm?o|N(Of}KrXdN@m)^h=mm}X2bK>qr%QCM+o_!D8%GX%^ed;vdSB2evUrTqlj)Q5vu zXsB-&LM)W%dnpw=-JG}{L|w`56Fh?1;lcP=dv%HRlwc>v=I>Bh0WC|!*N}h#w_zHg z?I@JV1}5E|z;Uy+GQLRdu(J++;TNi<;i^}hi5KY=2C=GFz8$W*npbWr_52cy(p)%4>gse8K`i`UzhT&I78{Ac`t{dTCKid{T3c@SlmOUQ)9(Z#QYsp+ht`j#jpy^O3#<4K?Q3 z>%`V3X3W3R996o6!HcSN{#n-`X3Dg{s++82ZN55wYR`= zu0dj-@HJE%(n%N&(7d~|@jT456X2Gtf0q{1g=tMrEiG=>RS}Y#(qNN8d&TgXFqFak zm{=6(p1oBYy~c^d7j>=sK*|N9cb&tFV9ifzjZm!ts~e5Mfs0Z93%byMIOcA|Hs6Ty zKb0^U09=c}Fey|8357?1o-bgGE^VQ%zCssl;KQkVy3uF82R8My+U=P1PdGX)@)M5i zz|m(Y7WJH#_@N_&rq5`3a~7Jas0MgBIZGQ6r3pBK{#`S$$-&TLpZbmCb;Qh zl!D$@UQ7*_PorG`WxTQ6&eqtf`KL!=pm&kQ-hn7%IZksR_AQVF4tvI&Vs*L|`GO9e z33e<5I~Kw*h&kaO*N|HSx0*`3#XHz=X*>h_64r*xYShqxr72@wR|~j>`IoR2a=vnG zPI9%gpto>ALOEw$mqdsq7Zc>93u5Tx8)WHnSmAaC_zJ8h&f=&CaY+ppnZo5|z_ID) z;8v3a@IjjHIn(Cp4Z^#-7mR#9e98G0!FXlE- zdH*OX?;oZz+fQ@`pMli84W^#6D81prvnc)azozuHl=F*}uBw9P7yFhF* zc3^I_^FucYGjcOcjOX|e<;0rDPH)~1M@eW;Rpb$ZINkN9Am1uke8tw^*Zu-?BKt` zXf4XcHn(Rejzel#&nXwM%>>31Cr=eSo@sA&#Q-Rc*epB zMEw=IgmQ)ZaO0)w>lBunvai-DQ&bvLZ0HnKD8ixl;bxs(C}Ntjqf#zXDc|Tk&AouC zO%_1GzgEWjEy^nimIRAxFAk!zsA$!~2ce-74)ae3#{~Sy_71t`3BY{*YHmQP(+(>V zF2<^WfAnWzX~p^$hYDCi7)oYfRR~h2j0D+aBp__VQ|!Ia1u3&Y3C0b~0ybC!(o5a% zHU6y*o0RoQLjyq|Yz@$GMPV0qaqdr<)Y?OLvGKlYGOJXv{ZK#oAjTysf^*;yV>H){ zB3S(TqH)2g@cf&SB6{dDP#CM@a0J?(5qDrM<^uz~!?%D1p@E0w#%BbDlU6i8Sv^uj zMR&lQIA-u|Hb+?a3cYe@DfkQ8XwxErV%gmjf-Qnv_ZJNVCYy90223uEUje|b24GiU zL8X_P;2cSU^EUfEcMv#OWy$28xQ#Y(Nd?3bK<%e})OR@2_|sr+ToRk>6RT zWi6^DhyR!7VsJhFAJ*K`7xo>!1H7ApS&9Qo*Wg`P&!j0c{Q)d9$X$7?f7u>v_`nr5ex*p7Wkz68zn_2K zEI3`{borNcA}2XSSRsk979NOCBKP+TMiTyp9Z9%f4|wHTer zLDcgh2GOJF8yKIgYa}8EQU(LlOo$=Mx6+PikNb4!vXr4CjesH}3t2rr{k>rSaTPGA ze;^j(s1B0(#JZg%y@W}_E_Ml52wO*%<0ZIUI9@8VEK3bIV1f2)lUp01V)A-XreQ%w zn0yTNldX{KC1AIBj$RK}5K38_O!+QS+>n>>iG-I^Z+xyOe_5(0WK1{@`GL*blO^sl z>w*IWP7w)uU7t*;NY*vBB54aqG`>d$Uo7IP`EED?(fJ&68~|!qqXt6X44-gprj;qo zCZc4`Vr!`j`>4YElPRsqf_ddhfiTecUi^GBPh~RC66677V@I;QPbObF zj7CE|)wO#F<|x5jYA2uYG0EbWisFDec*`){A009~ot|v|@+90B4d-|}nd46w>}dQ! z6D{$3VVX|C_e?TN#LO}pzEo#Ig(f0G$*hkdD;Ty^5CPWkZMpg0Ns4iAvhqn~o zGGr!>@*6~<7{48b)C7+D4&m5H!m8xxvuL(CCz*T=l40r?zWo8m+qYXxJK6}d^@K_T zdXt?>#(2*=Ci4zpQXF0JMZzHcn`G)iq>io^o5QJkt7vr_vHKxM;VFrc*0M4kqA2bx z>RpN9v?!igG;q-o82j5`%PMwb;XAbICP?l47&?cgi3}?l_>itG4#Q zKkj7_QKy_Ea!sH-3(Pzz69hR5JEdi70MO1ocR(yR{1H_TG2U$M-`7eMu{!RbNlNJ4btm^luT z(orDeMXD5<8^%ATH(TGMsKT5Q8zje;a0gPcB-iN;W0O96j8PTP^v4n8--Fb|dgw(8 zXknoN!y}qElQ6wVJ&j`sSigz-xoryV4EHdda=G`hX!F?oj$$qR41)0t?L~TH4WhT; z-Hb53TVAI|CB<@kOUNZ@`fCU|TK8b6rT_|#Eewm;C)?v=lAlktvv%@^=)x8-d!15s z+a>NWRp{6fQMVDY;BMY@0~3(tp8<((XJNvpZoe6P$TJVXMGg@n!{@>NY9d27lV7At`3X4ZAi0%JXfx5_z9N)mZ_w1S&Y;P| z5k7`*c3Ka=iW2RAwfQRa7fHrNMTEq^0qP0O`}H=&!e18qWp)-O>sfx7qL@xFvO+*c z^fXKR8sKJSN_BSBo;r5 zs<~itYUbBSAYG$x4i*$F+?Wh%*(Tupy3eo)W!5wUIl|!JZlKhpv`;VkBLb;TCW-wJ zx(Pjj64d_ARxfQz-HUhIovsnb$BzU(ox{Jkcxh8*p9EFi-UQ_>(jK4Nv5o zJaOGwJdyilJaH8k*+kxJ1VsNt{mWntpk(6uzRxlK_3$2i@}FR(Y?3yq==pH$`0Szl z0{{%?5$peow57P@XLu;H|BFFPl5jf_NwA=`V^|Oh|F1hSKvpH`fHPTQY>)&@-h& zzr{`*AvF(FA{Vb@?foaPJK1UQ4}T9WK96vh*0&WyR$nJ(xaks(GSPN|xQPM|YOK?k z2ajQKaTP4qlQvoaOSYf38#XS^vqLo~Xf)`F91vs`^ONCUDuAT}F9j+a!*oQtV>2jzubUl@*O;qY8^#0bk1Z&IIvx20S) zOy3f+-yajM8f3N~xf()vYtR7{bJH7p+U9PeYBehBo^hn|qL~ugxX3VnP2#M*Y}mOEdd%S$mszunh*xebDUAbm0^q1wXm0 zeFk>sN^nNi`$-noxU1=q>WM}d%WSh}#K*Z;liPQN(~96!vX;WBTP29ms#!0&kihQ; zXS8uNyBzCnO`y%OX%&bq?5iH;QAW}oPf@OIxJaFg+n$*6B zuDllWyf%WX1gR}>@DX;lVHAtr45FfYWaDt@KujD`)} zl&2cGsrku9ZOn63xVKQN&F^B#Z(4Z;OEGm5Vrg$0o-Q_hjs++`z5vq&;oe$J&I?d( zMd(wC_B!40d6k33%vud!iXN#2EaA%*R!NxNfvcq3L~n|_&SEW-r@BcC@!(9Za5f;; zXDtLqfDY@04bu|`e#ka+hyN~Wn3ljR=|ifkPZ>xi!$S)YiL^^!SQeT zTas{cLO6Al0hS~nVxT!;blLtWq4qE@t|DJDc)dh2no6vFT5re-W|5@=`b- z88V^$(`^8rA>0N4lRBMx_YC0Fx|79H#&zr>2?v`2cDUNuK`rswXh(R1Rl`&35M5jY zvsV(OFhl{RoO*-Z3lpm&0~Wq1*tKYZxm@%C_Ezkk;OwRxm;>Q@q6w$0a6IU3{vB|5 z1$LbWnAzfSw3xJ}s{NwNkDFcgiXMqBch4Q}vWm}Smp>7)qRZv}|A#Ka3VAqywR$H8 zKGb}yvjWBrYLw4GlaxY7*I*Y(dBt^0aMuDJ@)g`+1g|{|JVHeXetW_fZg}sJi;c%Y z+{*=2D9~?`s1W2#Vf!%JS4DGoq>xRnfk3usWHhov{~p=6#v;`MYY|whw1>N@gHwd# z&y^&)$<;B+-<*dz12coTm=56=5yq8eZxpA|#6ahB{spl*F^MIKB_J*Xf`*AT8T_fp z>!N#rI&!oQz(;E0JXHT(%$MN^uAabpXB7?%&Et{Kma{lDal`?jpagvH z#r8EELJJPMI|5A?vCS>SZ5Zr@g-Uv1jV*ZVOtoEhcQ?lMHCPfi$ak`sxSND-_o(8= zb*6K3jvg@F@379svDyV%jSWTac<57j8Dzi=R$pKg98CJ^<|P~0-QH_uIkJ{BonetZ zQ=2{A=KfwQnr?ir;D`wn$Ys~;F*Beoj@fkKVQm!f=dJ~32*7JJH-vfW;2GA~!s!=F zlhbqv?9yao?ab+3Afr1AZNc-f+Gh)f)QF7h?*4jX#Jp@q#qqK8t9Ugk9_{wqr-AYR zxzkz6PG|p%PNx+ZCe#H7;W*he)s*_|t@aPB?gc|3o3%Y|)5|O}%hqxVL1(S3&}J5x zSqV&cCta31u_!h+6H+wcR#>y$(&vS=Ag=?_PjpbsC#2tuI3i+7kyHK#@24#KRVO^M z1@r%vxWK~l>LH@>jvhSY4oE!maPx5|d?my=sE^|3BX?R5zHd(b)lTF>7XIp6Sjk{t zKz)@UlA4Nzv0re@4tj#1Mli#MBOWXZ&QSf6Sv$NDX!lnBWE;zZOOBmT?-_Edg3b}T z3T?7*eB@8=!-1lnnu~D5jcI-pPFdKUVuu}@FUPt$Fb7xEiK$L&A9gY6;7`Jx5jG_S zd!|GD*FX&&zJoqBos4#W15lz!wJ4G>a6qtw-#bzy!J9{lq|bqYvYX2NI#q6x*%XZO z{yF?>0I?N^h41n6O7qhZ-T^%L`R7=hAjJ_T#mUdRQ$Z};CC9D~{^r}J-kOVgTTZt) zz5|&d_034NvNJ**BIx)5vuIGj@}YqJzyB%K5uT7L8X8Ib9*WkGc07ny`##1)6kjxw z@nygGi0<5@oI$iM{Nf%ZwRGwNaUkqRc0640oa%G79Jz-HG3gr2ZPIeSV-_ z6nhN`IJ(V$4Bi6SM8E$cQhuCFX+ugMY5XE~6Jp^IDDr(QV*W$KthAJqVKX(4V|Ru; zv<7g~CNg#K1;_*xr&gQr5rg9<{E+x!KFmJ}z5?sCB>&tNpCSt8h=SOr8ARsmM=}p` z&q(Hsa<@V^S5ZsxU81FyP@-k!d?M)?LHru!+Z1q^sByG@0Q%@n7P0HOQxu^#_yIGs zqg5sPos8FsI=_z$MPM6Dh>~ckudmCbZwFsHQuxtS;b&9%{@C}UR6hSmzWdF5!K*}F zAH**ajodhr;of8hvtJ*GLi*gOHz~*?fhb-uAiE@gS|;OdqjqfBN@J#%E6ONZ}f0Akj8nK<1< z&Ok6>dp^fSDs1A6b ziAF;G&ELSj?{a{BYhRf`t9fH`pWFPny6;BwqqgsAe5kxOc#+B{1;W7c`1LeU_haXF0Tx|QKF&>rJtFK5^#^5G*z{a8{~~NM;Oc_}PNHt0 z3)o(G6UKBpG8@Y%hNVAgV>4blgmpIm)&;OoW1bWTd!(>Mie=D2PacTU!5*AudI^;d zpJuv^azi4~W`czd6n5Z70_^$GAxOI8WgKRGvZTEF8&l>WU&FMW)9Bdsbp*vJEwq>J zzE$LQJ~7YIhEH4+*#$3p$CmbjBe92t zdIoUmlqcKm=?#r%j$&T`xv>Ti?M}u)A+Kv=8P?a{W2(0Ye2j}Wd+CDTZ1O1W#x0nR z*6T!zdFHOTfRUr}QdCauG2HRmuiT7YyFJ;;`PedcdwI}~E6iGE)Hzz)z(Jaqqj{x* zd5^li{lScu(7AcR6`Hp{J`Hzxy1l*RfpFCA;kc^X<7$~+7o3MMj0|pXwu0-@29iaJ zz=~Lz&@FJDh!4~umorZ%!)XF2I4~YZ;1SFDYDVX|mCM9lF)mT{M2M0A(CRtnCUZlc zBRmDzjxS`O)?D~Eu*3O1=nJeVJxXcJHNf zoyXo%WLd1t-&kg`6y4A`si?5|LdYcc5*O}qn{s8;YL6F2t#W)? z)S4N;K5AVYzb0zUieEv1UjV?J_@9aB(%a+bM6F}v_NaAC91-KN&u1+yaXSd;O|yU# zbSi2kLxboKzjZfAW|x-rko0)d1+Z{ZrY1O(Y$}0R8c7)S$9s_|sXu;3yuRKjVJ-cg zZUkxyBKm*K|Kt}9AnR|QMZ_n+xb!=Mvb*c)$T0*?gA^;z#<>rPZ>5bTGI8$XpAzzf z*f}dl2ss*PFOK{h_VHVWbJ3}P{zn8maQo51T-e5O`&|c{13`r`R4(VY!$I4&BAu5L zla<@72$>o>_=L2qkX%^dVux3z^Lt-Ij@2&2=MNMr&Xshu$NfHgTgh%PtOM12qZs|z zY{rR_CVa6#e>U(oz+R-3b(E7Dmr?hb;yVzaWNdmREjTy5DxJRo9Qy;@MnnE| zO%0|xZ4U0ZN|EaI53uq~>_ z8Fn0K{L?GAm9Qy$8%7v=oTzMW^aVJ)$v6!#Hf_5$;e84n` z{b_{0i-A}WamOx-)Sv7jf;HH8z92;AE_4vnD#x6v?sKST&a6tuXZ(tSgAG>v)W*qA z*xYPPB?rFM53{#>_ey)inT7eg-JPqg`m`*X7jV#}LGtm-!3i`Y)L_3legg)*b`K^K zxfp4*_rR@4$Nf(IHA($pXJK#&rhm~etA%3;@Onv--7AQ=6+~RfW(&ku1~e?-kA@|D zb;>?RZ$Re#TD?tMoy}iDSNUIFhg`v~gqPz`DMs%l$W&d;y=7_AUYz*NR?j%~5+WBo z5m!1FvD;m^V|{j>yo#>y!BUw9M?=}p38Z(tgz>v-Ohjds$nd9df>KpxAWcvJp>rNyZP7~ocqE$FJ^ zyJ=*0bwKqfIC%0nY+5VhbbB-%1Jb>NJYy1??-nf#qJ=?mIm(*RE!=?|=A|iS3#3os z7bbGaPDH;laXvo8uS|@`hx4pont+|FQl@KeaL$h2_R#t8_a;o>oL#ZaU6$tzrF<+> z7g9_B4~z$^Vm8bQrWd<+ulO{7So+b8nx%#HmDNpoAhU}G*6Ly_ZpOqtL8a&@-2<#5 zq10VpS=0C@B;p=a^TJfEzEZ27%@6+!Zn#?ge5_gFSkiLV4I&hz8$?cx2g;J2o#1wY z6K=QRXEbPgUtBx^9IN9Ex)xiVBjarcHk~>SAeQxtley4_hHr$1a!3Y8k1Gxl?S!WX zT|5E~i^2l9D***@Qj}Y-$!BmUn51We_9`(;ac$!> zEx5j_15)w|FNDDJJAokK(^)IWtYzTCSgB3?sLEPdTWi-#T_ogi_xeAuEwbbBOtDv; z#{avBf^@P7saADPHe|3^M;%%Z{d4q9?B(#(Y0BY0`xXkkI@K%yrL>>F7PLs~I_TU$ zK?IegYgS^8Qk@q8LjeZwH0 z>OMnz`G*wwGU;pDR?^GN65{d^eS-{UXrn6h4K93&w6=wE+rlyC-6Z;k$%rNlW^&^_ zU|_>0gbTV#ViMgPXo6^F#T_-sHfCqb_Z~+}#AR*uPBaOOYg@O|^Whih`SMOY+qS+Y z;v?dFk9fW*p7<>#Lz961E#q%{h+aA6fAjCE-!xR6|==~zR98V;pjv&6Y ztu5lYmw?;QEdV`)XKX_co+7;UD5Y)f6=}!B^UorN)A!bX@%%`{4AA$(gW~zAh)Lkd z*U>K8h9UZ--9l{x0l@DQpEmkjB0gpMT!7DI5T(dvM_Ah$5zjs1*(siT#j~59FCW4) zx`Fh4i}vzS5!H)lY{M};FBje96uY%wJO@OY6J3V&Na8=n*>~s-+}#1fVI5@H6y6b|X{Uu$?k)ctJdO;#m-B+uBN@ zt!?7@ta!dAo)PifBc6N3vlGwghHgA9#f9azHeA0C@n_?e4G_7t{ktS=X!74bh(L@l zdJ(FK(5%nC7PEx9V$NHzt$bVo!LktQF{xhzu}mRVz}rBGzLk2#3IhBV>d;tT4n0G? z9JWuMKr(xn=mc$h_?{N_Fp+C?m}oXSOoSU9Cc=$`^@nN10l~Or{#p2lj2e*d9l?Nn z*@a|&5N_v`i7|p;VN^X`6J!NS1(7Ihnzf6$udV*pD!B}vDzYGZ1#i$?rFW;uEOL0qB zg9Nl2nY{5b)D+_{AV4gqU$bkgXpz-J#LHT zd*R5#GT~7q;I5|M7n{uEfF6-py-|<~unokhwCi&*+aTDdC4wQ!9-a;t565$z+QY=c z@o8e$RQ(wRr1+KW`_sq+WCO9fle;D(Pge&&0^HMvFWm`UjM@hR`etHTKKOGu z!t5ephf_nrF=DqXKM}XU5-prEpf8!u#_Rf9kOwZuxiL@6LRcAMp4P?U)wV>uHr*{= zk1P|fNADM}$Cr!OlR@$N;TrLJx>3BIX%VkyTg7X8n|QsjNxXJGB3`dODqfMt#cR)# z;??;>@!I>ecy&J`UWc9)ub%DVb@T=C>fI?`$6gaJ9ucqpJ>oUcDPDtn#VgS*UPFiQ zT8VQMaDXWbw{&&v>_G&~xn#Lu8PQ^w6r9lVkW<2`1@S|PajQ|8Lz?pcA&Xd~mXnP` z+_Ng~oeqt`PhY6tv`O(>VA}yPhHuDl_pp~Jq6x=b%sXB1vlH<{etsm5)T)gfW9Se6yi@0VO)gZX+4hA@~QZdqP~^H*(x=G zbzrJlm(GYKFjw$1&tRyY)^TH!r=K@}3g%I;EMy(HF^QjZJ+X?e($FW@s8A1tl%-HP z=4hpzO7|H@D;znX?e^!ZG>xHXrQG z?fFp{e&{qQZ<@#g*hS&}cVRTltz^@l&!4sq#npTIp%^cgn&x3~jr6^g4l@yNylEzX z1A#&hZ@!pHz$47IF5mV%4A`t<3Cwz#7=c!c=O|@{+Zcgo@${OWV(yB?jlW_ljWhIt zMjJ})=VO*yr2AmQos|dYg4vGe@B?g!$4_UplN(SkJaa$|AVcDNv3M5dUGFhiyi#{% z#rV2k3FBQ=0Tgt|9Qx18u=*xRSd$ci{p1s`dj`qafl~$8@+S!L*Ap~W&mb*MFx){m zEOC*O?elR9RdH4}nT#=1>k}tmp|0Uq+MXxkvV`>&A_~71>qK#x5UqczgoqdX0Lo~u zQV!b5gz{~2M1qe;evk(n?Fl%4)oW@u^5B#PisL88Aha*Tt<*`Ot@an6Ewz0~sePDd z!@-r@>VvZ&wu^A3{FSGPx$w(j_G*atGM9W96`m}bBRsr`#UUG?j6+q#y+?x zgq*l*N2C%bA4DQ{l?0XY1;un`($bFg=o2Rk*$(QBHHvcd`(~jD3@1RHxM2uK_UIQ1 z^RfvZC9ALzi8c*Sc&TJ3J08r-Ow19to40|rH(n!pl}_75 z4)y~|6K+j(HjL~Qcj3Icg|+ux4sgw)FjTP#zA9s$Xdjikf|-~ZCL6es0>8e7iEKK# z<`ajU!Tr%-l^nz^#;<(vN9d-qf#e7*%bTJF^QK12@)lYEIj-r&m5dnPa5-othX`|c z(cq$EXp`9)ZoL-8(HTrT=-oE-1@ljSCp+M-UhL3K2Lk?`Iw-L~4u2FMaAM8Iu}FwO z+|yWz9}qxF9!Ai?p!I6_3*jF!U=-k|<>fROg*x5)Lu-*=ceUYnVjk#Wn~>1U&=D-R^{ZNGux8QU&) z@B*rLS@#nF4lIc)Yz}=5u-^A=JOpVk6g}UWj{>Eon0VI7te;h~f zP;W}i=UpJp`0JT9i=j@B2FlAfFbQWJ@J{T?_zDbgYBO_>g1C378D%dv_a ztEac%AS{oVWG=xK5O5jgH{#9a5_hexWD79m$jtV=(cDG*eQ+PdFGS+nv0A}dIGj68 zpSGE{4l+y@z**X{B{)6>XVpfILvNnm5#F-4^SfS#XPgH=bxE_8#Pdm4qyx|1{!s!N zK)wHrFoR+;y^1E&#LomS@4^)L1zg(kBWh>ka`ZUAXBe#|9}`;bDYPECYBX9$X3u^{ zYZl7T>`6QHDVz>Z&cir8HjGm{F9eMUoBYt7gi6l;inqWb7YGH;fJ#hxDQwbRVdCde zK^wwm7NNcqn}ne}-L)A%yNWYy3;3vk<>_rKQ$5^Pf;^4K&{8@|j2cV0SB8cYjip^y z&rvIh+*8=B9X*mlm&7lCi}hLLIQSwEIy~5wLxL#Z1IH$b0{0Q5-i#kA!>lS29~wy< zMX?ya4iv&hjlOOGVqTqYX-K6QIrXBpAl?xYx;-)M_ou~FYg(Dh%852&H ze%u!~lNLYNdl5gNgXAx^mMlTP3T&46Yl&IHgwAyJqzwn!0LDDHQr&eF(>JcifmHn; z#KrHzjc(q4Q_Cl(JPl;zt}$yl}Uf**ki=r@Wi1_Tf#XMchivA$ss)3nXr5Nab1 zS`Ov6JD!Wdn{>D4mo>i~5)^>=VQC)3Z@I#thu&aPN1j)t5XR8~t<(;X5A2e#jpqJ+ zD2@FdKWpc=(Qi25Cv;#bu15~m0cXMFm6}8=2r9jHK>Tzfp=JP;ieC=i#@~QOm-I6B zSEo-#e<5OL{T9P#fUoR>%^e$t9V00>m?@2^6oJg?(85$I%1^#cR&Mjhri>l)skTpy z9X?9R1)m!`W>Zwc*inf${m@hvasR7J5VC=CaI^^}7^D2Um^`ugGf6>2U{r{~>P(9V zkO$TgM8nG?=GfYfJwx*Fu(sopK`(I5gCTgc=+Jzj+r91MR-un2*i>9=gD4#vHP{pV z2$S#$l?+|D)0qtHUU*-KyL3W_$aa1R#{~C+y#|0a9Jj^K-{qUv$k0>gJc8gvM2X-gF3CEA<#0B{co<^T_+{rq?b44uk4uNUmMh3?!Xx?RR}pVFCn*Owbf!jT$vobf}F6ZQ?`?kb$6#41^?D z3DQ>7i?&6X5ww{wVG_vXaFDiI^dEwtR0Ua*^}}=yX)!>HQ&f~BfA@pW%hssM>x^l> zWQYx_wn2&L8PcQ*xI=HKEIW!4D!xh75Xe~IstmZw0o#feFi^~$GE@DD;4KEcJ*?R> z=07_T&G9xpD~oMpPe*@AXLo3<)0NTKW)8^k&2o3ZeAe8Og~qMMyqML_HW|#9q7(=y zWKz^sa6E7vPQ3Q4J;C!X+aS4;`U~V=Oa%eCbvy2j@m`OH3 z;W4>ZuDw!vnTTeq=MgJQA9GBSdYGn5a#3l=snvKLS{PFdI*O;@gutup1tCH+H>l%6 zc(Sn3Y`9_)2S~-l(;D`>hl_XTMw_O*2!@zIq?jk}Mzu&lyUl zHzH?KHoAoB&!myj>X$9ZQ6a2JGYjeSDGg)#D%`D}h1#+(U+8l@G#LbNdSF?C{puy? ztMsz8==x<@=HYmR^Y&BAlFca7rB$))>rORCdOEN^moR{{*C)-$)awIHk*Q{b(ItSj z{t|n+4m65NM>vQR1tgez$bzFoUaU0&-q!X_LI8G0zjzi`2-o-GCco{nE{HGB)PmTu zD=|QfEgSC&kCxapb#I8tfjF5!0)Jd1C=|TF%>CkjM4wlx!>v)lS6DREW*a(X(NsH$ z9C@Ie{TQT~Pgb$>alQVi__$U+;w6Sq8pVu;naV>M(*c@AWFsohgFm7VLj34X{DV%+ z62R2+07Iicq=b^OT#lEIS)flM8i5R~E>zB>GcWy=v$`uhEWQw0rQew;Z{uN##kr)L z`KYv>lnD|;jBjz-U9(egM9s&d3AA0-an>|VlxgxdiLPjJ{8@8K5H&NWXJ;NJnIrd4 zJ1ZaAaCB1l%Vc$Qj>adSS@1etuqf%Qnti9~(ZIq5PM_5!)5Yjzn#pB<)uA zVIWoR8+NTo0Dg{aDHc5ieUcNN(R3X=YiHIfx#v%DktwOEKP)U|J|-IypFsjf zIU0Kq=JXBWO1>Mw&VsK14&*4NkgZajaBiP!|PgtQ8FZt^1B zu&S?+M}Jjg^e5d1mHcpFNo5i$Z>)JO6n^wmLbuLIGq`t;q>B?}FJ>&f&Z(sho z_zt;M;>?6(gX0U65=8Xk52P}S`(v?#@c`eEB+_+i#yGGB7jb*zJ2q)}xyIJ~$&$?Q z6?iMvz5I~X|1I9%%q_jYL^F58UnCf5hKbLoK9ZT2-ei4NZ#p5(7^8GYPk26% zD~I0^bsx0~pITiAU~@}`q>tv}u9+G0>BU;)MwN^J1uB&Mvi+Rg@9hZtLl(FluIg zUl=uJpO8s!6}ff}$~3N8OKWMF#!nB+ep90L!*bp%{tX6rT@r>tcwJ~*yTY?z%moK| zsE&Z54Q~o&`%p=m(VHs-%F=nhJ*i+Xp~)~Zt3MBpNipz9_yUXB)Rm;K`gF|5Mv!r;t#0bS{0@mbPiQOW1L2z&Le%{p@iumObCJ?Fm$A^0z#Wl zo#BgcOgGjPqV#=j9*X|V6t(szhoRN$d+Qd%K=AyXFaXh^T%?lKK0J031$c%VVC7!r zUGp6};;YKC%ZIp+u8__hG?j)u)Je@$Tb=GvI3r#4{#&eHXx;>uv)7};!7jIEB&SQw z;bAxvs=vv%-!32NP8M;teWCGSRFNIDlhgS2lSGd^*G+nLWnJ&EQEOI&VGE#;Z+p+ceu>$vChMM!#R6Cz?C?xq;cdz*x^YQ)5Eu&Ve}{8kgSJ2CR1G=#pADpL1{yz z;|UL5VjmS<0neVqD7Xx!>)w;$~$+3&6&fiS8| z?U=*F>#9n5yHyTI{WekK*7QAwQ&k*O%0&`CCUUZWO?X6tjrpX?covlfC>zeIYuk$B zq9}$J7IvleT4#I)$AP;u9+aQd+I93QnboXQn{}c>B1T+WIAiO`f_$&I?i>VkqTBE6cZ1ticM!Cu8w9HpW*!lBIo)b-{=&*$T{X{*hfXhJ84bNsqu42_IXM=Roh)zOH&QM}4N_o$p#Lh=!u9dnDp<3~ai$+=W?d@5&; z!}m8#f9`Ers(cK&m(COCD{Ez@M@uD!HkG7Cy5SWGJy=73tK+LUmyO;8B31QEUWrVw z$MPhQL^IT+g^?5%L2 zX`JukY-WqdG+Mf4OLvjpjst2U1&CiU|I0@DSz!I$E*&W!+{xjH5DVxB zsH>l#4K2A=a}l>D$BLSL0gTjzaG$tC4ApZm)qkSyk7z!RbKx#cH+J?a*NxGWe)dE$ zx;!%<+&OlwWKED(GsHYL?QIE~WG+Dd!`uj(lV15KwP+cFo!k1U3bS0bf)e_QDIv1hO z(M)+wjikcTeDC9d52yH_lj3!@rVRr0Uh9dw2zri zs|_6yN?fS|CQm%-if*b~wT_gk5ETxn6%C0;l`H%Rc<>>oZz!ia%wEIiJ!~+eq84=( zdWB%klBM(Nr(qAt|H|_lHyW0=rSS3%aS9pSqc#FRRV&3D`` zH`hk7h+jJI_PXuq8Ih!P!#Ri~t$y9(Bg~!<^H|LcLN6|XOQKjDo==@-5%;MsFpi41 zXu`heU~!0BO!zXZ(Eq_hS6b7vh&$%pR+{a>J&OP2lHptv9{gJ}8y6>7kz}DskmaA0 zwWJS^Bs$blyf+W@HjLSZ#PhCvhiMg8);P~n|BCB`7%pNU@x#ll`fTEhd!qfGTA0PK z{ka4@beDG<7G%LAc7@v?B<0wW3%E9rSmK8^@-mQA;26^0)1*GAgm@bRbHul267Ev7 zJssS!k7xn1$bhG3L)uIr4{$uP;NH%* zsi4~fHSvw{y?vYR(rWWLZl0+(Ux|~N z$xNNMQS?7b0)@iw2uc7i@5(ITFp2bfyv0mR#wd=C6?!^7yS&?Sr~5I#KD}g2nRi>U z|5RiI4nxX_GWsArKJBU1T`RfoPzYi?BtoFTc(^W7l+nuC*yWxHp%e;eTp*}_wv5Y; zJJ0_%-z)$KC_|{{`G}(^yRLW)lG^IAALNk~# zO41AFtxyl!&#;qItjSr3(zz=T;9X`~nw;Qim*50J2|;0+gs(E3_zWERU?(gMHGtd5EB3w=AD*{&5{T<5(HdVng}#nd#uN$ zlqqZP9B*o{<2{tzkZ8J}_pT3mbZ)s(@Xsk1UKyPauiHWAg{8a~*b9|+? z>TEj23BZ)Zyyi~7Y)`!X^9j3v8c~CYAAx>KC!e2yq(Q&wbMQv3 zCK-yqshq!Fdz_?1W0oF(8oQj{fLanerT6L&^vk8!x|qMQOdkI&_=x9NO3 zAQRCUSnI;3Ujthi&IH!p+XEdCQt$p#=%K9R@n-0avT&uDW&>?{b@bxwX+J4GDjVLD zY38B*=!oM7zTnE|SbHxszPCo=LB@NI&Wg9)sp~$X>yGQXaVjhQvv;~oFKHW9k&OpA zMIo%mDXJn;WbEzMtp%wUWREqpONrD2 z-S$@bZt96o5RBH8AqgBhje|&S_Kc%r2Ua8d=#S2DzV>H?N5uPwdYeuQEHF*p#t(S1 zwDz6@kUO)b@$AiH-8snfIXZ<#$W*3{qju#J&Oh}m)v|@9ky;XO^PebY1VcD3S zge|30`m^06nXvh_oM{kXG1G6*m8lZ>$dsH7$bTC*sNYdxeD?&=j9neR!Co>x9$oDU zUvoUL+8w@_-deSdW?}3mX(v>z{t6{#X{>)Bx_Vl?GcTUXuiI;Mpi_aETcZQZmR+ab zd_-?}@9MX?^gD2Da4{>>mYuQ}kjo%&Z_^a`vS}1A3o3^M;-bgpStC|Kyk@NjS2a|e zJ~}Q>y(mYAWzQpj(ZQm&*`Wa}T?+un}KmR!7q5p37H;*@NaQ^%GDW2gEayc=&t8FiCeD%{>} z2jaV8@sDm^I{L%=M9Zs}z9!{=7CZHq$jFvgWAF9EPOb|-8$0#4$e7qiuSBv+UkTZz z1y45gwvi$_)87!t(+3z5i^XZgnQK)oP9JPKZSw3;A~KIPwPxmcUKeGYvihMG@KhFG zp6~WH-9ZahaGBNTi_D8{m#e-j5t$n)t?&otB?6)PBGU#=dJ+M=%RpgHROc*VTdI~0 z*~fB`^rj>|bej~3%w7JDe`&6_=?pcQvQ|vw-vsE2%;g7caK3r(8mbr}U`Goj35(R=U-d3X5ImSFj%!Mm+#rNvppA~`LAa%*P! z@%@(u?k>(49m#k>O#1io)w?aD(5hOd=~28cWEbE{28Z`yzcsD6CAg5n$*aVEDx0(` z@Wr(-r1DOn_BERKapryHM_k9OnZ;BrT^B{Dd&K$JT<_}1EQ$0eoa;2@eK~kH;g&~q zP0QB{oDsh#A7c;rAx*Cdi4s`WHH{se8s0SxomBQ#>pW(A2tfv3?3K0Dig7HZ8uKK? z4O2O7VjT=#`AufTXHHCWfb?v}?InQH~g$dO)f0AU`}m0DVi@=qdCk(%XjlUP06 z5MRo~!g;v>FsR61j?8nOy*M|uwA2bzs2gP7BNcFFBO%-=PDAT^7~nW8q<)C^KeNmu zS?1f~(U5ET9~n%nRRar!BDgpS#TPC>g+CD~t-r1%F!%WW=D-pwxPYngw6|n>Up_FR zrmUrE?xhEsu^?Y!RV}!*Jr!6`5?R2~HD`>hd&3G=5MOJgo=ZePV()orV6N06P5p}| z)obtugm10|^|!GkEm@gXjjZvIkF7EENMw}v<@S(zwO`g!7Wh2yqJxQ=g65oIbOCS8*0gfAg?_ET)v;l|#YFt>eZHZ96F(7{U`@&% zdjBYRs&(wD*>+%4C{eW_Q8l-@>h46G1J=|5NEa9H>RsEH`PD&$?6%Y6`A4bY{|T#!X3#IXpW4HMHjjv?6n$f zOk&X`&>n9JiU_b$XuB_K?->#=fU`HV)S8{`c|8%F;oUakzP%yOtFed2bBikWHr_{m zsmt5=6WQUiRHI`jM??_Q&E+)1?L}k)im!nQzQEk%%=iv5*Upd5WRdLhrj3XTBgM1S z4ST>bi9oUXI~rd27?F9*8Vv=(nC*?JNEt0#!LT((h_~R3c$-J;RVjk-W0S z(q`a6j$d+-j3hUMXS}7@0SUTU))|RFZr9P*=&6i3Jc(HasD?q?O}zJ*CMvJS zWRAHW&JU>9)T}tt7@*D(d^Eigj*G2ss4pJtr;(%9*FpC z!PHc++#e}TL}qwbi#8t>!HV|AqIZk>Hmzqg#9c#xy2LbevqFh!c@Ao`0(J5JoanGc zIaE^ziW?FhQ8I0=w^2N)-Y6(8F>NlyXbp!>g+Jpv^;r(eJ1We#<8iS$bt7pAF7q|y z>#bC0S$jxC05@|%$&34VOa#N>FZ$oAzf#uYW!6J|X{X*D;Y?UvxtL7o@nvlG1j31F z3+R$e-gl(B`wn`2yGo`lsK-oBYUQ(Ob4Yl!r5ofU%GlEu6t!_GP0LM8pD!YsaJmgDw#!Gm)#au)NEQLNQnS5NAQ*s%#tXeKmvMT(x5LaP z;6n<^B>PPQs@jodGQ-~0C%LcCO%`3KqWSS(-Yd#pvH!Y@LA%144ejMjc5+xl`y76) z5s6H#a1qUQi?8;`gxK~{(!l~EFKyU9S6-M}Z__Fs@Bsx&of}T-=t^GW(Om49of6@H zY1lr`$sMV+8fNgEyfePt9G92)mrbn8v&v+b7Kc;@-PXqw3NHEW_}49pBOioE z9Y^<>I8Ui*07c543xNg-E3V2$XVj{NRE8avPp~&=U)oxk#rEX#wNe|VpC783Z7y6! zc{Ej7p+%K>qG4nSlP#@voR1POJrdKje&5NN#4W=XY-l2wpUeQ~=W|i8BDuc5Tb)lW z8hXcxQ~0ZN+$v!k(#aJ95&*4CVN2%25iDvuaK`f?vrvsw6NxEJFKsk6?q#YMd2Y8e zZWgPT*L|^y{eoCJL4jdO`g0Way97_rl|F* zZx8yu2*!iQL>GhG5^`+KTD3f6N1Xy35QG$8uivBF|hQ(gRVN(gziO;xABiOX)%`4LeDNwXDm7a)$KMM zOUkAzOn%;)RBBDnW&37cMu&7$LZg>waw236usI`bGWYN&Vmri#3wYyEsWzD1DgaT^ zAowJlRnj1s!rLSU;&S6P96hbnPLv1rSGWP9a`@6SM#t1)`Kh-^N8za-rMKe)#Z()q z)itQ6hwR8Y^&>I)3Lx6fbE)EAizMGL?X5tbKR%b~1qMJmG3kgfX{94K8Vq-U{>l>4 zgE5qJKw%x@v1>PPP{rRDN_4XoY4yKl)xH!NQBu3b+xQfPtY{7jQM0~q_9~QTLg;Mq zRUN^pgSEVZ=*#SI@AK$DXFOr${KA9c$9T^hzN+z_K)$Cc-ybMlj{Q-ozp6YDXsbiQ zP)?5%ReM0W{uR=1?COKrb^tRg2turXVcf?A$6|L!Dq0e<3QnKXiy&|o=uHLk)ED0r zNk*P`#W9Wthc2!%kjGt9E}DSF^m)@uf(4Ot9iR!R?f)hQe+67*78Zc*3veI$smT-L zc!5PwlDF|iS!{rHS)PAcF1q<%`v;^TFhO;Azcm@+q!qMLmcihCL56;eFrqR6!F&MC z*X{-tPBupbK~hvNv;%|YpunXZOM~o!O1M2tEKWrxpo$i85Bds!g5&WR@82B~h~gnM4z%@x5YZLq&`y|y^*bP!nNdKt9Xz#k^SYimCf zpJh(A|7q5fi_zbc<=~tE&)LqN2oVF6$`F3BjNR0Cuhe(;LUxlb02s_dIXBXlMjsp0 zf3W27-MPte|A&eR*dsoXz&USPwJ6UVp>!&;Usr%ejciHvBz4Hr5bbAo0m4IZQCk7M z@Kpf_=Dn)N&dQeMU@d}ebkcf3$TCl#=L1jVm?x6&OfR9(BX`M!hUceG{;E&SVsvtP z220X2n8}DAI&t<4qOG6#*>HPQHl$#n@K9DADa$8UDSELCWpSxhCKzd$U?hxG9ug^5 zDqNVAya^IPAbOU;Sy>}53o5QVxc84ek`I47^`ORDpIjhR(>80V&1dW-XZVqO_1M2Q z2uR`EKi$2l&hT-s=>U)ne<|j5g8-z5|5>ZO1Gr$dWeGIhiyfO)RfjmOh0q5Rt5L2%XIWSP8u`AS7Co+>XnAM&kzC zia@Km8gbuE1U4@+gGF)5j_8WiOLRvQTII&>wLnK05>Bvl#0`=HRe7REkfRn{DC`KR z$zD8*h;dvXM-JzF@NJ*B=~Y2tTGPf#Y-G=9A(TGOM9gddR6Yl@8`>Y^E&$!rG_B0r zxIz+f<+(SNT+*~R`Z?lipJUaOdtc7^eAE8$5bHI#O}CTCP0&e<+#buW;|@R$XL=Zu`*GI;uFH)hL(L!lp5Umz$CVw;It)c)pBvOHfMd}w)9-W?=O4UsT_%|mixaU>t3C&zX5ghIQ z8i;H((;&YemE7Rn`0lJ!cuaA4VHIPVmi7J3;PMh2=zp)p3Bo#Qoja5n@;0*lq_ zeu_vadYU~@e>nsM?wBLHmk9XV<-^=KT_s<($|ln^zs^;6m>QkFqV!|zdp1OFi$(WA zaiSc|6rq43@pOaxMT26qo{F+;&)?IMw)33xS~NDv$#mv(Nz7FXMH3-`VN< z1x1tbEU|y;Jlw+%79Gqz-kQql7ogLE$b3TN^8l&kxecbWX@lF5sD{wocoVYb-U+OC z>mw3>w_zbFTqveY$&N4F$f}OFqc3gPpqZm+OUxAj4P?ezMYq6)uYHC}&As z;j0>Ugyey`gl&=^TUO`_qeL)+MD&Zv%mr)X(RF0u)saC(bJX?s%R(a!#k%U6jqdQJ z(5xSgg)Q;XTiog*=QTW>qw5@L&B}%wEA<@cpB8V|!o$~M(JihByvIHIoSQ0iw-#in zckfH3E{jWYxUlG;ed~Ctzk=#>;}7@ZFTJ6}sr2E~x@Xai2l@#Nl^6dgzwX!Z9R+$w z=jqzdiS4*wYVQpENwahRq=`q%5+GpZaeCSuc!8jS&XCr&F$3P`UuBmjj4)W-5P%vH z-a*r@SL?=sXJ%Dc56>%!7FZc8xN6m1p>=e|J0KIu+d#z|P<_sXc!N?qehU7|FwwuQ zDo_h3KRFSIsTv+QU@)2D7Kn3&NqM}*c6?Pj%L*E`lY~}c0NmsEl5XCPuhg8oPAzZ6 zoYVg{7P%v+jjPe)ZOuA4{_p~j#8#<_HhYnO>yM(ozfKYZJ=XLE8bBHWZeN=xkhj6J zMN9cYG5KxZhOJqDnw8%P;c|0b484|wvcuWpiVeJK0`{Ht*QW3O~ ze)LdhV0B8XhS-rthhG40m5S6-R4RcuG-ll#hfG=!(o{38!WWoZW?U|J;mne_T<#*n zIs=E@Nn}8WWgOsb9V=p!{r&OufNN%=>gmL+399Tnnt)z!H%XYZRHT&~eN6q^=TUn= zxiI#!5ZLIj9Ok395kI?fs|h^m543viQM}n(rI=`KPRo;%CEuD}0YD@IPg;TX_C!2) zDVXqyz&b0#ZOz!u4XDS5dZ3)8d7_mS-IoZwlnCzjKDrZ#;%N21>RtWsJonU)1(Y*#M$!?uvvuRMA0JHmIyX8oJ3&l!0k;SUQ?^g8y%-P z*b9OEcw6Z9u345wk{Ud`O-KLfAWi)qzQLRd4kV9HZ52few);l@ZQ)-J|2PH!$yRUx zoFuS7R!IFCHCijsstb$lG8%p3$wg+3C$f0R++aoX)iwyq_zq#Qx`o*c-5^3q{NM?? zvVy3t33Ju)#q&~`Ku`M41E$x*k{vXFN1wQx`j~9s*q$;zp>^e$X{{gowc`Qh4o{0O z>%A~Csi9b7)Do*|f9k>0h?ki(!4Eq{%TH>Kx1BM1XXysFroXV{(q>@)fhby_z45lZ zc(ga4R_dN~c3F$Yun{7p9ER-?+aXF!*m0q$Dt;w_(@oG)Yi$`}K5uN<{0?b-hR5NpQB4EAaw zvd`J8Y}Bg9^j=*|&Hmtc@9I1Bd^;Pn(5i$J2W7g6`zS!`*=2eYekMLb*qWhYyY$)?Fo?Gahr8fjNC~|w zBG>(|F^X_c(tw)A6P(k6CnS8G!4t0Vh0ZxBlcx_p!3hv*z2eD1V=fbw%)u*>N7y^o zGz2$~i5i3ZsS{f5(EGgBdh<`pfa4${u+eolBU)Ehw`QeY z%#kT$pG9)f&!x=`>OnpH!_-Y99;38LW#ywYSopdhTXCT_I9(f;az$`ZRX?ciUS6%h zOQ0aOX(LWq6M<$cu$!BoASYiukCr$L1vAB^Rc#N6Zn;Jhvg07{)!ajJkSbTdMjphsfispH@C1e?Jn$QcD4ylztkun)ao0(A3?5fQqGrmRWQGZWU zw^eOcdrM5JV1%<%TZJ-g4s0I0%y$M}aDgIc9Q`3Dp+BM`3y5U9T@aBqE`i}aM*UC1H&hg33V<1MtaMDix9KkVrs+;m3OdQm z4??h|AvoCUz(xw#5Ra!;8E4o!fJ_W=?TpcmJ?y5z!J`T!Cv~+hI8=gy-s+2JDg&N} zKCZ!ER#lr({Iqbcv{jUILy5;lV=tj~DP;m3F0%dzT){;()Y~S(iNQ>eqLnCR(U>*i zTMPnYpe>=bwmpAOG?hw~Tg&)sP9LrIo1Xsx-EPhT-P=3TJCl%C9O^PsD+|Z?^^BpR0S5TuiMubHW_RLKF)*sD@R+)6C)~>+5bt@&Hw487s`+}CXR{3RvaufN! zT<|?DZPH6k)(weda1Ldb1eN%gQUkYB^J-HYa)mmk2-j2_f1()%!cp!`ZTzeRg1<$P|t2<)wkmr@ja{2sa**DDZSD zP@vv#6;WD&cf}FGBnas^v;&2l)4TOzX>LjQx-_F?0ys-EM=rzjo;gAByT=2lWw4Pw zJ*E+68d}`piQPdOw74xAx+(z^RIJqQ=du%j&rR^}A@TmP;o&zLB9PjW7o&$;9KYeh zND%~sV6LdXc?%^Tm;iB3Pg0BF*JY&^XAd@w>5v{@RlY-y?=tjwRes$X>%~2+H7=~b zE-*0Avj@Jyz`HN|U3iA2ZwThbklA!7>_6V&4u63w!qD)=T6mCJEEL>eYwy0RVVVg& zaO!O0KeMjgsHUs6L@>TRwY7)IRgLnjeqM<|TcKf&LYIoD5+x5c6*XH6o{IQkJBE7L zG&ep7`&Du)E!5`23-xu`rCP4}wr{_`>R8>?7DDfdt-gtCv2D3TOu=y9lfsE#s}$iX zjsLNJUx%-@z*C!_?39*H_&%I0F4wAZ)!RdHu+bmALwJ#W{)cmy&!T{C91jjGwqoXxRfii^#sh%4x+;H+b3;?Dyp~HyvC)*7V=%@^!$#S1WX-bw8s@5m(W_s$*8^ zS}W&C-`jvQ-s$YpA}gcSM{N%;0M?thK}Hk|whz2>qy46ktP7)M_qP+U6+_E_5hI zY*;tT4quXK=}*Eea4*W7kLQ(8R(zp?^yzgq?05`#;q*c%@gz@Hd@X-v0!1Fsk8q(q zw&Q7%TzD&wuje7QLyk+i^;nxFYY>N%y5+RpR79Aun*MN_?bkFtj&7YEqQe3!HT`B+ z_s?FG3A1zRRKkYU{l>D=u_p8o02w_5Z5Ja$a6V5iIzD@W+TM?^!fV#%0r6fj z_Qzf!{>nNAG-p;?+>x7RLufZn-1qO}!iOJa|DFe( zVyon?@u(b1sKh{!pMvFQYu`1=VYAds$&UOckE?g0w#Qeiur9;t>Q6nNIAn;YA$MK; z#vW52;$jXbIwL2mqvmO>e}1mF$txY4IuG@Ld~eebX?A{|_tBGbG*Ys@0%^*2@>_Y& z`SMm-^$R?;$FLbFTifxyWKU$NQ4;j}UOb+?E8%fdXMtvG*qyD)0E^>I+hyqQ?<^}THcn{BZgG_Qs zA?$?cN2FDf)_Bm{cq_l`K^u}Kx?cc|z%6ML5VX!a11Djbe8j(g2s&JK_GmQ)BYx(i z8;^FPF_7nhe_1bn z^eeHKC8(1Nrb1O=eAk&NiK;iTdrc*0#J9^RhD5jze1zA%{gEqT(UUIR+8_u;4io8X z$r&5_XhazIga_jvUHlLthJLrFBRSS|GI`8bd(3K(S@CpGT&5Iy!EPufB{IxzDC3vF z<~RnlBm2Ww=}pI#P#AE1{LAHEKL7H>mmol`)(E8?&7^+05e?q5QEf{8iNG*`8~SX4 z-lKQG@zXM0BfitlF1}nj;OwHIx1aHz?eC(oAd^{fTwWjuH98`Q?>2~!u)i*b4Xti^ z0N5JXnAw=_2cDAtWYwrUMUO-LXf1OLXYu@Df|=>SEp@RSyBX?0Y42mZ1bx-Xd89)Y zphJk$hXU~pfx|bk1~9=V9E3n}IZkA8gUokc3cSzbvOcaolnud?M49)o@`CeXJH#QY zD;&1B6g2aIkrX7~`hsj(Z|#fZ^;zOPrcRA0AOQz0I=@=}q?lMfEpz+7>vnv#t}|sf zns$n5$JntNPY}2V$y43skT7cK!=nCMn~C!|<}1EK-(AM>IBmT=dYgWSr7x?iE~I&9 zK;irF`wAG~a6w&Ac`)ZP=6JOiv+j%dJ>u=zarFJQb1| z1aT#S2-1gQxS&i=$Xc0Tym8DB-y;)Twu$gU+=8w~z0?9hM<)t1th@kQk33>U$V(m2 zDl^oJ1rIu(uZzPLwNqXIPv0JYUBL{Xvm$&GDy@V*P;UsNG4NN#B0>FdqlBC>n_h~cPYQdz@`BLdq-KiMb*^P8fW`Z~RV>FX z1DWOBW*s4E7XD1;QepwW3+%WAXd~owV}aN%sQ0k7)6glIIBV!exlA?{l!@<^dG@3n zehSIImi#;xi`&SGS?aIcZg`Tnx$0c3TY1Q367rQbMS#1R&5n?+Hq#jXVs?d>5|QII zGxQ9rJNykZ0x6b0y7Rn4<=+#8~rGjW z;$6M{v{?Bvmid-nfOTk}{kF8uoPEM3pV2qZ6a^KO4Jg_|n*I zF}-w0zHG&NO=%6eOhW3#`}tzHe^gXPZKdg1ci>aXuh&4}S~SOQEZD+QNR;BDc5o3Y z;4>Cs#(mn}QXtMHzz^bm}U1LV+?S$Ia@y#<;++Ia9hJ0s&`v= zjd$DW_WtbcDcZUW?Vr=0u0`Z#d8527SujdRlJ6|JfqUfYYw{PI+~O ze`6V$*WwIg=&Woq6df12SBbWAhmw}SBerCB;@Na2e`KPTCU(9lb^f~x3n{F|?WSUY zIiw2fk#)b0l!;n~B(~;&8H)DWO_}74FFWmyj4sKpADOTv-THfypcj)c&5oZOTK8Vb zZ>ltIK{yW>sy0M;hPIM_=Hh)ZKLNX^hj<8{YxG$K4)p8yYh0 z-0LEyqT|@$R~VGgMfeWgEfkrp;DN+LK`n-1IdJX6}Pku%TAG%DuCC0GEPY3sI3OM^vxg9vFcT^WLf%I=3B{nR z@lVb1+Rwd?49}4=P;(O-9^8N zgLqr^^h8s)EQ)R+VGFCuvSlI@T0O+m9^a`))!7uHH2oA#p||NLH0(^O_QH^!yj)8I zU3^2HcxYx&s8YO;Q+%Sz9dG@H^cBvN{T zO;r^oI;rlz%q!cd{t}#jIJKQ&{P=J4B3k!p^`V3ooQo$oZ=*0w;yX3?8ab62v>7hp zJ(%7{-)CITh`p;ZoM7t3y@YrVX}&iLzz(S&YzHJYKwGv#Z zfncli!W=fJaR}nn8e-i%ogt%)W$T*gkT%(wVfLHZMQK!OnsF8@zO#~JXt%X zMXO05!PBLu=E&gG)IB6K8lKOYpV)br{#vI~TV+uVco<;BeUG3tGd-!TvYZTPK|UNEcIjO@S%nU<8Zziyaj4xU7{1MPmqJc3Sd_ z_{MYq7&`ZXf) zu9mx)6 z7jp`VchYO)=D37!0QdSDxzOLa8ph9|kT{aDrlE5~Kp^~WaV45PPoI?i194Kjw3>ChliOUUqruIp=q&D#~*r_hF_~}=Fp)s6$*yY8DSE#29aygI+j}XkP7R_Ryo%YK@ zQmGHfSuz}}*iQ8)9z$GyUFxfUVcXyq{dekJ?vWPJb0LSwaV1K-IJj_y&!t5RvJJM} zaMH(+u89bG1Q5|B^_^zjpWB&{_{*C>z!Hg$z)gMW@T~p5m2wZW)(B;avaqkcWTm)) zL^(Hner1glI+tjDH={^P8$YADJMSP^4w1=PW-_;3e&+UMQ|h6caYv`VNu(4_g+yUm z1iP2OE9`FKa2DKOKe7hiNv67LCJq;2_d$JNwd1yfZ>k%$##7AKM{uu*DqkmWGb;a)|eCFrhpY!4sNi z6cmPss$bqfH`nWHkBiH2p2SsXq(&~FD}7u*iM~oBTs`tsjAR_+PGr&7EN3?5o|eZ~ zxkTovubHpqd=2tdu0@u3pZxIO4Ch0fIj0M#>rCcSGUw~6ta-YsoJw8SSovI$sVeF< z`kT zp+vsnv`Vki!zO|dd%I?%?tldDdEyj39l!urd>2S)DJc3*k)b?Ts_(M(?heJYMLn}4v7#Afmaj#J;h&f8~PvvKo z#Gv#9?^q&PEnh z)Yfu&%T#wL8TD=({adU%$@YbT0vF(dHaGshxBdNL@%L^XbwGY8 zyx)42?Lup_Sor@uN0z8q2aXTV&c7KpH;PtX^RCXm8oM)I!u zsjzKpvzrdVqSKJ*T_f)9Mc=bp9iJ}qi+3PWJRc(4%m;xTWovT;<;#&i@6_Z-wS`yp9Nu)~+mEFJ3D(sQ*0=U3G!8LYAux}qHk*3tCt_^DJXNaK zE2Jx7PVZdxO(_^8J$GQg-XZM_>{mTO6_Vs2i4-PFUFtGY#LjcYf1Pm{_c^Xb6|MKk zX}5SHr(HC20L9}w_C@;1=!e00r)Lfd4-i|S$E}85M_=Vqj_8w3yq6w!Z<#8U>B86P5-(BW5-GuY>9&KLbTF&U zhTj|9f^~r!DOu6B?Uz%QiLnBrv8#IU4N(&4^{yC8r8Vk@YpJGIsU9%BaqVs>Dy*Nb zp9n4gL6JW8@kzd090!l$)p}W97rW40?F{s})s7-FlV=O15JVw7yX+H5)*d3bYSC3V z6DmSI5TJ4W9$Qw5yvTlbHKSHTCy@NCG@}0YwSmVkf0bs0Ez+f)rbWji+8#CHGC`w!_qK#l$YHvgnY%qb6KkWsS#cZoEG;T5eRF8g}7l#+4X?O|n|> zCCK{8nO&2GZ{-A(A|#qY|M9L;hUU0ntE?n3lp5zxTEC2Jsx>Vw8Vu?*!D-tmTp5aY z6%Lj*WzCQwikA84f4>^RPvYB-X^a(v?sZvn5%*^l?N#3$F9co(9;>H|1<>+qSc|_G z!Sd<>n3@BsIdBxsV^kAhjET#g9vu0dS4ss?l|4dLt`$Zq{tncAOPQW=*D^iC^|p1$ zJnPHqDY(YgaJ>}cD%Eekr@{6dxul^UTB*JVv47|M+dCE&wEjR~Ayr8G?-&BIrL0t> zG?O8GD%Cn&(%Zy_#N(;Pf1TnQAWz~%W8jTP-oSoQJnKvZ-^2=0T@D74fHC_us2Y1= zJlLXN-kGC@uptIn?V;3I(H7Hrs6xy`)D73rZ*dzy$dp6m#yKpnYCn%~;a*q0$N1hy zQc+6nAW;Xn7i+FAwMp`jotRf@?+UU7v#vcT9Dz18lgvS|36F@QEZZ@Bz7J@s?m`yJCXXF~GZYGx?gx9biQ)5=@L3gRW zb75i$6;#N0x7NsHeyFxJh{Lnq=p+k=6{v-xXqOe8n7oKA-<2#*%lRtFF+gG?l?Y=@ zg`El_rh>ZH!Su1>bC6UfC1_L?pA9={k-ItsHQ6mvo-S3c%U^pi#Ss(i@izSi{4K{T z5wfyX6*x%m>_E3_XZNY-mq0okBMpKBG(0kyw|qy#BbG8{9Yt*&i^^K-1qvU&8YtvK z__8@?K}zZfosbjxXR>*^)L$_qwRH42sD1Affu2~j2Z1^fkHPzApjgc@&?k9!kynlZ zAQdFtC+8n2@|3H#OFh!oluA`immAx34sX*KGOK^%t2q@`EuqR~88BehvFKK9pB$BS ze69p?)e^}^Fi{?Jk?=RRRfca+^QG#tES+IC&#A>|?I{jbRrrBSR9_Jwx!Vb;8r-k0 zmP#VKlO?J^m&~9EseG)IEp&?hKCC#hgGXD^#d;Ns@Wg}we*Yn=$YkU`rpaUK1=UGHpn7Z zwHjkngqU`~`|TaX7jgDUTUmTrmaE+dBPK*0on>TFt~SKTuwO-r1|ywYH`PSAl`g@9;Yt0!@(1mF95mE;xu zWr=U`p}Qsc;lK?tu)jI@Cih2CL>9m!`$V1H+jtrHQdE;jx`EmR4#$!tyZJ`m#VVBD zovR9Yv0PIGtX^mEjcp`*o8Ay;uT_<5jPwNfs|=T^p^{Z7G=*zZb>dNKJ%nQATuD)i zSE+PvhWag!P+y{_!cKLO;b=&p`j?~w3j_B)BRw`DqK-r^tyJqJL!rq4c%*SxuD{dU zI9hrX>8(`DKRZ*%dQLWYH3yh-LE~7#9%3%(AOL2pYAOYREuBsM7QkXo*6f#ErF#@> z?W74d+D`t8E;=Uy`b3At_J}FIl(UpR2|H?V1R}i+nH#J1tY{lsd!9ORifrhpXZT)A z4)MLJE-BXqO(Au@2IwPc+Fy;(?*s+)<-O{Dazl zrzQxp?NS@LZaJ**z@nx{1{zHmJ(AE|z$ zhyf>jX65U<0-Fw;UHO2f*#i1jbX*tb;CLqyS+9<+=j7UrMh_YuT>L5e7DZKsz7&}> z7QC7mTp7!WTO(w}X59Z13^=kL>)7M(T(CF(-jGr4Ex}y#oH43B-a8k$B=oTi_Us|% z3=G4WrWQQ9$V92H(G7%sMSF|IOT?CzKn@<#k9V7yIzo@cE%uO6djth$A3t=#q4@7J zM!m+YqRFgfpfs~5HT!-&lTOrkX6uv9ociJa(9G}ue{1G3)6DThvf$EVGmfM*aL9l{ z{P#m7obO9#_uGj;rJ-mLh}2Z6ZBW>&f#+?i8kkv!FUab)bT=LnT|&IK>L4d9tG!al zZgtfcWMiYXrqg3DAC^rW{+a;P066^?b6RG;`C0jR{17XA!J(qP4IRSykaeluq!-0m zik3j`aqX=dr0s4Lmyi> zcDdfz3uGNM;*cGo_jX7s!v8}wi$NVf1U$ejzTi+p$9vSkQV2KTHT5m_sk7apy;{k3 zvuSJn0Cb?S?4XZN_Vq98J`Gs!f2@DT@!V&iwV!`RQHgbScB^ND^T&~5n9?nQY`wo( z8jTx=z9HiRcs_wMvRuc@3o<-76Ayo@y6Cux3pQ2ldk1uFV(|&nF?^+SJcbJf9D?LD z9glLQOAfJKue9g6k+MC)rRk3UF(aO5hv2+Yy>bh#A@AHZUN6rP;Gs^yHoL|;3Fiu) zmm7X}cIPTl+H>Q0OnlCSU`y3ace(C95y*1I!T~2EMp;$)wmxmx#3Ji;{E1zFLZvX2 z2jW%=12jZnXX;1_H*yk8MYyvkI$SQ~Vi%|DL%q~#ZFD;4IC8?g%Wb%;AUC6o&G9hk zF`REkI&`rdz?qYXIgs+k9?qQJu-E14OHE1$6OR77B5Be>$5R}nF8ZP)=*14CV+8HM ztw>Ix1VFB-2az1|Hb$YE2AAW;Zj{pQAxZ2TO4xb?8XW=I!MQPS23i!Wv_4iQaT$l= z62(247!tnitkN!Z5v46%+TY2gw*DMD=Nh6mX877!*Up5gS67AR z_a{F}3-)uu??47R4{?Nj0aLmMPQW*LAk3j1WBhu-GQtbZbm{Sns#%WJUDS5%!4mwd zOhvP|CCeQIt_>J*U&uR5!kM48U@_eoStA-Z%`Q*@%QGnDi$awSLU z#xldB7-Tg>c2dNBtK&pBCb#EXeUb>jJ6FBJ zhugR%0FXea03W_=!lj?AF8<0|HW=*5@Fl_`uU4fOB8A1 z7{H8QG*V+fV&i?dK|KU#LV_D$$pqJ5cntpde&#n?YzMN`ihK0Maf0=t$n%)s{BMaE zFOXY$Alm4Azq&Qc_mQ%_OHDzxBTEF#sW@%E1t~oMMqLqiQ)>EDpxm+}SG5Y{R*m=d) zFbNv4Rw}Qy-k{|2Z&UA?^I}`|oxsqBdYFgYF%!)+LKi-jv{YD^vk-H+494e0b5S4uo-s16&1>yY0Ll5WO z%_et;KPNxgXcKm+AHPp;y3|c%YI-gkSVH5HN(nud>q6M6<3lb$BvvS=H%g>JLtTV3 zLNT{OJ(Z#IGmrV_X8}#~v)ICKkZ9Hg#`CiblPom-gjt369F2l`?UC2vx5M{;OrAuu zteFRx{cHJ=sFg7L*YOCRM{~~{?-F&=u|ArM(6!-A8U3yCu6mVx4QFnW&d0}rgBs2> z0vk&gHk@hT*BkffG@(?zjVE;8gYvxca-A-xiFf6@I$c!Syp3<@=RfImmWKL{>Sy5@ zH=Gekgtzf|o{#=PC;V9_Ae!UjDS2M`-}*UMI<#`7em-A6i(8k5GkH8e^kBo8i*(u# zblMjsZT?Z2jD|BUyez$hmiS#V-Cp^V2Ex(x!XZ)yIMEpXf3JIp^;IBL-Ybe(RtcszkgnWo- zKHdNYA<~zDV|K6H6Tl^3b#LY$-E{HCZT?IDnq)~c#74eI>&-5!f$8d8{Zr*14|`FQ zV`iv-?@OUdwiwi$ zdKHV>vm$B;lRQM6kp7C|+HB))t)w81qW8v%6_UppbFg0w762Y zs3XUFpNEu;WL8$<)iiMA=+78AmDCr*`-m2qN9SNoORLl~O+Wb!Qe% zPGJ^s`HQ}S`mN|;!GoX_Y>YB~WY`|vLA4v{*T)(F!NDF@=j&_(lf=!^6X?^896Ni$ zxE{Z*rhStJibbQGdn));*Bri_TjyVCnxZu#u1Ea!AXhJXQV6TlVZRf;aqx2`pY_Ej z%XRNMCZhGrBCGl01@KoKE0#oL6Fw6<1I=#r0LO)4#%*?)K|}JYtCt&I$N_*Q6~TwA zNkW5QXPB;No-x`4Yvm!n@M$jPkGbq;w75UAR^=^_f!I2hjq1IV0)qQ^HIGP*6XuSgU~z#k2cy^hGvLP7^2pZ1&&1HM+_{! za0|MQcHm6}t`JG1Qe3a1TU0GC^b~naB~LA*Z@_cpo8k8n1l?wxkxOo=WPq@4Ro6;} zQ8#2pF5;6^bjiS{an7gkA1Go)mG6xG%p8VdN7l|%;~13i>sI4LIl6^E`>ntxBYg{x znCwR5i*8Zl01BL6ov#qKvp0{-s*%jIEvF7*2_!#i93J_j+K216?8-Ltr4Va@^Urm6ailW zHEIUiAkWbLc1kSjxk&XoI7ZzJXA{eT!91EI0;QOwN_7z#gsI-GLqJ_BFwy7ZJ`+&Y zkP_7-_{0$(CPwVp^|k5Fa~!9v|r6OsOwVTd-K22!3DqMMj5Z>L2B+2|#bP{L1ImCsrw zCal^_*61CC)c2M#*SX^8rBfA^>fMGT>MU2JfS^;X0vACXI^D(>`0dF|yS7J7;zbw1 zhu(9tV%DQG_&cl84yX{T7PyOs2XAeHp?$btGYfl6Ok|aB1u9}^y8l)(|S~B8f%p%W>yLL_g_-NY4lqZJv+tjCT1X?vAiW7R4zt-@~W_w7NVd93axQ`v!|vG?4~_-K7p zSE}R8<2`}`{D8!q6gt3$J#YWGXea}nSshgoc`+HRS&Xc04^Tm2(5fpO|(04zET zkqd6+Lmwk9I<8*RpTHK7EWz&OJ=Ne$2$ULi0Jsqkt(xUS05<3L&q{7&H!ygfp5;ke z3e|txQD&Q;VU4Pk9e112iWg&(XrWA8rwSJ83+1KO)CGizwaPLvEoUF z$VEZip4%QqDV9*)lJ-lT7Lhc|Gqt)B19kDF?~MB$p~&&_iq=jtro6}%OsSH4`QcpHBXrb}L;p&brVznMxE zXKv~eu(-*^hiAT|FQSx@lh37<9C`g&|ph95HV=fC{Y=M0)mp*s9{NhN~A*|Axc2T zjfp#SgG&;?PC_o1Ms#!rXB3?gW*o+LAd5PRE8sSDZ5)F#5Fyg<_td@J z3F_~8pZERe{pW?xN!P79b?Vf1YCCmmpFFed5<45d+J_JeVw@?;Z-QuBf@r#ZnUGnT zesxjFfZY$RJ%n!dCxMx13$BV>-^Mdy(^G1K+@YsGtzesrtL4MTs%6@>fcwo1Q`lx` zQ&sq+w#53Gg>uKdE%YB%iBEL=F!~h(K^u3k1BKJ8)-wN!htELyLeGn~&9p@=N41@= zLbJGvWh5}3?!<7e05N1-M_D=hvih!aO4qx}gOR_8W&0i9jlpPbRt`Q1C0K}ecOQz! zFaCfs@h$%Rc>bg`b|o!&;%yI?M|mBHg;+#Tpy*zGB(E@x&(UpNczec;MjC$FA1tKEE< zeguHNe!*p~rr_jQHiXkC2MFIS;VBbzTa-)5kCUEcLqE5AyE{INqu>#s^8FSC_}UW?9BH|s0xS0uC4LTVKJ=}y59q#)dO`CLT^7DrG% zu)d`yA6zVBLAOvgsZ^6nqWHHkFQgn$-cYv)=XQy^EQ2@@%d&|bPY@%VnUZJseRhI^ z*0L^ShbKA8>_Yt3PU8Nq#Ger2i)G(d?H}n%60OZ@rxLAINxH63C*4gTCYT=3Nmopa zCz)Q;N%!F{blI7*o+qf1|4y=Z3pM*>_8z9@(!XAn22`fbps=l1emDkuVkdTy#^#2# zHJMEnQ8#cX4(`PHg+p;46k|_!!Etxuba&`fS-pi$Cue&`BsqK4p|e#=WfpCq3))Ma zXb(APO9ky!3bjj$4|Jm4>Y#ltX#Is+C-XOTq7^!f4YBSJQqGiGMjgAt@<8o6;FP8v z^Cbrh`){WRFVl>~8WA0@a`V-WoGR()gTbK6J%RCMC-USoP7prqc)ldE zU9J8eJrM47WMx3Mff+4fEzn?tG)<|Y_Jk}sE)w`h9kFvb{4sY-rrDDgU1&K35wPAt zN*N(dgafgp7sAc^>oBdzZW~rAP^DCM;2Y z-&2Qd%w~$Yfea}kT`13<|abY)Z5zESKE_nH$jy`;8%8Q)3tawmWAmK z3ukp@p_k13FW#e-rI4G0b}`xt26CWN*rvz4*q8e2ASWQZfG@%A7TbaA)8y9&(ZzBtWMNKy>-)aC;iOA3 z?kc9gwQyvWsczIL+tu)cPP@yZ&!x%EVT+nPO!v7Ab^Z|D=T4SZMSIIoV{MP#`sxZT z3e|twRItRVrtKt?KdwvicmI6yiuNI0{@MR_N&X>wXY_5N>(rjh{!#MHw#QGCZ*((C zE*?q2o1Vz`Ts;*Jjv^_~;u7+NS{lcc)>Frz9rP`G7>~siTTrQt6j9mA(Za- zKOd~Ol=7l?xXnJnQd!J%42bcc^q|_%m*E#(c4^R~A+Yl22?+g(1V8-q!EH9fT0H7a zPMT$6)H6Ny))B9TtEOw=ez*E;C;57j%IqvNdqAE;|M^ihbS15~pnisQcC)YcHptP> zH%Lt!QYU;x3e)itsW(AH^CbC5iS4iKrndi^Z+627jD4G&gB?7FhO7%p6<;WGu<=>f zS$89Sk{IuFVhnXKLY6FflC!R7J25WHvFCBMgj+mIhY)mT9nnstEC)#r+AKM0WaLlc zT@Rj!prQM<2&&CmC0Gi9)D`Pe2dh^C>v^zZg^Zv{nVjLEeA(s@+9-q`6GC0E4)SQJ zB-fb0dIv0I?&GuL$>~0Y`HAeJw5kvA z88pk4mo>|^8JKtGEY~Vv6R;2X%UQEr{|3GRdY?VZmG+BSu2X>1flC%6TI2 zHt;>r4?a4;ITd#va6QmAWR@%c+*z&<@t;q;I^cQWWneC_26&5no=%=(A z)%!T_@qK*$zWw^AoiO0U^noXxoN>yjr)8dg#-OY-&pLbXFV4vxa_)IUhYc_NU;aCP z#K;RuFC67y=Okj~UKALeaF<#R!vUqa5apu)x>^_aXk<=EK%N!sxJ-Mg-K%?}WK{vhS zHOF`J#NI`jfN51~i|iVE%^qwWiROg#=L#+m%$Dx4ZYwv1)#Rf{4(|3{ubhR2+`oF~ zm-Z1wA+sY+397kH#W}_2YCHb2SCa{M6KybjXb$O)A_9^E9<3cXAXs=p@PTF3ek`7GMQC8(waVH-VX z#p|#Zx{>&ad2>QJdRe1pdJi_|2+e*YwP=s>FqC#Cl>$AR3&VbFLLagkbs~%meZ;8h zW|5^AuEE1vO9{6SogwMu@5`;& zSM>$y$#HGu`d7KJX>h<3UMJPQ>l#ULjeV+VpQ|-me}e7gnAufh{Ysfu*c$7yjJBEK zyv#1qDo&(Y^0&H_Hgyr+mv}ok*`&Jaq5npTTFP}3%IB+efh4N)kpa4RblE&^RIK7a z90f~tF09IpsmJx9x7>=$-=ylWE}<3OoPt>+1rrbN;vkGWUn`+B;o(C^O%jxMlD@sY5dt&NvLHqY+SMy3>Tzz; zg3yVHbh`NF@8Vt+uV3i;W_|L)U<$59Zdt@#D*cG`xji~VUaErbnV3iXnat|CZc+JQ zIYn0_IS6bq{k~`f+~Od!%SiP*DfTp(t>Z$JCBql!d6cxK)uM@jt)MFTF7#h0IUdbBmF+@pbJ1sl zR06pu)^q2%;}n2mQugm6rt7?H6;Veg#7xo^4GbE>1 z{jt#DOKb!r_!728d>G{AOV6b&yvo8O&FxLr31@6csv@Ax*JP!gf$8V%J1zawWOd_L z209TQo?tA?Y$ac3G_z(SJNkF0az4B93o06YYZuBM!7^FjktvlU#i;XxZZP=?mX)eE z%bZT2bJX2*m0+x;RsEMdIOk^Qd!c0PDH}lvZZoPo)PM^)0IW%ycU=kUK@&p1m=G>u zCUEOjvQ09ksu1@twfm|C0o9x^Vt;?ZY`n*jxhG7b&i}uwNHoYH!&4rs7Zkenq1HozH0 zX4fLmoXPQ@HUh}iXC$t3{aM7Lo>Qcw*3m}cli|G_V9J(IsroZ6Ic6{BzH%=2GOx&% z!f#`U460tGvIZ?TchwAopX}x`^9V*af zuw@kM&W>eTN(5&ro3ClA=TyC4(N^BlBPG;Fyh=({4NFVzA~;DnH);Dx;A~MlC{-0d zMR0{|1W{K&<=8hTh|w2o&u z8POPd?HYPmH`yQMwMRW$8}U}|BGHQAcI;S8MrwO6k|*{O%BRWHbDkJ5N#j0l1)og% zLIYVhu=AtMK{l(A_+lm`ZO;3|I9sFm{>}z;D*DyZ8Zcus1bQRYckn?mrRyS-o!!wv z&b!9v(yOn_n$32iW-UCHjkfU+%o8T(byu+|bR#|y)Z_8W#A}!Bm7dLKQ#-fYNeURO z9wvE8Sf_%jZywdYnN}kd!Oa5~!s))q^LP>=9gX8WRbM9A!dT@*nWu;i9K0v0>lvKP z9J+a;p|YgS#&#A%gtmey*>7<7E+j&xj!;H~fHdu@t&w$hUIN`kps`c;l9X^au90?$ z+~V$iyqS`?EA7{MH_+x~ zX5vls4)r}a^o^kFMdlKQBjVoyWGUX;7g z+d}<-%$f@&8OBeWO>?16X+IZ~+X~cEK^K=cD|V@>Vo{*jRnE&Z-=PcqQB7a&RW0#i zd45-e*N?sXs&5!#L?bMJAJ(Qsm9!^Z*~ulW5$sYQGn6O;e$f5XVh`P-Y7c60yQ=7n zln!r=m&vVlOSWNikTJ$9Pl^Q_elhmE``@??UV~xySv}Tk(mS4vm;-pZWQc{{cl26Li$ZIR$jI)52#gE_+ zg)dP_y&p*;R(qYD!WXWf*<%Oa8}1&s-5pBDn;~DV)84k9JgnDkjVnR#G~0$yI_I;z zz{d@PKBYqUJEoCVCd8qT#`kn6IK*zkX;(55U5>|{T<`D~dDN^ldw`IwV9G2D!lU^W)&4wwMg4y~zak>UOzi|! zO@u?cu>DRSwcemOw8(e1;)a&ki}Yvlr@y7yd*CV?Z{$N3QgZ+^-ze#3>U2YMyI^&< zvBdONe+R3%zi`)y6Y8aQPlnO9*iiK@4v30*t)>x_OOc0jzlmb@cOvGVwQkYGtSPWL zO^c=1A$4e1LSQ@mE`WvzZQs3DB37_F_L68dav$Vev32ke>TKmC&YL;%mnoWG{q0-5E01lHZkD7E*lxkLmAfrb$XQOk8(VfDL#{bF{M7iTOUT*2hc^$G7X(=-` zJ<4rUk6ubaRI#%@9mC)yDwR*&e5j>#M~R&BQz~dTqc>?ra(KlhIWbcvhRHM4Cj{zo zDo=(fnkk)Q!fLgmukegJ(^vaA@gzjOtUW__2nrsV>esf%H8h-IG>bg?P=DTM9dhzo1AH7(e-jSC~|2^%~@Sd4ff2g-@#!aC5t+o6fFu@ zYcb`iFO-VrTnSekv8c|4U3<_qo4A}>-9N&~iwnzvJd83i%Nrb196Ps` zh7FpM^v`b0FGg(E#^8N&b^XDn+D&5aEeM*JE{mVA<4IWKIr)?iUM2~&guSggT()FlWLN@uSU_v~^rR^p5iz@M(*V2Jd``X{gfIP~ zoXCv)Icb-bDOG(cgbo2d2L~733PZ7%49KJl6n^VXQ6DK

cS4H`#H%&)K=L}iLzYlA$j>})?O|o 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 diff --git a/Greenshot/tools/innosetup/iszlib.dll b/Greenshot/tools/innosetup/iszlib.dll deleted file mode 100644 index 841834f284dfd361f13d664ce649faf8ac96b62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 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 RnbQ)}QmOL4u78>Y{x7-|Gv)vQ diff --git a/Greenshot/tools/innosetup/license.txt b/Greenshot/tools/innosetup/license.txt deleted file mode 100644 index 5a528db0b..000000000 --- a/Greenshot/tools/innosetup/license.txt +++ /dev/null @@ -1,37 +0,0 @@ -Inno Setup License -================== - -Except where otherwise noted, all of the documentation and software included -in the Inno Setup package is copyrighted by Jordan Russell. - -Copyright (C) 1997-2013 Jordan Russell. All rights reserved. -Portions Copyright (C) 2000-2013 Martijn Laan. All rights reserved. - -This software is provided "as-is," without any express or implied warranty. -In no event shall the author be held liable for any damages arising from the -use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter and redistribute it, -provided that the following conditions are met: - -1. All redistributions of source code files must retain all copyright - notices that are currently in place, and this list of conditions without - modification. - -2. All redistributions in binary form must retain all occurrences of the - above copyright notice and web site addresses that are currently in - place (for example, in the About boxes). - -3. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software to - distribute a product, an acknowledgment in the product documentation - would be appreciated but is not required. - -4. Modified versions in source or binary form must be plainly marked as - such, and must not be misrepresented as being the original software. - - -Jordan Russell -jr-2010 AT jrsoftware.org -http://www.jrsoftware.org/ diff --git a/Greenshot/tools/innosetup/whatsnew.htm b/Greenshot/tools/innosetup/whatsnew.htm deleted file mode 100644 index c7a64dd44..000000000 --- a/Greenshot/tools/innosetup/whatsnew.htm +++ /dev/null @@ -1,1168 +0,0 @@ - - - -Inno Setup 5 Revision History - - - - - -

Inno Setup 5
Revision History
- -

Copyright © 1997-2013 Jordan Russell. All rights reserved.
-Portions Copyright © 2000-2013 Martijn Laan. All rights reserved.
-For conditions of distribution and use, see LICENSE.TXT. -

- -

5.5.3 (2013-01-30)

-
    -
  • Windows 8 change: [Icons] section flag excludefromshowinnewinstall now additionally prevents the new shortcut from being automatically pinned the Start screen.
  • -
  • Added new command line parameters supported by Setup: /HELP and /?. Cause Setup to display the list of accepted command line parameters in a message box, exiting with exit code 0 afterwards. Ignored if the UseSetupLdr [Setup] section directive was set to no.
  • -
  • Added new command line parameter supported by Inno Setup's own installer: /PORTABLE=1. Causes Inno Setup's own installer to not create an uninstaller nor an entry in the Add/Remove Programs Control Panel applet. Also supported by QuickStart Pack's installer.
  • -
  • Added workaround for bug in 64-bit Windows which in some cases would cause Windows to display an error message when a user tries to change the icon of an installed shortcut.
  • -
  • Updated the compiler and document icons, created by Motaz.
  • -
  • Restart Manager: If Setup is not running silently and is unable to close all applications using files that need to be updated, it will now ask the user to abort, retry, or ignore. Previously it always ignored.
  • -
  • A message has been added in this version. - (View differences in Default.isl) -
      -
    • New message: ErrorCloseApplications.
    • -
    -
  • -
  • Added official Corsican and Nepali translations. The Nepali translation requires Unicode Inno Setup.
  • -
  • Inno Setup Preprocessor (ISPP) changes: -
      -
    • Added directive #redim to increase or decrease the dimension of an existing array variable.
    • -
    • Added function DimOf. Returns the dimension of the specified identifier.
    • -
    -
  • -
  • Pascal Scripting changes: -
      -
    • Added new function: ExtractTemporaryFiles. This function is like ExtractTemporaryFile but supports wildcards and doesn't ignore directory information.
    • -
    • When ExtractTemporaryFile or ExtractTemporaryFiles extracts a file, this is now logged.
    • -
    • Unicode Inno Setup: Now has an Int64 type, supported by IntToStr. Also added new StrToInt64, StrToInt64Def, and GetSpaceOnDisk64 support functions.
    • -
    -
  • -
  • If the Flags parameter of a [Files] entry includes isreadme and the entry also has a BeforeInstall or AfterInstall parameter, the BeforeInstall or AfterInstall functions will now only be called when the file is installed and no longer a second time when the file is viewed after the installation has completed.
  • -
  • [Setup] section directive VersionInfoProductTextVersion, which sets the textual product version value, is now truncated at 50 characters instead of 20. Contributed by Lukas Ais via GitHub.
  • -
  • The Inno Setup help file source code has been moved into the main Inno Setup source code repository.
  • -
  • Fix: [Setup] section directive CloseApplicationsFilter was partially case sensitive.
  • -
  • Unicode [Code] based on RemObjects Pascal Script Git commit 31abd2925837d85a6965b5325e8fb7835ca73ea8.
  • -
  • QuickStart Pack: No longer offers to download and install InnoIDE (which is no longer maintained by its author) unless /ALLOWINNOIDE=1 is specified on the command line. If you're still using InnoIDE it is recommended you switch to Inno Script Studio (which QuickStart pack can download and install).
  • -
  • Minor tweaks.
  • -
- -

5.5.2 (2012-10-08)

-
    -
  • Added the Windows 8 "compatibility" section to the various manifest resources used by Inno Setup.
  • -
  • Added constants {userpf} and {usercf}. Only Windows 7 and later supports {userpf} and {usercf}; if used on previous Windows versions, they will translate to the same directories as {localappdata}\Programs and {localappdata}\Programs\Common.
  • -
  • Pascal Scripting: Added new RegisterExtraCloseApplicationsResources event function and also added new RegisterExtraCloseApplicationsResource support function. These functions can be used to register extra files which Setup should check for being in-use.
  • -
  • Added new command line parameters supported by Setup: /CLOSEAPPLICATIONS and /RESTARTAPPLICATIONS. These can be used to override the CloseApplications and RestartApplications directives.
  • -
  • Decreased Unicode Inno Setup's size slightly. Contributed by Andreas Hausladen via GitHub.
  • -
  • Unicode [Code] based on RemObjects Pascal Script Git commit 52291ffbfc14f3cf1a445f3e88c6902e13fbdf78.
  • -
  • Minor tweaks.
  • -
- -

5.5.1 (2012-07-09)

-
    -
  • Added official Greek translation.
  • -
  • Updated the official Catalan, Czech, Danish, Finnish, French (Standard), German, Hebrew, Hungarian, Italian, Japanese, Norwegian (Bokmal), Polish, Portuguese (Brazil), Portuguese (Portugal), Russian, Serbian (Cyrillic), Serbian (Latin), Slovenian, Spanish, and Ukrainian translations for the changes introduced by the previous version.
  • -
  • Demoted the official Basque and Slovak translations to unofficial because of a lack of updates by the maintainers. To send updates yourself, see this post for what needs updating and use this form to send updates (or use GitHub). See the Inno Setup Translations page for more information.
  • -
  • Fix: The Preparing to Install wizard page's detection of files that need to be updated but are in use or queued (by some other installation) to be replaced or deleted on the next restart did not work for [Files] and [InstallDelete] entries with a Components or Tasks parameter.
  • -
  • Minor tweaks.
  • -
- -

5.5.0 (2012-05-29)

-
    -
  • Non-Unicode Inno Setup OS requirements change: Windows 95, 98, Me, and NT 4.0 are no longer supported. Like the Unicode version, Windows 2000 is now the minimum supported operating system.
  • -
  • The MinVersion and OnlyBelowVersion directives and parameters now require only a single version number. For example: MinVersion=5.1. For compatibility with previous versions of Inno Setup, separate Windows 95/98/Me and Windows NT version numbers may still be specified, but these aren't used anymore.
  • -
  • On Windows Vista and newer, Setup now supports the Windows Restart Manager API to close and restart applications using files that need to be updated: -
      -
    • Added new [Setup] section directive: CloseApplications, which defaults to yes. If set to yes and Setup is not running silently, Setup will now pause on the Preparing to Install wizard page if it detects applications using files that need to be updated by the [Files] or [InstallDelete] section, showing the applications and asking the user if Setup should automatically close the applications and restart them after the installation has completed. If set to yes and Setup is running silently, Setup will always close and restart such applications, unless told not to via the command line (see below).
    • -
    • Added new [Setup] section directive: CloseApplicationsFilter, which defaults to *.exe,*.dll,*.chm. Controls which files Setup will check for being in use. Setting this to *.* can provide better checking at the expense of speed.
    • -
    • Added new [Setup] section directive: RestartApplications, which defaults to yes. Note: for Setup to be able to restart an application after the installation has completed, the application needs to be using the Windows RegisterApplicationRestart API function.
    • -
    • Added new command line parameters supported by Setup: /NOCLOSEAPPLICATIONS and /NORESTARTAPPLICATIONS. These can be used to override the new CloseApplications and RestartApplications directives.
    • -
    • Added new [Code] support function: RmSessionStarted.
    • -
    • TWizardForm: Added new PreparingMemo property.
    • -
    -
  • -
  • The Preparing to Install wizard page now also checks if one or more files specified in the [InstallDelete] section were queued (by some other installation) to be replaced or deleted on the next restart, making Setup stop on the page if it does. Previously it only checked files specified in the [Files] section.
  • -
  • Setup now additionally hides the Back and Next buttons while the PrepareToInstall [Code] event function is running. Previously it only disabled itself.
  • -
  • Added new [Setup] section directive: AllowNetworkDrive, which defaults to yes. If set to no, the user will not be allowed to enter a network drive on the Select Destination Location page of the wizard. Note: to fully disallow installation to network locations, you must also set AllowUNCPath to no.
  • -
  • Windows 7 changes: -
      -
    • Added new [Icons] section flag: preventpinning. Prevents a Start menu entry from being pinnable to Taskbar or the Start Menu on Windows 7 (or later). This also makes the entry ineligible for inclusion in the Start menu's Most Frequently Used (MFU) list. Ignored on earlier Windows versions. Contributed by Milan Burda via GitHub.
    • -
    • Windows 7 SP1 fixed the issue with EstimatedSize values in the Uninstall registry key and on Windows 7 SP1 or newer Setup now sets EstimatedSize even for sizes of 4GB or more.
    • -
    -
  • -
  • Improved the "auto-retry" feature of the [Files] section: it now automatically retries even if the restartreplace [Files] section flag is used.
  • -
  • Pascal Scripting: Changed the InstallOnThisVersion support function to return a Boolean value. If an invalid version string is passed, an exception will be raised.
  • -
  • Added 128x128 and 256x256 sizes to the compiler and document icons, created by Motaz.
  • -
  • Some messages have been added and removed in this version. - (View differences in Default.isl) -
      -
    • New messages: ApplicationsFound, ApplicationsFound2, CannotInstallToNetworkDrive, CannotInstallToUNCPath, CloseApplications, DontCloseApplications, InvalidParameter, SetupAlreadyRunning, ShutdownBlockReasonInstallingApp, ShutdownBlockReasonUninstallingApp, StatusClosingApplications, StatusRestartingApplications, WindowsServicePackRequired, WindowsVersionNotSupported.
    • -
    • New custom messages: AutoStartProgramGroupDescription, AutoStartProgram, AddonHostProgramNotFound.
    • -
    • Removed messages: ToUNCPathname.
    • -
    - Note: only the official English and Dutch (Netherlands) translations have been updated for these changes at this moment. See the Inno Setup Translations page for more information.
    -
  • -
  • Inno Setup Preprocessor (ISPP) changes: -
      -
    • Added function DirExists.
    • -
    • The ISPP source code has been moved into the main Inno Setup source code repository.
    • -
    -
  • -
  • Unicode [Code] based on RemObjects Pascal Script Git commit e5a93a963f785e89810e61e3eb5e2b6ee3efd3e7.
  • -
  • Minor tweaks.
  • -
- -
- -

5.4.3 (2011-12-20)

-
    -
  • QuickStart Pack: Now offers to download and install Inno Script Studio besides InnoIDE.
  • -
  • Setup now only allows the "Don't create a Start Menu folder" check box to suppress the creation of shortcuts under {group}. Previously, it would also suppress the creation of shortcuts in other locations, such as {userstartup}, on entries that lacked a Tasks parameter.
  • -
  • Setup now doesn't count files with Tasks/Check parameters when calculating the disk space shown at the bottom of the Select Components page.
  • -
  • Improved throughput of external file copying on some devices.
  • -
  • On Unicode, Setup now supports Rich Edit 4.1 when available.
  • -
  • Inno Setup Preprocessor (ISPP) changes: -
      -
    • Documentation improvements: Added the functions available from ISPPBuiltins.iss to the help file.
    • -
    • #ifexist/#ifnexist: For consistency with ISPP functions, prepend SourcePath if the filename is relative, and also support prefix expansion.
    • -
    • ReadReg: Now only requests KEY_QUERY_VALUE access on the key. Previously, it requested KEY_ALL_ACCESS.
    • -
    -
  • -
  • The Inno Setup source code is now also available as a Git repository at GitHub. This should make it easier to contribute to Inno Setup, see GitHub Help - Fork A Repo for more info.
  • -
  • Added official Serbian (both Latin and Cyrillic) and Ukrainian translations.
  • -
  • Minor tweaks.
  • -
- -

5.4.2 (2011-03-17)

-
    -
  • Windows 7 change: -
      -
    • Added new [Icons] section flag: excludefromshowinnewinstall. Prevents the Start menu entry for the new shortcut from receiving a highlight on Windows 7. Ignored on earlier Windows versions.
    • -
    -
  • -
  • Compiler IDE change: -
      -
    • Changed shortcut for Edit | Complete Word to Alt+Right (but still recognize Ctrl+Space). Reportedly, Ctrl+Space conflicts with the Chinese IME.
    • -
    -
  • -
  • Fixes: -
      -
    • Inno Setup Preprocessor: #include handling of '.\' and '..\' now treats such filenames as relative to the directory containing the current file, not to the current directory (which is undefined).
    • -
    • On the 5.4.1 Unicode compiler, trying to build a multi-language installer while running under a DBCS code page could unexpectedly result in "Illegal null character" errors.
    • -
    • On Unicode, string-type parameters passed to BeforeInstall and AfterInstall functions were being converted to ANSI.
    • -
    -
  • -
- -

5.4.1 (2011-02-09)

-
    -
  • Inno Setup Preprocessor (ISPP) changes: -
      -
    • ISPP is now an official part of Inno Setup and is included in the standard Inno Setup installer instead of only being included in the QuickStart Pack installer.
    • -
    • It is now possible to enable ISPP preprocessing on .isl files by adding a line saying #preproc ispp at the top of the .isl file.
    • -
    • With the exception of Exec, ReadIni, and WriteIni, all ISPP functions that take filenames have been changed to interpret the filenames as relative to SourcePath instead of the current directory. Additionally, these functions, the #include directive, and the #file directive now support prefix expansion (e.g. 'compiler:') in filenames.
    • -
    • The #include directive no longer searches the current directory.
    • -
    • Builtins.iss has been renamed to ISPPBuiltins.iss.
    • -
    • The Compiler IDE no longer displays a separate ISPP version number in its title bar.
    • -
    -
  • -
  • Compiler IDE changes: -
      -
    • The Edit | Replace | Replace All command now actually replaces all occurrences, instead of doing a Delphi-style "From Cursor" replacement. Also it now counts all replacements as a single undo action and shows how many occurrences were replaced.
    • -
    • Unicode change: Added a new File | Save Encoding submenu. It now defaults to preserving the UTF-8 BOM of existing files, even if the UTF-8 encoding isn't really needed.
    • -
    -
  • -
  • Unicode change: Added support for Unicode characters in DLL filenames (not specified directly in the script, but returned by constants like {app}). This fixes the "Cannot Import" error seen with for example the CodeDll.iss example script when uninstalling from an {app} path containing non-ANSI characters.
  • -
  • Two new Setup exit codes related to the Preparing to Install stage were added. See the help file for more information.
  • -
  • Minor tweaks.
  • -
- -

5.4.0 (2010-10-31)

-
    -
  • Compiler IDE changes: -
      -
    • The editor component has been changed from SynEdit to Scintilla.
    • -
    • Autocompletion support has been added to all sections except for [Messages], [CustomMessages], and [Code].
    • -
    • Brace highlighting has been added to all sections.
    • -
    • Syntax errors are now underlined during editing. (Support for the [Code] section is limited.)
    • -
    • Constants are now highlighted.
    • -
    • Variable-pitch fonts may now be selected as the editor font.
    • -
    • ISPP inline directives ({#...}) are now consistently highlighted in all contexts.
    • -
    • Zooming is now supported.
    • -
    • Added new options: Word wrap (default: off), Auto indent mode (default: on), Show indentation guides (default: off), Invoke autocomplete automatically (default: on), Underline syntax errors (default: on), and Use tab character (default: off).
    • -
    -
  • -
  • Setup now instructs edit controls which are used to input a file or folder name to use AutoComplete to help complete file system paths.
  • -
  • On disk space checks, Setup now queries the nearest volume mount point rather than the root.
  • -
  • The default directory and Start Menu folder names specified via the /DIR=, /GROUP=, and /LOADINF= command line parameters now may include an "expand:" prefix which instructs Setup to expand any constants in the name. For example: /DIR="expand:{pf}\My Program".
  • -
  • Pascal Scripting changes: -
      -
    • TNewProgressBar: Added new Style and State properties. See the CodeClasses.iss example script for an example.
    • -
    • TBitmapImage: Added new OnClick and OnDblClick properties. See the CodeClasses.iss example script for an example.
    • -
    -
  • -
  • Dropped Itanium-specific 64-bit support for the [Files] section's regtypelib flag and the [Registry] section's Permissions parameter. These features depended on an Itanium-specific "helper" binary, which we no longer have the ability to test or build. (x64 support for these features is unaffected.)
  • -
  • Updated bzip2 library to version 1.0.6.
  • -
  • Minor tweaks.
  • -
- -
- -

5.3.11 (2010-09-17)

-
    -
  • QuickStart Pack: Now offers to download and install InnoIDE instead of ISTool. InnoIDE is an easy to use Inno Setup Script editor by Graham Murt and meant as a replacement of the standard Compiler IDE that comes with Inno Setup. Using InnoIDE is especially recommended for new users. Note: unlike ISTool, InnoIDE supports Unicode scripts.
  • -
  • Unicode changes: -
      -
    • Previously, if a Unicode installer included translations for both Traditional Chinese and Simplified Chinese using the language IDs $0404 (Taiwan) and $0804 (PRC), a user running under another Traditional Chinese language ID—such as $0C04 (Hong Kong)—could have incorrectly received the Simplified Chinese translation by default if it was listed first in the script's [Languages] section. Now, like the ANSI version of Setup, Traditional Chinese and Simplified Chinese are treated as completely separate languages. Thus, provided other options are available, Simplified Chinese will not be considered for selection as the default language on Traditional Chinese systems, and vice versa.
    • -
    • Compiler IDE editor updated to the latest UniSynEdit version. This fixes the extra empty line appearing at the end of scripts when first saved.
    • -
    • Ctrl+V/Esc/etc. are no longer intercepted by the Compiler IDE's main window while the Find dialog has the focus.
    • -
    • Based on RemObjects Pascal Script SVN code revision 233. This fixes GetExceptionMessage always returning "(There is no current exception)" on Unicode.
    • -
    -
  • -
  • Compiler IDE: Added new Build | Open Output Folder command.
  • -
  • In certain cases, applications started via postinstall nowait [Run] entries did not come to the foreground (top of the Z-order) as expected. This could occur if Setup exited before the spawned process(es) were able to initialize, causing Windows to bring the window that was underneath Setup in the Z-order to the foreground instead. Now, when postinstall nowait [Run] entries are processed, Setup will wait briefly (up to one second) before exiting for another process to bump Setup from the foreground.
  • -
  • To help protect applications against potential DLL preloading attacks, Setup now always specifies a working directory on shortcuts it creates. If a WorkingDir parameter is not specified or is blank, Setup will try to extract a directory name from the Filename parameter. If for some reason that fails, the working directory will be set to {sys}.
  • -
  • To help protect installers against potential DLL/EXE preloading attacks, Setup/Uninstall now calls SetDllDirectory to remove the current directory from the DLL search order, and SetSearchPathMode to prevent SearchPath and CreateProcess from searching the current directory before system directories.
  • -
  • If the Filename parameter of a [Run]/[UninstallRun] entry or Exec/ShellExec call does not include a path, and a WorkingDir value is not provided, Setup/Uninstall will now specify a known-safe default (currently {sys}) for the process's initial current directory, instead of allowing the process to inherit Setup/Uninstall's current directory. You should not rely on this behavior, however; it is best to always specify a path in the Filename parameter.
  • -
  • When an Open or Save common dialog is dismissed, the current directory is now restored to its original value.
  • -
  • Updated bzip2 library to version 1.0.5.
  • -
  • QuickStart Pack: Any ISPP function that uses the system's DLL search path such as GetFileVersion will no longer search the current directory.
  • -
  • Minor tweaks.
  • -
- -

5.3.10 (2010-06-11)

-
    -
  • Added .NET Framework 4.0 support: -
      -
    • Added constants {dotnet40}, {dotnet4032}, and {dotnet4064}. An exception will be raised if an attempt is made to expand these constants on a system with no .NET Framework version 4.0 present.
    • -
    • [Files] section flag gacinstall can now be used on .NET Framework 4.0 assemblies too.
    • -
    -
  • -
  • Windows 7 changes: -
      -
    • [Icons] section flag foldershortcut is now ignored when running on Windows 7 (or later), as folder shortcuts do not expand properly on the Start Menu anymore.
    • -
    -
  • -
  • [Setup] section directive changes: -
      -
    • When SignedUninstaller is set to yes, any temporary self-copies used by Setup are now digitally signed too.
    • -
    • Uninstallable may now be set to a boolean expression, which may contain calls to check functions. For example: Uninstallable=not IsTaskSelected('portablemode'). See the Uninstallable documentation for details.
    • -
    • AppVerName is no longer required if AppVersion is specified. It will now effectively default to: {cm:NameAndVersion,[AppName],[AppVersion]}. The Compiler IDE's New Script Wizard now also asks for an AppVersion instead of an AppVerName.
    • -
    • If a text VersionInfo* directive is set to an empty string (as opposed to not being specified), then the version info field is really set to an empty string now, instead of forcing a default value.
    • -
    • VersionInfoProductTextVersion now defaults to VersionInfoProductVersion if set, else AppVersion if AppVersion is set and does not include constants, else VersionInfoTextVersion.
    • -
    -
  • -
  • Unicode Inno Setup: An issue with the taskbar button re-appearing on /VERYSILENT installs has been fixed.
  • -
  • Unicode [Code] based on RemObjects Pascal Script SVN code revision 228.
  • -
  • Minor tweaks.
  • -
- -

5.3.9 (2010-04-10)

-
    -
  • For better appearance on Windows 7 and Vista when ClearType is enabled, Tahoma is the new default font used by Setup and Uninstall. A new [Setup] section directive DefaultDialogFontName has also been added to make it easy to override the default dialog font for all languages that do not have a custom DialogFontName setting. If you would like to revert to the dialog font used in previous versions of Inno Setup (Microsoft Sans Serif if available, else MS Sans Serif), set DefaultDialogFontName to an empty string (DefaultDialogFontName=).
  • -
  • Added new [Setup] section directive: DisableWelcomePage to hide the Welcome wizard page. Doing so is recommended by the Aero wizard guidelines. Additionally, the ShouldSkipPage event function is now also called for wpWelcome.
  • -
  • When Setup is not running silently, the Ready To Install wizard page now ignores attempts to skip it when no other wizard page before it has been shown yet.
  • -
  • Added LZMA2 compression support: -
      -
    • Updated the LZMA SDK compression code to version 9.10 which adds support for LZMA2 compression. LZMA2 is a modified version of LZMA that offers a better compression ratio for uncompressible data (random data expands about 0.005%, compared to 1.35% with original LZMA), and optionally can compress multiple parts of large files in parallel, greatly increasing compression speed but with a possible reduction in compression ratio. LZMA2 compression may be activated by setting the Compression [Setup] section directive to lzma2, and lzma2 is now also the default value.
    • -
    -
  • -
  • Added various new [Setup] section directives with names that start with LZMA to fine-tune LZMA and LZMA2 compression parameters, including LZMADictionarySize which allows the LZMA dictionary size to be increased up to 256 MB from the previous maximum of 64 MB. Review the memory requirements listed in the Compression topic before using.
  • -
  • Tweaked the JMP/CALL instruction optimization algorithm for slightly better compression of executable files. (On Inno Setup's own installer, this saved about 2 KB.)
  • -
  • Improved compression of x64 executable files: just like for x86 executable files, JMP/CALL instruction optimization is now performed for x64 executable files. On average, this will reduce the compressed size of x64 executable files by 2-3%.
  • -
  • [Setup] section directive DiskSliceSize can now be set to max, and max is now also the default value.
  • -
  • Windows 7 change: The Compiler IDE is now pinnable. Also, files that are opened via the Welcome dialog, MRU list, and drag & drop now get added to the Jump List.
  • -
  • Windows 7 and Vista changes: -
      -
    • Before deleting a pinned shortcut, Uninstall now automatically removes it from the current user's Start menu pinned list and on Windows 7 also from the taskbar.
    • -
    • Changed the icon that is shown on Select Start Menu Folder wizard page. Previously, it used the same icon as the preceding Select Destination Location page, but that was never really the intention.
    • -
    • When Setup and Uninstall respawn for elevation, any SUBST'ed drives in the EXE filename are now expanded before the respawn, since the elevated user will not retain the original user's SUBST mappings. Fixes error seen when starting Setup from a SUBST'ed drive.
    • -
    -
  • -
  • Setup now uses the SHA-1 algorithm instead of MD5 for file checksums and various internally-used hashes.
  • -
  • Pascal Scripting: Added support functions GetSHA1OfString, GetSHA1OfUnicodeString, and GetSHA1OfFile.
  • -
  • QuickStart Pack: Added ISPP functions GetSHA1OfString, GetSHA1OfUnicodeString, and GetSHA1OfFile.
  • -
  • [Icons] section parameter AppUserModelID is now also used on Windows Server 2008 R2.
  • -
  • In Setup's version info text fields, "(C)" is now automatically replaced with real copyright symbols ("©").
  • -
  • Unicode Inno Setup: Added workaround for upstream Delphi bug that could cause Setup (versions 5.3.6 to 5.3.8) to display a "Stream read error" error message at startup on Windows 2000 systems that did not have Service Pack 4 installed.
  • -
  • Compiler IDE change: the Tools | Configure Sign Tools... dialog now allows editing of existing Sign Tools.
  • -
  • The uninstall program's version is now 51.(10)52.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.3.8 (2010-02-18)

-
    -
  • Added new [Setup] section directive: UsePreviousLanguage. When this directive is yes, the default, at startup Setup will look in the registry to see if the same application is already installed, and if so, it will use the language of the previous installation as the default language selected in the list of available languages on the Select Language dialog. Note that this directive does not change the language used by the Select Language dialog itself because it cannot assume that the current user understands the same languages as the previous user. UsePreviousLanguage must be set to no when AppId includes constants.
  • -
  • On Windows Vista and newer, Uninstall no longer blocks system shutdown until the uninstallation has actually started. This should make the Windows 7 Logo Kit (which wrongly tests any .exe in the application directory including the uninstaller) happy when it tries to shutdown an Uninstall sitting on its confirmation prompt.
  • -
  • On Windows NT and newer, PrivilegesRequired=lowest now has an additional effect: the uninstall info root key will always be HKEY_CURRENT_USER, and the "common" forms of the Shell Folder constants are always mapped to the "user" forms, even if administrative privileges are available.
  • -
  • [Setup] section directive CreateUninstallRegKey may now be set to a boolean expression, which may contain calls to check functions. For example: CreateUninstallRegKey=not IsTaskSelected('portablemode'). See the CreateUninstallRegKey documentation for details.
  • -
  • The Preparing to Install wizard page now offers the user an option to directly reboot instead of just saying a reboot is needed. To trigger this option from a PrepareToInstall event function set its new NeedsRestart parameter to True.
  • -
  • In the MinVersion and OnlyBelowVersion directives and parameters, .x is now treated the same as .0x when a major version of 5 or higher is specified. Thus, you now have the option of using either 5.01 or 5.1 to specify Windows XP. However, to maintain compatibility with existing scripts, 4.x will still be interpreted as 4.x0.
  • -
  • Pascal Scripting: Added new PageIndexFromID support function.
  • -
  • The online documentation available at http://www.jrsoftware.org/ishelp/ now has an index and is searchable.
  • -
  • QuickStart Pack changes: - -
  • -
  • The uninstall program's version is now 51.(10)51.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.3.7 (2010-01-06)

-
    -
  • The PrivilegesRequired [Setup] section directive can now be set to lowest. On Windows Vista and later this instructs Setup to not request elevated rights (via a User Account Control dialog) even if it was started by a member of the Administrators group. Do not use this setting unless you are sure your installation will run successfully on unprivileged accounts. If you were using PrivilegesRequired=none before, it is recommended to switch to PrivilegesRequired=lowest.
  • -
  • Added new Compiler IDE option: Autosave before compiling.
  • -
  • [Tasks] section flags checkedonce and unchecked may now be combined. This combination specifies the task to be unchecked by default on the first install, and always unchecked by default on subsequent installs as well.
  • -
  • A problem with "Not Implemented" errors when Setup or Uninstall was run on Windows 7 under special conditions such as from a non-interactive service was fixed.
  • -
  • Changed the CodePrepareToInstall.iss example script to use the RunOnce registry key instead of a shortcut placed in {commonstartup}.
  • -
  • Pascal Scripting: the Non Unicode compiler now has a PAnsiChar type just like the Unicode compiler.
  • -
  • Added official Japanese translation.
  • -
  • Unicode [Code] based on RemObjects Pascal Script SVN code revision 197.
  • -
  • Minor tweaks.
  • -
- -

5.3.6 (2009-11-14)

-
    -
  • Windows 7 change: -
      -
    • Added new [Setup] section directive: UninstallDisplaySize. On Windows 7 and newer, Setup uses this directive to set the EstimatedSize value in the Uninstall registry key when possible since the Windows 7 Add/Remove Programs Control Panel (called Program and Features) no longer automatically calculates it. If an UninstallDisplaySize is not set, Setup estimates the size itself by taking the size of all files installed and adding any ExtraDiskSpaceRequired values set. Note: Windows 7 only supports the display of values smaller than 4 GB.
    • -
    -
  • -
  • Pascal Scripting now supports IUnknown based COM. Previously it only supported IDispatch based COM but a growing number of Windows API functions are COM based without implementing the IDispatch interface, and you can now use these as well. See the new CodeAutomation2.iss example script for an example. Note: this is only supported by Unicode Inno Setup at the moment, because of Delphi 2's limitations (Delphi 2 is used to compile Non Unicode Inno Setup): -
      -
    • Added StringToGUID, CreateComObject, and OleCheck support functions.
    • -
    • Added HResult, TGUID, TCLSID, and TIID support types.
    • -
    -
  • -
  • The compiler no longer allows a single LanguageCodePage directive to be applied to multiple languages at once. If you were using this to force Non Unicode Setup to allow the user to select any language regardless of the system code page, set [Setup] section directive ShowUndisplayableLanguages to yes instead.
  • -
  • Added new CodePrepareToInstall.iss example script.
  • -
  • Fix: Unicode Pascal scripting: passing a very long string to Format caused an error.
  • -
  • Minor tweaks.
  • -
- -

5.3.5 (2009-09-23)

-
    -
  • Windows 7 changes: -
      -
    • Setup, Uninstall and custom TOutputProgressWizardPage pages now make use of the new Windows 7 taskbar functionality to display progress, pause and error indicators on their taskbar buttons.
    • -
    • Added new [Icons] section parameter: AppUserModelID. Specifies the Windows 7 Application User Model ID for the shortcut. Ignored on earlier Windows versions and on server versions. This parameter can include constants.
    • -
    -
  • -
  • Windows 7 and Vista changes: -
      -
    • Setup, Uninstall and custom TOutputProgressWizardPage pages now display pause and error indicators on their progress bars.
    • -
    • Setup and Uninstall now call the Windows API function ShutdownBlockReasonCreate to set the shutdown block reason string to be displayed to the user if system shutdown is initiated. Note: this change is purely cosmetic, the fact that Setup and Uninstall block system shutdown is not new.
    • -
    -
  • -
  • Pascal Scripting changes: -
      -
    • TWinControl: Added new ParentBackground property. By setting this to False, you can ensure the background of a TPanel will always display the color assigned to its Color property, instead of it becoming transparent under certain conditions. See the CodeClasses.iss example script for an example.
    • -
    -
  • -
  • The Unicode compiler now behaves identical to the Non Unicode compiler if a language uses more than one .isl file (it no longer requires the LanguageCodePage to be set in each file), or if a languages LanguageCodePage is overwritten from the .iss file (it no longer ignores this), or if any language specific plain text ANSI LicenseFile, InfoBeforeFile, or InfoAfterFile is used (it now converts these to Unicode using the languages LanguageCodePage at compile-time, instead of using the system codepage at run-time).
  • -
  • Fix: Pascal scripting: passing a Unicode string to some built-in functions like Copy caused the string to be converted to ANSI.
  • -
  • The uninstall program's version is now 51.(10)50.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.3.4 (2009-08-15)

-
    -
  • On Windows 7 the Compiler IDE now makes use of the new Windows 7 taskbar functionality to display progress, pause and error indicators on its taskbar button.
  • -
  • Pascal Scripting: Documented function IDispatchInvoke, which can be used to access a COM Automation property or method whose name is a reserved word.
  • -
  • Fix: Unicode [Registry] section entries with ValueType set to binary did not set the correct value.
  • -
  • Fix: Pascal scripting: setting a COM Automation property or method parameter to a Unicode string variable caused an 'Invalid Type' error.
  • -
- -

5.3.3 (2009-08-01)

-
    -
  • [Setup] section directives VersionInfoProductVersion now sets the binary product version value instead of the textual product version value.
  • -
  • Added new [Setup] section directive: VersionInfoProductTextVersion, which sets the textual product version value. Its default value is VersionInfoProductVersion if set, else VersionInfoVersion.
  • -
  • [Setup] section directives DisableDirPage and DisableProgramGroupPage can now be set to auto. If they are, at startup Setup will look in the registry to see if the same application is already installed, and if so, it will hide the pages automatically.
  • -
  • Pascal Scripting changes: -
      -
    • WizardForm.PrevAppDir is now available and returns the directory of the previous installation. Returns an empty string if there's no previous installation or if UsePreviousAppDir is set to no or if Uninstallable was previously set to no.
    • -
    • While running any PrepareToInstall event function Setup now displays the Preparing to Install wizard page instead of the Ready to Install page and disables itself.
    • -
    -
  • -
  • Added the Windows 7 "compatibility" section to the various manifest resources used by Inno Setup.
  • -
  • Documentation improvements.
  • -
- -

5.3.2-beta (2009-05-29)

-
    -
  • Replaced constant {regasmexe} with {dotnet11} and {dotnet20}.
  • -
  • Pascal Scripting: Added new PrepareToInstall event function. Return a non empty string from this function to instruct Setup to stop at the Preparing to Install wizard page showing the returned string as the error message.
  • -
  • Minor fixes and tweaks.
  • -
- -

5.3.1-beta (2009-05-15)

-
    -
  • [Setup] directive AppMutex and support function CheckForMutexes change: to specify a mutex name containing a comma you can now escape the comma with a backslash.
  • -
  • Minor tweaks.
  • -
- -

5.3.0-beta (2009-04-22)

-
    -
  • Added .NET support (these cause an internal error if used on a system with no .NET Framework present): -
      -
    • Added new [Files] section flag: gacinstall.
    • -
    • Added new [Files] section parameter: StrongAssemblyName.
    • -
    • Added new constants: {regasmexe}, {regasmexe32}, {regasmexe64}.
    • -
    -
  • -
  • MinVersion parameter/directive change: if you leave one of the versions empty then it will use the default MinVersion for that platform.
  • -
  • Pascal Scripting: Added new MinimizePathName support function.
  • -
  • Added Unicode support: there's now a second version of Inno Setup available called Unicode Inno Setup. Key features of this version are its ability to display any language on any system regardless of the system code page, and its ability to work with Unicode filenames. Notes: -
      -
    • Unicode Inno Setup uses the existing ANSI .isl language files and you should not and may not convert these to Unicode or anything similar since it does so automatically during compilation using the LanguageCodePage setting listed inside the language's .isl file. However, you do need to convert existing [Messages] and [CustomMessages] entries in your .iss files to Unicode if the language used a special LanguageCodePage.
    • -
    • The [Setup] directive ShowUndisplayableLanguages is ignored by Unicode Inno Setup.
    • -
    • Unicode Inno Setup is compiled with Delphi 2009 instead of Delphi 2 and 3, leading to slightly larger files. The source code however is still compatible with Delphi 2 and 3, and a non Unicode version will remain available.
    • -
    • Unicode Inno Setup and installers created by it require Windows 2000/XP or newer. The non Unicode version still works on NT/9x.
    • -
    • Existing installations of your programs done by non Unicode installers can be freely updated by Unicode installers, and vice versa.
    • -
    • Unicode Pascal Scripting notes: -
        -
      • The Unicode compiler sees type 'String' as a Unicode string, and 'Char' as a Unicode character. Its 'AnsiString' type hasn't changed and still is an ANSI string. Its 'PChar' type has been renamed to 'PAnsiChar'.
      • -
      • The Unicode compiler is more strict about correct ';' usage: it no longer accepts certain missing ';' characters.
      • -
      • The new RemObjects PascalScript version used by the Unicode compiler supports Unicode, but not for its input source. This means it does use Unicode string types as said, but any literal Unicode characters in the script will be converted to ANSI. This doesn't mean you can't display Unicode strings: you can for example instead use encoded Unicode characters to build Unicode strings (like S := #$0100 + #$0101 + 'Aa';), or load the string from a file using LoadStringsFromFile.
      • -
      • Some support functions had their prototype changed: some parameters of CreateOutputMsgMemoPage, RegQueryBinaryValue, RegWriteBinaryValue, OemToCharBuff, CharToOemBuff, LoadStringFromfile, SaveStringToFile, and GetMD5OfString are of type AnsiString now instead of String.
      • -
      • Added new SaveStringsToUTF8File, and GetMD5OfUnicodeString support functions.
      • -
      • If you want to compile an existing script that imports ANSI Windows API calls with the Unicode compiler, either upgrade to the 'W' Unicode API call or change the parameters from 'String' or 'PChar' to 'AnsiString'. The 'AnsiString' approach will make your [Code] compatible with both the Unicode and the non Unicode version.
      • -
      -
    • -
    • Unicode Inno Setup supports UTF-8 encoded .iss files (but not UTF-16).
    • -
    • Unicode Inno Setup supports UTF-8 and UTF-16LE encoded .txt files for LicenseFile, InfoBeforeFile, and InfoAfterFile.
    • -
    • QuickStart Pack: added ISPP predefined variable UNICODE.
    • -
    -
  • -
  • Thanks to Carlo Kok and Evgeny Karpov of RemObjects Software for their help related to Unicode support.
  • -
  • QuickStart Pack: added ISPP functions Trim, and GetMD5OfUnicodeString.
  • -
- -
- -

5.2.4 (2009-03-16)

-
    -
  • Added new [Registry] section ValueType: qword.
  • -
  • Added new [Setup] section directive: SignTool, which makes it possible to further automate digital signing of Setup and Uninstall. See the help file for more information.
  • -
  • The value of the AppVersion directive is now also used to set the MajorVersion and MinorVersion values in the Uninstall registry key when possible.
  • -
  • /LOG: Now logs exit codes on [UninstallRun] entries.
  • -
  • Compiler IDE changes: -
      -
    • Added new Tools | Configure Sign Tools... command.
    • -
    -
  • -
  • Command line compiler changes: -
      -
    • Added new "/S" parameter to specify a Sign Tool.
    • -
    -
  • -
  • Added new [Files] section flag: sortfilesbyname.
  • -
- -

5.2.3 (2008-03-10)

-
    -
  • Improved support for right-to-left languages (Arabic and Hebrew):
    Added new [LangOptions] section directive: RightToLeft. If set to yes, text alignment and reading order will be reversed (with some intentional exceptions), and controls will be arranged from right to left ("flipped").
  • -
  • Added new [Setup] section directives: VersionInfoProductName and VersionInfoProductVersion.
  • -
  • Changed the fixed Language field in Setup's version info from "English (United States)" to "Language Neutral".
  • -
  • Uninstall now supports custom message constants ({cm:...}) like Setup.
  • -
  • Right-to-left-related Pascal Scripting changes: -
      -
    • The control flipping that is performed when RightToLeft=yes is mostly transparent, normally requiring no changes to existing code. Controls created on custom wizard pages will be flipped automatically after the InitializeWizard event function returns, and controls created on custom forms will, by default, be flipped the first time the form is shown.
    • -
    • Changes to TSetupForm (the class used for custom forms): -
        -
      • Added RightToLeft Boolean property (read-only): True if right-to-left text alignment and reading order is enabled on the form. The RightToLeft [LangOptions] directive determines the value of this property.
      • -
      • Added FlipControlsOnShow Boolean property: If True (the default setting if RightToLeft is True), controls on the form will be flipped the next time the form is shown. After the form has been shown, the property is reset to False automatically.
      • -
      • Added ControlsFlipped Boolean property (read-only): True if the controls have been flipped.
      • -
      • Added FlipControlsIfNeeded method. This flips the controls immediately if FlipControlsOnShow is True, then resets FlipControlsOnShow to False.
      • -
      -
    • -
    • Added new classes: TNewEdit, TNewMemo, TNewComboBox, TNewButton, TNewCheckBox, TNewRadioButton, and TNewListBox. On these classes, right-to-left text alignment and reading order is used when the parent TSetupForm's RightToLeft property is True.
    • -
    • TNewStaticText: Added ForceLTRReading property. If set to True, the text will always be rendered with left-to-right reading order, overriding the parent form's RightToLeft setting.
    • -
    -
  • -
  • Other Pascal Scripting changes: -
      -
    • TNewStaticText: Added AdjustHeight method. This adjusts the value of the Height property to fit the text. Only useful when AutoSize is set to False.
    • -
    • Added new object UninstallProgressForm of class TUninstallProgressForm. Also added new event function InitializeUninstallProgressForm, which is called after the Uninstall progress form has been created and before it is shown. See the help file and the CodeClasses.iss example script for more information.
    • -
    -
  • -
  • Added workaround for bug in Windows Vista (still present in SP1): With UAC turned off, launching an uninstaller from the Programs and Features Control Panel applet and answering No at the confirmation message box would cause a "This program might not have uninstalled correctly" dialog to be displayed, even though the uninstaller includes a proper "Vista-aware" manifest.
  • -
  • Compiler IDE changes: -
      -
    • The New Script Wizard now generates random unique AppId [Setup] section directives.
    • -
    • Added new Tools | Generate GUID command.
    • -
    -
  • -
  • QuickStart Pack: added ISPP functions GetMD5OfFile, GetMD5OfString and GetFileDateTimeString.
  • -
  • Minor tweaks.
  • -
- -

5.2.2 (2007-10-22)

-
    -
  • The Setup loader now extracts the Setup program executable file with a ".tmp" extension. Versions 5.2.0 and 5.2.1 used a ".exe.tmp" extension, which reportedly, in some cases, caused an "Unable to execute file in temporary directory" error message on systems with a certain antivirus program installed. We were unable to reproduce the error in our own tests, however; it is suspected that this may have only impacted users with custom filename blocking rules defined in their antivirus configuration.
  • -
  • Pascal Scripting: Added new GetSaveFileName support function.
  • -
  • Fix: The compiler could fail with an "Out of memory" error on script files containing more than ~100,000 lines, due to a heap fragmentation issue.
  • -
- -

5.2.1 (2007-10-13)

-
    -
  • Added new [Setup] section directive: SignedUninstaller, which makes it possible to attach a digital signature to the uninstaller program (unins???.exe). When the uninstaller has a valid digital signature, Windows Vista users will not see an "unidentified program" warning when launching it from outside of Control Panel.
  • -
  • Added new [Setup] section directive: SignedUninstallerDir.
  • -
  • Check functions associated with [Tasks] entries are now called when the Select Tasks wizard page is entered. Previously, they were called prior to the wizard being shown, which meant they couldn't depend on the user's selections in preceding wizard pages. (There are plans to make the same change to [Components] in the future.)
  • -
  • Brought back the pre-5.1.13 duplicate [Components]/[Tasks] entry semantics. For example, in the following case: -
    -[Tasks]
    -Name: foo; Description: "foo #1"; Components: bar
    -Name: foo; Description: "foo #2"; Components: not bar
    -Name: foo\child; Description: "foo\child" -
    -"foo\child" will now, once again, be shown regardless of which "foo" is conditionally created. -
  • -
  • Pascal Scripting: "files:" function imports may now include multiple filenames. "files:A.dll,B.dll" will cause both A.dll and B.dll to be extracted before A.dll is loaded.
  • -
  • On Windows Vista, Setup no longer alters the uninstaller program's manifest resource to request elevation, because this would invalidate a digital signature. Instead, the uninstaller now respawns itself when elevation is required, much like Setup does beginning with version 5.2.0.
  • -
  • The uninstall program's version is now 51.49.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.2.0 (2007-09-19)

-
    -
  • On Windows Vista, [Run] section entries with the postinstall flag no longer inherit Setup's elevated privileges by default, and instead now execute with the (normally non-elevated) credentials of the user that started Setup initially. (There are some exceptions; see the runasoriginaluser flag documentation for details.)
  • -
  • Added new [Run] section flags: runascurrentuser and runasoriginaluser. These control which user credentials are used on Windows Vista when spawning processes. (runasoriginaluser is the default when the postinstall flag is used; runascurrentuser is the default otherwise.)
  • -
  • Improved compression of x86 executable files. (This reduced the size of Inno Setup's own installer by approximately 10 KB.)
  • -
  • Added new [Files] section parameter: ExternalSize.
  • -
  • Added new constant: {log}. Translates to the log file name, or an empty string if logging is not enabled.
  • -
  • Added new [Files] and [Dirs] sections flags: setntfscompression and unsetntfscompression. These flags instruct Setup to enable or disable NTFS compression on the file or directory.
  • -
  • Pascal Scripting: -
      -
    • Added new ExecAsOriginalUser, ShellExecAsOriginalUser, and SetNTFSCompression support functions.
    • -
    • Now supports new DLL loading flag loadwithalteredsearchpath to load DLLs with the Windows flag LOAD_WITH_ALTERED_SEARCH_PATH.
    • -
    -
  • -
  • The Setup loader now uses the original Setup EXE filename + .tmp as the filename for the extracted Setup executable instead of a name comprised of random letters and numbers, which may have seemed suspicious to firewall users.
  • -
  • In a multilingual installation, Setup now waits until after the Select Language dialog is shown to display any error messages concerning the user's Windows version or privilege level.
  • -
  • QuickStart Pack: added ISPP function GetDateTimeString.
  • -
  • Fix: On Windows Vista, AutoPlay wasn't being suppressed when the user swapped out discs in a disk-spanned install.
  • -
  • Fix: When the waituntilidle flag was used in the [UninstallRun] section, it behaved like waituntilterminated.
  • -
  • Based on RemObjects Pascal Script SVN code revision 1045a.
  • -
  • The uninstall program's version is now 51.48.0.0.
  • -
  • Minor tweaks.
  • -
- -
- -

5.1.14 (2007-08-07)

-
    -
  • Updated the LZMA SDK compression code to version 4.49. This version adds support for multi-threading, which can speed up the compression process by 50% or more on systems with multiple processor cores, and 20% or more on systems with single-core Intel processors featuring Hyper-Threading Technology.
  • -
  • Added new CompressionThreads [Setup] section directive.
  • -
  • Fix: When cleaning the output directory, the compiler would not only delete files matching OutputBaseFilename-*.bin, but files matching OutputBaseFilename-*-*.bin as well.
  • -
- -

5.1.13 (2007-07-22)

-
    -
  • Added new lzma/ultra64 compression level. Same as lzma/ultra, but uses a dictionary size that is twice as large (64 MB).
  • -
  • Added new SetupLogging [Setup] section directive. If set to yes, Setup will always create a log file (equivalent to passing /LOG on the command line).
  • -
  • Added new AppSupportPhone [Setup] section directive.
  • -
  • Added new [Files] section flag: solidbreak.
  • -
  • Added new [Run] and [UninstallRun] sections parameter: Verb. When used with the shellexec flag, specifies the action to be performed on the file.
  • -
  • When the shellexec flag is used in the [Run] and [UninstallRun] sections, it now uses the default verb for the file type instead of hardcoding "open". (If necessary, you can override this by adding a Verb parameter.)
  • -
  • Setup now supports a /TYPE parameter to override the default setup type.
  • -
  • Components/tasks-related changes: -
      -
    • /COMPONENTS & /TASKS: When a parent component/task is specified, it no longer automatically checks every child component/task. To achieve the old behavior, prefix the name of the parent component/task with a "*" character, or list each child component/task individually.
    • -
    • /COMPONENTS: It is now possible to force a child component to be deselected by including its name in the list with a "!" prefix. (/TASKS already supports this.)
    • -
    • /COMPONENTS is now ignored if no custom type is defined.
    • -
    • /SAVEINF now writes the selected setup type in the INF file. Previously, using /LOADINF would always select a custom type.
    • -
    • /SAVEINF now writes the selected tasks in the INF file.
    • -
    • When a MinVersion/OnlyBelowVersion/Languages/Check/Components parameter causes a parent component/task to be hidden from view, child items will now be hidden as well. (Previously, it was necessary to include the same conditions on every child item in order for them to be hidden along with the parent item.)
    • -
    • Fix: When new child components/tasks were introduced in a new install, they would always be selected by default if the parent component/task was selected in the previous installation.
    • -
    • Fix: /LOADINF would select child components that weren't selected during the initial install.
    • -
    • Fix: In a /COMPONENTS parameter, it is no longer necessary to list fixed components in order for them to be selected.
    • -
    -
  • -
  • Pascal Scripting changes: -
      -
    • FindFirst/FindNext: Add CreationTime, LastAccessTime, LastWriteTime, AlternateName fields to TFindRec.
    • -
    • TInputFileWizardPage: Added new IsSaveButton property. This can be used to make a button open a Save As dialog instead of the default Open dialog.
    • -
    • TNewCheckListBox: Setting Checked[] to True will no longer automatically check an item's child check boxes. To do that now, call the new CheckItem method with coCheckWithChildren in the AOperation parameter.
    • -
    • ParamStr/ParamCount: Empty parameters ("") are no longer skipped.
    • -
    -
  • -
  • /LOG: Logged times now include milliseconds.
  • -
  • Compiler IDE changes: -
      -
    • During the compression phase of a compile, the status bar now shows the estimated time remaining and KB compressed/second.
    • -
    • The Edit | Redo shortcut is now Ctrl+Y. The previous shortcut (Shift+Ctrl+Z) still works too.
    • -
    -
  • -
  • Fix: In the [INI] section, if Filename was blank, the uninsdelete* flags didn't actually delete anything.
  • -
  • The uninstall program's version is now 51.47.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.12 (2007-04-24)

-
    -
  • Fix: On Windows Vista, attempting to expand a shell folder constant that mapped to the root directory of a drive would fail with an error message. This was due to a bug in Vista's SHGetFolderPath API. A workaround for the problem has been implemented.
  • -
  • On Browse dialogs, the BrowseDialogLabel message text may now span multiple lines.
  • -
  • The OnlyOnThisPlatform message is no longer used. Now, when a Windows 95/98/Me user attempts to run an installation with a MinVersion setting that blocks installation on non-NT platforms, Setup will display the WinVersionTooLowError message, which is a bit more helpful as it mentions the required version number.
  • -
  • Corrected some trivial one-pixel-off issues when non-default dialog fonts or font sizes were used.
  • -
  • Added official Hebrew translation.
  • -
  • Minor tweaks.
  • -
- -

5.1.11 (2007-03-01)

-
    -
  • On Windows 2000 and later, it now uses Windows' own regsvr32.exe to handle DLL registration/unregistration instead of an internal program. This should address errors seen on Windows Vista when registering certain older DLLs. (Windows Vista applies a compatibility fix known as "WRP Mitigation" to regsvr32.exe, which allows it to successfully register DLLs that attempt to write to system registry keys in violation of Windows Resource Protection.)
  • -
  • Some messages have been added and removed in this version. - (View differences in Default.isl) -
      -
    • New messages: ErrorRegSvr32Failed.
    • -
    • Removed messages: ErrorRegisterServerMissingExport.
    • -
    -
  • -
  • The uninstall program's version is now 51.46.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.10 (2007-02-17)

-
    -
  • Added two new [Run]/[UninstallRun] section flags: 32bit and 64bit. Similar to the [Files] section flags of the same name, these override the install mode and affect which System directory the {sys} constant maps to on 64-bit Windows.
  • -
  • Pascal Scripting: -
      -
    • Added new EnableFsRedirection support function.
    • -
    • On the Exec function, you can now pass '>' in the Filename parameter and it will use the value of the Params parameter as the full command line. This feature can come in handy when executing command lines obtained from UninstallString registry values; no longer is it necessary to separate strings into filename and parameter components manually.
    • -
    • Fix: IsComponentSelected and IsTaskSelected didn't accept forward slashes.
    • -
    -
  • -
  • Improved Setup's folder tree view control (seen when a Browse button is clicked): -
      -
    • On Windows Vista, it now uses the same theme as Windows Explorer.
    • -
    • On Windows Vista, for consistency with Explorer, single-clicking in a node's text area no longer causes the node to expand.
    • -
    • Like Windows Explorer, folder nodes now use the shell's "display names", as opposed to the actual directory names. This matters on localized versions of Windows Vista, where the on-disk names of system folders are always in English.
    • -
    • The system "icon" font is now used instead of the default dialog font. This font defaults to Segoe UI on Windows Vista, and typically Tahoma or MS Sans Serif on earlier versions of Windows.
    • -
    • Disconnected network drives are now listed; expanding one will restore the connection (on Windows 2000, Me, and later).
    • -
    -
  • -
  • On the Select Destination Location wizard page (as well as custom directory selection pages created using the CreateInputDirPage support function), if the letter of a disconnected network drive is entered, and the user is running Windows XP or later, it will now attempt to restore the connection automatically when Next is clicked. (It also does this on silent installs.)
  • -
  • On Windows Vista, eliminated the flickering on Setup's progress bar (purely a cosmetic issue).
  • -
  • On Windows Vista, Setup now calls SetProcessDPIAware to avoid bitmap scaling when Windows is configured to use Large Fonts and the "Use Windows XP style DPI scaling" option is unchecked (not the default setting).
  • -
  • Compiler IDE changes: -
      -
    • Added new option: Always launch Setup/Uninstall as different user. This forces the IDE to display a "Run as" dialog when launching Setup/Uninstall.
    • -
    • The Stop Compile command now displays a confirmation message box.
    • -
    -
  • -
  • Added a "Vista-aware" manifest resource to ISCC so it doesn't request elevation on Windows Vista.
  • -
  • Fix: ISCC didn't always print error messages when standard output was redirected to a file.
  • -
  • When Setup fails to set the permissions on files, directories, or registry keys, the error code is now included in the log output.
  • -
  • When Setup fails to expand a shell folder constant, a warning message containing the error code is now logged.
  • -
  • Changed the way version information is read from VXD files to be more compliant with the MSDN docs.
  • -
  • The uninstall program's version is now 51.45.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.9 (2006-12-10)

-
    -
  • Change in default behavior: The PrivilegesRequired [Setup] section directive now defaults to admin. The default in all previous versions was none. More often than not, installations do need administrative privileges to run successfully; therefore, none should not be used unless you have actually tested your installation on unprivileged accounts.
  • -
  • On Windows Vista, the setting of the PrivilegesRequired directive now influences whether elevated rights are requested when the installation is started under a user account that does not have administrative privileges. Installations built with previous versions of Inno Setup always requested elevation on Vista. Beginning with this version, elevation will not be requested if the user is unprivileged and PrivilegesRequired is set to none.
  • -
  • On Windows Vista, the uninstaller will no longer request elevation when Setup was never run with administrative privileges.
  • -
  • URLs (web site addresses) may now be specified in the Filename parameter of [Icons] section entries. When a URL is detected, Setup will create an Internet Shortcut (.url) file instead of a regular shortcut.
    -(Note: While you could sometimes get away with specifying URLs in previous versions of Inno Setup, it was never recommended because the shortcuts would fail to resolve on Windows 95 or NT 4.0. Internet Shortcuts, on the other hand, will work on any version of Windows, as long as Internet Explorer is installed.)
  • -
  • Added workaround for bug in the 64-bit version of Windows Vista: The fields on the User Information wizard page would default to "Microsoft".
  • -
  • Pascal Scripting: Added new FontExists support function.
  • -
  • The uninstall program's version is now 51.44.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.8 (2006-10-11)

-
    -
  • Converted the documentation to HTML Help format for compatibility with Windows Vista, which does not support WinHelp-based help files at all (as of RC2). HTML Help is also said to work better with screen readers. Much of the conversion process was done by hand, so there may be some mistakes. Please report any problems you encounter.
  • -
  • Updated the LZMA SDK compression/decompression code to version 4.43. Compression is noticably faster in this version. (Compiling Inno Setup's own installer used to take 7 seconds; now it takes 4.)
  • -
  • Added a "requestedExecutionLevel" setting to Setup's manifest resource to disable Windows Vista's legacy application compatibility hacks. Now you should no longer see bogus "This program might not have installed correctly" dialogs when cancelling installations or after running installations that do not create an Uninstall key.
    -Note: It is possible that you were unwittingly relying on some of these application compatibility hacks, so it is recommended that you re-test your installations on Windows Vista after upgrading to this version.
  • -
  • When deleting a .chm file, the uninstaller will now automatically delete any corresponding .chw file as well.
  • -
  • Paths that are accessed at compile time may now include a "userdocs:" prefix, which is replaced with the path of your My Documents folder. For a usage example, see any of the example scripts.
  • -
  • Setup now creates an "InstallDate" value in the Uninstall key so that Vista's Programs and Features Control Panel applet doesn't have to guess the "Installed on" date.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • The StringChange function now returns an Integer indicating the number of changes made. Performance was also improved.
    • -
    • Introduced new StringChangeEx function, which adds support for strings containing double-byte characters (used in Chinese, Japanese, and Korean languages). Unless you require binary safety, this function should be used instead of StringChange, especially if you're working with strings containing paths or filenames.
    • -
    -
  • -
  • IDE changes: -
      -
    • The Open and Save As dialogs now permit sizing and include a places bar.
    • -
    • On Windows Vista, the IDE no longer requests administrative privileges when started. (You will, however, still see UAC popups when launching compiled installations from within the IDE.)
    • -
    • When you compile an unsaved script, the output is now placed under your My Documents folder (instead of the current directory). It asks if you want to save the script first, though.
    • -
    -
  • -
  • Updated bzip2 library to version 1.0.3.
  • -
  • Minor tweaks.
  • -
- -

5.1.7 (2006-08-18)

-
    -
  • New [Setup] section directive: TerminalServicesAware. If set to yes (the default), the "Terminal Services aware" flag will be set in the headers of the Setup and Uninstall programs. Most notably, this ensures that the {win} constant consistently returns the system's real Windows directory on systems with Terminal Services installed in application mode. Refer to the help file for details.
  • -
  • The program Setup internally uses to register/unregister DLLs/OCXs is now compiled with the "Terminal Services aware" flag set, like Microsoft's regsvr32.exe.
  • -
  • When determining which language to select by default, Setup now checks the LanguageCodePage values of each language in addition to LanguageID. Previously, Traditional Chinese could be auto-selected on a Simplified Chinese system due to both languages having the same primary language ID. This resulted in unreadable text as they use completely different character sets (code pages).
  • -
  • New [Setup] section directive: ShowUndisplayableLanguages. If set to yes, all languages will be listed in the Select Language dialog, including those that cannot be displayed properly on the user's system. If you were using the LanguageCodePage=0 trick in your script before, you should replace it with this to avoid the above-mentioned problem with Chinese languages.
  • -
  • A unique value is now appended to unins*.exe files so that uninstallers from different applications won't have the same hash.
  • -
  • The compiler now flags MSCOREE.DLL as an "unsafe" file.
  • -
  • Fix: The createallsubdirs [Files] section flag didn't properly escape directory names containing "{" characters.
  • -
  • Fix: The text on the Finished wizard page wasn't initialized when a restart was needed and /NORESTART was used without /SILENT.
  • -
  • Pascal Scripting: Defined new DWORD_PTR, UINT_PTR, and INT_PTR types for completeness.
  • -
  • Added official Basque and Spanish translations.
  • -
  • The uninstall program's version is now 51.43.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.6 (2005-11-18)

-
    -
  • Registration and unregistration of 32-bit DLLs is now performed in an external process. This change was primarily made to ensure that a buggy DLL cannot bring down the entire Setup/Uninstall process by, for example, corrupting its memory.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • The already-existing AnsiUppercase and AnsiLowercase functions are now documented. Unlike their non-Ansi counterparts, these can handle non-ASCII characters (e.g. accented letters).
    • -
    • TNewCheckListBox: Added new ItemCaption property. This can be used to change the caption of an already-created item. (Setting an item's caption through the Items property is not supported by TNewCheckListBox.)
    • -
    -
  • -
  • OLE is now initialized before registering a 64-bit DLL.
  • -
  • While Setup is waiting for a 64-bit DLL to register, it now processes messages.
  • -
  • On CD/DVD-spanned installs, fixed issue with AutoPlay not being suppressed if you clicked OK too quickly on the Setup Needs the Next Disk dialog after swapping CDs/DVDs.
  • -
  • When WindowVisible=yes, the gradient background now uses 256 colors instead of 64, resulting in a smoother appearance when running in 24- or 32-bit color mode.
  • -
  • In the documentation for the Excludes [Files] section parameter, mention that a simple Unix-style pattern matching routine is used, which exhibits some differences from the DOS/Windows-style pattern matching used in the Source parameter.
  • -
  • Added official Slovak translation.
  • -
  • Minor tweaks.
  • -
- -

5.1.5 (2005-08-17)

-
    -
  • Added new VersionInfoCopyright [Setup] section directive, which allows you to set the Copyright field in Setup's version info.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • New functions: CustomMessage, FmtMessage.
    • -
    • The FileExists function no longer strips off any trailing backslash from the specified filename. Previously, FileExists('c:\filename\') could return True.
    • -
    • TNewCheckListBox: Add new RequireRadioSelection Boolean property, which defaults to False. The "require a selection on top-level radio button groups" behavior introduced in 5.1.4 is now optional and disabled by default on user-created TNewCheckListBoxes.
    • -
    -
  • -
  • Now handles values with surrounding quotes consistently across all [Setup] and [LangOptions] directives. Previously, only certain directives would strip surrounding quotes; now they all do. If you were relying on the old, inconsistent behavior, it may be necessary to tweak your scripts.
  • -
  • On [INI] section entries whose filenames include paths, it now checks if the directories exist and creates them if necessary.
  • -
  • For consistency with regsvr32, FPU exceptions are now masked while registering/unregistering 32-bit DLLs.
  • -
  • /LOG: When processing a [Files] entry that has the 32bit or 64bit flag, it now logs a message to that effect.
  • -
  • Added official Finnish translation.
  • -
  • SetupLdr's internal data is now stored in a resource instead of in the DOS header. This should address compatibility issues with third-party apps that replace the DOS header.
  • -
  • Updated zlib library to version 1.2.3.
  • -
  • Minor tweaks.
  • -
- -

5.1.4 (2005-05-30)

-
    -
  • New command line parameters supported by Setup: /TASKS and /MERGETASKS. These can be used to initially select/deselect tasks.
  • -
  • Pascal Scripting: Added new GetWindowsVersionEx function, which returns extended information about the user's version of Windows, including the service pack level and product edition (e.g. Professional or Home, Standard or Enterprise Server).
  • -
  • Using /COMPONENTS= with an empty components list now deselects all components. Ditto for "Components=" in a .INF file (loaded via /LOADINF). Previously, it would keep the default selection in these cases.
  • -
  • On the Select Tasks wizard page, when the list of tasks has to be reinitialized due to the user going back and changing the component selection, it now restores the checked state of the items from when the page was last shown.
  • -
  • It should no longer be possible for a top-level, exclusive group of components or tasks to have no selection. If the script specifies that all items in the group are to be unchecked, Setup will check the first item automatically.
  • -
  • Removed 1024-character limit on .INI-file values read via the {ini:...} constant or GetIniString support function. Now, values can be up to 64 KB in length, or the maximum length supported by the operating system, whichever is smaller.
  • -
  • Fix: The CreateOleObject and GetActiveOleObject support functions leaked references in some cases.
  • -
  • Fix: Setup would crash or fail to start if passed a command line parameter more than 255 characters in length. (This was due to a buffer overflow bug in a Delphi run-time library function.)
  • -
  • Based on RemObjects Pascal Script SVN code revision 1045.
  • -
  • Minor tweaks.
  • -
- -

5.1.3-beta (2005-05-03)

-
    -
  • Pascal Scripting: -
      -
    • When Setup/Uninstall is running in 64-bit mode, most of the support functions that access files now disable WOW64 file system redirection, meaning they are now capable of working with files located in the 64-bit System directory. Some, however, still do not. See the 64-bit Installation Limitations topic in the help file for specifics.
    • -
    • Replaced FileSearch function with a new implementation that properly supports MBCS, and doesn't search the current directory unless it is told to (e.g. by including "." in the directory list).
    • -
    -
  • -
  • Uninstaller: Now hides the taskbar button when the /VERYSILENT switch is used.
  • -
  • IDE change: Added an option to the New Script Wizard to specify that the application doesn't have a main executable file.
  • -
  • Based on RemObjects Pascal Script SVN code revision 1039.
  • -
  • Minor tweaks.
  • -
- -

5.1.2-beta (2005-04-14)

-
    -
  • Addressed some 64-bit limitations in previous betas: -
      -
    • Setup is now capable of registering 64-bit DLLs/OCXs and 64-bit type libraries. When Setup is running in 64-bit mode, the regserver and regtypelib [Files] section flags assume that files are 64-bit by default. If you need to register a 32-bit file in a 64-bit mode install, include the new 32bit flag.
    • -
    • Setup is now capable of setting permissions on 64-bit registry keys and on files located in the 64-bit System directory.
    • -
    -
  • -
  • Added two new [Files] section flags: 32bit and 64bit. These override the install mode and affect which System directory the {sys} constant maps to, whether the regserver and regtypelib flags treat the file as 32-bit or 64-bit, and which SharedDLLs key the sharedfile flag updates.
  • -
  • Pascal Scripting: Added new Is64Bit parameters to the following functions: IncrementSharedCount, DecrementSharedCount, RegisterServer, UnregisterServer, RegisterTypeLibrary, UnregisterTypeLibrary. See the documentation for details.
  • -
  • Setup will now only append to existing uninstall logs created by installs done in the same bit mode (32- or 64-bit).
  • -
  • When an error occurs while registering a DLL/OCX/type library after a restart, it now displays an error message, provided the noregerror flag isn't used. Before, it was silent.
  • -
  • Constants may now be used in the AppMutex [Setup] section directive.
  • -
  • Added official Brazilian Portuguese, Danish, Hungarian, and Italian translations.
  • -
  • Renamed official Standard Portuguese translation file from PortugueseStd.isl to Portuguese.isl.
  • -
  • Various minor fixes to the 64-bit functionality.
  • -
  • Updated the LZMA SDK compression/decompression code to version 4.16. The new version incorporates some fixes and a minor speed improvement.
  • -
  • Based on RemObjects Pascal Script SVN code revision 1033.
  • -
  • The uninstall program's version is now 51.42.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.1-beta (2005-03-24)

-
    -
  • When Setup is running in 64-bit mode, it is now possible to install files to the 64-bit System directory, and execute programs located there.
    -The {sys} constant now maps to the 64-bit System directory when used in the [Dirs], [Files], [InstallDelete], [Run], [UninstallDelete], and [UninstallRun] sections. Elsewhere, the {sys} constant still maps to the 32-bit System directory. See the Install Mode: 32-bit vs. 64-bit and 64-bit Installation Limitations topics in the help file for details.
  • -
  • Added workaround for bug in the 64-bit editions of Windows prior to Windows Server 2003 SP1 RC2 which caused the restartreplace [Files] section flag to fail when used on files installed to {sys}. (Specifically, Windows would try to replace the file in the 64-bit System directory instead of the 32-bit one.)
  • -
  • Compiler: A warning is now emitted instead of an error when a custom message isn't defined for all languages.
  • -
  • Fix: The /COMPONENTS command line parameter supported by Setup didn't accept forward slashes in component names -- only backslashes.
  • -
  • Fix: The compiler no longer automatically strips any trailing slashes/backslashes from the Subkey parameter of [Registry] entries. Versions 5.0.8 and 5.1.0-beta stripped forward slashes. This was wrong because valid registry key names can include forward slashes.
  • -
  • Fix: When files were deleted by an [InstallDelete]/[UninstallDelete] section entry or DelTree function call, it also inappropriately stripped the read-only attribute from directories that matched the wildcard.
  • -
  • Fix: An "internal error" message was displayed if the user removed all contents from the Select Start Menu Folder wizard page's edit control and also checked the Don't create a Start Menu folder check box.
  • -
  • Based on RemObjects Pascal Script SVN code revision 1032.
  • -
  • The uninstall program's version is now 51.41.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.1.0-beta (2005-03-01)

-
    -
  • Inno Setup now has initial support for the installation of 64-bit applications on 64-bit versions of Windows:
    -
    -
      -
    • Setup can run in one of two modes: 32-bit or 64-bit. 64-bit mode is selected if the user is running a 64-bit version of Windows and the system's processor architecture is included in the value of the new ArchitecturesInstallIn64BitMode [Setup] section directive. Otherwise, 32-bit mode is used.
      How do the two modes of installation differ? Primarily, the differences lie in where things are installed by default. For example, 64-bit applications have their own Program Files directory, and their own isolated view of the registry. See the Install Mode: 32-bit vs. 64-bit topic in the help file for details.
    • -
    • Added new [Setup] section directive ArchitecturesAllowed. When set, it specifies which processor architecture(s) Setup is allowed to run on.
    • -
    • Even when running in 32-bit mode, Setup is capable of installing files and creating registry keys in 64-bit locations, and vice versa. New options have been added that override the default locations: -
        -
      • New constants: {pf32}, {pf64}, {cf32}, {cf64}.
      • -
      • Root key names used in the [Registry] section, {reg:...} constants, and the Reg* [Code] support functions may now include 32 or 64 suffixes to specify either the 32-bit or the 64-bit view of the registry respectively.
      • -
      -
    • -
    • To allow "multi-architecture" installations, new [Code] support functions have been added: IsWin64, Is64BitInstallMode, ProcessorArchitecture.
    • -
    • Added new {syswow64} constant and GetSysWow64Dir support function.
    • -
    • Added new example scripts: 64Bit.iss, 64BitTwoArch.iss, and 64BitThreeArch.iss.
    • -
    • Note: There are some limitations to be aware of when utilizing the 64-bit installation features. See the 64-bit Installation Limitations topic in the help file for details. There are plans to address these limitations in the near future, where possible.
    • -
    -
    - Purchase of the necessary 64-bit development hardware has been made possible by our kind donators, many thanks to them!
    -
    -
  • -
  • Pascal Scripting: New Format support function, which replaces the old Format1, Format2, Format3, and Format4 functions. Unlike those functions, Format accepts a variable number of arguments, and supports argument types other than strings.
  • -
  • Compiler: A warning is now emitted instead of an error when an unrecognized message name in a [Messages] section is encountered.
  • -
  • IDE changes: The New Script Wizard now allows you to specify the Setup languages.
  • -
  • /LOG improvement: The parameters of programs spawned in the [Run] and [UninstallRun] sections are now logged.
  • -
  • '&' characters in the BeveledLabel message no longer need to be escaped using another '&'.
  • -
  • Some messages have been added and removed in this version. - (View differences in Default.isl) -
      -
    • New messages: OnlyOnTheseArchitectures, MissingWOW64APIs, TranslatorNote, UninstallOnlyOnWin64.
    • -
    • Removed messages: NoIconsCheck.
    • -
    -
  • -
  • Based on RemObjects Pascal Script SVN code revision 1024.
  • -
  • The uninstall program's version is now 51.40.0.0.
  • -
  • Minor tweaks.
  • -
- -
- -

5.0.8 (2005-02-17)

-
    -
  • IDE changes: -
      -
    • Added support for setting breakpoints (Run | Toggle Breakpoint).
    • -
    • The dots in the editor's gutter now shift properly when you insert/remove lines while debugging. (Note, however, that any changes you make while debugging won't take effect until you re-compile.)
    • -
    -
  • -
  • Uninstaller: When a DLL/OCX was installed multiple times by separate installations of the same application, the uninstaller would unregister the DLL/OCX once for each install. As an optimization, it will now unregister the DLL/OCX only once.
  • -
  • Compiler: Using outdated .isl files that are missing some messages no longer results in a fatal compiler error. Now, warnings will be printed, and the missing messages will be pulled from Default.isl.
  • -
  • Various improvements/fixes to the parsing of pathnames. For example, ExtractFilePath('\\server\share') now returns \\server\share rather than \\server, and ExtractFileDir('path\\') now returns path rather than path\\.
  • -
  • When recursively deleting directories (for example, from an [InstallDelete] entry or a call to DelTree), it no longer recurses into reparse points.
  • -
  • The value of the NoProgramGroupCheck2 message is now always used as the caption of the "no icons" check box on the Select Start Menu Folder page of the wizard. Previously, it used either NoIconsCheck or NoProgramGroupCheck2 depending on whether an installation had [Icons] entries with Tasks parameters.
  • -
  • exclusive [Tasks] items that have no visible siblings are no longer automatically converted into check boxes. (If you really want check boxes, then you shouldn't use the exclusive flag.)
  • -
  • Based on RemObjects Pascal Script SVN code revision 1022.
  • -
  • Minor tweaks.
  • -
- -

5.0.7 (2005-01-19)

-
    -
  • When AllowNoIcons and UsePreviousGroup are set to yes, the Don't create any icons setting is now preserved between installs.
  • -
  • Both Setup and Uninstall now support a /SUPPRESSMSGBOXES command line parameter to suppress message boxes. This parameter only has an effect when combined with /SILENT or /VERYSILENT. See the help file for more details.
  • -
  • IDE changes: -
      -
    • Various enhancements to the New Script Wizard.
    • -
    • Added a new Tools menu with a command that opens the Add/Remove Programs Control Panel applet.
    • -
    • When stepping through code, the IDE now uses a different method of bringing Setup to the foreground, and vice versa. Previously, if for some reason Setup hung it was possible for the IDE to hang as well.
    • -
    -
  • -
  • /LOG changes: -
      -
    • Now logs the contents of message boxes.
    • -
    • On NT platforms, the OS service pack level is now logged, as well as the privilege level of the user (Administrative, Power User, or None).
    • -
    • Now doesn't skip the replacement of a protected system file until after the version numbers of the new and existing files are logged.
    • -
    -
  • -
  • Pascal Scripting changes/improvements: -
      -
    • Added new CharLength, DLLGetLastError, RegWriteExpandStringValue and SuppressibleMsgBox functions.
    • -
    • GetSpaceOnDisk no longer requires that a root directory be specified, or that a trailing backslash be included.
    • -
    -
  • -
  • Removed the requirement that Windows NT 4.0 users have SP6 installed, which was added in version 5.0.1-beta. Setup should run on previous service pack levels but no guarantees can be made as I generally only test with SP6. Therefore I recommend setting MinVersion to at least 4.0,4.0sp6 if possible.
  • -
  • Removed legacy code that searched for and deleted Uninstall keys with suffixes of _is2 and higher. Only Inno Setup 1.08 (from 1998) created such keys.
  • -
  • Reverted the change in 5.0.4-beta that made it automatically expand relative paths specified in [Icons] section because it didn't work when the paths contained environment-variable strings (e.g. %SystemRoot%\...).
  • -
  • Fix: In 5.0.6, if you clicked Back on the Select Tasks wizard page and changed component settings causing a different set of tasks to be activated, the new tasks would show up with the wrong item type when you returned to the Select Tasks wizard page. (If you do not have tasks with Components parameters, then this bug did not affect you.)
  • -
  • Fix: In rare cases, component and task items with multi-line captions were painted incorrectly (strictly a cosmetic issue).
  • -
  • Fix: The UninstallSilent support function always returned False.
  • -
  • Fix: Even though they were not being installed, files with the dontcopy flag were being displayed on the installation progress page and included in the required disk space figure(s).
  • -
  • Tweaked wording of the ExitSetupMessage message. - (View differences in Default.isl)
  • -
  • Based on RemObjects Pascal Script SVN code revision 1017.
  • -
  • Minor tweaks.
  • -
- -

5.0.6 (2004-12-24)

-
    -
  • This version introduces a new Inno Setup logo, new icons for the Inno Setup IDE, and new wizard images for the Inno Setup installer, created by glyFX.
  • -
  • New [Files] section flag: createallsubdirs. By default the compiler skips empty directories when it recurses subdirectories searching for the Source filename/wildcard. The createallsubdirs flag causes these directories to be created at install time (just like if you created [Dirs] entries for them). Must be combined with recursesubdirs.
  • -
  • New flag supported by the [Components] and [Tasks] sections: checkablealone. This flag specifies that the component/task can be checked when none of its children are. By default, if no Components/Tasks parameter directly references the component/task, unchecking all of the component/task's children will cause the component/task to become unchecked.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • An AddEx function has been added to TInputOptionWizardPage to allow the addition of subitems.
    • -
    • Various properties have been added to the TInput...WizardPage classes to allow access to the wizard page controls.
    • -
    • Event function NeedRestart is now called near the end of the installation process instead of at the beginning.
    • -
    • In DLL function imports, new options 'setuponly' and 'uninstallonly' are supported, which cause a DLL to be loaded only when the script is running from Setup or Uninstall, respectively.
    • -
    • Added new UnloadDLL and GetShellFolderByCSIDL functions.
    • -
    -
  • -
  • /LOG changes: -
      -
    • No longer (automatically) logs when the event functions InitializeSetup, InitializeWizard, GetCustomSetupExitCode, and DeinitializeSetup are called successfully -- only if they raise exceptions, and in the case of InitializeSetup, if False is returned.
    • -
    • Now logs the function name when the NeedRestart, RegisterPreviousData, InitializeUninstall, DeinitializeUninstall, CurUninstallStepChanged, and UninstallNeedRestart event functions raise exceptions.
    • -
    -
  • -
  • Compiler IDE changes/improvements: -
      -
    • New "Debug Output" view that shows log messages from Setup/Uninstall in real time. (These are the same messages seen in the log file produced when Setup/Uninstall is run with the /LOG switch.)
    • -
    • New Pause on exceptions option (accessible via View | Options). Unchecking this will prevent the debugger from pausing when an exception is raised from [Code].
    • -
    • Now preserves the position of the splitter when you close the IDE.
    • -
    -
  • -
  • Console-mode compiler (ISCC.exe): A new /F switch is supported which can be used to specify a new output filename, overriding any OutputBaseFilename setting in the script.
  • -
  • Improved Setup load time on installations containing hundreds of components at varying levels.
  • -
  • Updated zlib library to version 1.2.2.
  • -
  • Fix: When multiple patterns were specified in a [Files] section Excludes parameter, patterns that included backslashes were handled incorrectly.
  • -
  • Fix: [Components]: If you had two child radio buttons and one had children of its own, then unchecking & rechecking the top-level item would cause both radio buttons to be checked.
  • -
  • Based on RemObjects Pascal Script SVN code revision 1000.
  • -
  • Minor tweaks.
  • -
- -

5.0.5-beta (2004-11-14)

-
    -
  • New [Setup] section directive: OutputManifestFile. When set, the compiler will create a text file detailing information about the files compiled into Setup.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • Added new exception-related functions: GetExceptionMessage, RaiseException, and ShowExceptionMessage.
    • -
    • The ExtractTemporaryFile support function now raises an exception with a descriptive error message when it fails, instead of returning a Boolean indicating success/failure.
    • -
    • GetSpaceOnDisk: Added new InMegabytes parameter. By setting it to False, you can get figures in bytes (capped at 2 GB-1).
    • -
    • RegWriteMultiStringValue: When writing values, it now appends two null terminators automatically, like [Registry] does when writing multisz-type values.
    • -
    -
  • -
  • Console-mode compiler (ISCC.exe) improvements: -
      -
    • A new /O switch is supported which can be used to specify a new output path, overriding any OutputDir setting in the script.
    • -
    • A new /Q switch is supported which causes it to compile quietly, printing only error messages.
    • -
    • Error messages are now written to standard error instead of standard output.
      Note: If you were previously redirecting all compiler messages to a file using >filename you will now need to use >filename 2>&1 to capture standard error as well. If you wish to redirect only standard error, use 2>filename.
    • -
    -
  • -
  • When ChangesAssociations=yes and/or ChangesEnvironment=yes are used, it now notifies Windows of the changes after any [Run] section entries are processed and the CurStepChanged(ssPostInstall) event function is called.
  • -
  • Reverted one of the small image placement changes in 5.0.4: horizontally centering has been restored.
  • -
  • Fix: When the ExpandConstant support function was called at uninstall time, {common*} constants always mapped to their {user*} equivalents even if the user had administrative privileges.
  • -
  • Fix: ChangesEnvironment=yes worked on Windows NT 4.0 and 2000 but had no effect on Windows XP.
  • -
  • Fix: When writing empty REG_MULTI_SZ values, it should only append 1 null terminator, not 2.
  • -
  • Based on RemObjects Pascal Script SVN code revision 983.
  • -
  • The uninstall program's version is now 51.34.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.0.4-beta (2004-10-06)

-
    -
  • New [Setup] section directive: ChangesEnvironment. When set to yes, at the end of the installation Setup will notify other running applications (notably Windows Explorer) that they should reload their environment variables from the registry.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • The support functions CreateCustomForm, ScaleX, and ScaleY may now be called at uninstall time.
    • -
    • TRichEditViewer support class improvement: The Color property is now respected.
    • -
    -
  • -
  • /LOG improvements: -
      -
    • It's now possible to specify a fixed path/filename to use for the log file via /LOG="filename".
    • -
    • Now logs when various event functions are called, and in the case of InitializeSetup it also logs the return value of the function.
    • -
    • Now logs when DLL/OCX/type library registration fails, even if the noregerror flag is specified.
    • -
    -
  • -
  • Stretching of the small wizard image (specified by WizardSmallImage) now only occurs if the image is larger than the default size, or if the user is running larger-than-normal fonts. Previously, it always attempted to stretch the image.
  • -
  • The WizardSmallImageBackColor [Setup] section directive is now deprecated and ignored. Any unused space around the small wizard image is now filled with the standard window color (usually white).
  • -
  • Relative paths specified in [Icons] section entries are now converted into absolute paths automatically.
  • -
  • Fix: On Windows XP, folder shortcuts (which were introduced in 5.0.3-beta) showed ".lnk" at the end of them.
  • -
  • Based on RemObjects Pascal Script SVN code revision 960.
  • -
  • The uninstall program's version is now 51.33.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.0.3-beta (2004-08-16)

-
    -
  • New supported [Files] section flag uninsnosharedfileprompt, which tells the uninstaller to automatically remove the shared file when its reference count reaches zero instead of asking the user. Must be combined with the sharedfile flag to have an effect.
  • -
  • New supported [Icons] section flag foldershortcut, which creates a special type of shortcut known as a "Folder Shortcut". Normally, when a shortcut to a folder is present on the Start Menu, clicking the item causes a separate Explorer window to open showing the target folder's contents. In contrast, a "folder shortcut" will show the contents of the target folder as a submenu instead of opening a separate window.
    -Folder shortcuts are only supported by Windows 2000, Me, and later. On earlier versions of Windows, Setup will fall back to creating a normal shortcut when this flag is used.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • The return value of the CreateShellLink function has changed from a Boolean to a String. Now, any failure results in an exception being raised.
    • -
    -
  • -
  • The uninstaller is now capable of removing directories that have the read-only attribute set. (No special flags are needed; this is the default behavior.)
  • -
  • Based on RemObjects Pascal Script SVN code revision 948.
  • -
  • The uninstall program's version is now 51.32.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.0.2-beta (2004-08-05)

-
    -
  • Pascal Scripting changes/improvements: -
      -
    • New GetUILanguage support function.
    • -
    -
  • -
  • Compiler IDE: When a file has been modified outside the editor, offer to reload it.
  • -
  • Fix: The per-page event functions introduced in 5.0.1 that returned Boolean values didn't work properly.
  • -
  • Fix: When the overwritereadonly [Files] section flag was used and Setup was unable to remove the read-only attribute from a file (e.g. due to ACL restrictions), it would get stuck in an infinite loop.
  • -
  • Based on RemObjects Pascal Script SVN code revision 947.
  • -
- -

5.0.1-beta (2004-08-02)

-
    -
  • Compiler IDE: the toolbar now uses a modern looking set of images kindly donated by glyFX.
  • -
  • Setup/Uninstall can now wait on processes spawned using [Run]/[UninstallRun] entries that have the shellexec flag. Combine shellexec with either the new waituntilterminated flag (the default behavior when shellexec isn't specified) or the waituntilidle flag.
  • -
  • When Setup is running on Windows NT 4.0, Service Pack 6 is now required. This change shouldn't impact any significant number of users; SP6 was released five years ago, and almost all other programs that still support NT 4.0 nowadays have the same requirement.
  • -
  • Pascal Scripting changes/improvements: -
      -
    • Added new supported event function CancelButtonClick, which is called when the user clicks the Cancel button.
    • -
    • The prototype of the CurStepChanged function has changed, as has the names of the CurStep values passed to it. See the help file for details.
    • -
    • The names of the values passed to the CurUninstallStepChanged function have changed. See the help file for details.
    • -
    • Per-page event functions are now supported. TWizardPage and its descendants now include these properties: OnActivate, OnBackButtonClick, OnCancelButtonClick, OnNextButtonClick, OnShouldSkipPage. See the Support Classes Reference topic in the help file for the prototypes of these event functions.
    • -
    • Replaced the InstExec function with a new function named Exec. The new function offers the same functionality as the old one, but uses a slightly different prototype. The WaitUntilTerminated and WaitUntilIdle parameters have been replaced with a single Wait parameter.
    • -
    • Replaced the InstShellExec function with a new function named ShellExec. The new function adds Verb and Wait parameters. To get ShellExec to behave the same way as the old function, specify 'open' in the Verb parameter and ewNoWait in the Wait parameter.
    • -
    • Replaced the FindFirst and FindNext support functions with new versions that return more information about found files and can handle nested searches. Any existing scripts that called these functions will need updating. There is also a new FindClose function that you should call at the end of a find sequence.
    • -
    • Replaced the confusingly-named ShouldProcessEntry support function with new functions named IsComponentSelected and IsTaskSelected.
    • -
    • The Wizard* support functions now raise exceptions if you call them before the wizard has been initialized, instead of returning empty strings.
    • -
    -
  • -
  • On a file that has the uninsrestartdelete flag the containing directory will now also be removed at uninstall time.
  • -
  • When extracting files, Setup now sets just the modification times instead of the creation and modification times.
  • -
  • /LOG improvement: Now logs permission setting on files/directories/registry keys.
  • -
  • The compiler now flags UXTHEME.DLL as an "unsafe" file.
  • -
  • Dropped the obsolete WizModernImage2.bmp and WizModernSmallImage2.bmp images.
  • -
  • Based on RemObjects Pascal Script SVN code revision 945.
  • -
  • The uninstall program's version is now 51.31.0.0.
  • -
  • Minor tweaks.
  • -
- -

5.0.0-beta (2004-07-14)

-
    -
  • The size of compiled installations has decreased by 22-26 KB from Inno Setup 4.2.7, primarily due to the merging of Setup and Uninstall into a single binary.

  • -
  • Pascal Scripting can now be used to customize Uninstall:
    -
    -
      -
    • Added Uninstall specific event functions InitializeUninstall, DeinitializeUninstall, CurUninstallStepChanged and UninstallNeedRestart.
    • -
    • Added support functions IsUninstaller and UninstallSilent.
    • -
    -
    - Furthermore, the compiler IDE now supports Uninstall debugging. To debug Uninstall, first run Setup from the IDE, install your application, select Target Uninstall in the Run menu and finally use the debugger functions as normal.
    - See the help file and the UninstallCodeExample1.iss example script for more information.
    -
    -
  • -
  • The custom wizard page support has been completely redesigned from the ground up. The new design uses an event-driven model just like standard wizard pages; no longer do you have to write complicated loops to handle sequences of custom pages.
    -Any existing code utilizing custom wizard pages will need updating; all of the old functions have been replaced. Please see the new Using Custom Wizard Pages topic in the help file and the CodeDlg.iss and CodeClasses.iss example scripts for examples of how to use the new custom wizard page model.
    -
    -
  • -
  • Besides space separated lists, you may now also use boolean expressions as Components, Tasks, Languages and Check parameters. Supported operators include not, and, and or. For example: -
    -[Components]
    -Name: a; Description: a
    -Name: b; Description: b
    -
    -[Tasks]
    -Name: p; Description: a or b; Components: a or b
    -Name: q; Description: a and b; Components: a and b
    -Name: r; Description: not a or b; Components: not a or b
    -Name: s; Description: not (a or b); Components: not (a or b)
    -Name: t; Description: a or b - old style; Components: a b -
    -
  • -
  • This syntax of function parameters in Check, BeforeInstall and AfterInstall parameters has changed to allow a list of multiple, comma separated, parameters and the use of Integer and Boolean parameter types besides String types. For example, you may now use: -
    -[Files]
    -Source: MyProg.exe; DestDir: {app}; Check: MyCheck(1, True, 'Some text')
    -
    -[Code]
    -function MyCheck(I: Integer; B: Boolean; S: String): Boolean;
    -begin
    -  Result := (I > 0) and B and (S <> '');
    -end;
    -
    -Also, there's one support function that may be called from within a parameter list: ExpandConstant. For example: -
    -[Files]
    -Source: MyProg.exe; DestDir: {app}; Check: MyCheck(1, True, ExpandConstant('{app}'))
    -
    -Existing scripts using function parameters will need to be updated.
    -
    -
  • -
  • The functions specified by {code:...} constants and by Check, BeforeInstall and AfterInstall parameters may now refer to support functions too, for example: -
    -[Components]
    -Name: adminonly; Description: My Admin Only Component; Check: IsAdminLoggedOn
    -
    -[Files]
    -Source: MyProg.exe; DestDir: {app}; BeforeInstall: Log('About to install MyProg.exe')
    -Source: MyProg.hlp; DestDir: {app}\Help; Check: DirExists(ExpandConstant('{app}\Help'))
    -
    -[INI]
    -FileName: {app}\MyIni.ini; Section: MySettings; Key: ShortApp; String: {code:GetShortName|{app}}
    -FileName: {app}\MyIni.ini; Section: MySettings; Key: AppDrive; String: {code:ExtractFileDrive|{app}} -
    -
  • -
  • Wizard-related event functions such as NextButtonClick are now called on silent installs as well. In fact, silent installs now function almost identically to non-silent ones with the exception that the Next button is automatically "clicked".
  • -
  • Logging improvements: -
      -
    • The filenames of programs spawned in the [Run] section are now logged.
    • -
    • The /LOG parameter is now also supported by Uninstall, which causes Uninstall to create a log file in the user's TEMP directory detailing file uninstallation and [UninstallRun] actions taken during the uninstallation process. This can be a helpful debugging aid. See the Uninstall Command Line Parameters topic in the help file for further details.
    • -
    -
  • -
  • A new ShouldSkipPage event function has been added, which replaces SkipCurPage. Existing scripts that contain a SkipCurPage function will need to be updated. Note that unlike the old SkipCurPage event function, the page passed to the ShouldSkipPage function is not the current page.
  • -
  • Added support function Abort. Calling Abort throws an exception to abort the current operation. It does not terminate Setup or Uninstall unless it's still starting up.
  • -
  • When extracting a file, Setup now pre-allocates all of the bytes in the destination file on disk. This allows the system to know what the final size of the file will be before extraction begins, and avoid fragmenting it.
  • -
  • The compiler now fully supports script files that use Unix-style line breaks (LF only).
  • -
  • The Setup section directive UninstallIconFile is now deprecated and ignored. As Setup and Uninstall have been merged into a single executable, setting a custom icon for Uninstall is no longer possible.
  • -
  • The Setup section directive UninstallStyle is now deprecated and ignored. Only the "modern" uninstaller style is supported now.
  • -
  • Based on RemObjects Pascal Script SVN code revision 933.
  • -
  • The uninstall program's version is now 51.30.0.0.
  • -
  • A very large number of minor tweaks.
  • -
  • This version is derived from Inno Setup 4.2.7, and therefore includes all of the features and fixes from that version.
  • -
- -

Inno Setup 4.2 & 4.1 Revision History

- - - diff --git a/appveyor12.yml b/appveyor12.yml index 25e95b989..d69ea9389 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -42,6 +42,7 @@ environment: rsakey: secure: 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 before_build: +- nuget restore - ps: .\prebuild.ps1 build: project: greenshot\greenshot.sln diff --git a/build.ps1 b/build.ps1 index 59bab841c..bb8878164 100644 --- a/build.ps1 +++ b/build.ps1 @@ -235,7 +235,7 @@ Function PackageDbgSymbolsZip { # This function creates the installer Function PackageInstaller { $setupOutput = "$(get-location)\setup" - $innoSetup = "$(get-location)\greenshot\tools\innosetup\ISCC.exe" + $innoSetup = "$(get-location)\greenshot\packages\Tools.InnoSetup.5.5.9\tools\ISCC.exe" $innoSetupFile = "$(get-location)\greenshot\releases\innosetup\setup.iss" Write-Host "Starting $innoSetup $innoSetupFile" $setupResult = Start-Process -wait -PassThru "$innoSetup" -ArgumentList "$innoSetupFile" -NoNewWindow -RedirectStandardOutput "$setupOutput.log" -RedirectStandardError "$setupOutput.error" From 9f3b8ed61880fd5161a3ff2147192580dda11720 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 22:33:12 +0200 Subject: [PATCH 047/170] Fixed missing change to psproj to enable InnoSetup from Nuget. --- Greenshot/Greenshot.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index dd9d31648..663fe3076 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -390,6 +390,7 @@ Form + From 60d93a9306f7f6dca372421ed3805b501cc0f0ab Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 22:48:59 +0200 Subject: [PATCH 048/170] Move solution file. --- Greenshot/Greenshot.sln => Greenshot.sln | 0 Greenshot/Greenshot.v11.suo | Bin 274432 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename Greenshot/Greenshot.sln => Greenshot.sln (100%) delete mode 100644 Greenshot/Greenshot.v11.suo diff --git a/Greenshot/Greenshot.sln b/Greenshot.sln similarity index 100% rename from Greenshot/Greenshot.sln rename to Greenshot.sln diff --git a/Greenshot/Greenshot.v11.suo b/Greenshot/Greenshot.v11.suo deleted file mode 100644 index 2dd74ff7e3f1f418ac99067dbe98d9507976ac66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274432 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 bfyG+Bf=7`x8(cmZ7lVo}c{Q6tJFou(Jg36x From 9da5c753be4dbd8c7f31d6ea6085c310e846ebca Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 22:50:14 +0200 Subject: [PATCH 049/170] Fixed paths in solution --- Greenshot.sln | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Greenshot.sln b/Greenshot.sln index 38a4f572c..47be71a18 100644 --- a/Greenshot.sln +++ b/Greenshot.sln @@ -3,36 +3,36 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Greenshot", "Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Greenshot", "Greenshot\Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPlugin", "..\GreenshotPlugin\GreenshotPlugin.csproj", "{5B924697-4DCD-4F98-85F1-105CB84B7341}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPlugin", "GreenshotPlugin\GreenshotPlugin.csproj", "{5B924697-4DCD-4F98-85F1-105CB84B7341}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotExternalCommandPlugin", "..\GreenshotExternalCommandPlugin\GreenshotExternalCommandPlugin.csproj", "{47F23C86-604E-4CC3-8767-B3D4088F30BB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotExternalCommandPlugin", "GreenshotExternalCommandPlugin\GreenshotExternalCommandPlugin.csproj", "{47F23C86-604E-4CC3-8767-B3D4088F30BB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotConfluencePlugin", "..\GreenshotConfluencePlugin\GreenshotConfluencePlugin.csproj", "{C3052651-598A-44E2-AAB3-2E41311D50F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotConfluencePlugin", "GreenshotConfluencePlugin\GreenshotConfluencePlugin.csproj", "{C3052651-598A-44E2-AAB3-2E41311D50F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotImgurPlugin", "..\GreenshotImgurPlugin\GreenshotImgurPlugin.csproj", "{80D8DEB9-94E3-4876-8CCA-2DF1ED5F2C50}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotImgurPlugin", "GreenshotImgurPlugin\GreenshotImgurPlugin.csproj", "{80D8DEB9-94E3-4876-8CCA-2DF1ED5F2C50}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotJiraPlugin", "..\GreenshotJiraPlugin\GreenshotJiraPlugin.csproj", "{19FEEF09-313F-43C7-819D-F1BCA782B08B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotJiraPlugin", "GreenshotJiraPlugin\GreenshotJiraPlugin.csproj", "{19FEEF09-313F-43C7-819D-F1BCA782B08B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOCRPlugin", "..\GreenshotOCRPlugin\GreenshotOCRPlugin.csproj", "{C6988EE8-2FEE-4349-9F09-F9628A0D8965}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOCRPlugin", "GreenshotOCRPlugin\GreenshotOCRPlugin.csproj", "{C6988EE8-2FEE-4349-9F09-F9628A0D8965}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOCRCommand", "..\GreenshotOCRCommand\GreenshotOCRCommand.csproj", "{D61E6ECE-E0B6-4467-B492-F08A06BA8F02}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOCRCommand", "GreenshotOCRCommand\GreenshotOCRCommand.csproj", "{D61E6ECE-E0B6-4467-B492-F08A06BA8F02}" ProjectSection(ProjectDependencies) = postProject {C6988EE8-2FEE-4349-9F09-F9628A0D8965} = {C6988EE8-2FEE-4349-9F09-F9628A0D8965} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotBoxPlugin", "..\GreenshotBoxPlugin\GreenshotBoxPlugin.csproj", "{697CF066-9077-4F22-99D9-D989CCE7282B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotBoxPlugin", "GreenshotBoxPlugin\GreenshotBoxPlugin.csproj", "{697CF066-9077-4F22-99D9-D989CCE7282B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotDropboxPlugin", "..\GreenshotDropboxPlugin\GreenshotDropboxPlugin.csproj", "{AD7CFFE2-40E7-46CF-A172-D48CF7AE9A12}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotDropboxPlugin", "GreenshotDropboxPlugin\GreenshotDropboxPlugin.csproj", "{AD7CFFE2-40E7-46CF-A172-D48CF7AE9A12}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotFlickrPlugin", "..\GreenshotFlickrPlugin\GreenshotFlickrPlugin.csproj", "{7EC72A5A-D73A-4B4B-9CA1-2216C7D92D5E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotFlickrPlugin", "GreenshotFlickrPlugin\GreenshotFlickrPlugin.csproj", "{7EC72A5A-D73A-4B4B-9CA1-2216C7D92D5E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPicasaPlugin", "..\GreenshotPicasaPlugin\GreenshotPicasaPlugin.csproj", "{1893A2E4-A78A-4713-A8E7-E70058DABEE0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPicasaPlugin", "GreenshotPicasaPlugin\GreenshotPicasaPlugin.csproj", "{1893A2E4-A78A-4713-A8E7-E70058DABEE0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOfficePlugin", "..\GreenshotOfficePlugin\GreenshotOfficePlugin.csproj", "{92599C09-FF29-4ABD-B6E6-C48ECD781BAB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOfficePlugin", "GreenshotOfficePlugin\GreenshotOfficePlugin.csproj", "{92599C09-FF29-4ABD-B6E6-C48ECD781BAB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPhotobucketPlugin", "..\GreenshotPhotobucketPlugin\GreenshotPhotobucketPlugin.csproj", "{9C0ECC4C-7807-4111-916A-4F57BB29788A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPhotobucketPlugin", "GreenshotPhotobucketPlugin\GreenshotPhotobucketPlugin.csproj", "{9C0ECC4C-7807-4111-916A-4F57BB29788A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From c3872248f7ad0781695234b0efaaff3b187fa452 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 23:00:08 +0200 Subject: [PATCH 050/170] Fixed project builds and nuget update --- .gitignore | 234 ++++++++++++++++-- Greenshot/Greenshot.csproj | 2 +- GreenshotBoxPlugin/GreenshotBoxPlugin.csproj | 10 +- .../GreenshotConfluencePlugin.csproj | 10 +- .../GreenshotDropboxPlugin.csproj | 10 +- .../GreenshotExternalCommandPlugin.csproj | 10 +- .../GreenshotFlickrPlugin.csproj | 10 +- .../GreenshotImgurPlugin.csproj | 10 +- .../GreenshotJiraPlugin.csproj | 10 +- .../GreenshotOCRCommand.csproj | 6 +- GreenshotOCRPlugin/GreenshotOCRPlugin.csproj | 10 +- .../GreenshotOfficePlugin.csproj | 6 +- .../GreenshotPhotobucketPlugin.csproj | 10 +- .../GreenshotPicasaPlugin.csproj | 10 +- 14 files changed, 268 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 54ed6bdf5..94c0f9d36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,212 @@ -.svn/ -*.gsp -*.bak -Greenshot*INSTALLER*.exe -Greenshot*INSTALLER*.zip -*.paf.exe -*-SVN.* -/Greenshot*/bin/ -obj/ -fugue/ -*Credentials.private.cs -*Credentials.orig.cs -/Greenshot/UpgradeLog*.htm -/Greenshot/UpgradeLog*.XML -/Greenshot/_UpgradeReport_Files/* -*.log -/Greenshot/releases/additional_files/readme.txt -/*.error -/Greenshot/releases/innosetup/setup.iss -/Greenshot/packages -/Greenshot/releases/appinfo.ini -/Greenshot/Backup* +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. -/Greenshot/tools/PortableApps.comInstaller/Data/PortableApps.comInstallerLog.txt +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index 663fe3076..866066d0d 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -401,6 +401,6 @@ -copy "$(ProjectDir)log4net-debug.xml" "$(SolutionDir)bin\$(Configuration)\log4net.xml" +copy "$(ProjectDir)log4net-debug.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\log4net.xml" \ No newline at end of file diff --git a/GreenshotBoxPlugin/GreenshotBoxPlugin.csproj b/GreenshotBoxPlugin/GreenshotBoxPlugin.csproj index 7bc39f15a..1df2862d1 100644 --- a/GreenshotBoxPlugin/GreenshotBoxPlugin.csproj +++ b/GreenshotBoxPlugin/GreenshotBoxPlugin.csproj @@ -75,11 +75,11 @@ rename "$(ProjectDir)BoxCredentials.orig.cs" "BoxCredentials.cs" ) -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" if exist "$(ProjectDir)BoxCredentials.private.cs" ( diff --git a/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj b/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj index b0535116e..c531a3499 100644 --- a/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj +++ b/GreenshotConfluencePlugin/GreenshotConfluencePlugin.csproj @@ -143,10 +143,10 @@ - mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" \ No newline at end of file diff --git a/GreenshotDropboxPlugin/GreenshotDropboxPlugin.csproj b/GreenshotDropboxPlugin/GreenshotDropboxPlugin.csproj index 58f8f231e..7721478a4 100644 --- a/GreenshotDropboxPlugin/GreenshotDropboxPlugin.csproj +++ b/GreenshotDropboxPlugin/GreenshotDropboxPlugin.csproj @@ -67,11 +67,11 @@ rename "$(ProjectDir)DropBoxCredentials.cs" "DropBoxCredentials.private.cs" rename "$(ProjectDir)DropBoxCredentials.orig.cs" "DropBoxCredentials.cs" ) -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" if exist "$(ProjectDir)DropBoxCredentials.private.cs" ( diff --git a/GreenshotExternalCommandPlugin/GreenshotExternalCommandPlugin.csproj b/GreenshotExternalCommandPlugin/GreenshotExternalCommandPlugin.csproj index 2f534d1b4..8be1f0a81 100644 --- a/GreenshotExternalCommandPlugin/GreenshotExternalCommandPlugin.csproj +++ b/GreenshotExternalCommandPlugin/GreenshotExternalCommandPlugin.csproj @@ -63,11 +63,11 @@ - mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" False diff --git a/GreenshotFlickrPlugin/GreenshotFlickrPlugin.csproj b/GreenshotFlickrPlugin/GreenshotFlickrPlugin.csproj index 5c3c047e0..69d67f146 100644 --- a/GreenshotFlickrPlugin/GreenshotFlickrPlugin.csproj +++ b/GreenshotFlickrPlugin/GreenshotFlickrPlugin.csproj @@ -71,11 +71,11 @@ rename "$(ProjectDir)FlickrCredentials.orig.cs" "FlickrCredentials.cs" ) -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" if exist "$(ProjectDir)FlickrCredentials.private.cs" ( rename "$(ProjectDir)FlickrCredentials.cs" "FlickrCredentials.orig.cs" diff --git a/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj b/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj index 6dea91f73..16a2690f1 100644 --- a/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj +++ b/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj @@ -88,10 +88,10 @@ if exist "$(ProjectDir)ImgurCredentials.private.cs" ( rename "$(ProjectDir)ImgurCredentials.orig.cs" "ImgurCredentials.cs" ) -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" \ No newline at end of file diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 671d710a9..0af0eaeb9 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -95,11 +95,11 @@ - mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" False diff --git a/GreenshotOCRCommand/GreenshotOCRCommand.csproj b/GreenshotOCRCommand/GreenshotOCRCommand.csproj index 94b553e26..bf34f8d0e 100644 --- a/GreenshotOCRCommand/GreenshotOCRCommand.csproj +++ b/GreenshotOCRCommand/GreenshotOCRCommand.csproj @@ -63,9 +63,9 @@ -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\GreenshotOCRPlugin" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\GreenshotOCRPlugin" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName).config" "$(SolutionDir)bin\$(Configuration)\Plugins\GreenshotOCRPlugin" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\GreenshotOCRPlugin" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\GreenshotOCRPlugin" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName).config" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\GreenshotOCRPlugin" diff --git a/GreenshotOCRPlugin/GreenshotOCRPlugin.csproj b/GreenshotOCRPlugin/GreenshotOCRPlugin.csproj index 56cbb92ca..22257a2c1 100644 --- a/GreenshotOCRPlugin/GreenshotOCRPlugin.csproj +++ b/GreenshotOCRPlugin/GreenshotOCRPlugin.csproj @@ -64,11 +64,11 @@ - mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" False diff --git a/GreenshotOfficePlugin/GreenshotOfficePlugin.csproj b/GreenshotOfficePlugin/GreenshotOfficePlugin.csproj index 07bf79ccf..43f976544 100644 --- a/GreenshotOfficePlugin/GreenshotOfficePlugin.csproj +++ b/GreenshotOfficePlugin/GreenshotOfficePlugin.csproj @@ -85,9 +85,9 @@ - mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" diff --git a/GreenshotPhotobucketPlugin/GreenshotPhotobucketPlugin.csproj b/GreenshotPhotobucketPlugin/GreenshotPhotobucketPlugin.csproj index 2a5bfe70e..140a7d927 100644 --- a/GreenshotPhotobucketPlugin/GreenshotPhotobucketPlugin.csproj +++ b/GreenshotPhotobucketPlugin/GreenshotPhotobucketPlugin.csproj @@ -84,11 +84,11 @@ if exist "$(ProjectDir)PhotobucketCredentials.orig.cs" ( rename "$(ProjectDir)PhotobucketCredentials.cs" "PhotobucketCredentials.private.cs" rename "$(ProjectDir)PhotobucketCredentials.orig.cs" "PhotobucketCredentials.cs" ) -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" \ No newline at end of file diff --git a/GreenshotPicasaPlugin/GreenshotPicasaPlugin.csproj b/GreenshotPicasaPlugin/GreenshotPicasaPlugin.csproj index 926f22050..5a7327910 100644 --- a/GreenshotPicasaPlugin/GreenshotPicasaPlugin.csproj +++ b/GreenshotPicasaPlugin/GreenshotPicasaPlugin.csproj @@ -76,11 +76,11 @@ rename "$(ProjectDir)PicasaCredentials.orig.cs" "PicasaCredentials.cs" ) -mkdir "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)bin\$(Configuration)\Plugins\$(ProjectName)\" -mkdir "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)" -copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" +copy "$(ProjectDir)Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" if exist "$(ProjectDir)PicasaCredentials.private.cs" ( From fe52e4a48e988a09a178edb11d361364c8b8def0 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 23:06:11 +0200 Subject: [PATCH 051/170] Fixed location of the sln file in the yml. --- appveyor12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor12.yml b/appveyor12.yml index d69ea9389..b08dfe989 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -45,7 +45,7 @@ before_build: - nuget restore - ps: .\prebuild.ps1 build: - project: greenshot\greenshot.sln + project: greenshot.sln verbosity: normal after_build: - ps: .\build.ps1 From 5d58150e038a496605a56de53508ac12e4f81293 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 23:14:20 +0200 Subject: [PATCH 052/170] Fixed package location in script. --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index bb8878164..856abb4bc 100644 --- a/build.ps1 +++ b/build.ps1 @@ -235,7 +235,7 @@ Function PackageDbgSymbolsZip { # This function creates the installer Function PackageInstaller { $setupOutput = "$(get-location)\setup" - $innoSetup = "$(get-location)\greenshot\packages\Tools.InnoSetup.5.5.9\tools\ISCC.exe" + $innoSetup = "$(get-location)\packages\Tools.InnoSetup.5.5.9\tools\ISCC.exe" $innoSetupFile = "$(get-location)\greenshot\releases\innosetup\setup.iss" Write-Host "Starting $innoSetup $innoSetupFile" $setupResult = Start-Process -wait -PassThru "$innoSetup" -ArgumentList "$innoSetupFile" -NoNewWindow -RedirectStandardOutput "$setupOutput.log" -RedirectStandardError "$setupOutput.error" From 3919d1783248dba9abaae131663b3a50a66cc849 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 31 May 2016 23:39:58 +0200 Subject: [PATCH 053/170] Added missing custom translations for Inno Setup. --- .gitignore | 1 - .../innosetup/Languages/ChineseSimplified.isl | 336 +++++++++++++++++ .../releases/innosetup/Languages/Latvian.isl | 346 ++++++++++++++++++ .../innosetup/Languages/NorwegianNynorsk.isl | 301 +++++++++++++++ .../releases/innosetup/Languages/Spanish.isl | 335 +++++++++++++++++ .../releases/innosetup/setup.iss.template | 8 +- 6 files changed, 1322 insertions(+), 5 deletions(-) create mode 100644 Greenshot/releases/innosetup/Languages/ChineseSimplified.isl create mode 100644 Greenshot/releases/innosetup/Languages/Latvian.isl create mode 100644 Greenshot/releases/innosetup/Languages/NorwegianNynorsk.isl create mode 100644 Greenshot/releases/innosetup/Languages/Spanish.isl diff --git a/.gitignore b/.gitignore index 94c0f9d36..3321bd633 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ -[Rr]eleases/ x64/ x86/ build/ diff --git a/Greenshot/releases/innosetup/Languages/ChineseSimplified.isl b/Greenshot/releases/innosetup/Languages/ChineseSimplified.isl new file mode 100644 index 000000000..9cf26394d --- /dev/null +++ b/Greenshot/releases/innosetup/Languages/ChineseSimplified.isl @@ -0,0 +1,336 @@ +; *** Inno Setup version 5.5.0+ Chinese (Simplified) messages *** +; by Mack Zhang (hua_wuxin@21cn.com) +; +; To download user-contributed translations of this file, go to: +; http://www.jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=<4E2D><6587><7B80><4F53> +LanguageID=$0804 +LanguageCodePage=936 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +DialogFontName= +DialogFontSize=9 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=װ +SetupWindowTitle=װ - %1 +UninstallAppTitle=ж +UninstallAppFullTitle=%1 ж + +; *** Misc. common +InformationTitle=Ϣ +ConfirmTitle=ȷ +ErrorTitle= + +; *** SetupLdr messages +SetupLdrStartupMessage=װ򵼽ĵϰװ %1ȷҪ +LdrCannotCreateTemp=޷ʱļװֹ +LdrCannotExecTemp=޷ʱļеļװֹ + +; *** Startup error messages +LastErrorMessage=%1.%n%n %2%3 +SetupFileMissing=װļȱļ %1ȡ°汾 +SetupFileCorrupt=װļ𻵡ȡ°汾 +SetupFileCorruptOrWrongVer=װļ𻵣뱾װ򵼵İ汾ݡȡ°汾 +InvalidParameter=һIJݵУ%n%n%1 +SetupAlreadyRunning=װѾС +WindowsVersionNotSupported=֧ĵе Windows 汾 +WindowsServicePackRequired=Ҫ %1 Service Pack %2 µİ汾 +NotOnThisPlatform= %1 С +OnlyOnThisPlatform= %1 С +OnlyOnTheseArchitectures=ֻܰװΪдܹƵ Windows 汾У%n%n%1 +MissingWOW64APIs=ǰ Windows 汾ûаִ 64 λװĺҪ⣬밲װ Service Pack %1 +WinVersionTooLowError=Ҫ %1 v%2 ߰汾 +WinVersionTooHighError=ܰװ %1 v%2 ߰汾ϡ +AdminPrivilegesRequired=װʱԹԱݵ¼ +PowerUserPrivilegesRequired=װʱԹԱ Power Users Աݵ¼ +SetupAppRunningError=װ򵼷 %1 С%n%nرʵȻ󵥻ȷ򵥻ȡ˳ +UninstallAppRunningError=ж򵼷 %1 С%n%nرʵȻ󵥻ȷ򵥻ȡ˳ + +; *** Misc. errors +ErrorCreatingDir=װ޷ļС%1 +ErrorTooManyFilesInDir=޷ļС%1дļΪ̫ļ + +; *** Setup common messages +ExitSetupTitle=˳װ +ExitSetupMessage=װδɡ˳ᰲװ%n%nʱаװɰװ%n%n˳װ +AboutSetupMenuItem=ڰװ(&A) +AboutSetupTitle=ڰװ +AboutSetupMessage=%1 汾 %2%n%3%n%n%1 ҳ%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< һ(&B) +ButtonNext=һ(&N) > +ButtonInstall=װ(&I) +ButtonOK=ȷ +ButtonCancel=ȡ +ButtonYes=(&Y) +ButtonYesToAll=ȫ(&A) +ButtonNo=(&N) +ButtonNoToAll=ȫ(&O) +ButtonFinish=(&F) +ButtonBrowse=(&B) +ButtonWizardBrowse=(&R) +ButtonNewFolder=ļ(&M) + +; *** "Select Language" dialog messages +SelectLanguageTitle=ѡװ +SelectLanguageLabel=ѡװڼҪʹõԣ + +; *** Common wizard text +ClickNext=һ򵥻ȡ˳װ +BeveledLabel= +BrowseDialogTitle=ļ +BrowseDialogLabel=ѡһļУȻ󵥻ȷ +NewFolderName=½ļ + +; *** "Welcome" wizard page +WelcomeLabel1=ӭʹ [name] װ +WelcomeLabel2=װ򵼽ĵϰװ [name/ver]%n%nڼ֮ǰرӦó + +; *** "Password" wizard page +WizardPassword= +PasswordLabel1=װ뱣 +PasswordLabel3=룬Ȼ󵥻һһִСд +PasswordEditLabel=(&P) +IncorrectPassword=벻ȷԡ + +; *** "License Agreement" wizard page +WizardLicense=Э +LicenseLabel=ڼ֮ǰĶҪϢ +LicenseLabel3=ĶЭ顣ڼװ֮ǰܴЭ +LicenseAccepted=ҽЭ(&A) +LicenseNotAccepted=ҲЭ(&D) + +; *** "Information" wizard pages +WizardInfoBefore=Ϣ +InfoBeforeLabel=ڼ֮ǰĶҪϢ +InfoBeforeClickLabel=׼üװ뵥һ +WizardInfoAfter=Ϣ +InfoAfterLabel=ڼ֮ǰĶҪϢ +InfoAfterClickLabel=׼üװ뵥һ + +; *** "User Information" wizard page +WizardUserInfo=ûϢ +UserInfoDesc=Ϣ +UserInfoName=û(&U) +UserInfoOrg=֯(&O) +UserInfoSerial=к(&S) +UserInfoNameRequired=û + +; *** "Select Destination Location" wizard page +WizardSelectDir=ѡĿλ +SelectDirDesc= [name] װ +SelectDirLabel3=װ򵼽 [name] װļС +SelectDirBrowseLabel=ҪһҪѡͬļУ뵥 +DiskSpaceMBLabel=Ҫ [mb] MB Ŀд̿ռ䡣 +CannotInstallToNetworkDrive=޷װ +CannotInstallToUNCPath=޷װ UNC · +InvalidPath=̷·磺%n%nC:\APP%n%n UNC ·ʽ%n%n\\server\share +InvalidDrive=ѡ UNC ڻ򲻿ɷʡѡ +DiskSpaceWarningTitle=û㹻Ĵ̿ռ +DiskSpaceWarning=װҪ %1 KB ʣռ䣬ѡֻ %2 KB á%n%nȻҪ +DirNameTooLong=ļƻ·̫ +InvalidDirName=ļЧ +BadDirName32=ļƲַܰ%n%n%1 +DirExistsTitle=ļѴ +DirExists=ļУ%n%n%1%n%nѴڡȷҪװļ +DirDoesntExistTitle=ļв +DirDoesntExist=ļУ%n%n%1%n%nڡļ + +; *** "Select Components" wizard page +WizardSelectComponents=ѡ +SelectComponentsDesc=ҪװЩ +SelectComponentsLabel2=ѡҪװ㲻밲װ׼úһ +FullInstallation=װ +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=లװ +CustomInstallation=ưװ +NoUninstallWarningTitle=Ѵ +NoUninstallWarning=װ򵼷Ѿװ%n%n%1%n%nȡѡжЩ%n%nװ +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceMBLabel=ǰѡҪ [mb] MB ̿ռ䡣 + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=ѡ񸽼 +SelectTasksDesc=ҪִЩ +SelectTasksLabel2=ѡڰװ [name] ڼ䰲װҪִеĸȻһ + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=ѡʼ˵ļ +SelectStartMenuFolderDesc=ѳݷʽŵ +SelectStartMenuFolderLabel3=װ򵼽¿ʼ˵ļдݷʽ +SelectStartMenuFolderBrowseLabel=һһҪѡͬļУ +MustEnterGroupName=ļ +GroupNameTooLong=ļƻ·̫ +InvalidGroupName=ļЧ +BadGroupName=ļƲַܰ%n%n%1 +NoProgramGroupCheck2=ʼ˵ļ(&D) + +; *** "Ready to Install" wizard page +WizardReady=׼װ +ReadyLabel1=װ׼ʼװ [name] +ReadyLabel2a=װװҪ鿴߸һ +ReadyLabel2b=װװ +ReadyMemoUserInfo=ûϢ +ReadyMemoDir=Ŀλã +ReadyMemoType=װͣ +ReadyMemoComponents=ѡ +ReadyMemoGroup=ʼ˵ļУ +ReadyMemoTasks= + +; *** "Preparing to Install" wizard page +WizardPreparing=׼װ +PreparingDesc=װ׼װ [name] +PreviousInstallNotCompleted=ǰİװ/жδɡҪɰװ%n%n֮аװ [name] İװ +CannotContinue=װܼȡ˳ +ApplicationsFound=װҪ±ӦóռõļԶرЩӦó +ApplicationsFound2=װҪ±ӦóռõļԶرЩӦó򡣰װɺ󣬰װ򵼻᳢ЩӦó +CloseApplications=ԶرӦó(&A) +DontCloseApplications=ԶرӦó(&D) + +; *** "Installing" wizard page +WizardInstalling=ڰװ +InstallingLabel=ļаװ [name]Եȡ + +; *** "Setup Completed" wizard page +FinishedHeadingLabel= [name] װ +FinishedLabelNoIcons=װ [name] İװ +FinishedLabel=װ [name] İװͨѡѰװͼӦó +ClickFinish=ɡ˳װ +FinishedRestartLabel=Ϊ [name] İװװ򵼱ԡҪ +FinishedRestartMessage=Ϊ [name] İװװ򵼱ԡ%n%nҪ +ShowReadmeCheck=ǣҪ鿴ļ +YesRadio=ǣ(&Y) +NoRadio=Ժ(&N) +; used for example as 'Run MyProg.exe' +RunEntryExec= %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=鿴 %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=װҪһ +SelectDiskLabel2= %1 ȷ%n%nڳʾļļҲôϵļȷ· +PathLabel=·(&P) +FileNotInDir2=ļ%1ڡ%2СȷĴ̻ѡļС +SelectDirectoryLabel=ָһ̵λá + +; *** Installation phase messages +SetupAborted=װδɡ%n%nⲢаװ򵼡 +EntryAbortRetryIgnore=ԡ³ԣԡװֹȡװ + +; *** Installation status messages +StatusClosingApplications=ڹرӦó +StatusCreateDirs=ڴļС +StatusExtractFiles=ȡļ +StatusCreateIcons=ڴݷʽ +StatusCreateIniEntries=ڴ INI Ŀ +StatusCreateRegistryEntries=ڴעĿ +StatusRegisterFiles=עļ +StatusSavingUninstall=ڱжϢ +StatusRunProgram=ɰװ +StatusRestartingApplications=Ӧó +StatusRollback=ڻعġ + +; *** Misc. errors +ErrorInternal2=ڲ%1 +ErrorFunctionFailedNoCode=%1 ʧ +ErrorFunctionFailed=%1 ʧܡ %2 +ErrorFunctionFailedWithMessage=%1 ʧܡ %2%n%3 +ErrorExecutingProgram=޷ִļ%n%1 + +; *** Registry errors +ErrorRegOpenKey=עʱ%n%1\%2 +ErrorRegCreateKey=עʱ%n%1\%2 +ErrorRegWriteKey=дעʱ%n%1\%2 + +; *** INI errors +ErrorIniEntry=ļ%1д INI Ŀʱ + +; *** File copying errors +FileAbortRetryIgnore=ԡ³ԣԡļƼֹȡװ +FileAbortRetryIgnore2=ԡ³ԣԡװƼֹȡװ +SourceIsCorrupted=Դļ +SourceDoesntExist=Դļ%1 +ExistingFileReadOnly=ļΪֻ%n%nԡƳֻԲԣԡļֹȡװ +ErrorReadingExistingDest=ȡļʱ +FileExists=ļѴڡ%n%nҪ +ExistingFileNewer=ļȰװҪװĻ¡㱣ļ%n%nļ +ErrorChangingAttr=ļʱ +ErrorCreatingTemp=Ŀļдļʱ +ErrorReadingSource=ȡԴļʱ +ErrorCopying=ļʱ +ErrorReplacingExistingFile=滻ļʱ +ErrorRestartReplace=滻ʧܣ +ErrorRenamingTemp=Ŀļеļʱ +ErrorRegisterServer=޷ע DLL/OCX%1 +ErrorRegSvr32Failed=RegSvr32 ʧܡֵ%1 +ErrorRegisterTypeLib=޷עͿ⣺%1 + +; *** Post-installation errors +ErrorOpeningReadme=ļʱ +ErrorRestartingComputer=װ޷ԡֶ + +; *** Uninstaller messages +UninstallNotFound=ļ%1ڡжء +UninstallOpenError=ļ%1ܴ򿪡ж +UninstallUnsupportedVer=ж־ļ%1ĸʽܱ˰汾жʶ𡣲ж +UninstallUnknownEntry=ж־һδ֪Ŀ (%1) +ConfirmUninstall=ǷȷҪȫɾ %1 +UninstallOnlyOnWin64=˰װֻ 64 λ Windows жء +OnlyAdminCanUninstall=˰װֻɾ߱ԱȨ޵ûжء +UninstallStatusLabel=ɾ %1Եȡ +UninstalledAll=%1 ѳɹɾ +UninstalledMost=%1 жɡ%n%nijЩĿɾֶɾ +UninstalledAndNeedsRestart=Ҫ %1 жأԡ%n%nҪ +UninstallDataCorrupted=ļ%1𻵡ж + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=ɾļ +ConfirmDeleteSharedFile2=йļٱκγʹáҪɾùļ%n%nгʹøļѱɾЩ޷С㲻ȷѡ񡰷񡱡¸ļϵͳκΣ +SharedFileNameLabel=ļ +SharedFileLocationLabel=λã +WizardUninstalling=ж״̬ +StatusUninstalling=ж %1 + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=ڰװ %1 +ShutdownBlockReasonUninstallingApp=ж %1 + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 汾 %2 +AdditionalIcons=ͼ꣺ +CreateDesktopIcon=ͼ(&D) +CreateQuickLaunchIcon=ͼ(&Q) +ProgramOnTheWeb=%1 վ +UninstallProgram=ж %1 +LaunchProgram= %1 +AssocFileExtension= %1 %2 ļչ(&A) +AssocingFileExtension=ڽ %1 %2 ļչ +AutoStartProgramGroupDescription= +AutoStartProgram=Զ %1 +AddonHostProgramNotFound=ѡļҲ %1%n%nǷȻ diff --git a/Greenshot/releases/innosetup/Languages/Latvian.isl b/Greenshot/releases/innosetup/Languages/Latvian.isl new file mode 100644 index 000000000..01796096f --- /dev/null +++ b/Greenshot/releases/innosetup/Languages/Latvian.isl @@ -0,0 +1,346 @@ +;Agris Ausejs +;****************************************************** +; *** *** +; *** Inno Setup version 5.5.1+ Latvian messages *** +; *** *** +; *** Original Author: *** +; *** *** +; *** Agris Ausejs (oby2005@gmail.com) *** +; *** *** +; *** 02/22/2008 *** +; ****************************************************** +; +; +; To download user-contributed translations of this file, go to: +; http://www.jrsoftware.org/is3rdparty.php +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Latviski +LanguageID=$0426 +LanguageCodePage=1257 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Uzstdana +SetupWindowTitle=Uzstdana - %1 +UninstallAppTitle=Atinstalcija +UninstallAppFullTitle=%1 Atinstalcija + +; *** Misc. common +InformationTitle=Informcija +ConfirmTitle=Apstiprint +ErrorTitle=Kda + +; *** SetupLdr messages +SetupLdrStartupMessage=Tiks uzstdta programma %1. Vai vlaties turpint? +LdrCannotCreateTemp=Neiespjami izveidot pagaidu datnes. Uzstdana prtraukta +LdrCannotExecTemp=Neiespjami palaist datni no pagaidu mapes. Uzstdana prtraukta + +; *** Startup error messages +LastErrorMessage=%1.%n%nKda %2: %3 +SetupFileMissing=Datne %1 nav atrodama instalcijas map. Ldzu, izlabojiet kdu vai iegdjieties jaunu programmas kopiju. +SetupFileCorrupt=Uzstdms datnes ir sabojtas. Ldzu, iegdjieties jaunu programmas kopiju. +SetupFileCorruptOrWrongVer=Uzstdms datnes ir bojtas vai nav savienojamas ar o Uzstdanas programmu. Ldzu, izlabojiet o kdu vai iegdjieties jaunu programmas kopiju. +InvalidParameter=Nedergs parametrs tika pieemts uz komandrindas:%n%n%1 +SetupAlreadyRunning=Uzstdana jau darbojas. +WindowsVersionNotSupported= programma neatbalsta Windows versiju dator darbojas. +WindowsServicePackRequired= programma pieprasa %1 servisa pakotnes %2 vai jaunka. +NotOnThisPlatform=o programmu nevar palaist uz %1. +OnlyOnThisPlatform= programma darbojas uz %1. +OnlyOnTheseArchitectures=o programmu var uzstdt tikai uz dm Windows versijm:%n%n%1 +MissingWOW64APIs=Palaik palaist Windows versija neatbalsta 64-bitu instalciju. Lai izlabotu o kdu, uzinstaljiet Service Pack %1. +WinVersionTooLowError= programma pieprasa %1 versiju %2 vai jaunku. +WinVersionTooHighError=o programmu nevar uzstdt uz %1 versijas %2 vai jaunkas. +AdminPrivilegesRequired=Jums ir jbt adminstratoram, lai vartu uzskt instalciju. +PowerUserPrivilegesRequired=Jums ir jbt administratoram vai pilnvarotam lietotjam, lai uzstdtu o programmu. +SetupAppRunningError=Uzstdana ir atkljusi, ka %1 palaik darbojas.%n%nLdzu, aizveriet visas programmas un spiediet "Ok" vai "Atcelt", lai izietu. +UninstallAppRunningError=Atinstalcija ir atkljusi ka %1 palaik darbojas.%n%nLdzu, aizveriet visas programmas un spiediet "Ok", lai turpintu, vai "Atcelt", lai izietu. + +; *** Misc. errors +ErrorCreatingDir=Uzstdan ir neiespjami izveidot mapi "%1" +ErrorTooManyFilesInDir=Neiespjami izveidot datnes map "%1", jo t satur prk daudz datu + +; *** Setup common messages +ExitSetupTitle=Iziet no Uzstdanas +ExitSetupMessage=Uzstdana nav pabeigta. Ja Js tagad iziesiet, tad programma netiks uzinstalta.%n%nJums bs atkal jpalai Uzstdana, lai pabeigtu programmas instalciju.%n%nIziet no Uzstdanas? +AboutSetupMenuItem=&Par Uzstdanu... +AboutSetupTitle=Par Uzstdanu +AboutSetupMessage=%1 versija %2%n%3%n%n%1 mjas lapa:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< &Atpaka +ButtonNext=&Tlk > +ButtonInstall=&Uzstdt +ButtonOK=OK +ButtonCancel=Atcelt +ButtonYes=&J +ButtonYesToAll=J &Visam +ButtonNo=&N +ButtonNoToAll=N V&isam +ButtonFinish=&Pabeigt +ButtonBrowse=P&rlkot... +ButtonWizardBrowse=Prl&kot... +ButtonNewFolder=I&zveidot jaunu mapi + +; *** "Select Language" dialog messages +SelectLanguageTitle=Izvlieties Uzstdanas valodu +SelectLanguageLabel=Izvlieties valodu, kur notiks Uzstdana: + +; *** Common wizard text +ClickNext=Spiediet "Tlk", lai turpintu, vai "Atcelt", lai izietu no Uzstdanas. +BeveledLabel= +BrowseDialogTitle=Prlkot mapi +BrowseDialogLabel=Izvlieties mapi no saraksta, tad spiediet "Ok". +NewFolderName=Jauna mape + +; *** "Welcome" wizard page +WelcomeLabel1=Laipni ldzam [name] Uzstdan +WelcomeLabel2=is uzstds [name/ver] uz Jsu datora.%n%nVlams aizvrt visas programmas pirms turpinanas. + +; *** "Password" wizard page +WizardPassword=Parole +PasswordLabel1= instalcija ir aizsargta ar paroli. +PasswordLabel3=Ldzu, ievadiet paroli, tad spiediet "Tlk", lai turpintu. Parole ir reistrjutga. +PasswordEditLabel=&Parole: +IncorrectPassword=Parole, ko Js ievadjt, ir nepareiza. Ldzu, miniet vlreiz. + +; *** "License Agreement" wizard page +WizardLicense=Lgums +LicenseLabel=Ldzu, izlasiet sekojoo informciju, pirms turpint. +LicenseLabel3=Ldzu, izlasiet Lgumu. Jums ir japstiprina Lgums, lai turpintu instalciju. +LicenseAccepted=Es &piekrtu lgumam +LicenseNotAccepted=Es &nepiekrtu lgumam + +; *** "Information" wizard pages +WizardInfoBefore=Informcija +InfoBeforeLabel=Ldzu, izlasiet o informciju. +InfoBeforeClickLabel=Kad esat gatavs turpint instalciju, spiediet "Tlk". +WizardInfoAfter=Informcija +InfoAfterLabel=Ldzu izlasiet sekojoo informciju. +InfoAfterClickLabel=Kad esat gatavs turpint instalciju, spiediet "Tlk". + +; *** "User Information" wizard page +WizardUserInfo=Lietotja informcija +UserInfoDesc=Ldzu, ievadiet savu informciju. +UserInfoName=&Lietotja vrds: +UserInfoOrg=&Organizcija: +UserInfoSerial=&Serilais numurs: +UserInfoNameRequired=Jums ir jievada savs vrds. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Izvlieties mapi, uz kuru tiks stti dati +SelectDirDesc=Kur [name] tiks instalts? +SelectDirLabel3=[name] datnes tiks instaltas nordtaj map. +SelectDirBrowseLabel=Lai turpintu, spiediet "Tlk". Ja vlaties nordt citu mapi, spiediet "Prlkot". +DiskSpaceMBLabel=Ir nepiecieami brvi [mb] MB uz ciet diska. +CannotInstallToNetworkDrive=Iestatana nevar instalt ar tkla disku. +CannotInstallToUNCPath=Iestatana nevar uzstdt uz UNC ceu. +InvalidPath=Jums ir jnorda pilna instalcijas adrese, piemrs:%n%nC:\APP%n%nvai UNC adrese:%n%n\\server\share +InvalidDrive=Ierce UNC, kuru Js izvljties, nepastv vai ar nav pieejama. Ldzu, izvlieties citu. +DiskSpaceWarningTitle=Nepietiek vietas uz diska +DiskSpaceWarning=Instalcijai ir nepiecieami vismaz %1 KB brvs vietas uz diska, bet pieejami ir tikai %2 KB.%n%nVai vlaties turpint? +DirNameTooLong=Mapes nosaukums vai adrese ir prk gara. +InvalidDirName=Mapes nosaukums nav dergs. +BadDirName32=Mapes nosaukum nedrkst bt di simboli:%n%n%1 +DirExistsTitle=Mape jau pastv +DirExists=Mape:%n%n%1%n%njau pastv. Vai vienalga vlaties turpint? +DirDoesntExistTitle=Mape nepastv +DirDoesntExist=Mape:%n%n%1%n%ndoes nepastv. Vai vlaties izveidot mapi? + +; *** "Select Components" wizard page +WizardSelectComponents=Izvlieties sastvdaas +SelectComponentsDesc=Kurus komponentus vlaties uzstdt? +SelectComponentsLabel2=Izvlieties komponentus, kurus vlaties uzstdt. Spiediet "Tlk", lai turpintu. +FullInstallation=Pilna Uzstdana +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompakta Uzstdana +CustomInstallation=Izveidot Uzstdanu +NoUninstallWarningTitle=Komponenti jau pastv +NoUninstallWarning=Uzstdana ir atkljusi ka di faili jau ir uzstdti:%n%n%1%n%nAtiestatiet os komponentus.%n%nVai vlaties turpint? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceMBLabel=Palaik izvltie komponenti aizem [mb] MB uz ciet diska. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Papilduzdevumu izvlne +SelectTasksDesc=Kurus papilduzdevumus vajadztu veikt? +SelectTasksLabel2=Izvlieties, kdi papilduzdevumi tiks veikti [name] Uzstdanas laik, tad spiediet "Tlk". + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Izvlieties Start Menu mapi +SelectStartMenuFolderDesc=Kur Uzstdanas programmai vajadztu likt sinjumikonas? +SelectStartMenuFolderLabel3=Uzstdana izveidos sinjumikonas Start Menu map. +SelectStartMenuFolderBrowseLabel=Lai turpintu, spiediet "Tlk". Ja vlaties nordt citu mapi, spiediet "Prlkot". +MustEnterGroupName=Jums ir jnorda mape. +GroupNameTooLong=Mapes nosaukums ir prk gar. +InvalidGroupName=Mape nav derga. +BadGroupName=Mapes nosaukums satur kdu no iem simboliem:%n%n%1 +NoProgramGroupCheck2=&Neizveidot Start Menu mapi + +; *** "Ready to Install" wizard page +WizardReady=Gatavs instalcijai +ReadyLabel1=Uzstdana ir gatava instalt [name] uz Jsu datora. +ReadyLabel2a=Spiediet "Uzstdt", lai sktu instalciju, vai spiediet Atpaka, lai izmaintu parametrus. +ReadyLabel2b=Spiediet "Uzstdt", lai sktu instalciju. +ReadyMemoUserInfo=Lietotja informcija: +ReadyMemoDir=Galamris: +ReadyMemoType=Uzstdanas tips: +ReadyMemoComponents=Izvltie komponenti: +ReadyMemoGroup=Start Menu mape: +ReadyMemoTasks=Papilduzdevumi: + +; *** "Preparing to Install" wizard page +WizardPreparing=Gatavoties instalcijai +PreparingDesc=Uzstdana ir gatava instalt [name] uz Jsu datora. +PreviousInstallNotCompleted=Instalcija/noemana iepriekjai programmai nav pabeigta. Jums ir jprstart dators, lai pabeigtu instalciju.%n%nPc prstartanas palaidiet uzstdanu no jauna, lai pabeigtu uzstdt [name]. +CannotContinue=Uzstdanu nevar turpint. Ldzu, spiediet "Atcelt", lai izietu. +ApplicationsFound=das lietojumprogrammas izmanto failus, kas ir jatjaunina ar Setup. Tas ir ieteicams, ka js aujat Setup automtiski aizvrt os pieteikumus. +ApplicationsFound2=das lietojumprogrammas izmanto failus, kas ir jatjaunina ar Setup. Tas ir ieteicams, ka js aujat Setup automtiski aizvrt os pieteikumus. Pc uzstdana ir pabeigta, Setup mins atskt pieteikumus. +CloseApplications=&Automtiski aizvrtu programmas +DontCloseApplications=&Nav aizvrtu programmas + +; *** "Installing" wizard page +WizardInstalling=Instalcija +InstallingLabel=Ldzu, uzgaidiet, kamr [name] tiks uzstdts uz Jsu datora. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Pabeigta [name] Uzstdana +FinishedLabelNoIcons=Uzstdana pabeigta. +FinishedLabel=Uzstdana pabeigta. Programmu var palaist, uzklikinot uz izveidotajm ikonm. +ClickFinish=Spiediet "Pabeigt", lai aizvrtu Uzstdanu. +FinishedRestartLabel=Lai pabeigtu [name] uzstdanu, nepiecieams prstartt Jsu datoru. Vai vlaties to dart tagad? +FinishedRestartMessage=Lai pabeigtu [name] uzstdanu, nepiecieams prstartt Jsu datoru.%n%nVai vlaties to dart tagad? +ShowReadmeCheck=J, vlos apskatt README failu +YesRadio=&J, prstartt datoru tagad +NoRadio=&N, datoru prstartu vlk +; used for example as 'Run MyProg.exe' +RunEntryExec=Run %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=View %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Uzstdanai ir nepiecieams nkamais disks +SelectDiskLabel2=Ldzu, ielieciet %1 disku un spiediet "Ok".%n%nJa datne ir atrodama uz paa diska kd cit map, nordiet ts atraans vietu vai spiediet "Prlkot", lai to nordtu. +PathLabel=&Ce: +FileNotInDir2=Datne "%1" neatrodas "%2". Ldzu, ielieciet pareizo disku vai nordiet pareizo mapi. +SelectDirectoryLabel=Ldzu, nordiet nkam diska atraans vietu. + +; *** Installation phase messages +SetupAborted=Uzstdana netika pabeigta.%n%nLdzu, izlabojiet kdu un palaidiet Uzstdanu no jauna. +EntryAbortRetryIgnore=Spiediet "Atkrtot", lai mintu vlreiz, vai "Ignort", lai turpintu, vai "Prtraukt", lai beigtu instalciju. + +; *** Installation status messages +StatusClosingApplications=Noslguma pieteikumi... +StatusCreateDirs=Mapju izveidoana... +StatusExtractFiles=Datu kopana... +StatusCreateIcons=sinjumikonu izveidoana... +StatusCreateIniEntries=Izveido INI ierakstu... +StatusCreateRegistryEntries=Izveido reistra ierakstus... +StatusRegisterFiles=Reistr datnes... +StatusSavingUninstall=Saglab atinstalanas datus... +StatusRunProgram=Pabeidz instalciju... +StatusRestartingApplications=Restartana pieteikumi... +StatusRollback=Izveido izmaias... + +; *** Misc. errors +ErrorInternal2=Iekja kda: %1 +ErrorFunctionFailedNoCode=%1 cieta neveiksmi +ErrorFunctionFailed=%1 cieta neveiksmi; kods %2 +ErrorFunctionFailedWithMessage=%1 cieta neveiksmi; kods %2.%n%3 +ErrorExecutingProgram=Neiespjami palaist failu:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Kda, atverot reistra atslgu:%n%1\%2 +ErrorRegCreateKey=Kda, izveidojot reistra atslgu:%n%1\%2 +ErrorRegWriteKey=Kda, rakstot reistra atslgu:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Kda, izveidojot INI ieraksta datni "%1". + +; *** File copying errors +FileAbortRetryIgnore=Spiediet "Atkrtot", lai mintu vlreiz, "Ignort", lai izlaistu datni (nav ieteicams), vai "Prtraukt", lai beigtu instalciju. +FileAbortRetryIgnore2=Spiediet "Atkrtot", lai mintu vlreiz, "Ignort", lai turpintu (nav ieteicams), vai "Prtraukt", lai beigtu instalciju. +SourceIsCorrupted=Datnes avots ir bojts +SourceDoesntExist=Datnes avots "%1" nepastv +ExistingFileReadOnly=Pastvo datne ir izveidota k read-only.%n%nSpiediet "Atkrtot", lai noemtu read-only pabu un mintu vlreiz, "Ignort", lai izlaistu datni, vai "Prtraukt", lai beigtu instalciju. +ErrorReadingExistingDest=Kda, nolasot pastvoo datni: +FileExists=Datne jau pastv.%n%nVai vlaties, lai Uzstdana to prraksta? +ExistingFileNewer=Pastvo datne ir jaunka par to, kuru nepiecieams uzstdt. Vlams atstt jau pastvoo datni.%n%nVai vlaties to paturt? +ErrorChangingAttr=Radusies kda, minot nomaint datnes pabu: +ErrorCreatingTemp=Radusies kda, izveidojot datni galamra map: +ErrorReadingSource=Radusies kda, nolasot datni: +ErrorCopying=Radusies kda, prkopjot datni: +ErrorReplacingExistingFile=Radusies kda, prrakstot jau pastvoo datni: +ErrorRestartReplace=Atkrtota aizstana cietusi neveiksmi: +ErrorRenamingTemp=Radusies kda, nomainot nosaukumu datnei galamra map: +ErrorRegisterServer=Neiespjami reistrt DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 neizdevs ar izejas kodu %1 +ErrorRegisterTypeLib=Neiespjami reistrt tipa bibliotku: %1 + +; *** Post-installation errors +ErrorOpeningReadme=Radusies kda, atverot README datni. +ErrorRestartingComputer=Uzstdana nevar prstartt datoru. Ldzu, izdariet to manuli. + +; *** Uninstaller messages +UninstallNotFound=Datne "%1" nepastv. Nevar atinstalt. +UninstallOpenError=Datni "%1" nevar atvrt. Nevar atinstalt +UninstallUnsupportedVer=Atinstalanas datne "%1" nav atpazstama ai atinstalanas programmai. Nevar atinstalt +UninstallUnknownEntry=Nezinms ieraksts (%1) izveidoja sadursmi ar atinstalciju +ConfirmUninstall=Vai esat prliecints, ka vlaties pilnb noemt %1 un visus t komponentus? +UninstallOnlyOnWin64=o instalciju var noemt tikai ar 64-bitu Windows. +OnlyAdminCanUninstall=Atinstalciju var veikt tikai lietotjs ar Adminstratora privilijm. +UninstallStatusLabel=Ldzu uzgaidiet, kamr %1 tiek noemts no Jsu datora. +UninstalledAll=%1 tika veiksmgi noemts no Jsu datora. +UninstalledMost=%1 atinstalcija pabeigta.%n%nDaus elementus nevarja noemt. Tos var noemt manuli. +UninstalledAndNeedsRestart=Lai pabeigtu atinstalciju %1, Jsu dators jprstart.%n%nVai vlaties to dart tagad? +UninstallDataCorrupted="%1" datne ir bojta. Nevar atinstalt + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Noemt kopgs datnes? +ConfirmDeleteSharedFile2=Sistma ir secinjusi, ka s koplietoanas datnes vairs netiks lietotas. Vai vlaties ts noemt?%n%nJa kda cita programma izmanto s datnes, tad programma var strdt nekorekti. Ja neesat dros, izvlieties "N". Atstjot s datnes, Jsu datoram netiks nodarti nekdi bojjumi. +SharedFileNameLabel=Faila nosaukums: +SharedFileLocationLabel=Atraans vieta: +WizardUninstalling=Atinstalanas Statuss +StatusUninstalling=Atinstal %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Instalana %1. +ShutdownBlockReasonUninstallingApp=Atinstal %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versija %2 +AdditionalIcons=Papildu ikonas: +CreateDesktopIcon=Izveidot &darbvisrmas ikonu +CreateQuickLaunchIcon=Izveidot &Quick Launch ikonu +ProgramOnTheWeb=%1 Internt +UninstallProgram=Atinstalt %1 +LaunchProgram=Palaist %1 +AssocFileExtension=&Apvienot %1 ar %2 faila paplainjumu +AssocingFileExtension=Apvienoana %1 ar %2 faila paplainjumu... +AutoStartProgramGroupDescription=starta: +AutoStartProgram=Automtiski skt %1 +AddonHostProgramNotFound=%1 nevar atrasties map js izvljties.%n%nVai vlaties turpint? diff --git a/Greenshot/releases/innosetup/Languages/NorwegianNynorsk.isl b/Greenshot/releases/innosetup/Languages/NorwegianNynorsk.isl new file mode 100644 index 000000000..325c5a2b8 --- /dev/null +++ b/Greenshot/releases/innosetup/Languages/NorwegianNynorsk.isl @@ -0,0 +1,301 @@ +; *** Inno Setup version 4.0.5+ Norsk, nynorsk messages *** +; +; Translated by/omsett av: Magnar Myrtveit +; +; To download user-contributed translations of this file, go to: +; http://www.jrsoftware.org/is3rdparty.php +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; $jrsoftware: issrc/Files/Default.isl,v 1.32 2003/06/18 19:24:07 jr Exp $ + +[LangOptions] +LanguageName=Norsk, nynorsk +LanguageID=$0409 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName=MS Shell Dlg +;DialogFontSize=8 +;DialogFontStandardHeight=13 +;TitleFontName=Arial +;TitleFontSize=29 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +DialogFontName=MS Shell Dlg +DialogFontSize=8 +DialogFontStandardHeight=13 +TitleFontName=Arial +TitleFontSize=29 +WelcomeFontName=Verdana +WelcomeFontSize=12 +CopyrightFontName=Arial +CopyrightFontSize=8 +[Messages] + +; *** Application titles +SetupAppTitle=Installasjon +SetupWindowTitle=Installering - %1 +UninstallAppTitle=Avinstallasjon +UninstallAppFullTitle=Avinstallering - %1 + +; *** Misc. common +InformationTitle=Informasjon +ConfirmTitle=Godta +ErrorTitle=Feil + +; *** SetupLdr messages +SetupLdrStartupMessage=Dette vil installera %1. Vil du halda fram? +LdrCannotCreateTemp=Kan ikkje laga midlertidig fil. Installasjonen er avbroten +LdrCannotExecTemp=Kan ikkje kyra fila i den midlertidige katalogen. Installasjonen er avbroten + +; *** Startup error messages +LastErrorMessage=%1.%n%nFeil %2: %3 +SetupFileMissing=Fila %1 finst ikkje i installasjonskatalogen. Ver venleg og fiks problemet eller f tak i ein ny kopi av programmet. +SetupFileCorrupt=Installasjonsfila er ydelagt. Ver venleg og f tak i ein ny kopi av programmet. +SetupFileCorruptOrWrongVer=Installasjonsfilane er ydelagde, eller ikkje kompatible med dette installasjonsprogrammet.Ver venleg og fiks problemet eller f tak i ein ny kopi av programmet. +NotOnThisPlatform=Dette programmet kyrer ikkje p %1. +OnlyOnThisPlatform=Dette programmet kyrer berre p %1. +WinVersionTooLowError=Dette programmet krev %1 versjon %2 eller nyare. +WinVersionTooHighError=Dette programmet kan ikkje bli installert p %1 versjon %2 eller nyare. +AdminPrivilegesRequired=Du m vera logga inn som administrator nr du installerer dette programmet. +PowerUserPrivilegesRequired=Du m vera logga inn som administrator eller ha administrator-rettar nr du installerer dette programmet. +SetupAppRunningError=Installasjonen har oppdaga at %1 kyrer.%n%nVer venleg og lukk det no, og trykk OK for halda fram, eller Avbryt for avslutta. +UninstallAppRunningError=Avinstallasjonen har oppdaga at %1 kyrer.%n%nVer venleg og lukk det no, og trykk OK for halda fram, eller Avbryt for avslutta. + +; *** Misc. errors +ErrorCreatingDir=Installasjonsprogrammet kunne ikkje laga katalogen "%1" +ErrorTooManyFilesInDir=Kunne ikkje laga ei fil i mappa "%1" fordi den inneheld for mange filar + +; *** Setup common messages +ExitSetupTitle=Avslutt installasjonen +ExitSetupMessage=Installasjonen er ikkje ferdig. Viss du avsluttar no, vil ikkje programmet bli installert.%n%nDu kan kyra installasjonen p nytt seinare for fullfra installsajonen.%n%nVil du avslutta installasjonen? +AboutSetupMenuItem=&Om installasjonsprogrammet... +AboutSetupTitle=Om installasjonsprogrammet +AboutSetupMessage=%1 versjon %2%n%3%n%n%1 heimeside:%n%4 +AboutSetupNote= + +; *** Buttons +ButtonBack=< &Tilbake +ButtonNext=&Neste > +ButtonInstall=&Installer +ButtonOK=OK +ButtonCancel=Avbryt +ButtonYes=&Ja +ButtonYesToAll=Ja til &alle +ButtonNo=&Nei +ButtonNoToAll=N&ei til alle +ButtonFinish=&Ferdig +ButtonBrowse=&Bla gjennom... + +; *** "Select Language" dialog messages +SelectLanguageTitle=Vel installasjonssprk +SelectLanguageLabel=Vel sprket som skal brukast under installasjonen: + +; *** Common wizard text +ClickNext=Trykk Neste for halda fram, eller Avbryt for avslutta installasjonen. +BeveledLabel= + +; *** "Welcome" wizard page +WelcomeLabel1=Velkomen til installasjonen av [name] +WelcomeLabel2=Dette vil installera [name/ver] p di datamaskin.%n%nDet er anbefalt at du lukkar alle andre program fr du fortset. + +; *** "Password" wizard page +WizardPassword=Passord +PasswordLabel1=Denne installasjonen er passordbeskytta. +PasswordLabel3=Ver venleg og skriv inn passordet, og trykk Neste for halda fram. Store og sm bokstavar blir behandla ulikt. +PasswordEditLabel=&Passord: +IncorrectPassword=Passordet du skreiv inn er feil. Ver venleg og prv igjen. + +; *** "License Agreement" wizard page +WizardLicense=Lisensvilkr +LicenseLabel=Ver venleg og les den fylgjande viktige informasjonen fr du fortset. +LicenseLabel3=Ver venleg og les dei fylgjande lisensvilkra. Du m godta innehaldet i denne avtalen fr du fortset installasjonen. +LicenseAccepted=Eg &godtar avtalen +LicenseNotAccepted=Eg godtar &ikkje avtalen + +; *** "Information" wizard pages +WizardInfoBefore=Informasjon +InfoBeforeLabel=Ver venleg og les den fylgjande viktige informasjonen fr du fortset. +InfoBeforeClickLabel=Nr du er klar til halda fram med installasjonen, trykk Neste. +WizardInfoAfter=Informasjon +InfoAfterLabel=Ver venleg og les den fylgjande viktige informasjonen fr du fortset. +InfoAfterClickLabel=Nr du er klar til fullfra installasjonen, trykk Neste. + +; *** "User Information" wizard page +WizardUserInfo=Brukarinformasjon +UserInfoDesc=Ver venleg og skriv inn din informasjon. +UserInfoName=&Brukarnamn: +UserInfoOrg=&Organisasjon: +UserInfoSerial=&Serienummer: +UserInfoNameRequired=Du m skriva inn eit namn. + +; *** "Select Destination Directory" wizard page +WizardSelectDir=Vel mlmappe +SelectDirDesc=Kvar skal [name] bli installert? +SelectDirLabel=Vel mappa der du vil at [name] skal bli installert, og trykk Neste. +DiskSpaceMBLabel=Programmet krev minst [mb] MB diskplass. +ToUNCPathname=Kan ikkje installera til ei UNC-bane. Viss du prver installera i eit nettverk, m du skriva inn nettverksmlstasjonen. +InvalidPath=Du m skriva inn ei full bane med stasjonsbokstav; for eksempel:%n%nC:\APP%n%neller ei UNC-bane som:%n%n\\server\share +InvalidDrive=Den valte stasjonen eller UNC-delinga finst ikkje, eller er ikkje tilgjengeleg. Ver venleg og vel ein annan. +DiskSpaceWarningTitle=Ikkje nok diskplass +DiskSpaceWarning=Installasjonsprogrammet krev minst %1 KB ledig plass for installera, men den valte stasjonen har berre %2 KB ledig.%n%nVil du halda fram likevel? +BadDirName32=Katalognamn kan ikkje innehalda nokon av dei fylgjande teikna:%n%n%1 +DirExistsTitle=Katalogen finst +DirExists=Katalogen:%n%n%1%n%nfinst allereie. Vil du installera til denne katalogen likevel? +DirDoesntExistTitle=Katalogen finst ikkje +DirDoesntExist=Katalogen:%n%n%1%n%nfinst ikkje. Vil du at katalogen skal bli laga? + +; *** "Select Components" wizard page +WizardSelectComponents=Vel komponentar +SelectComponentsDesc=Kva komponentar skal installerast? +SelectComponentsLabel2=Vel dei komponentane du vil installera; vel vekk dei komponentane du ikkje vil installera. Trykk Neste nr du er klar til halda fram. +FullInstallation=Full installasjon +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompakt installasjon +CustomInstallation=Eigendefinert installasjon +NoUninstallWarningTitle=Komponentane finst +NoUninstallWarning=Installasjonen har oppdaga at desse komponentane allereie er installerte p datamaskina:%n%n%1%n%nDesse komponentane blir ikkje avinstallerte sjlv om du vel dei vekk.%n%nVil du halda fram likevel? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceMBLabel=Valte alternativ krev minst [mb] MB ledig diskplass. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Vel tilleggsoppgver +SelectTasksDesc=Kva tilleggsoppgver skal utfrast? +SelectTasksLabel2=Vel dei tilleggsoppgvene som skal utfrast mens [name] blir installert, trykk deretter Neste. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Vel mappe i Start-menyen +SelectStartMenuFolderDesc=Kvar skal snarvegane plasserast? +SelectStartMenuFolderLabel=Vel mappa i Start-menyen der du vil at snarvegane skal bli plasserte. Trykk deretter Neste. +NoIconsCheck=&Ikkje lag ikon +MustEnterGroupName=Du m skriva inn eit katalognamn. +BadGroupName=Katalognamn kan ikkje innehalda nokon av dei fylgjande teikna:%n%n%1 +NoProgramGroupCheck2=&Ikkje lag mappe i Start-menyen + +; *** "Ready to Install" wizard page +WizardReady=Klar til installera +ReadyLabel1=Installasjonsprogrammet er no klart til starta installasjonen av [name] p di datamaskin. +ReadyLabel2a=Trykk Installer for halda fram med installasjonen, eller trykk Tilbake viss du vil sj p eller endra instillingane. +ReadyLabel2b=Trykk Installer for halda fram med installasjonen. +ReadyMemoUserInfo=Brukarinformasjon: +ReadyMemoDir=Mlmappe: +ReadyMemoType=Installasjonstype: +ReadyMemoComponents=Valte komponentar: +ReadyMemoGroup=Mappe i Start-menyen: +ReadyMemoTasks=Tilleggsoppgver: + +; *** "Preparing to Install" wizard page +WizardPreparing=Frebur installasjonen +PreparingDesc=Installasjonsprogrammet frebur installasjonen av [name] p di datamaskin. +PreviousInstallNotCompleted=Installasjonen/fjerninga av eit tidlegare program blei ikkje fullfrt. Du m starta maskina p nytt for fullfra den installasjonen.%n%nEtter omstarten m du kyra installasjonsprogrammet p nytt for fullfra installasjonen av [name]. +CannotContinue=Installasjonsprogrammet kan ikkje halda fram. Ver venleg og trykk Avbryt for avslutta. + +; *** "Installing" wizard page +WizardInstalling=Installerer +InstallingLabel=Ver venleg og vent mens [name] blir installert p di datamaskin. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Fullfrer installasjonsvegvisaren for [name] +FinishedLabelNoIcons=Installasjonen av [name] er fullfrt. +FinishedLabel=Installasjonen av [name] er fullfrt. Du kan starta programmet ved trykka p eit av dei installerte ikona. +ClickFinish=Trykk Ferdig for avslutta installasjonen. +FinishedRestartLabel=For fullfra installasjonen av [name], m maskina bli starta p nytt. Vil du starta p nytt no? +FinishedRestartMessage=For fullfra installasjonen av [name], m maskina bli starta p nytt.%n%nVil du starta p nytt no? +ShowReadmeCheck=Ja, eg vil sj LESMEG-fila +YesRadio=&Ja, start maskina p nytt no +NoRadio=&Nei, eg vil starta p nytt seinare +; used for example as 'Run MyProg.exe' +RunEntryExec=Kyr %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Vis %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Installasjonen treng den neste disketten +SelectDirectory=Vel katalog +SelectDiskLabel2=Ver venleg og set inn diskett %1 og trykk OK.%n%nViss filane finst i ein annan katalog enn den vist nedom, skriv inn riktig bane eller trykk Bla gjennom... +PathLabel=&Bane: +FileNotInDir2=Finn ikkje fila "%1" i "%2". Ver venleg og set inn riktig diskett eller vel ein annan katalog. +SelectDirectoryLabel=Ver venleg og skriv inn plasseringa til den neste disketten. + +; *** Installation phase messages +SetupAborted=Installasjonen blei ikkje fullfrt.%n%nVer venleg og fiks problemet og kyr installasjonen p nytt. +EntryAbortRetryIgnore=Tykkk Prv p nytt for prva p nytt, Ignorr for halda fram, eller Avbryt for avslutta installasjonen. + +; *** Installation status messages +StatusCreateDirs=Oppretter katalogar... +StatusExtractFiles=Pakkar ut filar... +StatusCreateIcons=Oppretter program-ikon... +StatusCreateIniEntries=Oppretter INI-instillingar... +StatusCreateRegistryEntries=Opprettter register-instillingar... +StatusRegisterFiles=Registrerer filar... +StatusSavingUninstall=Lagrar avinstallasjonsinformasjon... +StatusRunProgram=Fullfrer installasjonen... +StatusRollback=Tilbakestiller endringar... + +; *** Misc. errors +ErrorInternal2=Intern feil: %1 +ErrorFunctionFailedNoCode=%1 gjekk gale +ErrorFunctionFailed=%1 gjekk gale; kode %2 +ErrorFunctionFailedWithMessage=%1 gjekk gale; kode %2.%n%3 +ErrorExecutingProgram=Kunne ikkje kyre fila:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Feil under opning av registernkkel:%n%1\%2 +ErrorRegCreateKey=Feil under oppretting av registernkkel:%n%1\%2 +ErrorRegWriteKey=Feil under skriving til registernkkel:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Feil under oppretting av innstillingar i fila "%1". + +; *** File copying errors +FileAbortRetryIgnore=Trykk Prv p nytt for prva p nytt, Ignorr for hoppa over denne fila (ikkje anbefalt), eller Avbryt for avslutta installasjonen. +FileAbortRetryIgnore2=Trykk Prv p nytt for prva p nytt, Ignorr for halda fram (ikkje anbefalt), eller Avbryt for avslutta installasjonen. +SourceIsCorrupted=Kjeldefila er ydelagt +SourceDoesntExist=Kjeldefila "%1" finst ikkje +ExistingFileReadOnly=Den eksisterande fila er skrivebeskytta.%n%nTrykk Prv p nytt for fjerna skrivebeskyttinga og prva p nytt, Ignorr for hoppa over denne fila, eller Avbryt for avslutta installasjonen. +ErrorReadingExistingDest=Ein feil oppstod under lesing av den eksisterande fila: +FileExists=Fila finst allereie.%n%nVil du at installasjonsprogrammet skal skriva over den? +ExistingFileNewer=Den eksisterande fila er nyare enn den installasjonen prver installera. Det er anbefalt at du beheld den eksisterande fila.%n%nVil du behalda den eksisterande fila? +ErrorChangingAttr=Ein feil oppstod under forsk p endra attributtar i den eksisterande fila: +ErrorCreatingTemp=Ein feil oppstod under forsk p oppretta ei fil i mlmappa: +ErrorReadingSource=Ein feil oppstod under forsk p lesa kjeldefila: +ErrorCopying=Ein feil oppstod under forsk p kopiera fila: +ErrorReplacingExistingFile=Ein feil oppstod under forsk p erstatta den eksisterande fila: +ErrorRestartReplace=RestartReplace gjekk gale: +ErrorRenamingTemp=Ein feil oppstod under forsk p gje nytt namnt til ei fil i mlmappa: +ErrorRegisterServer=Kunne ikkje registrera DLL/OCX: %1 +ErrorRegisterServerMissingExport=DllRegisterServer-eksportering blei ikkje funne +ErrorRegisterTypeLib=Kunne ikkje registrera typebiblioteket: %1 + +; *** Post-installation errors +ErrorOpeningReadme=Ein feil oppstod under forsk p opna LESMEG-fila. +ErrorRestartingComputer=Installasjonsprogrammet kunne ikkje starta maskina p nytt. Ver venleg og gjer dette manuelt. + +; *** Uninstaller messages +UninstallNotFound=Kan ikkje avinstallera. Fila "%1" finst ikkje. +UninstallOpenError=Kan ikkje avinstallera. Fila "%1" kunne ikkje opnast. +UninstallUnsupportedVer=Kan ikkje avinstallera. Avinstallasjonsloggfila "%1" er i eit format som denne versjonen av avinstallasjonsprogrammet ikkje forstr +UninstallUnknownEntry=Ein ukjend parameter (%1) blei funne i avinstallasjonsloggen +ConfirmUninstall=Er du sikker p at du vil fjerna %1 og alle tilhyrande komponentar? +OnlyAdminCanUninstall=Denne installasjonen kan berre avinstallerast av ein brukar med administrator-rettar. +UninstallStatusLabel=Ver venleg og vent mens %1 blir fjerna fr di datamaskin. +UninstalledAll=Fjerninga av %1 var vellukka. +UninstalledMost=Avinstalleringa av %1 er fullfrt.%n%nNokre element kunne ikkje bli sletta. Desse kan slettast manuelt. +UninstalledAndNeedsRestart=For fullfra avinstallasjonen av %1, m datamaskina startast p nytt.%n%nVil du starta p nytt no? +UninstallDataCorrupted=Kan ikkje avinstallera. "%1"-fila er ydelagd. + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Fjerna delt fil? +ConfirmDeleteSharedFile2=Systemet indikerer at den fylgjande delte fila ikkje blir brukt av nokon program. Vil du at avinstallasjonsprogrammet skal fjerna denne delte fila?%n%nViss nokre program framleis brukar denne fila, og den blir fjerna, kan du risikere at dei ikkje verkar som dei skal. Viss du er usikker, vel Nei. la denne fila vera p systemet vil ikkje gjera nokon skade. +SharedFileNameLabel=Filnamn: +SharedFileLocationLabel=Plassering: +WizardUninstalling=Avinstallasjons-status +StatusUninstalling=Avinstallerer %1... + diff --git a/Greenshot/releases/innosetup/Languages/Spanish.isl b/Greenshot/releases/innosetup/Languages/Spanish.isl new file mode 100644 index 000000000..60da7c270 --- /dev/null +++ b/Greenshot/releases/innosetup/Languages/Spanish.isl @@ -0,0 +1,335 @@ +; *** Inno Setup version 5.5.3+ Spanish messages *** +; +; Maintained by Jorge Andres Brugger (jbrugger@ideaworks.com.ar) +; Spanish.isl version 1.2 (20121214) +; Default.isl version 5.5.3 +; +; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, +; Ramn Verduzco, Graciela Garca, Carles Millan and Rafael Barranco-Droege + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Espa<00F1>ol +LanguageID=$0c0a +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Instalar +SetupWindowTitle=Instalar - %1 +UninstallAppTitle=Desinstalar +UninstallAppFullTitle=Desinstalar - %1 + +; *** Misc. common +InformationTitle=Informacin +ConfirmTitle=Confirmar +ErrorTitle=Error + +; *** SetupLdr messages +SetupLdrStartupMessage=Este programa instalar %1. Desea continuar? +LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida +LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida + +; *** Startup error messages +LastErrorMessage=%1.%n%nError %2: %3 +SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. +SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa. +SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. +InvalidParameter=Se ha utilizado un parmetro no vlido en la lnea de comandos:%n%n%1 +SetupAlreadyRunning=El programa de instalacin an est ejecutndose. +WindowsVersionNotSupported=Este programa no es compatible con la versin de Windows de su equipo. +WindowsServicePackRequired=Este programa requiere %1 Service Pack %2 o posterior. +NotOnThisPlatform=Este programa no se ejecutar en %1. +OnlyOnThisPlatform=Este programa debe ejecutarse en %1. +OnlyOnTheseArchitectures=Este programa slo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1 +MissingWOW64APIs=La versin de Windows que est utilizando no cuenta con la funcionalidad requerida por el instalador para realizar una instalacin de 64 bits. Para solucionar este problema, por favor, instale el Service Pack %1. +WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior. +WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior. +AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa. +PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como miembro del grupo de Usuarios Avanzados para instalar este programa. +SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. +UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. + +; *** Misc. errors +ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1" +ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos + +; *** Setup common messages +ExitSetupTitle=Salir de la Instalacin +ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no se instalar;.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin? +AboutSetupMenuItem=&Acerca de Instalar... +AboutSetupTitle=Acerca de Instalar +AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4 +AboutSetupNote= +TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net) + +; *** Buttons +ButtonBack=< &Atrs +ButtonNext=&Siguiente > +ButtonInstall=&Instalar +ButtonOK=Aceptar +ButtonCancel=Cancelar +ButtonYes=&S +ButtonYesToAll=S a &Todo +ButtonNo=&No +ButtonNoToAll=N&o a Todo +ButtonFinish=&Finalizar +ButtonBrowse=&Examinar... +ButtonWizardBrowse=&Examinar... +ButtonNewFolder=&Crear Nueva Carpeta + +; *** "Select Language" dialog messages +SelectLanguageTitle=Seleccione el Idioma de la Instalacin +SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin: + +; *** Common wizard text +ClickNext=Haga clic en Siguiente para continuar o en Cancelar para salir de la instalacin. +BeveledLabel= +BrowseDialogTitle=Buscar Carpeta +BrowseDialogLabel=Seleccione una carpeta y luego haga clic en Aceptar. +NewFolderName=Nueva Carpeta + +; *** "Welcome" wizard page +WelcomeLabel1=Bienvenido al asistente de instalacin de [name] +WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda cerrar todas las dems aplicaciones antes de continuar. + +; *** "Password" wizard page +WizardPassword=Contrasea +PasswordLabel1=Esta instalacin est protegida por contrasea. +PasswordLabel3=Por favor, introduzca la contrasea y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas. +PasswordEditLabel=&Contrasea: +IncorrectPassword=La contrasea introducida no es correcta. Por favor, intntelo nuevamente. + +; *** "License Agreement" wizard page +WizardLicense=Acuerdo de Licencia +LicenseLabel=Es importante que lea la siguiente informacin antes de continuar. +LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar las clusulas de este acuerdo antes de continuar con la instalacin. +LicenseAccepted=A&cepto el acuerdo +LicenseNotAccepted=&No acepto el acuerdo + +; *** "Information" wizard pages +WizardInfoBefore=Informacin +InfoBeforeLabel=Es importante que lea la siguiente informacin antes de continuar. +InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente. +WizardInfoAfter=Informacin +InfoAfterLabel=Es importante que lea la siguiente informacin antes de continuar. +InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente. + +; *** "User Information" wizard page +WizardUserInfo=Informacin de Usuario +UserInfoDesc=Por favor, introduzca sus datos. +UserInfoName=Nombre de &Usuario: +UserInfoOrg=&Organizacin: +UserInfoSerial=Nmero de &Serie: +UserInfoNameRequired=Debe introducir un nombre. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Seleccione la Carpeta de Destino +SelectDirDesc=Dnde debe instalarse [name]? +SelectDirLabel3=El programa instalar [name] en la siguiente carpeta. +SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar. +DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco. +CannotInstallToNetworkDrive=El programa de instalacin no puede realizar la instalacin en una unidad de red. +CannotInstallToUNCPath=El programa de instalacin no puede realizar la instalacin en una ruta de acceso UNC. +InvalidPath=Debe introducir una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido +InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra. +DiskSpaceWarningTitle=Espacio Insuficiente en Disco +DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada slo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas? +DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. +InvalidDirName=El nombre de la carpeta no es vlido. +BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1 +DirExistsTitle=La Carpeta Ya Existe +DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas? +DirDoesntExistTitle=La Carpeta No Existe +DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta? + +; *** "Select Components" wizard page +WizardSelectComponents=Seleccione los Componentes +SelectComponentsDesc=Qu componentes deben instalarse? +SelectComponentsLabel2=Seleccione los componentes que desea instalar y desmarque los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar. +FullInstallation=Instalacin Completa +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Instalacin Compacta +CustomInstallation=Instalacin Personalizada +NoUninstallWarningTitle=Componentes Encontrados +NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nDesmarcar estos componentes no los desinstalar.%n%nDesea continuar de todos modos? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Seleccione las Tareas Adicionales +SelectTasksDesc=Qu tareas adicionales deben realizarse? +SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio +SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa? +SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio. +SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar. +MustEnterGroupName=Debe proporcionar un nombre de carpeta. +GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. +InvalidGroupName=El nombre de la carpeta no es vlido. +BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1 +NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio + +; *** "Ready to Install" wizard page +WizardReady=Listo para Instalar +ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema. +ReadyLabel2a=Haga clic en Instalar para continuar con el proceso o haga clic en Atrs si desea revisar o cambiar alguna configuracin. +ReadyLabel2b=Haga clic en Instalar para continuar con el proceso. +ReadyMemoUserInfo=Informacin del usuario: +ReadyMemoDir=Carpeta de Destino: +ReadyMemoType=Tipo de Instalacin: +ReadyMemoComponents=Componentes Seleccionados: +ReadyMemoGroup=Carpeta del Men Inicio: +ReadyMemoTasks=Tareas Adicionales: + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparndose para Instalar +PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema. +PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name]. +CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir. +ApplicationsFound=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. +ApplicationsFound2=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. Al completarse la instalacin, el programa de instalacin intentar reiniciar las aplicaciones. +CloseApplications=&Cerrar automticamente las aplicaciones +DontCloseApplications=&No cerrar las aplicaciones +ErrorCloseApplications=El programa de instalacin no pudo cerrar de forma automtica todas las aplicaciones. Se recomienda que, antes de continuar, cierre todas las aplicaciones que utilicen archivos que necesitan ser actualizados por el programa de instalacin. + +; *** "Installing" wizard page +WizardInstalling=Instalando +InstallingLabel=Por favor, espere mientras se instala [name] en su sistema. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Completando la instalacin de [name] +FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema. +FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin haciendo clic sobre el icono instalado. +ClickFinish=Haga clic en Finalizar para salir del programa de instalacin. +FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora? +FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? +ShowReadmeCheck=S, deseo ver el archivo LAME +YesRadio=&S, deseo reiniciar el sistema ahora +NoRadio=&No, reiniciar el sistema ms tarde +; used for example as 'Run MyProg.exe' +RunEntryExec=Ejecutar %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Ver %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco +SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar. +PathLabel=&Ruta: +FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta. +SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco. + +; *** Installation phase messages +SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin. +EntryAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas o en Anular para cancelar la instalacin. + +; *** Installation status messages +StatusClosingApplications=Cerrando aplicaciones... +StatusCreateDirs=Creando carpetas... +StatusExtractFiles=Extrayendo archivos... +StatusCreateIcons=Creando accesos directos... +StatusCreateIniEntries=Creando entradas INI... +StatusCreateRegistryEntries=Creando entradas de registro... +StatusRegisterFiles=Registrando archivos... +StatusSavingUninstall=Guardando informacin para desinstalar... +StatusRunProgram=Terminando la instalacin... +StatusRestartingApplications=Reiniciando aplicaciones... +StatusRollback=Deshaciendo cambios... + +; *** Misc. errors +ErrorInternal2=Error interno: %1 +ErrorFunctionFailedNoCode=%1 fall +ErrorFunctionFailed=%1 fall; cdigo %2 +ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3 +ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2 +ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2 +ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Error al crear entrada INI en el archivo "%1". + +; *** File copying errors +FileAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para excluir este archivo (no recomendado) o en Anular para cancelar la instalacin. +FileAbortRetryIgnore2=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas (no recomendado) o en Anular para cancelar la instalacin. +SourceIsCorrupted=El archivo de origen est daado +SourceDoesntExist=El archivo de origen "%1" no existe +ExistingFileReadOnly=El archivo existente est marcado como slo-lectura.%n%nHaga clic en Reintentar para quitar el atributo de slo-lectura e intentarlo de nuevo, en Omitir para excluir este archivo o en Anular para cancelar la instalacin. +ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo: +FileExists=El archivo ya existe.%n%nDesea sobreescribirlo? +ExistingFileNewer=El archivo existente es ms reciente que el que est tratando de instalar. Se recomienda que mantenga el archivo existente.%n%nDesea mantener el archivo existente? +ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo: +ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino: +ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen: +ErrorCopying=Ocurri un error al intentar copiar el archivo: +ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente: +ErrorRestartReplace=Fall reintento de reemplazar: +ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino: +ErrorRegisterServer=Imposible registrar el DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1 +ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1 + +; *** Post-installation errors +ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME. +ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente. + +; *** Uninstaller messages +UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar. +UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar +UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar +UninstallUnknownEntry=Se encontr una entrada desconocida (%1) en el registro de desinstalacin +ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes? +UninstallOnlyOnWin64=Este programa slo puede ser desinstalado en Windows de 64-bits. +OnlyAdminCanUninstall=Este programa slo puede ser desinstalado por un usuario con privilegios administrativos. +UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema. +UninstalledAll=%1 se desinstal satisfactoriamente de su sistema. +UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse, pero podr eliminarlos manualmente si lo desea. +UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? +UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido? +ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es utilizado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi elimina el archivo y hay programas que lo utilizan, esos programas podran dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao. +SharedFileNameLabel=Archivo: +SharedFileLocationLabel=Ubicacin: +WizardUninstalling=Estado de la Desinstalacin +StatusUninstalling=Desinstalando %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Instalando %1. +ShutdownBlockReasonUninstallingApp=Desinstalando %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versin %2 +AdditionalIcons=Iconos adicionales: +CreateDesktopIcon=Crear un icono en el &escritorio +CreateQuickLaunchIcon=Crear un icono de &Inicio Rpido +ProgramOnTheWeb=%1 en la Web +UninstallProgram=Desinstalar %1 +LaunchProgram=Ejecutar %1 +AssocFileExtension=&Asociar %1 con la extensin de archivo %2 +AssocingFileExtension=Asociando %1 con la extensin de archivo %2... +AutoStartProgramGroupDescription=Inicio: +AutoStartProgram=Iniciar automticamente %1 +AddonHostProgramNotFound=%1 no pudo ser localizado en la carpeta seleccionada.%n%nDesea continuar de todas formas? diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 94f2d626e..9632c3f93 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -177,16 +177,16 @@ Name: {group}\Readme.txt; Filename: {app}\readme.txt; WorkingDir: {app} Name: {group}\License.txt; Filename: {app}\license.txt; WorkingDir: {app} [Languages] Name: en; MessagesFile: compiler:Default.isl -Name: cn; MessagesFile: compiler:Languages\ChineseSimplified.isl +Name: cn; MessagesFile: Languages\ChineseSimplified.isl Name: de; MessagesFile: compiler:Languages\German.isl Name: es; MessagesFile: compiler:Languages\Spanish.isl Name: fi; MessagesFile: compiler:Languages\Finnish.isl Name: fr; MessagesFile: compiler:Languages\French.isl Name: nl; MessagesFile: compiler:Languages\Dutch.isl -Name: lt; MessagesFile: compiler:Languages\Latvian.isl -Name: nn; MessagesFile: compiler:Languages\NorwegianNynorsk.isl +Name: lt; MessagesFile: Languages\Latvian.isl +Name: nn; MessagesFile: Languages\NorwegianNynorsk.isl Name: sr; MessagesFile: compiler:Languages\SerbianCyrillic.isl -Name: sv; MessagesFile: compiler:Languages\Swedish.isl +Name: sv; MessagesFile: Languages\Swedish.isl Name: uk; MessagesFile: compiler:Languages\Ukrainian.isl [Tasks] From 7670bfc9e50d0298abe9e22a3437edacac3dd537 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 1 Jun 2016 07:09:47 +0200 Subject: [PATCH 054/170] Added wrong language file, it was late... trying again. --- .../releases/innosetup/Languages/Spanish.isl | 335 ----------------- .../releases/innosetup/Languages/Swedish.isl | 339 ++++++++++++++++++ 2 files changed, 339 insertions(+), 335 deletions(-) delete mode 100644 Greenshot/releases/innosetup/Languages/Spanish.isl create mode 100644 Greenshot/releases/innosetup/Languages/Swedish.isl diff --git a/Greenshot/releases/innosetup/Languages/Spanish.isl b/Greenshot/releases/innosetup/Languages/Spanish.isl deleted file mode 100644 index 60da7c270..000000000 --- a/Greenshot/releases/innosetup/Languages/Spanish.isl +++ /dev/null @@ -1,335 +0,0 @@ -; *** Inno Setup version 5.5.3+ Spanish messages *** -; -; Maintained by Jorge Andres Brugger (jbrugger@ideaworks.com.ar) -; Spanish.isl version 1.2 (20121214) -; Default.isl version 5.5.3 -; -; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, -; Ramn Verduzco, Graciela Garca, Carles Millan and Rafael Barranco-Droege - -[LangOptions] -; The following three entries are very important. Be sure to read and -; understand the '[LangOptions] section' topic in the help file. -LanguageName=Espa<00F1>ol -LanguageID=$0c0a -LanguageCodePage=1252 -; If the language you are translating to requires special font faces or -; sizes, uncomment any of the following entries and change them accordingly. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 - -[Messages] - -; *** Application titles -SetupAppTitle=Instalar -SetupWindowTitle=Instalar - %1 -UninstallAppTitle=Desinstalar -UninstallAppFullTitle=Desinstalar - %1 - -; *** Misc. common -InformationTitle=Informacin -ConfirmTitle=Confirmar -ErrorTitle=Error - -; *** SetupLdr messages -SetupLdrStartupMessage=Este programa instalar %1. Desea continuar? -LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida -LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida - -; *** Startup error messages -LastErrorMessage=%1.%n%nError %2: %3 -SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. -SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa. -SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. -InvalidParameter=Se ha utilizado un parmetro no vlido en la lnea de comandos:%n%n%1 -SetupAlreadyRunning=El programa de instalacin an est ejecutndose. -WindowsVersionNotSupported=Este programa no es compatible con la versin de Windows de su equipo. -WindowsServicePackRequired=Este programa requiere %1 Service Pack %2 o posterior. -NotOnThisPlatform=Este programa no se ejecutar en %1. -OnlyOnThisPlatform=Este programa debe ejecutarse en %1. -OnlyOnTheseArchitectures=Este programa slo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1 -MissingWOW64APIs=La versin de Windows que est utilizando no cuenta con la funcionalidad requerida por el instalador para realizar una instalacin de 64 bits. Para solucionar este problema, por favor, instale el Service Pack %1. -WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior. -WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior. -AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa. -PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como miembro del grupo de Usuarios Avanzados para instalar este programa. -SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. -UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. - -; *** Misc. errors -ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1" -ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos - -; *** Setup common messages -ExitSetupTitle=Salir de la Instalacin -ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no se instalar;.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin? -AboutSetupMenuItem=&Acerca de Instalar... -AboutSetupTitle=Acerca de Instalar -AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4 -AboutSetupNote= -TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net) - -; *** Buttons -ButtonBack=< &Atrs -ButtonNext=&Siguiente > -ButtonInstall=&Instalar -ButtonOK=Aceptar -ButtonCancel=Cancelar -ButtonYes=&S -ButtonYesToAll=S a &Todo -ButtonNo=&No -ButtonNoToAll=N&o a Todo -ButtonFinish=&Finalizar -ButtonBrowse=&Examinar... -ButtonWizardBrowse=&Examinar... -ButtonNewFolder=&Crear Nueva Carpeta - -; *** "Select Language" dialog messages -SelectLanguageTitle=Seleccione el Idioma de la Instalacin -SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin: - -; *** Common wizard text -ClickNext=Haga clic en Siguiente para continuar o en Cancelar para salir de la instalacin. -BeveledLabel= -BrowseDialogTitle=Buscar Carpeta -BrowseDialogLabel=Seleccione una carpeta y luego haga clic en Aceptar. -NewFolderName=Nueva Carpeta - -; *** "Welcome" wizard page -WelcomeLabel1=Bienvenido al asistente de instalacin de [name] -WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda cerrar todas las dems aplicaciones antes de continuar. - -; *** "Password" wizard page -WizardPassword=Contrasea -PasswordLabel1=Esta instalacin est protegida por contrasea. -PasswordLabel3=Por favor, introduzca la contrasea y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas. -PasswordEditLabel=&Contrasea: -IncorrectPassword=La contrasea introducida no es correcta. Por favor, intntelo nuevamente. - -; *** "License Agreement" wizard page -WizardLicense=Acuerdo de Licencia -LicenseLabel=Es importante que lea la siguiente informacin antes de continuar. -LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar las clusulas de este acuerdo antes de continuar con la instalacin. -LicenseAccepted=A&cepto el acuerdo -LicenseNotAccepted=&No acepto el acuerdo - -; *** "Information" wizard pages -WizardInfoBefore=Informacin -InfoBeforeLabel=Es importante que lea la siguiente informacin antes de continuar. -InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente. -WizardInfoAfter=Informacin -InfoAfterLabel=Es importante que lea la siguiente informacin antes de continuar. -InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente. - -; *** "User Information" wizard page -WizardUserInfo=Informacin de Usuario -UserInfoDesc=Por favor, introduzca sus datos. -UserInfoName=Nombre de &Usuario: -UserInfoOrg=&Organizacin: -UserInfoSerial=Nmero de &Serie: -UserInfoNameRequired=Debe introducir un nombre. - -; *** "Select Destination Location" wizard page -WizardSelectDir=Seleccione la Carpeta de Destino -SelectDirDesc=Dnde debe instalarse [name]? -SelectDirLabel3=El programa instalar [name] en la siguiente carpeta. -SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar. -DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco. -CannotInstallToNetworkDrive=El programa de instalacin no puede realizar la instalacin en una unidad de red. -CannotInstallToUNCPath=El programa de instalacin no puede realizar la instalacin en una ruta de acceso UNC. -InvalidPath=Debe introducir una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido -InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra. -DiskSpaceWarningTitle=Espacio Insuficiente en Disco -DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada slo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas? -DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. -InvalidDirName=El nombre de la carpeta no es vlido. -BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1 -DirExistsTitle=La Carpeta Ya Existe -DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas? -DirDoesntExistTitle=La Carpeta No Existe -DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta? - -; *** "Select Components" wizard page -WizardSelectComponents=Seleccione los Componentes -SelectComponentsDesc=Qu componentes deben instalarse? -SelectComponentsLabel2=Seleccione los componentes que desea instalar y desmarque los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar. -FullInstallation=Instalacin Completa -; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Instalacin Compacta -CustomInstallation=Instalacin Personalizada -NoUninstallWarningTitle=Componentes Encontrados -NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nDesmarcar estos componentes no los desinstalar.%n%nDesea continuar de todos modos? -ComponentSize1=%1 KB -ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco. - -; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Seleccione las Tareas Adicionales -SelectTasksDesc=Qu tareas adicionales deben realizarse? -SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente. - -; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio -SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa? -SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio. -SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar. -MustEnterGroupName=Debe proporcionar un nombre de carpeta. -GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. -InvalidGroupName=El nombre de la carpeta no es vlido. -BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1 -NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio - -; *** "Ready to Install" wizard page -WizardReady=Listo para Instalar -ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema. -ReadyLabel2a=Haga clic en Instalar para continuar con el proceso o haga clic en Atrs si desea revisar o cambiar alguna configuracin. -ReadyLabel2b=Haga clic en Instalar para continuar con el proceso. -ReadyMemoUserInfo=Informacin del usuario: -ReadyMemoDir=Carpeta de Destino: -ReadyMemoType=Tipo de Instalacin: -ReadyMemoComponents=Componentes Seleccionados: -ReadyMemoGroup=Carpeta del Men Inicio: -ReadyMemoTasks=Tareas Adicionales: - -; *** "Preparing to Install" wizard page -WizardPreparing=Preparndose para Instalar -PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema. -PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name]. -CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir. -ApplicationsFound=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. -ApplicationsFound2=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. Al completarse la instalacin, el programa de instalacin intentar reiniciar las aplicaciones. -CloseApplications=&Cerrar automticamente las aplicaciones -DontCloseApplications=&No cerrar las aplicaciones -ErrorCloseApplications=El programa de instalacin no pudo cerrar de forma automtica todas las aplicaciones. Se recomienda que, antes de continuar, cierre todas las aplicaciones que utilicen archivos que necesitan ser actualizados por el programa de instalacin. - -; *** "Installing" wizard page -WizardInstalling=Instalando -InstallingLabel=Por favor, espere mientras se instala [name] en su sistema. - -; *** "Setup Completed" wizard page -FinishedHeadingLabel=Completando la instalacin de [name] -FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema. -FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin haciendo clic sobre el icono instalado. -ClickFinish=Haga clic en Finalizar para salir del programa de instalacin. -FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora? -FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? -ShowReadmeCheck=S, deseo ver el archivo LAME -YesRadio=&S, deseo reiniciar el sistema ahora -NoRadio=&No, reiniciar el sistema ms tarde -; used for example as 'Run MyProg.exe' -RunEntryExec=Ejecutar %1 -; used for example as 'View Readme.txt' -RunEntryShellExec=Ver %1 - -; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco -SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar. -PathLabel=&Ruta: -FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta. -SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco. - -; *** Installation phase messages -SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin. -EntryAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas o en Anular para cancelar la instalacin. - -; *** Installation status messages -StatusClosingApplications=Cerrando aplicaciones... -StatusCreateDirs=Creando carpetas... -StatusExtractFiles=Extrayendo archivos... -StatusCreateIcons=Creando accesos directos... -StatusCreateIniEntries=Creando entradas INI... -StatusCreateRegistryEntries=Creando entradas de registro... -StatusRegisterFiles=Registrando archivos... -StatusSavingUninstall=Guardando informacin para desinstalar... -StatusRunProgram=Terminando la instalacin... -StatusRestartingApplications=Reiniciando aplicaciones... -StatusRollback=Deshaciendo cambios... - -; *** Misc. errors -ErrorInternal2=Error interno: %1 -ErrorFunctionFailedNoCode=%1 fall -ErrorFunctionFailed=%1 fall; cdigo %2 -ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3 -ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1 - -; *** Registry errors -ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2 -ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2 -ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2 - -; *** INI errors -ErrorIniEntry=Error al crear entrada INI en el archivo "%1". - -; *** File copying errors -FileAbortRetryIgnore=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para excluir este archivo (no recomendado) o en Anular para cancelar la instalacin. -FileAbortRetryIgnore2=Haga clic en Reintentar para intentarlo de nuevo, en Omitir para continuar de todas formas (no recomendado) o en Anular para cancelar la instalacin. -SourceIsCorrupted=El archivo de origen est daado -SourceDoesntExist=El archivo de origen "%1" no existe -ExistingFileReadOnly=El archivo existente est marcado como slo-lectura.%n%nHaga clic en Reintentar para quitar el atributo de slo-lectura e intentarlo de nuevo, en Omitir para excluir este archivo o en Anular para cancelar la instalacin. -ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo: -FileExists=El archivo ya existe.%n%nDesea sobreescribirlo? -ExistingFileNewer=El archivo existente es ms reciente que el que est tratando de instalar. Se recomienda que mantenga el archivo existente.%n%nDesea mantener el archivo existente? -ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo: -ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino: -ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen: -ErrorCopying=Ocurri un error al intentar copiar el archivo: -ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente: -ErrorRestartReplace=Fall reintento de reemplazar: -ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino: -ErrorRegisterServer=Imposible registrar el DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1 -ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1 - -; *** Post-installation errors -ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME. -ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente. - -; *** Uninstaller messages -UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar. -UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar -UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar -UninstallUnknownEntry=Se encontr una entrada desconocida (%1) en el registro de desinstalacin -ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes? -UninstallOnlyOnWin64=Este programa slo puede ser desinstalado en Windows de 64-bits. -OnlyAdminCanUninstall=Este programa slo puede ser desinstalado por un usuario con privilegios administrativos. -UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema. -UninstalledAll=%1 se desinstal satisfactoriamente de su sistema. -UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse, pero podr eliminarlos manualmente si lo desea. -UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? -UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse - -; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido? -ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es utilizado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi elimina el archivo y hay programas que lo utilizan, esos programas podran dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao. -SharedFileNameLabel=Archivo: -SharedFileLocationLabel=Ubicacin: -WizardUninstalling=Estado de la Desinstalacin -StatusUninstalling=Desinstalando %1... - -; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=Instalando %1. -ShutdownBlockReasonUninstallingApp=Desinstalando %1. - -; The custom messages below aren't used by Setup itself, but if you make -; use of them in your scripts, you'll want to translate them. - -[CustomMessages] - -NameAndVersion=%1 versin %2 -AdditionalIcons=Iconos adicionales: -CreateDesktopIcon=Crear un icono en el &escritorio -CreateQuickLaunchIcon=Crear un icono de &Inicio Rpido -ProgramOnTheWeb=%1 en la Web -UninstallProgram=Desinstalar %1 -LaunchProgram=Ejecutar %1 -AssocFileExtension=&Asociar %1 con la extensin de archivo %2 -AssocingFileExtension=Asociando %1 con la extensin de archivo %2... -AutoStartProgramGroupDescription=Inicio: -AutoStartProgram=Iniciar automticamente %1 -AddonHostProgramNotFound=%1 no pudo ser localizado en la carpeta seleccionada.%n%nDesea continuar de todas formas? diff --git a/Greenshot/releases/innosetup/Languages/Swedish.isl b/Greenshot/releases/innosetup/Languages/Swedish.isl new file mode 100644 index 000000000..6a942b267 --- /dev/null +++ b/Greenshot/releases/innosetup/Languages/Swedish.isl @@ -0,0 +1,339 @@ +; *** Inno Setup version 5.5.3+ Swedish messages *** +; +; To download user-contributed translations of this file, go to: +; http://www.jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Translated by christer_1@hotmail.com (Christer Toivonen) +; + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Svenska +LanguageID=$041D +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Installationsprogram +SetupWindowTitle=Installationsprogram fr %1 +UninstallAppTitle=Avinstallation +UninstallAppFullTitle=%1 Avinstallation + +; *** Misc. common +InformationTitle=Information +ConfirmTitle=Bekrfta +ErrorTitle=Fel + +; *** SetupLdr messages +SetupLdrStartupMessage=%1 kommer att installeras. Vill du fortstta? +LdrCannotCreateTemp=Kan ej skapa en temporr fil. Installationen avbryts +LdrCannotExecTemp=Kan inte kra fil i temporr katalog. Installationen avbryts + +; *** Startup error messages +LastErrorMessage=%1.%n%nFel %2: %3 +SetupFileMissing=Filen %1 saknas i installationskatalogen. Rtta till problemet eller hmta en ny kopia av programmet. +SetupFileCorrupt=Installationsfilerna r felaktiga. Hmta en ny kopia av programmet +SetupFileCorruptOrWrongVer=Installationsfilerna r felaktiga, eller stmmer ej verens med denna version av installationsprogrammet. Rtta till felet eller hmta en ny programkopia. +InvalidParameter=En ogiltig parameter angavs p kommandoraden:%n%n%1 +SetupAlreadyRunning=Setup krs redan. +WindowsVersionNotSupported=Programmet stdjer inte den version av Windows som krs p datorn. +WindowsServicePackRequired=Programmet krver %1 Service Pack %2 eller nyare. +NotOnThisPlatform=Detta program kan ej kras p %1. +OnlyOnThisPlatform=Detta program mste ha %1. +OnlyOnTheseArchitectures=Detta program kan bara installeras p Windows versioner med fljande processorarkitekturer:%n%n%1 +MissingWOW64APIs=Den versionen av Windows du kr har inte den funktionalitet installationsprogrammet behver fr att genomfra en 64-bitars installation. Rtta till problemet genom att installera Service Pack %1. +WinVersionTooLowError=Detta program krver %1, version %2 eller senare. +WinVersionTooHighError=Programmet kan inte installeras p %1 version %2 eller senare. +AdminPrivilegesRequired=Du mste vara inloggad som administratr nr du installerar detta program. +PowerUserPrivilegesRequired=Du mste vara inloggad som administratr eller medlem av gruppen Privilegierade anvndare (Power Users) nr du installerar detta program. +SetupAppRunningError=Installationsprogrammet har upptckt att %1 r igng.%n%nAvsluta det angivna programmet nu. Klicka sedan p OK fr att g vidare, eller p Avbryt fr att avsluta. +UninstallAppRunningError=Avinstalleraren har upptckt att %1 krs fr tillfllet.%n%nStng all ppna instanser av det nu, klicka sedan p OK fr att g vidare, eller p Avbryt fr att avsluta. + +; *** Misc. errors +ErrorCreatingDir=Kunde inte skapa katalogen "%1" +ErrorTooManyFilesInDir=Kunde inte skapa en fil i katalogen "%1" drfr att den innehller fr mnga filer + +; *** Setup common messages +ExitSetupTitle=Avsluta installationen +ExitSetupMessage=Installationen r inte frdig. Om du avslutar nu, kommer programmet inte att installeras.%n%nDu kan kra installationsprogrammet vid ett senare tillflle fr att slutfra installationen.%n%nVill du avbryta installationen? +AboutSetupMenuItem=&Om installationsprogrammet... +AboutSetupTitle=Om installationsprogrammet +AboutSetupMessage=%1 version %2%n%3%n%n%1 hemsida:%n%4 +AboutSetupNote=Svensk versttning r gjord av dickg@go.to 1999, 2002%n%nUppdatering till 3.0.2+ av peter@peterandlinda.com, 4.+ av stefan@bodingh.se +TranslatorNote= + +; *** Buttons +ButtonBack=< &Tillbaka +ButtonNext=&Nsta > +ButtonInstall=&Installera +ButtonOK=OK +ButtonCancel=Avbryt +ButtonYes=&Ja +ButtonYesToAll=Ja till &Allt +ButtonNo=&Nej +ButtonNoToAll=N&ej till allt +ButtonFinish=&Slutfr +ButtonBrowse=&Blddra... +ButtonWizardBrowse=&Blddra... +ButtonNewFolder=Skapa ny katalog + +; *** "Select Language" dialog messages +SelectLanguageTitle=Vlj sprk fr installationen +SelectLanguageLabel=Vlj sprk som skall anvndas under installationen: + +; *** Common wizard text +ClickNext=Klicka p Nsta fr att fortstta eller p Avbryt fr att avsluta installationen. +BeveledLabel= +BrowseDialogTitle=Vlj katalog +BrowseDialogLabel=Vlj en katalog i listan nedan, klicka sedan p OK. +NewFolderName=Ny katalog + +; *** "Welcome" wizard page +WelcomeLabel1=Vlkommen till installationsprogrammet fr [name]. +WelcomeLabel2=Detta kommer att installera [name/ver] p din dator.%n%nDet rekommenderas att du avslutar alla andra program innan du fortstter. Det frebygger konflikter under installationens gng. + +; *** "Password" wizard page +WizardPassword=Lsenord +PasswordLabel1=Denna installation r skyddad med lsenord. +PasswordLabel3=Var god ange lsenordet, klicka sedan p Nsta fr att fortstta. Lsenord skiljer p versaler/gemener. +PasswordEditLabel=&Lsenord: +IncorrectPassword=Lsenordet du angav r inkorrekt. Frsk igen. + +; *** "License Agreement" wizard page +WizardLicense=Licensavtal +LicenseLabel=Var god och ls fljande viktiga information innan du fortstter. +LicenseLabel3=Var god och ls fljande licensavtal. Du mste acceptera villkoren i avtalet innan du kan fortstta med installationen. +LicenseAccepted=Jag &accepterar avtalet +LicenseNotAccepted=Jag accepterar &inte avtalet + +; *** "Information" wizard pages +WizardInfoBefore=Information +InfoBeforeLabel=Var god ls fljande viktiga information innan du fortstter. +InfoBeforeClickLabel=Nr du r klar att fortstta med installationen klickar du p Nsta. +WizardInfoAfter=Information +InfoAfterLabel=Var god ls fljande viktiga information innan du fortstter. +InfoAfterClickLabel=Nr du r klar att fortstta med installationen klickar du p Nsta. + +; *** "User Information" wizard page +WizardUserInfo=Anvndarinformation +UserInfoDesc=Var god och fyll i fljande uppgifter. +UserInfoName=&Namn: +UserInfoOrg=&Organisation: +UserInfoSerial=&Serienummer: +UserInfoNameRequired=Du mste fylla i ett namn. + +; *** "Select Destination Directory" wizard page +WizardSelectDir=Vlj installationsplats +SelectDirDesc=Var skall [name] installeras? +SelectDirLabel3=Installationsprogrammet kommer att installera [name] i fljande katalog +SelectDirBrowseLabel=Fr att fortstta klickar du p Nsta. Om du vill vlja en annan katalog klickar du p Blddra. +DiskSpaceMBLabel=Programmet krver minst [mb] MB hrddiskutrymme. +CannotInstallToNetworkDrive=Setup kan inte installeras p ntverksdisk. +CannotInstallToUNCPath=Setup kan inte installeras p UNC skvg. +InvalidPath=Du mste skriva en fullstndig skvg med enhetsbeteckning; till exempel:%n%nC:\Program%n%neller en UNC-skvg i formatet:%n%n\\server\resurs +InvalidDrive=Enheten du har valt finns inte eller r inte tillgnglig. Vlj en annan. +DiskSpaceWarningTitle=Ej tillrckligt med diskutrymme +DiskSpaceWarning=Installationsprogrammet behver tminstone %1 KB ledigt diskutrymme fr installationen, men den valda enheten har bara %2 KB tillgngligt.%n%nVill du fortstta nd? +DirNameTooLong=Katalogens namn eller skvg r fr lng. +InvalidDirName=Katalogen du har valt r inte tillgnglig. +BadDirName32=Katalogens namn fr ej innehlla ngot av fljande tecken:%n%n%1 +DirExistsTitle=Katalogen finns +DirExists=Katalogen:%n%n%1%n%nfinns redan. Vill du nd fortstta installationen till den valda katalogen? +DirDoesntExistTitle=Katalogen finns inte +DirDoesntExist=Katalogen:%n%n%1%n%nfinns inte. Vill du skapa den? + +; *** "Select Components" wizard page +WizardSelectComponents=Vlj komponenter +SelectComponentsDesc=Vilka komponenter skall installeras? +SelectComponentsLabel2=Vlj de komponenter som du vill ska installeras; avmarkera de komponenter som du inte vill ha. Klicka sedan p Nsta nr du r klar att fortstta. +FullInstallation=Fullstndig installation +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompakt installation +CustomInstallation=Anpassad installation +NoUninstallWarningTitle=Komponenter finns +NoUninstallWarning=Installationsprogrammet har upptckt att fljande komponenter redan finns installerade p din dator:%n%n%1%n%nAtt avmarkera dessa komponenter kommer inte att avinstallera dom.%n%nVill du fortstta nd? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceMBLabel=Aktuella val krver minst [mb] MB diskutrymme. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Vlj extra uppgifter +SelectTasksDesc=Vilka extra uppgifter skall utfras? +SelectTasksLabel2=Markera ytterligare uppgifter att utfra vid installation av [name], tryck sedan p Nsta. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Vlj Startmenykatalogen +SelectStartMenuFolderDesc=Var skall installationsprogrammet placera programmets genvgar? +SelectStartMenuFolderLabel3=Installationsprogrammet kommer att skapa programmets genvgar i fljande katalog. +SelectStartMenuFolderBrowseLabel=Fr att fortstta klickar du p Nsta. Om du vill vlja en annan katalog, klickar du p Blddra. +MustEnterGroupName=Du mste ange en katalog. +GroupNameTooLong=Katalogens namn eller skvg r fr lng. +InvalidGroupName=Katalogen du har valt r inte tillgnglig. +BadGroupName=Katalognamnet kan inte innehlla ngon av fljande tecken:%n%n%1 +NoProgramGroupCheck2=&Skapa ingen Startmenykatalog + +; *** "Ready to Install" wizard page +WizardReady=Redo att installera +ReadyLabel1=Installationsprogrammet r nu redo att installera [name] p din dator. +ReadyLabel2a=Tryck p Installera om du vill fortstta, eller p g Tillbaka om du vill granska eller ndra p ngot. +ReadyLabel2b=Vlj Installera fr att pbrja installationen. +ReadyMemoUserInfo=Anvndarinformation: +ReadyMemoDir=Installationsplats: +ReadyMemoType=Installationstyp: +ReadyMemoComponents=Valda komponenter: +ReadyMemoGroup=Startmenykatalog: +ReadyMemoTasks=Extra uppgifter: + +; *** "Preparing to Install" wizard page +WizardPreparing=Frbereder installationen +PreparingDesc=Installationsprogrammet frbereder installationen av [name] p din dator. +PreviousInstallNotCompleted=Installationen/avinstallationen av ett tidigare program har inte slutfrts. Du mste starta om datorn fr att avsluta den installationen.%n%nEfter att ha startat om datorn kr du installationsprogrammet igen fr att slutfra installationen av [name]. +CannotContinue=Installationsprogrammet kan inte fortstta. Klicka p Avbryt fr att avsluta. +ApplicationsFound=Fljande program anvnder filer som mste uppdateras av Setup. Vi rekommenderar att du lter Setup automatiskt stnga dessa program. +ApplicationsFound2=Fljande program anvnder filer som mste uppdateras av Setup. Vi rekommenderar att du lter Setup automatiskt stnga dessa program. Efter installationen kommer Setup att frska starta programmen igen. +CloseApplications=&Stng programmen automatiskt +DontCloseApplications=&Stng inte programmen +ErrorCloseApplications=Installationsprogrammet kunde inte stnga alla program. Innan installationen fortstter rekommenderar vi att du stnger alla program som anvnder filer som Setup behver uppdatera. + +; *** "Installing" wizard page +WizardInstalling=Installerar +InstallingLabel=Vnta medan [name] installeras p din dator. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Avslutar installationen av [name] +FinishedLabelNoIcons=[name] har nu installerats p din dator. +FinishedLabel=[name] har nu installerats p din dator. Programmet kan startas genom att vlja ngon av ikonerna. +ClickFinish=Vlj Slutfr fr att avsluta installationen. +FinishedRestartLabel=Fr att slutfra installationen av [name], mste datorn startas om. Vill du starta om nu? +FinishedRestartMessage=Fr att slutfra installationen av [name], mste datorn startas om.%n%nVill du starta om datorn nu? +ShowReadmeCheck=Ja, jag vill se filen LS MIG +YesRadio=&Ja, jag vill starta om datorn nu +NoRadio=&Nej, jag startar sjlv om datorn senare +; used for example as 'Run MyProg.exe' +RunEntryExec=Kr %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Ls %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Installationsprogrammet behver nsta diskett +SelectDiskLabel2=Var god stt i diskett %1 och tryck OK.%n%nOm filerna kan hittas i en annan katalog n den som visas nedan, skriv in rtt skvg eller vlj Blddra. +PathLabel=&Skvg: +FileNotInDir2=Kunde inte hitta filen "%1" i "%2". Var god stt i korrekt diskett eller vlj en annan katalog. +SelectDirectoryLabel=Var god ange skvgen fr nsta diskett. + +; *** Installation phase messages +SetupAborted=Installationen slutfrdes inte.%n%nVar god rtta till felet och kr installationen igen. +EntryAbortRetryIgnore=Vlj Frsk igen eller Ignorera fr att fortstta nd, eller vlj Avbryt fr att avbryta installationen. + +; *** Installation status messages +StatusClosingApplications=Stnger program... +StatusCreateDirs=Skapar kataloger... +StatusExtractFiles=Packar upp filer... +StatusCreateIcons=Skapar programikoner... +StatusCreateIniEntries=Skriver INI-vrden... +StatusCreateRegistryEntries=Skriver register-vrden... +StatusRegisterFiles=Registrerar filer... +StatusSavingUninstall=Sparar information fr avinstallation... +StatusRunProgram=Slutfr installationen... +StatusRestartingApplications=Startar om program... +StatusRollback=terstller ndringar... + +; *** Misc. errors +ErrorInternal2=Internt fel: %1 +ErrorFunctionFailedNoCode=%1 misslyckades +ErrorFunctionFailed=%1 misslyckades; kod %2 +ErrorFunctionFailedWithMessage=%1 misslyckades; kod %2.%n%3 +ErrorExecutingProgram=Kan inte kra filen:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Fel vid ppning av registernyckel:%n%1\%2 +ErrorRegCreateKey=Kan ej skapa registernyckel:%n%1\%2 +ErrorRegWriteKey=Kan ej skriva till registernyckel:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Kan inte skriva nytt INI-vrde i filen "%1". + +; *** File copying errors +FileAbortRetryIgnore=Vlj Frsk igen eller Ignorera fr att hoppa ver denna fil (ej rekommenderat), eller vlj Avbryt installationen. +FileAbortRetryIgnore2=Vlj Frsk igen eller Ignorera och fortstt nd (ej rekommenderat), eller vlj Avbryt installationen. +SourceIsCorrupted=Kllfilen r felaktig +SourceDoesntExist=Kllfilen "%1" finns inte +ExistingFileReadOnly=Den nuvarande filen r skrivskyddad.%n%nVlj Frsk igen fr att ta bort skrivskyddet, Ignorera fr att hoppa ver denna fil, eller vlj Avbryt installationen. +ErrorReadingExistingDest=Ett fel uppstod vid frsk att lsa den befintliga filen: +FileExists=Filen finns redan.%n%nVill du skriva ver den? +ExistingFileNewer=Den befintliga filen r nyare n den som ska installeras. Du rekommenderas att behlla den befintliga filen. %n%nVill Du behlla den befintliga filen? +ErrorChangingAttr=Ett fel uppstod vid frsk att ndra attribut p den befintliga filen: +ErrorCreatingTemp=Ett fel uppstod vid ett frsk att skapa installationskatalogen: +ErrorReadingSource=Ett fel uppstod vid ett frsk att lsa kllfilen: +ErrorCopying=Ett fel uppstod vid kopiering av filen: +ErrorReplacingExistingFile=Ett fel uppstod vid ett frsk att erstta den befintliga filen: +ErrorRestartReplace=terstartaErstt misslyckades: +ErrorRenamingTemp=Ett fel uppstod vid ett frsk att byta namn p en fil i installationskatalogen: +ErrorRegisterServer=Kunde inte registrera DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 misslyckades med felkod %1 +ErrorRegisterTypeLib=Kunde inte registrera typbibliotek: %1 + +; *** Post-installation errors +ErrorOpeningReadme=Ett fel uppstod vid ppnandet av LS MIG-filen. +ErrorRestartingComputer=Installationsprogrammet kunde inte starta om datorn. Var god gr det manuellt. + +; *** Uninstaller messages +UninstallNotFound=Filen "%1" finns inte. Kan inte avinstallera. +UninstallOpenError=Filen "%1" kan inte ppnas. Kan inte avinstallera. +UninstallUnsupportedVer=Avinstallationsloggen "%1" r i ett format som denna version inte knner igen. Kan ej avinstallera +UninstallUnknownEntry=En oknd rad (%1) hittades i avinstallationsloggen +ConfirmUninstall=r du sker p att du vill ta bort %1 och alla tillhrande komponenter? +UninstallOnlyOnWin64=Denna installation kan endast avinstalleras p en 64-bitarsversion av Windows. +OnlyAdminCanUninstall=Denna installation kan endast avinstalleras av en anvndare med administrativa rttigheter. +UninstallStatusLabel=Var god och vnta medan %1 tas bort frn din dator. +UninstalledAll=%1 r nu borttaget frn din dator. +UninstalledMost=Avinstallationen av %1 r nu klar.%n%nEn del filer/kataloger gick ej att ta bort. Dessa kan tas bort manuellt. +UninstalledAndNeedsRestart=Fr att slutfra avinstallationen av %1 mste datorn startas om.%n%nVill du starta om nu? +UninstallDataCorrupted=Filen "%1" r felaktig. Kan inte avinstallera + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Ta bort delad fil? +ConfirmDeleteSharedFile2=Systemet indikerar att fljande delade fil inte lngre anvnds av ngra program. Vill du ta bort den delade filen?%n%n%1%n%nOm ngot program fortfarande anvnder denna fil och den raderas, kommer programmet kanske att sluta fungera. Om du r osker, vlj Nej. Att lta filen ligga kvar i systemet kommer inte att orsaka ngon skada. +SharedFileNameLabel=Filnamn: +SharedFileLocationLabel=Plats: +WizardUninstalling=Avinstallationsstatus +StatusUninstalling=Avinstallerar %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installerar %1. +ShutdownBlockReasonUninstallingApp=Avinstallerar %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 version %2 +AdditionalIcons=terstende ikoner: +CreateDesktopIcon=Skapa en ikon p skrivbordet +CreateQuickLaunchIcon=Skapa en ikon i Snabbstartfltet +ProgramOnTheWeb=%1 p Webben +UninstallProgram=Avinstallera %1 +LaunchProgram=Starta %1 +AssocFileExtension=Associera %1 med %2 filnamnstillgg +AssocingFileExtension=Associerar %1 med %2 filnamnstillgg... +AutoStartProgramGroupDescription=Autostart: +AutoStartProgram=Starta automatiskt %1 +AddonHostProgramNotFound=%1 kunde inte hittas i katalogen du valde.%n%nVill du fortstta nd? From 59efe425fffa1befc4f26bd3c9e2dabf6f536995 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 1 Jun 2016 10:34:17 +0200 Subject: [PATCH 055/170] Added tickets to the readme.txt.template [skip ci] --- .../releases/additional_files/readme.txt.template | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index a102c0066..0c7aa8dde 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -23,14 +23,20 @@ Fixed: * BUG-1945: Failure starting Greenshot at system startup * BUG-1949: Can't delete Imgur upload * BUG-1965: Activation border around window is visible in the capture +* FEATURE-916: Added icon as possible format to save with (image is sized to 256x256) * FEATURE-919: Allow adding of space around screenshot -* FEATURE-945: Added environment variables to the external command +* FEATURE-945:Added environment variables resolving to the external command +* FEATURE-949: Updated to Inno-Setup 5.5.9 for improved installer security Open issues planned for this version: BUG-1872: OneDrive prevents Greenshot hotkeys from working -FEATURE-916: Save file as icon +BUG-1908: External Command plugin should check for possible default-commands at startup +BUG-1910: Error occurs after adding 10+ text boxes with arrows FEATURE-912: [Storage Location] Define directory pattern +Known issues: +* TextContainer (the thing in the editor that can add text to your capture) can throw exceptions. + 1.2.8.12-cab854b RELEASE From 9fe00fdbdbec5707a5f7a4633bcb06e53a61dab1 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 16 Jun 2016 21:35:32 +0200 Subject: [PATCH 056/170] Fixing some NPR Exceptions. --- Greenshot/Drawing/CropContainer.cs | 16 ++++++---------- Greenshot/Drawing/DrawableContainer.cs | 23 ++++------------------- Greenshot/Drawing/FreehandContainer.cs | 2 +- Greenshot/Drawing/TextContainer.cs | 26 +++++++++++++------------- 4 files changed, 24 insertions(+), 43 deletions(-) diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index 5bf51021d..93464f18f 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -50,24 +50,20 @@ namespace Greenshot.Drawing { } public override void Invalidate() { - if (_parent == null) - { - return; - } - _parent.Invalidate(); + _parent?.Invalidate(); } /// /// We need to override the DrawingBound, return a rectangle in the size of the image, to make sure this element is always draw /// (we create a transparent brown over the complete picture) /// - public override Rectangle DrawingBounds { - get { - return new Rectangle(0,0,_parent.Width, _parent.Height); - } - } + public override Rectangle DrawingBounds => new Rectangle(0,0,_parent?.Width??0, _parent?.Height ?? 0); public override void Draw(Graphics g, RenderMode rm) { + if (_parent == null) + { + return; + } using (Brush cropBrush = new SolidBrush(Color.FromArgb(100, 150, 150, 100))) { Rectangle cropRectangle = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); Rectangle selectionRect = new Rectangle(cropRectangle.Left - 1, cropRectangle.Top - 1, cropRectangle.Width + 1, cropRectangle.Height + 1); diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 650e20992..989cc9d07 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -89,14 +89,7 @@ namespace Greenshot.Drawing if (!disposing) { return; } - if (_parent != null) - { - FieldAggregator fieldAggregator = _parent.FieldAggregator; - if (fieldAggregator != null) - { - fieldAggregator.UnbindElement(this); - } - } + _parent?.FieldAggregator?.UnbindElement(this); } ~DrawableContainer() { @@ -306,7 +299,7 @@ namespace Greenshot.Drawing public virtual void Invalidate() { if (Status != EditStatus.UNDRAWN) { - _parent.Invalidate(DrawingBounds); + _parent?.Invalidate(DrawingBounds); } } @@ -491,15 +484,7 @@ namespace Greenshot.Drawing { return; } - if (_parent != null) - { - // Remove FieldAggregator - FieldAggregator fieldAggregator = _parent.FieldAggregator; - if (fieldAggregator != null) - { - fieldAggregator.UnbindElement(this); - } - } + _parent.FieldAggregator?.UnbindElement(this); _parent = newParent; foreach(IFilter filter in Filters) { @@ -521,7 +506,7 @@ namespace Greenshot.Drawing /// The field to be changed /// The new value public virtual void BeforeFieldChange(IField fieldToBeChanged, object newValue) { - _parent.MakeUndoable(new ChangeFieldHolderMemento(this, fieldToBeChanged), true); + _parent?.MakeUndoable(new ChangeFieldHolderMemento(this, fieldToBeChanged), true); Invalidate(); } diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index 23de535f6..eb97544e7 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -217,7 +217,7 @@ namespace Greenshot.Drawing { int safetymargin = 10; return new Rectangle(myBounds.Left + Left - (safetymargin+lineThickness), myBounds.Top + Top - (safetymargin+lineThickness), myBounds.Width + 2*(lineThickness+safetymargin), myBounds.Height + 2*(lineThickness+safetymargin)); } - return new Rectangle(0, 0, _parent.Width, _parent.Height); + return new Rectangle(0, 0, _parent?.Width??0, _parent?.Height?? 0); } } diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 397a4501e..a6673d091 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -40,14 +40,12 @@ namespace Greenshot.Drawing { public class TextContainer : RectangleContainer, ITextContainer { // If makeUndoable is true the next text-change will make the change undoable. // This is set to true AFTER the first change is made, as there is already a "add element" on the undo stack + // Although the name is wrong, we can't change it due to file serialization + // ReSharper disable once InconsistentNaming private bool makeUndoable; [NonSerialized] private Font _font; - public Font Font { - get { - return _font; - } - } + public Font Font => _font; [NonSerialized] private TextBox _textBox; @@ -57,11 +55,10 @@ namespace Greenshot.Drawing { ///
[NonSerialized] StringFormat _stringFormat = new StringFormat(); - public StringFormat StringFormat { - get { - return _stringFormat; - } - } + public StringFormat StringFormat => _stringFormat; + + // Although the name is wrong, we can't change it due to file serialization + // ReSharper disable once InconsistentNaming private string text; // there is a binding on the following property! public string Text { @@ -168,7 +165,7 @@ namespace Greenshot.Drawing { HideTextBox(); } else if (Selected && Status == EditStatus.DRAWING) { ShowTextBox(); - } else if (Selected && Status == EditStatus.IDLE && _textBox.Visible) { + } else if (_parent != null && Selected && Status == EditStatus.IDLE && _textBox.Visible) { // Fix (workaround) for BUG-1698 _parent.KeysLocked = true; } @@ -221,8 +218,11 @@ namespace Greenshot.Drawing { } private void ShowTextBox() { - _parent.KeysLocked = true; - _parent.Controls.Add(_textBox); + if (_parent != null) + { + _parent.KeysLocked = true; + _parent.Controls.Add(_textBox); + } EnsureTextBoxContrast(); _textBox.Show(); _textBox.Focus(); From aa3df02e3ffd9393bab1b0de7fa0c6b79a805abb Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 16 Jun 2016 21:56:54 +0200 Subject: [PATCH 057/170] NPR Exception fixes. --- Greenshot/Drawing/DrawableContainer.cs | 2 +- Greenshot/Drawing/Surface.cs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 989cc9d07..73c59713a 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -484,7 +484,7 @@ namespace Greenshot.Drawing { return; } - _parent.FieldAggregator?.UnbindElement(this); + _parent?.FieldAggregator?.UnbindElement(this); _parent = newParent; foreach(IFilter filter in Filters) { diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 8b56d16f3..2ec781963 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -1618,7 +1618,10 @@ namespace Greenshot.Drawing { element.FieldChanged -= element_FieldChanged; } - element.Parent = null; + if (elementToRemove != null) + { + elementToRemove.Parent = null; + } // Do not dispose, the memento should!! element.Dispose(); if (invalidate) { From 789334c193ca7bc461fc57ca0fe6f30cf88b96e3 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 3 Jul 2016 21:59:20 +0200 Subject: [PATCH 058/170] BUG-1812 storing a windows placement and than using this later causes issues when the location is actually outside of the screen. This should fix it. --- Greenshot/Configuration/EditorConfiguration.cs | 9 +++++++++ Greenshot/Forms/ImageEditorForm.cs | 18 +++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index c23d3118a..0d74d81cd 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -119,6 +119,15 @@ namespace Greenshot.Configuration { } } + public void ResetEditorPlacement() + { + WindowNormalPosition = new Rectangle(100, 100, 400, 400); + WindowMaxPosition = new Point(-1,-1); + WindowMinPosition = new Point(-1, -1); + WindowPlacementFlags = 0; + ShowWindowCommand = ShowWindowCommand.Normal; + } + public WindowPlacement GetEditorPlacement() { WindowPlacement placement = WindowPlacement.Default; placement.NormalPosition = new RECT(WindowNormalPosition); diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index 7afa3d9ac..cd88ec793 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -77,7 +77,7 @@ namespace Greenshot { get { try { EditorList.Sort(delegate(IImageEditor e1, IImageEditor e2) { - return String.Compare(e1.Surface.CaptureDetails.Title, e2.Surface.CaptureDetails.Title, StringComparison.Ordinal); + return string.Compare(e1.Surface.CaptureDetails.Title, e2.Surface.CaptureDetails.Title, StringComparison.Ordinal); }); } catch(Exception ex) { LOG.Warn("Sorting of editors failed.", ex); @@ -104,6 +104,14 @@ namespace Greenshot { }; // Make sure the editor is placed on the same location as the last editor was on close + // But only if this still exists, else it will be reset (BUG-1812 + WindowPlacement editorWindowPlacement = EditorConfiguration.GetEditorPlacement(); + Rectangle screenbounds = WindowCapture.GetScreenBounds(); + if (!screenbounds.Contains(editorWindowPlacement.NormalPosition)) + { + EditorConfiguration.ResetEditorPlacement(); + } + // ReSharper disable once UnusedVariable WindowDetails thisForm = new WindowDetails(Handle) { WindowPlacement = EditorConfiguration.GetEditorPlacement() @@ -145,7 +153,10 @@ namespace Greenshot { panel1.Height = 10; panel1.Width = 10; _surface = newSurface as Surface; - panel1.Controls.Add(_surface); + if (_surface != null) + { + panel1.Controls.Add(_surface); + } Image backgroundForTransparency = GreenshotResources.getImage("Checkerboard.Image"); if (_surface != null) { @@ -375,9 +386,6 @@ namespace Greenshot { // Change title Text = eventArgs.Surface.LastSaveFullPath + " - " + Language.GetString(LangKey.editor_title); break; - case SurfaceMessageTyp.Error: - case SurfaceMessageTyp.Info: - case SurfaceMessageTyp.UploadedUri: default: // Put the event message on the status label updateStatusLabel(dateTime + " - " + eventArgs.Message); From 1082d852e291268cd2625239a24de0aca7bc10a0 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 3 Jul 2016 22:01:57 +0200 Subject: [PATCH 059/170] Updated readme.txt --- Greenshot/releases/additional_files/readme.txt.template | 1 + 1 file changed, 1 insertion(+) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 0c7aa8dde..b426719f4 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -10,6 +10,7 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ Fixed: +* BUG-1812: Opening the editor after removing a monitor shows it outside the visible screen. * BUG-1876: Already running message, multi user environment * BUG-1884: OCR has trailing blank spaces * BUG-1887: hang on exit - hang time proportional to number of objects From b6ccbb783ad71a2dbf43cb80a39e220c1394febe Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 11 Jul 2016 22:23:01 +0200 Subject: [PATCH 060/170] FEATURE-916: Added auto-fit for the .ico, using the best possible size (16x16, 32x32, 48x48 and 256x256) --- GreenshotPlugin/Core/ImageOutput.cs | 36 +++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 64f6709ff..c4419814e 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -641,17 +641,39 @@ namespace GreenshotPlugin.Core { IList encodedImages = new List(); foreach (var image in images) { - var imageStream = new MemoryStream(); - // Always size to 256x256, first make sure the image is 32bpp - using (var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb)) + // Pick the best fit + var sizes = new[] { 16, 32, 48 }; + int size = 256; + foreach (var possibleSize in sizes) { - using (var resizedImage = ImageHelper.ResizeImage(clonedImage, true, true, Color.Empty, 256, 256, null)) + if (image.Width <= possibleSize && image.Height <= possibleSize) { - resizedImage.Save(imageStream, ImageFormat.Png); - imageSizes.Add(resizedImage.Size); + size = possibleSize; + break; } - } + var imageStream = new MemoryStream(); + if (image.Width == size && image.Height == size) + { + using (var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb)) + { + clonedImage.Save(imageStream, ImageFormat.Png); + imageSizes.Add(new Size(size, size)); + } + } + else + { + // Resize to the specified size, first make sure the image is 32bpp + using (var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb)) + { + using (var resizedImage = ImageHelper.ResizeImage(clonedImage, true, true, Color.Empty, size, size, null)) + { + resizedImage.Save(imageStream, ImageFormat.Png); + imageSizes.Add(resizedImage.Size); + } + } + } + imageStream.Seek(0, SeekOrigin.Begin); encodedImages.Add(imageStream); } From 7d69b6b3bb51f0d7db0c94b600c32c9f805c9fce Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 12 Jul 2016 21:06:52 +0200 Subject: [PATCH 061/170] BUG-1991: Fixed missing log file for PAF version. --- Greenshot/Greenshot.csproj | 2 +- Greenshot/log4net-portable.xml | 2 - .../additional_files/readme.txt.template | 12 ++--- GreenshotPlugin/Core/Language.cs | 2 +- GreenshotPlugin/Core/LogHelper.cs | 52 +++++++++---------- GreenshotPlugin/log4net-embedded.xml | 2 - build.ps1 | 3 +- 7 files changed, 33 insertions(+), 42 deletions(-) diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index 866066d0d..30d5a0210 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -379,7 +379,7 @@ - Never + PreserveNewest Never diff --git a/Greenshot/log4net-portable.xml b/Greenshot/log4net-portable.xml index bff2b7fc2..9c54417d6 100644 --- a/Greenshot/log4net-portable.xml +++ b/Greenshot/log4net-portable.xml @@ -1,7 +1,5 @@  - - diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index b426719f4..ee51c4254 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -17,6 +17,7 @@ Fixed: * BUG-1890: Slight cropping around window on Windows 10 * BUG-1892: Greenshot saves blank JPG file with reduce colors * BUG-1898: Specify GPLv3 in the license text +* BUG-1910: Error occurs after adding 10+ text boxes with arrows * BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on and transparency is used * BUG-1933: Greenshot Installer sets bad registry key permission * BUG-1935: Delay when pasting and ShapeShifter from FlameFusion is running @@ -24,20 +25,17 @@ Fixed: * BUG-1945: Failure starting Greenshot at system startup * BUG-1949: Can't delete Imgur upload * BUG-1965: Activation border around window is visible in the capture -* FEATURE-916: Added icon as possible format to save with (image is sized to 256x256) -* FEATURE-919: Allow adding of space around screenshot -* FEATURE-945:Added environment variables resolving to the external command +* BUG-1991: Greenshot portable (PAF) uses wrong log configuration +* FEATURE-916: Added ico file format +* FEATURE-919: Allow adding of space around screenshot (use Ctrl + / Ctrl -) +* FEATURE-945: Added environment variables resolving to the external command * FEATURE-949: Updated to Inno-Setup 5.5.9 for improved installer security Open issues planned for this version: BUG-1872: OneDrive prevents Greenshot hotkeys from working BUG-1908: External Command plugin should check for possible default-commands at startup -BUG-1910: Error occurs after adding 10+ text boxes with arrows FEATURE-912: [Storage Location] Define directory pattern -Known issues: -* TextContainer (the thing in the editor that can add text to your capture) can throw exceptions. - 1.2.8.12-cab854b RELEASE diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 4a2660c78..501782029 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -61,7 +61,7 @@ namespace GreenshotPlugin.Core { LOG.Warn("IniConfig hasn't been initialized yet! (Design mode?)"); IniConfig.Init("greenshot", "greenshot"); } - if (!LogHelper.isInitialized) { + if (!LogHelper.IsInitialized) { LOG.Warn("Log4net hasn't been initialized yet! (Design mode?)"); LogHelper.InitializeLog4NET(); } diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 20a007da5..b1091f47a 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -18,6 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + using System.IO; using System.Reflection; using System.Windows.Forms; @@ -32,47 +33,44 @@ using log4net.Util; namespace GreenshotPlugin.Core { /// - /// Description of LogHelper. + /// Initialize the logger /// public class LogHelper { - private const string LOG4NET_FILE = "log4net.xml"; - private const string LOG4NET_PORTABLE_FILE = "log4net-portable.xml"; - private static bool isLog4NetConfigured; + private static bool _isLog4NetConfigured; private const string INIT_MESSAGE = "Greenshot initialization of log system failed"; - public static bool isInitialized { + + public static bool IsInitialized { get { - return isLog4NetConfigured; + return _isLog4NetConfigured; } } // Initialize Log4J public static string InitializeLog4NET() { // Setup log4j, currently the file is called log4net.xml - string pafLog4NetFilename = Path.Combine(Application.StartupPath, @"App\Greenshot\" + LOG4NET_PORTABLE_FILE); - string log4netFilename = Path.Combine(Application.StartupPath, LOG4NET_FILE); - - if (File.Exists(log4netFilename)) { - try { - XmlConfigurator.Configure(new FileInfo(log4netFilename)); - isLog4NetConfigured = true; - } catch (Exception ex) { - MessageBox.Show(ex.Message, INIT_MESSAGE, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } else if (File.Exists(pafLog4NetFilename)) { - try { - XmlConfigurator.Configure(new FileInfo(pafLog4NetFilename)); - isLog4NetConfigured = true; - } catch (Exception ex) { - MessageBox.Show(ex.Message, INIT_MESSAGE, MessageBoxButtons.OK, MessageBoxIcon.Warning); + foreach (var logName in new[] { "log4net.xml" , @"App\Greenshot\log4net-portable.xml"}) + { + string log4NetFilename = Path.Combine(Application.StartupPath, logName); + if (File.Exists(log4NetFilename)) + { + try + { + XmlConfigurator.Configure(new FileInfo(log4NetFilename)); + _isLog4NetConfigured = true; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, INIT_MESSAGE, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } } } - - if (!isLog4NetConfigured) { + // Fallback + if (!_isLog4NetConfigured) { try { Assembly assembly = typeof(LogHelper).Assembly; using (Stream stream = assembly.GetManifestResourceStream("GreenshotPlugin.log4net-embedded.xml")) { XmlConfigurator.Configure(stream); - isLog4NetConfigured = true; + _isLog4NetConfigured = true; IniConfig.ForceIniInStartupPath(); } } catch (Exception ex){ @@ -80,7 +78,7 @@ namespace GreenshotPlugin.Core { } } - if (isLog4NetConfigured) { + if (_isLog4NetConfigured) { // Get the logfile name try { if (((Hierarchy)LogManager.GetRepository()).Root.Appenders.Count > 0) { @@ -100,7 +98,7 @@ namespace GreenshotPlugin.Core { /// A simple helper class to support the logging to the AppData location ///
public class SpecialFolderPatternConverter : PatternConverter { - override protected void Convert(TextWriter writer, object state) { + protected override void Convert(TextWriter writer, object state) { Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), Option, true); writer.Write(Environment.GetFolderPath(specialFolder)); } diff --git a/GreenshotPlugin/log4net-embedded.xml b/GreenshotPlugin/log4net-embedded.xml index 6be33994a..ccfa902a7 100644 --- a/GreenshotPlugin/log4net-embedded.xml +++ b/GreenshotPlugin/log4net-embedded.xml @@ -1,7 +1,5 @@  - - diff --git a/build.ps1 b/build.ps1 index 856abb4bc..2a5b4fb6c 100644 --- a/build.ps1 +++ b/build.ps1 @@ -104,7 +104,7 @@ Function PackagePortable { "$sourcebase\Greenshot.exe.config", "$sourcebase\GreenshotPlugin.dll", "$sourcebase\log4net.dll", - "$sourcebase\log4net.xml", + "$sourcebase\log4net-portable.xml", "$destbase\additional_files\*.txt" ) | foreach { Copy-Item $_ "$destbase\portabletmp\App\Greenshot\" } Copy-Item -Path "$sourcebase\Languages\help-en-US.html" -Destination "$destbase\portabletmp\help.html" @@ -170,7 +170,6 @@ Function PackageZip { "$sourcebase\Greenshot.exe.config", "$sourcebase\GreenshotPlugin.dll", "$sourcebase\log4net.dll", - "$sourcebase\log4net.xml", "$destbase\additional_files\*.txt" ) | foreach { Copy-Item $_ "$destzip\" } $zipOutput = "$(get-location)\zip" From 9e88119fd9da9d46b8082486f71bcd4337c3e0c9 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 13 Jul 2016 17:33:28 +0200 Subject: [PATCH 062/170] BUG-1992: Fixed a problem with the OutputFilePath & OutputFileAsFullpath configuration values when using the Greenshot configuration on different PC's. --- GreenshotPlugin/Core/CoreConfiguration.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index 68ffe9a5b..07a4eaf4a 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -518,7 +518,16 @@ namespace GreenshotPlugin.Core { if (WebRequestReadWriteTimeout < 1) { WebRequestReadWriteTimeout = 100; } - } + // Added for BUG-1992, reset the OutputFilePath / OutputFileAsFullpath if they don't exist (e.g. the configuration is used on a different PC) + if (!Directory.Exists(OutputFilePath)) + { + OutputFilePath = GetDefault(nameof(OutputFilePath)) as string; + } + if (!File.Exists(OutputFileAsFullpath)) + { + OutputFileAsFullpath = GetDefault(nameof(OutputFileAsFullpath)) as string; + } + } } } \ No newline at end of file From 5951a4705a0ffcdd285b2e73f46af7d1d9253d90 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 16:29:21 +0200 Subject: [PATCH 063/170] First try of getting code signing working. --- .../additional_files/readme.txt.template | 1 + .../releases/innosetup/setup.iss.template | 6 +++ build.ps1 | 42 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index ee51c4254..699607d51 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -30,6 +30,7 @@ Fixed: * FEATURE-919: Allow adding of space around screenshot (use Ctrl + / Ctrl -) * FEATURE-945: Added environment variables resolving to the external command * FEATURE-949: Updated to Inno-Setup 5.5.9 for improved installer security +* FEATURE-958: Added code-signing of Greenshot and the installer, this should help preventing security issues Open issues planned for this version: BUG-1872: OneDrive prevents Greenshot hotkeys from working diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 9632c3f93..c38663d86 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -1,6 +1,7 @@ #define ExeName "Greenshot" #define Version "@VERSION@" #define FileVersion "@FILEVERSION@" +#define CertificatePassword GetEnv('CertificatePassword') ; Include the scripts to install .NET Framework ; See http://www.codeproject.com/KB/install/dotnetfx_innosetup_instal.aspx @@ -127,6 +128,11 @@ OutputBaseFilename={#ExeName}-INSTALLER-{#FileVersion} OutputDir=..\ PrivilegesRequired=none SetupIconFile=..\..\icons\applicationIcon\icon.ico +; Create a SHA1 signature +SignTool=SignTool sign /debug /fd sha1 /a /f ..\..\..\Greenshot.pfx /p {#CertificatePassword} /tr http://time.certum.pl /td sha1 $f +; Append a SHA256 to the previous SHA1 signature (this is what as does) +SignTool=SignTool sign /as /debug /fd sha256 /a /f ..\..\..\Greenshot.pfx /p {#CertificatePassword} /a /tr http://time.certum.pl /td sha256 $f +SignedUninstaller=yes UninstallDisplayIcon={app}\{#ExeName}.exe Uninstallable=true VersionInfoCompany={#ExeName} diff --git a/build.ps1 b/build.ps1 index 2a5b4fb6c..726f075a3 100644 --- a/build.ps1 +++ b/build.ps1 @@ -23,8 +23,19 @@ ################################################################ $version=$env:APPVEYOR_BUILD_VERSION +if ( !$version ) { + $version = "1.3.0.0" +} + $buildType=$env:build_type +if ( !$buildType ) { + $buildType = "local" +} + $gitcommit=$env:APPVEYOR_REPO_COMMIT +if ( !$gitcommit ) { + $gitcommit = "abcdefghijklmnopqrstuvwxy" +} $gitcommit=$gitcommit.SubString(0, [math]::Min($gitcommit.Length, 7)) $detailversion=$version + '-' + $gitcommit + " " + $buildType $release=(([version]$version).build) % 2 -eq 1 @@ -40,6 +51,27 @@ Function MD5($filename) { return [System.BitConverter]::ToString($hash) -replace "-", "" } +# Write the certificate to the file system, so signtool can use it +Function PrepareCertificate() { + $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) + $decodedContentBytes | set-content "greenshot.pfx" -encoding byte +} + +# Sign the file with Signtool before they are packed in the installer / .zip etc +Function SignBinaryFilesBeforeBuildingInstaller() { + $sourcebase = "$(get-location)\Greenshot\bin\Release" + + $INCLUDE=@("*.exe", "*.gsp", "*.dll") + Get-ChildItem -Path "$sourcebase" -Recurse -Include $INCLUDE | foreach { + Write-Host "Signing $_" + $signSha1Arguments = @('sign', '/fd ', 'sha1', '/a', '/f', "$(get-location)\Greenshot.pfx", '/p', $env:CertificatePassword, '/tr', 'http://time.certum.pl', '/td', 'sha1', $_) + $signSha256Arguments = @('sign', '/as', '/fd ', 'sha256', '/a', '/f', "$(get-location)\Greenshot.pfx", '/p', $env:CertificatePassword, '/tr', 'http://time.certum.pl', '/td', 'sha256', $_) + + Start-Process -wait -PassThru $env:SignTool -ArgumentList $signSha1Arguments -NoNewWindow + Start-Process -wait -PassThru $env:SignTool -ArgumentList $signSha256Arguments -NoNewWindow + } +} + # Fill the templates Function FillTemplates { Write-Host "Filling templates for version $detailversion`n`n" @@ -237,7 +269,8 @@ Function PackageInstaller { $innoSetup = "$(get-location)\packages\Tools.InnoSetup.5.5.9\tools\ISCC.exe" $innoSetupFile = "$(get-location)\greenshot\releases\innosetup\setup.iss" Write-Host "Starting $innoSetup $innoSetupFile" - $setupResult = Start-Process -wait -PassThru "$innoSetup" -ArgumentList "$innoSetupFile" -NoNewWindow -RedirectStandardOutput "$setupOutput.log" -RedirectStandardError "$setupOutput.error" + $arguments = @("/SSignTool=""$env:SignTool `$p""", $innoSetupFile) + $setupResult = Start-Process -wait -PassThru "$innoSetup" -ArgumentList $arguments -NoNewWindow -RedirectStandardOutput "$setupOutput.log" -RedirectStandardError "$setupOutput.error" Write-Host "Log output:" Get-Content "$setupOutput.log"| Write-Host if ($setupResult.ExitCode -ne 0) { @@ -274,9 +307,14 @@ Function TagCode { FillTemplates echo "Generating MD5" - MD5Checksums | Set-Content "$(get-location)\Greenshot\bin\Release\checksum.MD5" -encoding UTF8 +echo "Preparing certificate" +PrepareCertificate + +echo "Signing executables" +SignBinaryFilesBeforeBuildingInstaller + echo "Generating Installer" PackageInstaller From 87f380b8b5607ae7f0214a65ed7babf5f68137a4 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 16:43:50 +0200 Subject: [PATCH 064/170] Using password via environment --- Greenshot/releases/innosetup/setup.iss.template | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index c38663d86..526e47195 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -1,7 +1,6 @@ #define ExeName "Greenshot" #define Version "@VERSION@" #define FileVersion "@FILEVERSION@" -#define CertificatePassword GetEnv('CertificatePassword') ; Include the scripts to install .NET Framework ; See http://www.codeproject.com/KB/install/dotnetfx_innosetup_instal.aspx @@ -129,9 +128,9 @@ OutputDir=..\ PrivilegesRequired=none SetupIconFile=..\..\icons\applicationIcon\icon.ico ; Create a SHA1 signature -SignTool=SignTool sign /debug /fd sha1 /a /f ..\..\..\Greenshot.pfx /p {#CertificatePassword} /tr http://time.certum.pl /td sha1 $f +SignTool=SignTool sign /debug /fd sha1 /a /f ..\..\..\Greenshot.pfx /p %CertificatePassword% /tr http://time.certum.pl /td sha1 $f ; Append a SHA256 to the previous SHA1 signature (this is what as does) -SignTool=SignTool sign /as /debug /fd sha256 /a /f ..\..\..\Greenshot.pfx /p {#CertificatePassword} /a /tr http://time.certum.pl /td sha256 $f +SignTool=SignTool sign /as /debug /fd sha256 /a /f ..\..\..\Greenshot.pfx /p %CertificatePassword% /a /tr http://time.certum.pl /td sha256 $f SignedUninstaller=yes UninstallDisplayIcon={app}\{#ExeName}.exe Uninstallable=true From 6b650b3eee90ec582ef2be0ce93900a77c4fd746 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 17:09:33 +0200 Subject: [PATCH 065/170] Reducing the chance a password is visible by installing the certificate locally. --- Greenshot/releases/innosetup/setup.iss.template | 4 ++-- build.ps1 | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 526e47195..459fc7525 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -128,9 +128,9 @@ OutputDir=..\ PrivilegesRequired=none SetupIconFile=..\..\icons\applicationIcon\icon.ico ; Create a SHA1 signature -SignTool=SignTool sign /debug /fd sha1 /a /f ..\..\..\Greenshot.pfx /p %CertificatePassword% /tr http://time.certum.pl /td sha1 $f +SignTool=SignTool sign /debug /fd sha1 /a /tr http://time.certum.pl /td sha1 $f ; Append a SHA256 to the previous SHA1 signature (this is what as does) -SignTool=SignTool sign /as /debug /fd sha256 /a /f ..\..\..\Greenshot.pfx /p %CertificatePassword% /a /tr http://time.certum.pl /td sha256 $f +SignTool=SignTool sign /debug /as /fd sha256 /a /tr http://time.certum.pl /td sha256 $f SignedUninstaller=yes UninstallDisplayIcon={app}\{#ExeName}.exe Uninstallable=true diff --git a/build.ps1 b/build.ps1 index 726f075a3..bcf0c0eb2 100644 --- a/build.ps1 +++ b/build.ps1 @@ -55,6 +55,7 @@ Function MD5($filename) { Function PrepareCertificate() { $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) $decodedContentBytes | set-content "greenshot.pfx" -encoding byte + certutil -f -p $env:CertificatePassword -importpfx "greenshot.pfx" } # Sign the file with Signtool before they are packed in the installer / .zip etc @@ -64,8 +65,8 @@ Function SignBinaryFilesBeforeBuildingInstaller() { $INCLUDE=@("*.exe", "*.gsp", "*.dll") Get-ChildItem -Path "$sourcebase" -Recurse -Include $INCLUDE | foreach { Write-Host "Signing $_" - $signSha1Arguments = @('sign', '/fd ', 'sha1', '/a', '/f', "$(get-location)\Greenshot.pfx", '/p', $env:CertificatePassword, '/tr', 'http://time.certum.pl', '/td', 'sha1', $_) - $signSha256Arguments = @('sign', '/as', '/fd ', 'sha256', '/a', '/f', "$(get-location)\Greenshot.pfx", '/p', $env:CertificatePassword, '/tr', 'http://time.certum.pl', '/td', 'sha256', $_) + $signSha1Arguments = @('sign', '/fd ', 'sha1' , '/a', '/tr', 'http://time.certum.pl', '/td', 'sha1' , $_) + $signSha256Arguments = @('sign', '/as', '/fd ', 'sha256', '/a', '/tr', 'http://time.certum.pl', '/td', 'sha256', $_) Start-Process -wait -PassThru $env:SignTool -ArgumentList $signSha1Arguments -NoNewWindow Start-Process -wait -PassThru $env:SignTool -ArgumentList $signSha256Arguments -NoNewWindow @@ -269,7 +270,7 @@ Function PackageInstaller { $innoSetup = "$(get-location)\packages\Tools.InnoSetup.5.5.9\tools\ISCC.exe" $innoSetupFile = "$(get-location)\greenshot\releases\innosetup\setup.iss" Write-Host "Starting $innoSetup $innoSetupFile" - $arguments = @("/SSignTool=""$env:SignTool `$p""", $innoSetupFile) + $arguments = @("/Qp /SSignTool=""$env:SignTool `$p""", $innoSetupFile) $setupResult = Start-Process -wait -PassThru "$innoSetup" -ArgumentList $arguments -NoNewWindow -RedirectStandardOutput "$setupOutput.log" -RedirectStandardError "$setupOutput.error" Write-Host "Log output:" Get-Content "$setupOutput.log"| Write-Host From 863fb6c00776aef00a6273caf6f819c751e3952c Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 17:15:15 +0200 Subject: [PATCH 066/170] Trying to fix certutil call. --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index bcf0c0eb2..f381cf74e 100644 --- a/build.ps1 +++ b/build.ps1 @@ -55,7 +55,7 @@ Function MD5($filename) { Function PrepareCertificate() { $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) $decodedContentBytes | set-content "greenshot.pfx" -encoding byte - certutil -f -p $env:CertificatePassword -importpfx "greenshot.pfx" + certutil -p "$env:CertificatePassword" -importpfx -f "greenshot.pfx" NoExport } # Sign the file with Signtool before they are packed in the installer / .zip etc From f1e152eb3857b0b78252b79d898c82cca7a4170c Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 17:21:14 +0200 Subject: [PATCH 067/170] PowerShell call for CertUtil --- build.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index f381cf74e..769bb66bc 100644 --- a/build.ps1 +++ b/build.ps1 @@ -55,7 +55,9 @@ Function MD5($filename) { Function PrepareCertificate() { $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) $decodedContentBytes | set-content "greenshot.pfx" -encoding byte - certutil -p "$env:CertificatePassword" -importpfx -f "greenshot.pfx" NoExport + + $certutilArguments = @('-f', '-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") + Start-Process -wait -PassThru certutil -ArgumentList $certutilArguments -NoNewWindow } # Sign the file with Signtool before they are packed in the installer / .zip etc From ec1e80cf455db7aa000f5e414584891e4a2fe907 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:02:52 +0200 Subject: [PATCH 068/170] Hope this brings more details on why the signing doesn't work --- .../releases/innosetup/setup.iss.template | 4 +- build.ps1 | 38 ++++++++++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 459fc7525..413bb97ba 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -128,9 +128,9 @@ OutputDir=..\ PrivilegesRequired=none SetupIconFile=..\..\icons\applicationIcon\icon.ico ; Create a SHA1 signature -SignTool=SignTool sign /debug /fd sha1 /a /tr http://time.certum.pl /td sha1 $f +SignTool=SignTool sign /debug /sm /fd sha1 /tr http://time.certum.pl /td sha1 $f ; Append a SHA256 to the previous SHA1 signature (this is what as does) -SignTool=SignTool sign /debug /as /fd sha256 /a /tr http://time.certum.pl /td sha256 $f +SignTool=SignTool sign /debug /as /sm /fd sha256 /tr http://time.certum.pl /td sha256 $f SignedUninstaller=yes UninstallDisplayIcon={app}\{#ExeName}.exe Uninstallable=true diff --git a/build.ps1 b/build.ps1 index 769bb66bc..7452d87f6 100644 --- a/build.ps1 +++ b/build.ps1 @@ -56,8 +56,18 @@ Function PrepareCertificate() { $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) $decodedContentBytes | set-content "greenshot.pfx" -encoding byte - $certutilArguments = @('-f', '-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") - Start-Process -wait -PassThru certutil -ArgumentList $certutilArguments -NoNewWindow + $certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") + Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow +} + +# Sign the specify file +Function SignWithCertificate($filename) { + Write-Host "Signing $filename" + $signSha1Arguments = @('sign', '/debug', '/sm', '/fd', 'sha1' , '/tr', 'http://time.certum.pl', '/td', 'sha1' , $filename) + $signSha256Arguments = @('sign', '/debug', '/as', '/sm', '/fd', 'sha256', '/tr', 'http://time.certum.pl', '/td', 'sha256', $filename) + + Start-Process -wait $env:SignTool -ArgumentList $signSha1Arguments -NoNewWindow + Start-Process -wait $env:SignTool -ArgumentList $signSha256Arguments -NoNewWindow } # Sign the file with Signtool before they are packed in the installer / .zip etc @@ -65,13 +75,8 @@ Function SignBinaryFilesBeforeBuildingInstaller() { $sourcebase = "$(get-location)\Greenshot\bin\Release" $INCLUDE=@("*.exe", "*.gsp", "*.dll") - Get-ChildItem -Path "$sourcebase" -Recurse -Include $INCLUDE | foreach { - Write-Host "Signing $_" - $signSha1Arguments = @('sign', '/fd ', 'sha1' , '/a', '/tr', 'http://time.certum.pl', '/td', 'sha1' , $_) - $signSha256Arguments = @('sign', '/as', '/fd ', 'sha256', '/a', '/tr', 'http://time.certum.pl', '/td', 'sha256', $_) - - Start-Process -wait -PassThru $env:SignTool -ArgumentList $signSha1Arguments -NoNewWindow - Start-Process -wait -PassThru $env:SignTool -ArgumentList $signSha256Arguments -NoNewWindow + Get-ChildItem -Path "$sourcebase" -Recurse -Include $INCLUDE -Exclude "log4net.dll" | foreach { + SignWithCertificate($_) } } @@ -162,6 +167,13 @@ Function PackagePortable { } Start-Sleep -m 1500 Remove-Item "$destbase\portabletmp" -Recurse -Confirm:$false + + # sign the .paf.exe + $pafFiles = @("*.paf.exe") + Get-ChildItem -Path "$destbase" -Recurse -Include $pafFiles | foreach { + SignWithCertificate($_) + } + return } @@ -316,17 +328,17 @@ echo "Preparing certificate" PrepareCertificate echo "Signing executables" -SignBinaryFilesBeforeBuildingInstaller +#SignBinaryFilesBeforeBuildingInstaller echo "Generating Installer" -PackageInstaller +#PackageInstaller echo "Generating ZIP" -PackageZip +#PackageZip echo "Generating Portable" PackagePortable echo "Generating Debug Symbols ZIP" -PackageDbgSymbolsZip +#PackageDbgSymbolsZip From aa9cad2588207acc640cfa28ae4873a6fe76cc7a Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:05:38 +0200 Subject: [PATCH 069/170] Removed comments --- build.ps1 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build.ps1 b/build.ps1 index 7452d87f6..0f59f5a3f 100644 --- a/build.ps1 +++ b/build.ps1 @@ -57,6 +57,8 @@ Function PrepareCertificate() { $decodedContentBytes | set-content "greenshot.pfx" -encoding byte $certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") + Import-PfxCertificate –FilePath C:\mypfx.pfx cert:\localMachine\my -Password $env:CertificatePassword + Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow } @@ -328,17 +330,17 @@ echo "Preparing certificate" PrepareCertificate echo "Signing executables" -#SignBinaryFilesBeforeBuildingInstaller +SignBinaryFilesBeforeBuildingInstaller echo "Generating Installer" -#PackageInstaller +PackageInstaller echo "Generating ZIP" -#PackageZip +PackageZip echo "Generating Portable" PackagePortable echo "Generating Debug Symbols ZIP" -#PackageDbgSymbolsZip +PackageDbgSymbolsZip From 3297c1ad7f2a19c2f478d1872343eda2463bda3a Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:11:48 +0200 Subject: [PATCH 070/170] Added wrong command, commented this out for now. --- build.ps1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.ps1 b/build.ps1 index 0f59f5a3f..3de252787 100644 --- a/build.ps1 +++ b/build.ps1 @@ -55,11 +55,10 @@ Function MD5($filename) { Function PrepareCertificate() { $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) $decodedContentBytes | set-content "greenshot.pfx" -encoding byte - $certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") - Import-PfxCertificate –FilePath C:\mypfx.pfx cert:\localMachine\my -Password $env:CertificatePassword - Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow + + #Import-PfxCertificate –FilePath "greenshot.pfx" "cert:\localMachine\my" -Password "$env:CertificatePassword" } # Sign the specify file From f6156b63062a4ad8095da7ac4c1be772b9ae31d2 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:16:43 +0200 Subject: [PATCH 071/170] Trying with Import-PfxCertificate --- Greenshot/releases/innosetup/setup.iss.template | 4 ++-- build.ps1 | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 413bb97ba..398410fbf 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -128,9 +128,9 @@ OutputDir=..\ PrivilegesRequired=none SetupIconFile=..\..\icons\applicationIcon\icon.ico ; Create a SHA1 signature -SignTool=SignTool sign /debug /sm /fd sha1 /tr http://time.certum.pl /td sha1 $f +SignTool=SignTool sign /debug /fd sha1 /tr http://time.certum.pl /td sha1 $f ; Append a SHA256 to the previous SHA1 signature (this is what as does) -SignTool=SignTool sign /debug /as /sm /fd sha256 /tr http://time.certum.pl /td sha256 $f +SignTool=SignTool sign /debug /as /fd sha256 /tr http://time.certum.pl /td sha256 $f SignedUninstaller=yes UninstallDisplayIcon={app}\{#ExeName}.exe Uninstallable=true diff --git a/build.ps1 b/build.ps1 index 3de252787..ee46d3f4f 100644 --- a/build.ps1 +++ b/build.ps1 @@ -55,17 +55,17 @@ Function MD5($filename) { Function PrepareCertificate() { $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) $decodedContentBytes | set-content "greenshot.pfx" -encoding byte - $certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") - Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow + #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") + #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - #Import-PfxCertificate –FilePath "greenshot.pfx" "cert:\localMachine\my" -Password "$env:CertificatePassword" + Import-PfxCertificate –FilePath "greenshot.pfx" -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword } # Sign the specify file Function SignWithCertificate($filename) { Write-Host "Signing $filename" - $signSha1Arguments = @('sign', '/debug', '/sm', '/fd', 'sha1' , '/tr', 'http://time.certum.pl', '/td', 'sha1' , $filename) - $signSha256Arguments = @('sign', '/debug', '/as', '/sm', '/fd', 'sha256', '/tr', 'http://time.certum.pl', '/td', 'sha256', $filename) + $signSha1Arguments = @('sign', '/debug', '/fd', 'sha1' , '/tr', 'http://time.certum.pl', '/td', 'sha1' , $filename) + $signSha256Arguments = @('sign', '/debug', '/as', '/fd', 'sha256', '/tr', 'http://time.certum.pl', '/td', 'sha256', $filename) Start-Process -wait $env:SignTool -ArgumentList $signSha1Arguments -NoNewWindow Start-Process -wait $env:SignTool -ArgumentList $signSha256Arguments -NoNewWindow From 24cd4e51b0a16d271b413e08db6058ba32243ee3 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:19:29 +0200 Subject: [PATCH 072/170] Try 1001 --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index ee46d3f4f..86f912099 100644 --- a/build.ps1 +++ b/build.ps1 @@ -58,7 +58,7 @@ Function PrepareCertificate() { #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - Import-PfxCertificate –FilePath "greenshot.pfx" -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword + Get-ChildItem -Path "greenshot.pfx" | Import-PfxCertificate -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword } # Sign the specify file From c48d5dfc1a8c0b256fb1bc5775920c46aa6444e3 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:23:06 +0200 Subject: [PATCH 073/170] Getting closer... --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index 86f912099..f48306e31 100644 --- a/build.ps1 +++ b/build.ps1 @@ -58,7 +58,7 @@ Function PrepareCertificate() { #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - Get-ChildItem -Path "greenshot.pfx" | Import-PfxCertificate -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword + Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword } # Sign the specify file From 544e8e92e2d8c4a25fdba1b3d1df8a40683187e2 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:27:04 +0200 Subject: [PATCH 074/170] Should fix password issue --- build.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index f48306e31..6c3ed8723 100644 --- a/build.ps1 +++ b/build.ps1 @@ -57,8 +57,8 @@ Function PrepareCertificate() { $decodedContentBytes | set-content "greenshot.pfx" -encoding byte #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - - Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword + $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText + Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:psw } # Sign the specify file From fd327aabe7a93b605bf7f7832c253a6b12b86996 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:29:24 +0200 Subject: [PATCH 075/170] another try --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index 6c3ed8723..fc2767cc5 100644 --- a/build.ps1 +++ b/build.ps1 @@ -57,7 +57,7 @@ Function PrepareCertificate() { $decodedContentBytes | set-content "greenshot.pfx" -encoding byte #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText + $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:psw } From 9153a0baf5b7bdce10bf2b54ccc2cb1107282822 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:31:16 +0200 Subject: [PATCH 076/170] Another try... --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index fc2767cc5..e5b002531 100644 --- a/build.ps1 +++ b/build.ps1 @@ -58,7 +58,7 @@ Function PrepareCertificate() { #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force - Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:psw + Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password "$psw" } # Sign the specify file From 8660ee6591a81e3d3bd3716f277b873507771337 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 18:34:27 +0200 Subject: [PATCH 077/170] The password needs to be a secure string, not a string. --- build.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index e5b002531..d894d5003 100644 --- a/build.ps1 +++ b/build.ps1 @@ -57,8 +57,8 @@ Function PrepareCertificate() { $decodedContentBytes | set-content "greenshot.pfx" -encoding byte #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force - Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password "$psw" + $secureString = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force + Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $secureString } # Sign the specify file From 00532fb052a9f11de57fd4508caaa82846062375 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 21:00:25 +0200 Subject: [PATCH 078/170] Trying a different way for the password / certificate. --- appveyor12.yml | 3 +++ build.ps1 | 14 +------------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/appveyor12.yml b/appveyor12.yml index b08dfe989..c465b6993 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -44,6 +44,9 @@ environment: before_build: - nuget restore - ps: .\prebuild.ps1 +- ps: [System.Convert]::FromBase64String($env:CertificatePassword) | set-content "greenshot.pfx" -encoding byte +- ps: $psw = ConvertTo-SecureString $env:my_secure_var -AsPlainText +- ps: Import-PfxCertificate -FilePath Greenshot.pfx -CertStoreLocation cert:\CurrentUser\My -Password $psw build: project: greenshot.sln verbosity: normal diff --git a/build.ps1 b/build.ps1 index d894d5003..2478628a0 100644 --- a/build.ps1 +++ b/build.ps1 @@ -36,6 +36,7 @@ $gitcommit=$env:APPVEYOR_REPO_COMMIT if ( !$gitcommit ) { $gitcommit = "abcdefghijklmnopqrstuvwxy" } + $gitcommit=$gitcommit.SubString(0, [math]::Min($gitcommit.Length, 7)) $detailversion=$version + '-' + $gitcommit + " " + $buildType $release=(([version]$version).build) % 2 -eq 1 @@ -51,16 +52,6 @@ Function MD5($filename) { return [System.BitConverter]::ToString($hash) -replace "-", "" } -# Write the certificate to the file system, so signtool can use it -Function PrepareCertificate() { - $decodedContentBytes = [System.Convert]::FromBase64String($env:Certificate) - $decodedContentBytes | set-content "greenshot.pfx" -encoding byte - #$certutilArguments = @('-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") - #Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow - $secureString = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force - Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $secureString -} - # Sign the specify file Function SignWithCertificate($filename) { Write-Host "Signing $filename" @@ -325,9 +316,6 @@ FillTemplates echo "Generating MD5" MD5Checksums | Set-Content "$(get-location)\Greenshot\bin\Release\checksum.MD5" -encoding UTF8 -echo "Preparing certificate" -PrepareCertificate - echo "Signing executables" SignBinaryFilesBeforeBuildingInstaller From 341e5fd418ff04a58243132122784fdd92479364 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 21:09:42 +0200 Subject: [PATCH 079/170] Fixed variable name --- appveyor12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor12.yml b/appveyor12.yml index c465b6993..cf9feffae 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -45,7 +45,7 @@ before_build: - nuget restore - ps: .\prebuild.ps1 - ps: [System.Convert]::FromBase64String($env:CertificatePassword) | set-content "greenshot.pfx" -encoding byte -- ps: $psw = ConvertTo-SecureString $env:my_secure_var -AsPlainText +- ps: $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText - ps: Import-PfxCertificate -FilePath Greenshot.pfx -CertStoreLocation cert:\CurrentUser\My -Password $psw build: project: greenshot.sln From ae05c71399012b4d98abe66831823511279ad273 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 21:12:51 +0200 Subject: [PATCH 080/170] Change the way the file is written. --- appveyor12.yml | 1 - prebuild.ps1 | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/appveyor12.yml b/appveyor12.yml index cf9feffae..13fa44334 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -44,7 +44,6 @@ environment: before_build: - nuget restore - ps: .\prebuild.ps1 -- ps: [System.Convert]::FromBase64String($env:CertificatePassword) | set-content "greenshot.pfx" -encoding byte - ps: $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText - ps: Import-PfxCertificate -FilePath Greenshot.pfx -CertStoreLocation cert:\CurrentUser\My -Password $psw build: diff --git a/prebuild.ps1 b/prebuild.ps1 index 60d3be684..0390a669c 100644 --- a/prebuild.ps1 +++ b/prebuild.ps1 @@ -44,3 +44,6 @@ Function FillCredentials { } FillCredentials + +# Write the certificate to a file +[System.Convert]::FromBase64String($env:CertificatePassword) | set-content "greenshot.pfx" -encoding byte From 634123df895f7d666148cfbc9d6d293881f03466 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 21:14:31 +0200 Subject: [PATCH 081/170] Added force. --- appveyor12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor12.yml b/appveyor12.yml index 13fa44334..e63671860 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -44,7 +44,7 @@ environment: before_build: - nuget restore - ps: .\prebuild.ps1 -- ps: $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText +- ps: $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force - ps: Import-PfxCertificate -FilePath Greenshot.pfx -CertStoreLocation cert:\CurrentUser\My -Password $psw build: project: greenshot.sln From b8e6cdfb602024caddab06d6b7dfb97aedf47cd4 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 21:47:03 +0200 Subject: [PATCH 082/170] Use wrong var --- prebuild.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebuild.ps1 b/prebuild.ps1 index 0390a669c..8e9161b19 100644 --- a/prebuild.ps1 +++ b/prebuild.ps1 @@ -46,4 +46,4 @@ Function FillCredentials { FillCredentials # Write the certificate to a file -[System.Convert]::FromBase64String($env:CertificatePassword) | set-content "greenshot.pfx" -encoding byte +[System.Convert]::FromBase64String($env:Certificate) | set-content "greenshot.pfx" -encoding byte From 82ea01814b5e1ae9b7054f784b8c411fceabbe0a Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 21:59:18 +0200 Subject: [PATCH 083/170] Found that pw was double encrypted --- prebuild.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/prebuild.ps1 b/prebuild.ps1 index 8e9161b19..920077f62 100644 --- a/prebuild.ps1 +++ b/prebuild.ps1 @@ -47,3 +47,9 @@ FillCredentials # Write the certificate to a file [System.Convert]::FromBase64String($env:Certificate) | set-content "greenshot.pfx" -encoding byte +# Import it +Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword + +# Alternative +# $certutilArguments = @('-f','-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") +# Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow From 4587e7763ee4729480031683a2793000f8b04f57 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 22:12:26 +0200 Subject: [PATCH 084/170] Straightening stuff --- appveyor12.yml | 2 -- prebuild.ps1 | 10 ++++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/appveyor12.yml b/appveyor12.yml index e63671860..b08dfe989 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -44,8 +44,6 @@ environment: before_build: - nuget restore - ps: .\prebuild.ps1 -- ps: $psw = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force -- ps: Import-PfxCertificate -FilePath Greenshot.pfx -CertStoreLocation cert:\CurrentUser\My -Password $psw build: project: greenshot.sln verbosity: normal diff --git a/prebuild.ps1 b/prebuild.ps1 index 920077f62..6d1333950 100644 --- a/prebuild.ps1 +++ b/prebuild.ps1 @@ -47,9 +47,7 @@ FillCredentials # Write the certificate to a file [System.Convert]::FromBase64String($env:Certificate) | set-content "greenshot.pfx" -encoding byte -# Import it -Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $env:CertificatePassword - -# Alternative -# $certutilArguments = @('-f','-p', $env:CertificatePassword, '-importpfx', "greenshot.pfx") -# Start-Process -wait certutil -ArgumentList $certutilArguments -NoNewWindow +# Decode password to secure string +$password = ConvertTo-SecureString $env:CertificatePassword -AsPlainText -Force +# Import pfx +Import-PfxCertificate -FilePath .\Greenshot.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $password From 61cfe004c5954114ea47cfd9c0bf3e1cf0c77987 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 15 Aug 2016 22:41:08 +0200 Subject: [PATCH 085/170] Small fix, md5 should be made AFTER signing the files [skip ci] --- build.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.ps1 b/build.ps1 index 2478628a0..e7aa2bf80 100644 --- a/build.ps1 +++ b/build.ps1 @@ -313,12 +313,12 @@ Function TagCode { FillTemplates -echo "Generating MD5" -MD5Checksums | Set-Content "$(get-location)\Greenshot\bin\Release\checksum.MD5" -encoding UTF8 - echo "Signing executables" SignBinaryFilesBeforeBuildingInstaller +echo "Generating MD5" +MD5Checksums | Set-Content "$(get-location)\Greenshot\bin\Release\checksum.MD5" -encoding UTF8 + echo "Generating Installer" PackageInstaller From 798ca503a57307c84b2c796cfc2a34d1d141a76e Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 16 Aug 2016 10:37:55 +0200 Subject: [PATCH 086/170] Code quality changes [skip ci] --- .../Configuration/EditorConfiguration.cs | 26 +- Greenshot/Configuration/LanguageKeys.cs | 3 + Greenshot/Controls/ColorButton.cs | 6 +- Greenshot/Controls/Pipette.cs | 49 +- Greenshot/Controls/ToolStripColorButton.cs | 6 +- Greenshot/Destinations/FileDestination.cs | 2 +- .../Destinations/FileWithDialogDestination.cs | 5 +- Greenshot/Destinations/PrinterDestination.cs | 6 +- Greenshot/Drawing/Adorners/AbstractAdorner.cs | 1 - Greenshot/Drawing/Adorners/MoveAdorner.cs | 1 - Greenshot/Drawing/Adorners/ResizeAdorner.cs | 1 - Greenshot/Drawing/DrawableContainerList.cs | 1 - .../Fields/AbstractFieldHolderWithChildren.cs | 2 +- .../DecimalDoublePercentageConverter.cs | 2 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 1 - Greenshot/Drawing/Filters/AbstractFilter.cs | 10 +- Greenshot/Drawing/StepLabelContainer.cs | 8 +- Greenshot/Drawing/Surface.cs | 14 +- Greenshot/Forms/ColorDialog.cs | 2 +- Greenshot/Forms/SettingsForm.cs | 3 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 3 +- Greenshot/Helpers/CaptureHelper.cs | 2 +- Greenshot/Helpers/DestinationHelper.cs | 3 +- Greenshot/Helpers/IECaptureHelper.cs | 6 +- Greenshot/Helpers/MailHelper.cs | 2 +- Greenshot/Helpers/SoundHelper.cs | 8 +- Greenshot/Languages/help-de-DE.html | 2 +- Greenshot/Languages/help-es-ES.html | 2 +- Greenshot/Languages/help-it-IT.html | 1 - Greenshot/Languages/help-ru-RU.html | 2 +- Greenshot/Languages/help-sv-SE.html | 2 +- Greenshot/Memento/AddElementMemento.cs | 1 - Greenshot/Memento/DeleteElementMemento.cs | 1 - .../Memento/SurfaceBackgroundChangeMemento.cs | 2 - Greenshot/Memento/TextChangeMemento.cs | 3 +- GreenshotBoxPlugin/BoxConfiguration.cs | 21 +- GreenshotBoxPlugin/BoxPlugin.cs | 10 - GreenshotConfluencePlugin/Confluence.cs | 204 ++-- .../ConfluenceDestination.cs | 8 +- GreenshotConfluencePlugin/ConfluencePlugin.cs | 10 +- GreenshotConfluencePlugin/ConfluenceUtils.cs | 6 +- .../Forms/ConfluencePagePicker.xaml | 2 +- .../Forms/ConfluencePagePicker.xaml.cs | 2 +- .../Forms/ConfluenceSearch.xaml.cs | 2 +- .../Forms/ConfluenceTreePicker.xaml.cs | 4 +- .../Forms/ConfluenceUpload.xaml.cs | 62 +- .../Support/ITranslationProvider.cs | 6 - .../Support/LanguageXMLTranslationProvider.cs | 15 - GreenshotDropboxPlugin/DropboxPlugin.cs | 68 +- .../DropboxPluginConfiguration.cs | 12 +- .../ExternalCommandConfiguration.cs | 20 +- .../ExternalCommandPlugin.cs | 16 +- .../SettingsForm.cs | 6 +- .../SettingsFormDetail.cs | 8 +- GreenshotFlickrPlugin/FlickrConfiguration.cs | 26 +- GreenshotFlickrPlugin/FlickrPlugin.cs | 10 - GreenshotImgurPlugin/Forms/ImgurHistory.cs | 62 +- GreenshotImgurPlugin/ImgurConfiguration.cs | 30 +- GreenshotImgurPlugin/ImgurPlugin.cs | 154 ++- .../Forms/JiraForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/JiraForm.cs | 107 +- GreenshotJiraPlugin/Forms/JiraFormBase.cs | 2 +- .../Forms/SettingsForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.cs | 5 +- GreenshotJiraPlugin/Jira.cs | 265 ++--- GreenshotJiraPlugin/JiraConfiguration.cs | 35 +- GreenshotJiraPlugin/JiraDestination.cs | 59 +- GreenshotJiraPlugin/JiraPlugin.cs | 81 +- GreenshotJiraPlugin/JiraUtils.cs | 29 +- .../Properties/AssemblyInfo.cs | 2 +- .../Web References/JiraSoap/Reference.cs | 983 +++++++++--------- GreenshotOCRCommand/COMWrapper.cs | 208 +--- GreenshotOCRPlugin/OCRConfiguration.cs | 6 +- GreenshotOCRPlugin/OCRPlugin.cs | 5 +- GreenshotOfficePlugin/OfficeConfiguration.cs | 21 +- .../OfficeExport/ExcelExporter.cs | 2 +- .../OfficeExport/OutlookEmailExporter.cs | 38 +- .../OfficeExport/WordExporter.cs | 2 +- GreenshotOfficePlugin/OfficePlugin.cs | 18 +- .../PhotobucketConfiguration.cs | 18 +- .../PhotobucketPlugin.cs | 94 +- .../PhotobucketUtils.cs | 2 +- GreenshotPicasaPlugin/PicasaConfiguration.cs | 7 +- GreenshotPicasaPlugin/PicasaPlugin.cs | 73 +- GreenshotPlugin/Controls/BackgroundForm.cs | 2 +- GreenshotPlugin/Controls/HotkeyControl.cs | 1 - GreenshotPlugin/Core/AbstractDestination.cs | 13 +- GreenshotPlugin/Core/BinaryStructHelper.cs | 2 +- GreenshotPlugin/Core/ClipboardHelper.cs | 8 +- GreenshotPlugin/Core/CoreConfiguration.cs | 180 ++-- GreenshotPlugin/Core/CredentialsHelper.cs | 60 +- GreenshotPlugin/Core/FastBitmap.cs | 301 +++--- GreenshotPlugin/Core/FilenameHelper.cs | 9 +- GreenshotPlugin/Core/ImageHelper.cs | 72 +- GreenshotPlugin/Core/Language.cs | 12 +- GreenshotPlugin/Core/OAuthHelper.cs | 17 +- GreenshotPlugin/Core/PluginUtils.cs | 5 +- GreenshotPlugin/Core/QuantizerHelper.cs | 228 ++-- GreenshotPlugin/Core/WindowsHelper.cs | 44 +- GreenshotPlugin/IniFile/IniConfig.cs | 13 +- GreenshotPlugin/IniFile/IniSection.cs | 2 +- GreenshotPlugin/IniFile/IniValue.cs | 20 +- GreenshotPlugin/Interfaces/Generic.cs | 2 +- GreenshotPlugin/Interfaces/IDestination.cs | 2 +- .../Interfaces/Plugin/PluginInterfaces.cs | 9 +- GreenshotPlugin/Interop/COMWrapper.cs | 213 ++-- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 2 +- .../UnmanagedHelpers/Win32Errors.cs | 3 - 108 files changed, 1981 insertions(+), 2258 deletions(-) diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index 0d74d81cd..1d1fe2df3 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -35,35 +35,35 @@ namespace Greenshot.Configuration { [IniSection("Editor", Description="Greenshot editor configuration")] public class EditorConfiguration : IniSection { [IniProperty("RecentColors", Separator="|", Description="Last used colors")] - public List RecentColors; + public List RecentColors { get; set; } [IniProperty("LastFieldValue", Separator="|", Description="Field values, make sure the last used settings are re-used")] - public Dictionary LastUsedFieldValues; + public Dictionary LastUsedFieldValues { get; set; } [IniProperty("MatchSizeToCapture", Description="Match the editor window size to the capture", DefaultValue="True")] - public bool MatchSizeToCapture; + public bool MatchSizeToCapture { get; set; } [IniProperty("WindowPlacementFlags", Description="Placement flags", DefaultValue="0")] - public WindowPlacementFlags WindowPlacementFlags; + public WindowPlacementFlags WindowPlacementFlags { get; set; } [IniProperty("WindowShowCommand", Description="Show command", DefaultValue="Normal")] - public ShowWindowCommand ShowWindowCommand; + public ShowWindowCommand ShowWindowCommand { get; set; } [IniProperty("WindowMinPosition", Description="Position of minimized window", DefaultValue="-1,-1")] - public Point WindowMinPosition; + public Point WindowMinPosition { get; set; } [IniProperty("WindowMaxPosition", Description="Position of maximized window", DefaultValue="-1,-1")] - public Point WindowMaxPosition; + public Point WindowMaxPosition { get; set; } [IniProperty("WindowNormalPosition", Description="Position of normal window", DefaultValue="100,100,400,400")] - public Rectangle WindowNormalPosition; + public Rectangle WindowNormalPosition { get; set; } [IniProperty("ReuseEditor", Description = "Reuse already open editor", DefaultValue = "false")] - public bool ReuseEditor; + public bool ReuseEditor { get; set; } [IniProperty("FreehandSensitivity", Description = "The smaller this number, the less smoothing is used. Decrease for detailed drawing, e.g. when using a pen. Increase for smoother lines. e.g. when you want to draw a smooth line.", DefaultValue = "3")] - public int FreehandSensitivity; + public int FreehandSensitivity { get; set; } [IniProperty("SuppressSaveDialogAtClose", Description="Suppressed the 'do you want to save' dialog when closing the editor.", DefaultValue="False")] - public bool SuppressSaveDialogAtClose; + public bool SuppressSaveDialogAtClose { get; set; } [IniProperty("DropShadowEffectSettings", Description = "Settings for the drop shadow effect.")] - public DropShadowEffect DropShadowEffectSettings; + public DropShadowEffect DropShadowEffectSettings { get; set; } [IniProperty("TornEdgeEffectSettings", Description = "Settings for the torn edge effect.")] - public TornEdgeEffect TornEdgeEffectSettings; + public TornEdgeEffect TornEdgeEffectSettings { get; set; } public override void AfterLoad() { base.AfterLoad(); diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs index 240fcd3e8..a6c75441a 100644 --- a/Greenshot/Configuration/LanguageKeys.cs +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -19,7 +19,10 @@ * along with this program. If not, see . */ +using System.Diagnostics.CodeAnalysis; + namespace Greenshot.Configuration { + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum LangKey { none, about_bugs, diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index 80e77399c..a0b988ab5 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -31,7 +31,7 @@ namespace Greenshot.Controls { /// public class ColorButton : Button, IGreenshotLanguageBindable { public event PropertyChangedEventHandler PropertyChanged; - private Color selectedColor = Color.White; + private Color _selectedColor = Color.White; [Category("Greenshot"), DefaultValue(null), Description("Specifies key of the language file to use when displaying the text.")] public string LanguageKey { @@ -44,9 +44,9 @@ namespace Greenshot.Controls { } public Color SelectedColor { - get {return selectedColor;} + get {return _selectedColor;} set { - selectedColor = value; + _selectedColor = value; Brush brush; if(value != Color.Transparent) { diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index 179642335..cf91299ad 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -30,22 +30,22 @@ namespace Greenshot.Controls { /// This code was supplied by Hi-Coder as a patch for Greenshot /// Needed some modifications to be stable. /// - public class Pipette : Label, IMessageFilter, IDisposable { - private MovableShowColorForm movableShowColorForm; - private bool dragging; + public sealed class Pipette : Label, IMessageFilter, IDisposable { + private MovableShowColorForm _movableShowColorForm; + private bool _dragging; private Cursor _cursor; private readonly Bitmap _image; - private const int VK_ESC = 27; + private const int VkEsc = 27; public event EventHandler PipetteUsed; public Pipette() { BorderStyle = BorderStyle.FixedSingle; - dragging = false; + _dragging = false; _image = (Bitmap)new ComponentResourceManager(typeof(ColorDialog)).GetObject("pipette.Image"); Image = _image; - _cursor = CreateCursor((Bitmap)_image, 1, 14); - movableShowColorForm = new MovableShowColorForm(); + _cursor = CreateCursor(_image, 1, 14); + _movableShowColorForm = new MovableShowColorForm(); Application.AddMessageFilter(this); } @@ -58,13 +58,12 @@ namespace Greenshot.Controls { /// Cursor private static Cursor CreateCursor(Bitmap bitmap, int hotspotX, int hotspotY) { using (SafeIconHandle iconHandle = new SafeIconHandle( bitmap.GetHicon())) { - IntPtr icon; - IconInfo iconInfo = new IconInfo(); + IconInfo iconInfo; User32.GetIconInfo(iconHandle, out iconInfo); iconInfo.xHotspot = hotspotX; iconInfo.yHotspot = hotspotY; iconInfo.fIcon = false; - icon = User32.CreateIconIndirect(ref iconInfo); + var icon = User32.CreateIconIndirect(ref iconInfo); return new Cursor(icon); } } @@ -85,11 +84,11 @@ namespace Greenshot.Controls { if (_cursor != null) { _cursor.Dispose(); } - if (movableShowColorForm != null) { - movableShowColorForm.Dispose(); + if (_movableShowColorForm != null) { + _movableShowColorForm.Dispose(); } } - movableShowColorForm = null; + _movableShowColorForm = null; _cursor = null; base.Dispose(disposing); } @@ -101,7 +100,7 @@ namespace Greenshot.Controls { protected override void OnMouseDown(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { User32.SetCapture(Handle); - movableShowColorForm.MoveTo(PointToScreen(new Point(e.X, e.Y))); + _movableShowColorForm.MoveTo(PointToScreen(new Point(e.X, e.Y))); } base.OnMouseDown(e); } @@ -117,7 +116,7 @@ namespace Greenshot.Controls { User32.ReleaseCapture(); if (PipetteUsed != null) { - PipetteUsed(this, new PipetteUsedArgs(movableShowColorForm.color)); + PipetteUsed(this, new PipetteUsedArgs(_movableShowColorForm.color)); } } base.OnMouseUp(e); @@ -128,10 +127,10 @@ namespace Greenshot.Controls { /// /// MouseEventArgs protected override void OnMouseMove(MouseEventArgs e) { - if (dragging) { + if (_dragging) { //display the form on the right side of the cursor by default; Point zp = PointToScreen(new Point(e.X, e.Y)); - movableShowColorForm.MoveTo(zp); + _movableShowColorForm.MoveTo(zp); } base.OnMouseMove(e); } @@ -142,16 +141,16 @@ namespace Greenshot.Controls { /// protected override void OnMouseCaptureChanged(EventArgs e) { if (Capture) { - dragging = true; + _dragging = true; Image = null; Cursor c = _cursor; Cursor = c; - movableShowColorForm.Visible = true; + _movableShowColorForm.Visible = true; } else { - dragging = false; + _dragging = false; Image = _image; Cursor = Cursors.Arrow; - movableShowColorForm.Visible = false; + _movableShowColorForm.Visible = false; } Update(); base.OnMouseCaptureChanged(e); @@ -160,9 +159,9 @@ namespace Greenshot.Controls { #region IMessageFilter Members public bool PreFilterMessage(ref Message m) { - if (dragging) { + if (_dragging) { if (m.Msg == (int)WindowsMessages.WM_CHAR) { - if ((int)m.WParam == VK_ESC) { + if ((int)m.WParam == VkEsc) { User32.ReleaseCapture(); } } @@ -174,10 +173,10 @@ namespace Greenshot.Controls { } public class PipetteUsedArgs : EventArgs { - public Color color; + public Color Color; public PipetteUsedArgs(Color c) { - color = c; + Color = c; } } } diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index cbabe38fb..5f29db4aa 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -35,16 +35,16 @@ namespace Greenshot.Controls { set; } - private Color selectedColor = Color.Transparent; + private Color _selectedColor = Color.Transparent; public ToolStripColorButton() { Click+= ColorButtonClick; } public Color SelectedColor { - get {return selectedColor;} + get {return _selectedColor;} set { - selectedColor = value; + _selectedColor = value; Brush brush; if(value != Color.Transparent) { diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 076cb1d67..8a8275274 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -114,7 +114,7 @@ namespace Greenshot.Destinations { } // Don't overwrite filename if no output is made if (outputMade) { - exportInformation.ExportMade = outputMade; + exportInformation.ExportMade = true; exportInformation.Filepath = fullPath; if (captureDetails != null) { diff --git a/Greenshot/Destinations/FileWithDialogDestination.cs b/Greenshot/Destinations/FileWithDialogDestination.cs index cf4733e7f..a12194788 100644 --- a/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/Greenshot/Destinations/FileWithDialogDestination.cs @@ -26,14 +26,12 @@ using Greenshot.Configuration; using GreenshotPlugin.Core; using Greenshot.Plugin; using Greenshot.IniFile; -using log4net; namespace Greenshot.Destinations { /// /// Description of FileWithDialog. /// public class FileWithDialogDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(FileWithDialogDestination)); private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); public const string DESIGNATION = "FileDialog"; @@ -69,9 +67,8 @@ namespace Greenshot.Destinations { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string savedTo = null; // Bug #2918756 don't overwrite path if SaveWithDialog returns null! - savedTo = ImageOutput.SaveWithDialog(surface, captureDetails); + var savedTo = ImageOutput.SaveWithDialog(surface, captureDetails); if (savedTo != null) { exportInformation.ExportMade = true; exportInformation.Filepath = savedTo; diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index 4b584add4..29698a70d 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -35,7 +35,7 @@ namespace Greenshot.Destinations { /// public class PrinterDestination : AbstractDestination { public const string DESIGNATION = "Printer"; - public string printerName; + public readonly string printerName; public PrinterDestination() { } @@ -85,7 +85,7 @@ namespace Greenshot.Destinations { /// /// Create destinations for all the installed printers /// - /// IEnumerable + /// IEnumerable of IDestination public override IEnumerable DynamicDestinations() { PrinterSettings settings = new PrinterSettings(); string defaultPrinter = settings.PrinterName; @@ -117,7 +117,7 @@ namespace Greenshot.Destinations { /// ExportInformation public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - PrinterSettings printerSettings = null; + PrinterSettings printerSettings; if (!string.IsNullOrEmpty(printerName)) { using (PrintHelper printHelper = new PrintHelper(surface, captureDetails)) { printerSettings = printHelper.PrintTo(printerName); diff --git a/Greenshot/Drawing/Adorners/AbstractAdorner.cs b/Greenshot/Drawing/Adorners/AbstractAdorner.cs index 685ec779f..03648a784 100644 --- a/Greenshot/Drawing/Adorners/AbstractAdorner.cs +++ b/Greenshot/Drawing/Adorners/AbstractAdorner.cs @@ -24,7 +24,6 @@ using Greenshot.Plugin.Drawing.Adorners; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; -using System; namespace Greenshot.Drawing.Adorners { diff --git a/Greenshot/Drawing/Adorners/MoveAdorner.cs b/Greenshot/Drawing/Adorners/MoveAdorner.cs index 78e00e2dd..998192a12 100644 --- a/Greenshot/Drawing/Adorners/MoveAdorner.cs +++ b/Greenshot/Drawing/Adorners/MoveAdorner.cs @@ -21,7 +21,6 @@ using Greenshot.Helpers; using Greenshot.Plugin.Drawing; -using Greenshot.Plugin.Drawing.Adorners; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; diff --git a/Greenshot/Drawing/Adorners/ResizeAdorner.cs b/Greenshot/Drawing/Adorners/ResizeAdorner.cs index da536b1f5..325d6de9d 100644 --- a/Greenshot/Drawing/Adorners/ResizeAdorner.cs +++ b/Greenshot/Drawing/Adorners/ResizeAdorner.cs @@ -21,7 +21,6 @@ using Greenshot.Helpers; using Greenshot.Plugin.Drawing; -using Greenshot.Plugin.Drawing.Adorners; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 60a25cf24..35df2644b 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -20,7 +20,6 @@ */ using Greenshot.Configuration; -using Greenshot.Drawing.Fields; using Greenshot.Memento; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index ae610a5fa..a4e5986ee 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -28,7 +28,7 @@ namespace Greenshot.Drawing.Fields { /// /// Basic IFieldHolderWithChildren implementation. Similar to IFieldHolder, - /// but has a List of children. + /// but has a List of IFieldHolder for children. /// Field values are passed to and from children as well. /// [Serializable()] diff --git a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs index d7e92247f..9a0495f56 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs @@ -22,7 +22,7 @@ using System; namespace Greenshot.Drawing.Fields.Binding { /// - /// Converts decimal to double (%) and vice versa, e.g. 95f <---> 0.95d + /// Converts decimal to double (%) and vice versa, e.g. 95f to 0.95d /// public class DecimalDoublePercentageConverter : AbstractBindingConverter { diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 7c2e7558f..748cf8576 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -23,7 +23,6 @@ using Greenshot.Configuration; using Greenshot.IniFile; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; -using GreenshotPlugin.Interfaces; using GreenshotPlugin.Interfaces.Drawing; using log4net; using System.Collections.Generic; diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index af9f8cb9f..e33aa0291 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -25,12 +25,12 @@ using System.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 { + /// + /// Graphical filter which can be added to DrawableContainer. + /// Subclasses should fulfill INotifyPropertyChanged contract, i.e. call + /// OnPropertyChanged whenever a public property has been changed. + /// [Serializable()] public abstract class AbstractFilter : AbstractFieldHolder, IFilter { diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 08f6fbd01..fd1da0091 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -34,7 +34,7 @@ namespace Greenshot.Drawing { /// To make sure that deleting recalculates, we check the location before every draw. /// [Serializable] - public class StepLabelContainer : DrawableContainer { + public sealed class StepLabelContainer : DrawableContainer { [NonSerialized] private StringFormat _stringFormat = new StringFormat(); @@ -103,7 +103,7 @@ namespace Greenshot.Drawing { } base.SwitchParent(newParent); if (newParent != null) { - ((Surface)Parent).AddStepLabel(this); + ((Surface)Parent)?.AddStepLabel(this); } } @@ -207,8 +207,8 @@ namespace Greenshot.Drawing { EllipseContainer.DrawEllipse(rect, graphics, rm, 0, Color.Transparent, fillColor, false); } using (FontFamily fam = new FontFamily(FontFamily.GenericSansSerif.Name)) { - using (Font _font = new Font(fam, fontSize, FontStyle.Bold, GraphicsUnit.Pixel)) { - TextContainer.DrawText(graphics, rect, 0, lineColor, false, _stringFormat, text, _font); + using (Font font = new Font(fam, fontSize, FontStyle.Bold, GraphicsUnit.Pixel)) { + TextContainer.DrawText(graphics, rect, 0, lineColor, false, _stringFormat, text, font); } } } diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 2ec781963..65d4adb35 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -46,7 +46,7 @@ namespace Greenshot.Drawing /// /// Description of Surface. /// - public class Surface : Control, ISurface + public sealed class Surface : Control, ISurface { private static ILog LOG = LogManager.GetLogger(typeof(Surface)); public static int Count = 0; @@ -1609,6 +1609,7 @@ namespace Greenshot.Drawing /// Element to remove /// flag specifying if the remove needs to be undoable /// flag specifying if an surface invalidate needs to be called + /// false to skip event generation public void RemoveElement(IDrawableContainer elementToRemove, bool makeUndoable = true, bool invalidate = true, bool generateEvents = true) { DeselectElement(elementToRemove, generateEvents); @@ -1639,7 +1640,6 @@ namespace Greenshot.Drawing /// /// DrawableContainerList /// true if the adding should be undoable - /// true if invalidate needs to be called public void AddElements(IDrawableContainerList elementsToAdd, bool makeUndoable = true) { // fix potential issues with iterating a changing list @@ -1901,7 +1901,8 @@ namespace Greenshot.Drawing /// /// Deselect the specified element /// - /// + /// IDrawableContainerList + /// false to skip event generation public void DeselectElement(IDrawableContainer container, bool generateEvents = true) { container.Selected = false; @@ -1909,8 +1910,7 @@ namespace Greenshot.Drawing FieldAggregator.UnbindElement(container); if (generateEvents && _movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = selectedElements; + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs {Elements = selectedElements}; _movingElementChanged(this, eventArgs); } } @@ -1918,7 +1918,7 @@ namespace Greenshot.Drawing /// /// Deselect the specified elements /// - /// + /// IDrawableContainerList public void DeselectElements(IDrawableContainerList elements) { if (elements.Count == 0) @@ -1951,6 +1951,8 @@ namespace Greenshot.Drawing /// Select the supplied element /// /// + /// false to skip invalidation + /// false to skip event generation public void SelectElement(IDrawableContainer container, bool invalidate = true, bool generateEvents = true) { if (!selectedElements.Contains(container)) diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index 4891f6124..889b38f7f 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -235,7 +235,7 @@ namespace Greenshot { #endregion private void PipetteUsed(object sender, PipetteUsedArgs e) { - Color = e.color; + Color = e.Color; } } } diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 567185e7b..c881960a0 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -114,7 +114,8 @@ namespace Greenshot { /// with the items from the enumeration /// /// ComboBox to populate - /// Enum to populate with + /// + /// private void PopulateComboBox(ComboBox comboBox, ET[] availableValues, ET selectedValue) where ET : struct { comboBox.Items.Clear(); foreach(ET enumValue in availableValues) { diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index 0b42181cf..ab6ddb071 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -200,12 +200,11 @@ namespace Greenshot.Forms { } - // + /// /// adds an item to the select list /// /// the label to be displayed /// the icon to be displayed - /// whether the item is initially selected /// whether the item is initially checked public void AddItem(string label, Image image, bool isChecked) { AddItem(label, image, null, isChecked); diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index e70685a93..9142cb0df 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -209,7 +209,7 @@ namespace Greenshot.Helpers { /// /// Make Capture for region /// - /// filename + /// Rectangle private void MakeCapture(Rectangle region) { _captureRect = region; MakeCapture(); diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index bdb8ad64c..fd13e3d38 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -75,7 +75,7 @@ namespace Greenshot.Helpers { /// /// Method to get all the destinations from the plugins /// - /// List + /// List of IDestination private static List GetPluginDestinations() { List destinations = new List(); foreach (PluginAttribute pluginAttribute in PluginHelper.Instance.Plugins.Keys) { @@ -130,6 +130,7 @@ namespace Greenshot.Helpers { /// /// A simple helper method which will call ExportCapture for the destination with the specified designation /// + /// /// /// /// diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index 805afb0f1..0511cb05c 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -125,7 +125,7 @@ namespace Greenshot.Helpers { /// /// Gets a list of all IE Windows & tabs with the captions of the instances /// - /// List> + /// List with KeyValuePair of WindowDetails and string public static List> GetBrowserTabs() { List ieHandleList = new List(); Dictionary> browserWindows = new Dictionary>(); @@ -217,7 +217,6 @@ namespace Greenshot.Helpers { /// or return the first if none is supplied. /// /// The WindowDetails to get the IHTMLDocument2 for - /// Ref to the IHTMLDocument2 to return /// The WindowDetails to which the IHTMLDocument2 belongs private static DocumentContainer CreateDocumentContainer(WindowDetails browserWindow) { DocumentContainer returnDocumentContainer = null; @@ -587,8 +586,9 @@ namespace Greenshot.Helpers { /// /// This method takes the actual capture of the document (frame) /// - /// + /// DocumentContainer /// Needed for referencing the location of the frame + /// Graphics /// Bitmap with the capture private static void DrawDocument(DocumentContainer documentContainer, WindowDetails contentWindowDetails, Graphics graphicsTarget) { documentContainer.SetAttribute("scroll", 1); diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index 79d1c0267..f8cb29ae6 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -35,7 +35,7 @@ namespace Greenshot.Helpers { /// /// Author: Andrew Baker /// Datum: 10.03.2006 - /// Available from: http://www.vbusers.com/codecsharp/codeget.asp?ThreadID=71&PostID=1 + /// Available from here /// #region Public MapiMailMessage Class diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index fe36cbb56..1f3d6b8ec 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -27,15 +27,13 @@ using GreenshotPlugin.UnmanagedHelpers; using GreenshotPlugin.Core; using Greenshot.IniFile; using System.IO; -/// -/// Create to fix the sometimes wrongly played sample, especially after first start from IDE -/// See: http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2487569 -/// + using log4net; namespace Greenshot.Helpers { /// - /// Description of SoundHelper. + /// Create to fix the sometimes wrongly played sample, especially after first start from IDE + /// See: http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2487569 /// public static class SoundHelper { private static readonly ILog LOG = LogManager.GetLogger(typeof(SoundHelper)); diff --git a/Greenshot/Languages/help-de-DE.html b/Greenshot/Languages/help-de-DE.html index 8491ba3f2..f2228ee42 100644 --- a/Greenshot/Languages/help-de-DE.html +++ b/Greenshot/Languages/help-de-DE.html @@ -84,7 +84,7 @@

Mit Hilfe der Leertaste können Sie vom Bereichsmodus in den - Fenstermodus wechseln (und umgekehrt). + Fenstermodus wechseln (und umgekehrt).

Wenn Sie einen exakten Bereich abfotografieren, ist es eventuell einfacher, zuerst diff --git a/Greenshot/Languages/help-es-ES.html b/Greenshot/Languages/help-es-ES.html index 43437a96a..e248bd90a 100644 --- a/Greenshot/Languages/help-es-ES.html +++ b/Greenshot/Languages/help-es-ES.html @@ -168,7 +168,7 @@

Usted puede mover o redimensionar formas existentes después de elegir la - Herramienta de Selección ESC desde la barra de herramientas.
Herramienta de Selección ESC desde la barra de herramientas.
Para cada tipo de elemento hay un conjunto específico de opciones disponibles para cambiar la apariencia del elemento (por ej. grosor de la línea, color de la línea, color de relleno). Usted puede cambiar las opciones para un diff --git a/Greenshot/Languages/help-it-IT.html b/Greenshot/Languages/help-it-IT.html index 7d0d69e3b..1d5744287 100644 --- a/Greenshot/Languages/help-it-IT.html +++ b/Greenshot/Languages/help-it-IT.html @@ -335,7 +335,6 @@

  • Stampa con colori inverititi (negativo): Trasformerà l'immagine in negativo prima di stamparla, utile per esempio quando si stampa un'immagine con testo bianco su sfondo nero (per risparmiare toner o inchiostro).
  • Visualizza scelta opzioni di stampa ogni volta che si stampa un'immagine: Permette di scegliere se visualizzare o meno la finestra di scelta opzioni per le stampe successive alla prima.
  • -

    Impostazioni Componenti Aggiuntivi

    diff --git a/Greenshot/Languages/help-ru-RU.html b/Greenshot/Languages/help-ru-RU.html index f04d2548d..33eb7d114 100644 --- a/Greenshot/Languages/help-ru-RU.html +++ b/Greenshot/Languages/help-ru-RU.html @@ -23,7 +23,7 @@ - Version 0.8

    Содержание

      diff --git a/Greenshot/Languages/help-sv-SE.html b/Greenshot/Languages/help-sv-SE.html index 5225f0797..cdff974f1 100644 --- a/Greenshot/Languages/help-sv-SE.html +++ b/Greenshot/Languages/help-sv-SE.html @@ -316,7 +316,7 @@ Som standard lter Greenshot dig vlja en destination dynamiskt efter en skrmdump, genom att visa en liten meny med olika destinationer att vlja mellan. Om du inte vill eller behver vlja mellan destinationer direkt kanske du fredrar att konfigurera Greenshot till att exportera till en eller fler destinationer direkt, utan att visa destinationsvljaren.

      - Liksom exportering frn redigerarfnstret kommer de visade destinationerna variera baserat p de insticksprogram du har installerade med Greenshot. + Liksom exportering frn redigerarfnstret kommer de visade destinationerna variera baserat p de insticksprogram du har installerade med Greenshot.

      diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 493539bb7..873408071 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -19,7 +19,6 @@ * along with this program. If not, see . */ using System; -using Greenshot.Configuration; using Greenshot.Drawing; using Greenshot.Plugin.Drawing; diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index ed7350243..e73700901 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -19,7 +19,6 @@ * along with this program. If not, see . */ using System; -using Greenshot.Configuration; using Greenshot.Drawing; using Greenshot.Plugin.Drawing; diff --git a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs index 13b3da9ea..ae5c2e07f 100644 --- a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs +++ b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs @@ -19,9 +19,7 @@ * along with this program. If not, see . */ -using Greenshot.Configuration; using Greenshot.Drawing; -using System; using System.Drawing; using System.Drawing.Drawing2D; diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index 973f59c94..dab958704 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -18,9 +18,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -using System; + using Greenshot.Drawing; -using Greenshot.Configuration; namespace Greenshot.Memento { /// diff --git a/GreenshotBoxPlugin/BoxConfiguration.cs b/GreenshotBoxPlugin/BoxConfiguration.cs index 5c42cb1a5..1707b1080 100644 --- a/GreenshotBoxPlugin/BoxConfiguration.cs +++ b/GreenshotBoxPlugin/BoxConfiguration.cs @@ -31,30 +31,21 @@ namespace GreenshotBoxPlugin { [IniSection("Box", Description = "Greenshot Box Plugin configuration")] public class BoxConfiguration : IniSection { [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("AfterUploadLinkToClipBoard", Description = "After upload send Box link to clipboard.", DefaultValue = "true")] - public bool AfterUploadLinkToClipBoard; + public bool AfterUploadLinkToClipBoard { get; set; } [IniProperty("UseSharedLink", Description = "Use the shared link, instead of the private, on the clipboard", DefaultValue = "True")] - public bool UseSharedLink { - get; - set; - } + public bool UseSharedLink { get; set; } [IniProperty("FolderId", Description = "Folder ID to upload to, only change if you know what you are doing!", DefaultValue = "0")] - public string FolderId { - get; - set; - } + public string FolderId { get; set; } [IniProperty("RefreshToken", Description = "Box authorization refresh Token", Encrypted = true)] - public string RefreshToken { - get; - set; - } + public string RefreshToken { get; set; } /// /// Not stored diff --git a/GreenshotBoxPlugin/BoxPlugin.cs b/GreenshotBoxPlugin/BoxPlugin.cs index 6131a4654..2e8a40719 100644 --- a/GreenshotBoxPlugin/BoxPlugin.cs +++ b/GreenshotBoxPlugin/BoxPlugin.cs @@ -105,16 +105,6 @@ namespace GreenshotBoxPlugin { _config.ShowConfigDialog(); } - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Box Plugin!"); - Shutdown(); - } - public void ConfigMenuClick(object sender, EventArgs eventArgs) { _config.ShowConfigDialog(); } diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 8b4f3958b..128e30e01 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -26,22 +26,18 @@ using GreenshotConfluencePlugin; using GreenshotConfluencePlugin.confluence; using GreenshotPlugin.Core; -/// -/// For details see the Confluence API site -/// See: http://confluence.atlassian.com/display/CONFDEV/Remote+API+Specification -/// namespace Confluence { #region transport classes public class Page { public Page(RemotePage page) { - id = page.id; + Id = page.id; Title = page.title; SpaceKey = page.space; Url = page.url; Content = page.content; } public Page(RemoteSearchResult searchResult, string space) { - id = searchResult.id; + Id = searchResult.id; Title = searchResult.title; SpaceKey = space; Url = searchResult.url; @@ -49,12 +45,12 @@ namespace Confluence { } public Page(RemotePageSummary pageSummary) { - id = pageSummary.id; + Id = pageSummary.id; Title = pageSummary.title; SpaceKey = pageSummary.space; Url =pageSummary.url; } - public long id { + public long Id { get; set; } @@ -91,46 +87,52 @@ namespace Confluence { } #endregion + /// + /// For details see the Confluence API site + /// See: http://confluence.atlassian.com/display/CONFDEV/Remote+API+Specification + /// public class ConfluenceConnector : IDisposable { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceConnector)); - private const string AUTH_FAILED_EXCEPTION_NAME = "com.atlassian.confluence.rpc.AuthenticationFailedException"; - private const string V2_FAILED = "AXIS"; - private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection(); - private string credentials = null; - private DateTime loggedInTime = DateTime.Now; - private bool loggedIn = false; - private ConfluenceSoapServiceService confluence; - private readonly int timeout; - private string url; - private readonly Cache pageCache = new Cache(60 * config.Timeout); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ConfluenceConnector)); + private const string AuthFailedExceptionName = "com.atlassian.confluence.rpc.AuthenticationFailedException"; + private const string V2Failed = "AXIS"; + private static readonly ConfluenceConfiguration Config = IniConfig.GetIniSection(); + private string _credentials; + private DateTime _loggedInTime = DateTime.Now; + private bool _loggedIn; + private ConfluenceSoapServiceService _confluence; + private readonly int _timeout; + private string _url; + private readonly Cache _pageCache = new Cache(60 * Config.Timeout); public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) { - if (confluence != null) { - logout(); + protected void Dispose(bool disposing) { + if (_confluence != null) { + Logout(); } if (disposing) { - if (confluence != null) { - confluence.Dispose(); - confluence = null; + if (_confluence != null) { + _confluence.Dispose(); + _confluence = null; } } } public ConfluenceConnector(string url, int timeout) { - this.timeout = timeout; - init(url); + _timeout = timeout; + Init(url); } - private void init(string url) { - this.url = url; - confluence = new ConfluenceSoapServiceService(); - confluence.Url = url; - confluence.Proxy = NetworkHelper.CreateProxy(new Uri(url)); + private void Init(string url) { + _url = url; + _confluence = new ConfluenceSoapServiceService + { + Url = url, + Proxy = NetworkHelper.CreateProxy(new Uri(url)) + }; } ~ConfluenceConnector() { @@ -141,41 +143,43 @@ namespace Confluence { /// Internal login which catches the exceptions /// /// true if login was done sucessfully - private bool doLogin(string user, string password) { + private bool DoLogin(string user, string password) { try { - credentials = confluence.login(user, password); - loggedInTime = DateTime.Now; - loggedIn = true; + _credentials = _confluence.login(user, password); + _loggedInTime = DateTime.Now; + _loggedIn = true; } catch (Exception e) { // Check if confluence-v2 caused an error, use v1 instead - if (e.Message.Contains(V2_FAILED) && url.Contains("v2")) { - init(url.Replace("v2", "v1")); - return doLogin(user, password); + if (e.Message.Contains(V2Failed) && _url.Contains("v2")) { + Init(_url.Replace("v2", "v1")); + return DoLogin(user, password); } // check if auth failed - if (e.Message.Contains(AUTH_FAILED_EXCEPTION_NAME)) { + if (e.Message.Contains(AuthFailedExceptionName)) { return false; } // Not an authentication issue - loggedIn = false; - credentials = null; + _loggedIn = false; + _credentials = null; e.Data.Add("user", user); - e.Data.Add("url", url); + e.Data.Add("url", _url); throw; } return true; } - public void login() { - logout(); + public void Login() { + Logout(); try { // Get the system name, so the user knows where to login to - string systemName = url.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX1,""); - systemName = url.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX2, ""); - CredentialsDialog dialog = new CredentialsDialog(systemName); - dialog.Name = null; + string systemName = _url.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX1,""); + systemName = systemName.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX2, ""); + CredentialsDialog dialog = new CredentialsDialog(systemName) + { + Name = null + }; while (dialog.Show(dialog.Name) == DialogResult.OK) { - if (doLogin(dialog.Name, dialog.Password)) { + if (DoLogin(dialog.Name, dialog.Password)) { if (dialog.SaveChecked) { dialog.Confirm(true); } @@ -185,7 +189,7 @@ namespace Confluence { dialog.Confirm(false); } catch (ApplicationException e) { // exception handling ... - LOG.Error("Problem using the credentials dialog", e); + Log.Error("Problem using the credentials dialog", e); } // For every windows version after XP show an incorrect password baloon dialog.IncorrectPassword = true; @@ -195,119 +199,119 @@ namespace Confluence { } } catch (ApplicationException e) { // exception handling ... - LOG.Error("Problem using the credentials dialog", e); + Log.Error("Problem using the credentials dialog", e); } } - public void logout() { - if (credentials != null) { - confluence.logout(credentials); - credentials = null; - loggedIn = false; + public void Logout() { + if (_credentials != null) { + _confluence.logout(_credentials); + _credentials = null; + _loggedIn = false; } } - private void checkCredentials() { - if (loggedIn) { - if (loggedInTime.AddMinutes(timeout-1).CompareTo(DateTime.Now) < 0) { - logout(); - login(); + private void CheckCredentials() { + if (_loggedIn) { + if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) { + Logout(); + Login(); } } else { - login(); + Login(); } } - public bool isLoggedIn { + public bool IsLoggedIn { get { - return loggedIn; + return _loggedIn; } } - public void addAttachment(long pageId, string mime, string comment, string filename, IBinaryContainer image) { - checkCredentials(); + public void AddAttachment(long pageId, string mime, string comment, string filename, IBinaryContainer image) { + CheckCredentials(); RemoteAttachment attachment = new RemoteAttachment(); // Comment is ignored, see: http://jira.atlassian.com/browse/CONF-9395 attachment.comment = comment; attachment.fileName = filename; attachment.contentType = mime; - confluence.addAttachment(credentials, pageId, attachment, image.ToByteArray()); + _confluence.addAttachment(_credentials, pageId, attachment, image.ToByteArray()); } - public Page getPage(string spaceKey, string pageTitle) { + public Page GetPage(string spaceKey, string pageTitle) { RemotePage page = null; string cacheKey = spaceKey + pageTitle; - if (pageCache.Contains(cacheKey)) { - page = pageCache[cacheKey]; + if (_pageCache.Contains(cacheKey)) { + page = _pageCache[cacheKey]; } if (page == null) { - checkCredentials(); - page = confluence.getPage(credentials, spaceKey, pageTitle); - pageCache.Add(cacheKey, page); + CheckCredentials(); + page = _confluence.getPage(_credentials, spaceKey, pageTitle); + _pageCache.Add(cacheKey, page); } return new Page(page); } - public Page getPage(long pageId) { + public Page GetPage(long pageId) { RemotePage page = null; string cacheKey = "" + pageId; - if (pageCache.Contains(cacheKey)) { - page = pageCache[cacheKey]; + if (_pageCache.Contains(cacheKey)) { + page = _pageCache[cacheKey]; } if (page == null) { - checkCredentials(); - page = confluence.getPage(credentials, pageId); - pageCache.Add(cacheKey, page); + CheckCredentials(); + page = _confluence.getPage(_credentials, pageId); + _pageCache.Add(cacheKey, page); } return new Page(page); } - public Page getSpaceHomepage(Space spaceSummary) { - checkCredentials(); - RemoteSpace spaceDetail = confluence.getSpace(credentials, spaceSummary.Key); - RemotePage page = confluence.getPage(credentials, spaceDetail.homePage); + public Page GetSpaceHomepage(Space spaceSummary) { + CheckCredentials(); + RemoteSpace spaceDetail = _confluence.getSpace(_credentials, spaceSummary.Key); + RemotePage page = _confluence.getPage(_credentials, spaceDetail.homePage); return new Page(page); } - public List getSpaceSummaries() { - checkCredentials(); - RemoteSpaceSummary [] spaces = confluence.getSpaces(credentials); + public List GetSpaceSummaries() { + CheckCredentials(); + RemoteSpaceSummary [] spaces = _confluence.getSpaces(_credentials); List returnSpaces = new List(); foreach(RemoteSpaceSummary space in spaces) { returnSpaces.Add(new Space(space)); } - returnSpaces.Sort((x, y) => string.Compare(x.Name, y.Name)); + returnSpaces.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name)); return returnSpaces; } - public List getPageChildren(Page parentPage) { - checkCredentials(); + public List GetPageChildren(Page parentPage) { + CheckCredentials(); List returnPages = new List(); - RemotePageSummary[] pages = confluence.getChildren(credentials, parentPage.id); + RemotePageSummary[] pages = _confluence.getChildren(_credentials, parentPage.Id); foreach(RemotePageSummary page in pages) { returnPages.Add(new Page(page)); } - returnPages.Sort((x, y) => string.Compare(x.Title, y.Title)); + returnPages.Sort((x, y) => string.CompareOrdinal(x.Title, y.Title)); return returnPages; } - public List getPageSummaries(Space space) { - checkCredentials(); + public List GetPageSummaries(Space space) { + CheckCredentials(); List returnPages = new List(); - RemotePageSummary[] pages = confluence.getPages(credentials, space.Key); + RemotePageSummary[] pages = _confluence.getPages(_credentials, space.Key); foreach(RemotePageSummary page in pages) { returnPages.Add(new Page(page)); } - returnPages.Sort((x, y) => string.Compare(x.Title, y.Title)); + returnPages.Sort((x, y) => string.CompareOrdinal(x.Title, y.Title)); return returnPages; } - public List searchPages(string query, string space) { - checkCredentials(); + public List SearchPages(string query, string space) { + CheckCredentials(); List results = new List(); - foreach(RemoteSearchResult searchResult in confluence.search(credentials, query, 20)) { - LOG.DebugFormat("Got result of type {0}", searchResult.type); + foreach(RemoteSearchResult searchResult in _confluence.search(_credentials, query, 20)) { + Log.DebugFormat("Got result of type {0}", searchResult.type); if ("page".Equals(searchResult.type)) { results.Add(new Page(searchResult, space)); } diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 8765ecba9..18612c525 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -102,7 +102,7 @@ namespace GreenshotConfluencePlugin { } public override IEnumerable DynamicDestinations() { - if (ConfluencePlugin.ConfluenceConnectorNoLogin == null || !ConfluencePlugin.ConfluenceConnectorNoLogin.isLoggedIn) { + if (ConfluencePlugin.ConfluenceConnectorNoLogin == null || !ConfluencePlugin.ConfluenceConnectorNoLogin.IsLoggedIn) { yield break; } List currentPages = ConfluenceUtils.GetCurrentPages(); @@ -117,7 +117,7 @@ namespace GreenshotConfluencePlugin { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); // force password check to take place before the pages load - if (!ConfluencePlugin.ConfluenceConnector.isLoggedIn) { + if (!ConfluencePlugin.ConfluenceConnector.IsLoggedIn) { return exportInformation; } @@ -129,7 +129,7 @@ namespace GreenshotConfluencePlugin { Nullable dialogResult = confluenceUpload.ShowDialog(); if (dialogResult.HasValue && dialogResult.Value) { selectedPage = confluenceUpload.SelectedPage; - if (confluenceUpload.isOpenPageSelected) { + if (confluenceUpload.IsOpenPageSelected) { openPage = false; } filename = confluenceUpload.Filename; @@ -164,7 +164,7 @@ namespace GreenshotConfluencePlugin { try { new PleaseWaitForm().ShowAndWait(Description, Language.GetString("confluence", LangKey.communication_wait), delegate() { - ConfluencePlugin.ConfluenceConnector.addAttachment(page.id, "image/" + config.UploadFormat.ToString().ToLower(), null, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + ConfluencePlugin.ConfluenceConnector.AddAttachment(page.Id, "image/" + config.UploadFormat.ToString().ToLower(), null, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); } ); LOG.Debug("Uploaded to Confluence."); diff --git a/GreenshotConfluencePlugin/ConfluencePlugin.cs b/GreenshotConfluencePlugin/ConfluencePlugin.cs index c8a86ec20..4f1c7224e 100644 --- a/GreenshotConfluencePlugin/ConfluencePlugin.cs +++ b/GreenshotConfluencePlugin/ConfluencePlugin.cs @@ -68,8 +68,8 @@ namespace GreenshotConfluencePlugin { CreateConfluenceConntector(); } try { - if (_confluenceConnector != null && !_confluenceConnector.isLoggedIn) { - _confluenceConnector.login(); + if (_confluenceConnector != null && !_confluenceConnector.IsLoggedIn) { + _confluenceConnector.Login(); } } catch (Exception e) { MessageBox.Show(Language.GetFormattedString("confluence", LangKey.login_error, e.Message)); @@ -112,7 +112,7 @@ namespace GreenshotConfluencePlugin { public virtual void Shutdown() { LOG.Debug("Confluence Plugin shutdown."); if (_confluenceConnector != null) { - _confluenceConnector.logout(); + _confluenceConnector.Logout(); _confluenceConnector = null; } } @@ -131,8 +131,8 @@ namespace GreenshotConfluencePlugin { IniConfig.Save(); if (_confluenceConnector != null) { if (!url.Equals(_config.Url)) { - if (_confluenceConnector.isLoggedIn) { - _confluenceConnector.logout(); + if (_confluenceConnector.IsLoggedIn) { + _confluenceConnector.Logout(); } _confluenceConnector = null; } diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index f7d95c145..6f699e8f1 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -50,14 +50,14 @@ namespace GreenshotConfluencePlugin { try { bool pageDouble = false; foreach(Confluence.Page page in pages) { - if (page.id == pageId) { + if (page.Id == pageId) { pageDouble = true; LOG.DebugFormat("Skipping double page with ID {0}", pageId); break; } } if (!pageDouble) { - Confluence.Page page = ConfluencePlugin.ConfluenceConnector.getPage(pageId); + Confluence.Page page = ConfluencePlugin.ConfluenceConnector.GetPage(pageId); LOG.DebugFormat("Adding page {0}", page.Title); pages.Add(page); } @@ -89,7 +89,7 @@ namespace GreenshotConfluencePlugin { } } if (!pageDouble) { - Confluence.Page page = ConfluencePlugin.ConfluenceConnector.getPage(space, title); + Confluence.Page page = ConfluencePlugin.ConfluenceConnector.GetPage(space, title); LOG.DebugFormat("Adding page {0}", page.Title); pages.Add(page); diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml index 4fe9f18e6..6455e86b5 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml @@ -1,7 +1,7 @@  + Loaded="Page_Loaded"> diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index 31c236cf3..5eb08f4eb 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -44,7 +44,7 @@ namespace GreenshotConfluencePlugin { if (PageListView.HasItems && PageListView.SelectedItems.Count > 0) { confluenceUpload.SelectedPage = (Page)PageListView.SelectedItem; // Make sure the uploader knows we selected an already opened page - confluenceUpload.isOpenPageSelected = true; + confluenceUpload.IsOpenPageSelected = true; } else { confluenceUpload.SelectedPage = null; } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index 2f7f59362..01b6e0526 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -77,7 +77,7 @@ namespace GreenshotConfluencePlugin { void doSearch() { string spaceKey = (string)SpaceComboBox.SelectedValue; config.SearchSpaceKey = spaceKey; - List searchResult = ConfluencePlugin.ConfluenceConnector.searchPages(searchText.Text, spaceKey); + List searchResult = ConfluencePlugin.ConfluenceConnector.SearchPages(searchText.Text, spaceKey); pages.Clear(); foreach(Confluence.Page page in searchResult) { pages.Add(page); diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index 214c1f315..36d32ec7d 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -58,7 +58,7 @@ namespace GreenshotConfluencePlugin { LOG.Debug("Loading pages for page: " + page.Title); (new Thread(() => { Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {ShowBusy.Visibility = Visibility.Visible;})); - List pages = confluenceConnector.getPageChildren(page); + List pages = confluenceConnector.GetPageChildren(page); Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => { foreach(Confluence.Page childPage in pages) { LOG.Debug("Adding page: " + childPage.Title); @@ -105,7 +105,7 @@ namespace GreenshotConfluencePlugin { // Get homepage try { - Confluence.Page page = confluenceConnector.getSpaceHomepage(space); + Confluence.Page page = confluenceConnector.GetSpaceHomepage(space); TreeViewItem pageTreeViewItem = new TreeViewItem(); pageTreeViewItem.Header = page.Title; pageTreeViewItem.Tag = page; diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index d9783fc6e..026990847 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -29,56 +29,56 @@ namespace GreenshotConfluencePlugin { /// Interaction logic for ConfluenceUpload.xaml /// public partial class ConfluenceUpload : Window { - private Page pickerPage = null; + private Page _pickerPage; public Page PickerPage { get { - if (pickerPage == null) { + if (_pickerPage == null) { List pages = ConfluenceUtils.GetCurrentPages(); if (pages != null && pages.Count > 0) { - pickerPage = new ConfluencePagePicker(this, pages); + _pickerPage = new ConfluencePagePicker(this, pages); } } - return pickerPage; + return _pickerPage; } } - private Page searchPage = null; + private Page _searchPage; public Page SearchPage { get { - if (searchPage == null) { - searchPage = new ConfluenceSearch(this); + if (_searchPage == null) { + _searchPage = new ConfluenceSearch(this); } - return searchPage; + return _searchPage; } } - private Page browsePage = null; + private Page _browsePage; public Page BrowsePage { get { - if (browsePage == null) { - browsePage = new ConfluenceTreePicker(this); + if (_browsePage == null) { + _browsePage = new ConfluenceTreePicker(this); } - return browsePage; + return _browsePage; } } - private Confluence.Page selectedPage = null; + private Confluence.Page _selectedPage; public Confluence.Page SelectedPage { get { - return selectedPage; + return _selectedPage; } set { - selectedPage = value; - if (selectedPage != null) { + _selectedPage = value; + if (_selectedPage != null) { Upload.IsEnabled = true; } else { Upload.IsEnabled = false; } - isOpenPageSelected = false; + IsOpenPageSelected = false; } } - public bool isOpenPageSelected { + public bool IsOpenPageSelected { get; set; } @@ -87,39 +87,39 @@ namespace GreenshotConfluencePlugin { set; } - private static DateTime lastLoad = DateTime.Now; - private static List spaces; + private static DateTime _lastLoad = DateTime.Now; + private static List _spaces; public List Spaces { get { - updateSpaces(); - while (spaces == null) { + UpdateSpaces(); + while (_spaces == null) { Thread.Sleep(300); } - return spaces; + return _spaces; } } public ConfluenceUpload(string filename) { Filename = filename; InitializeComponent(); - this.DataContext = this; - updateSpaces(); + DataContext = this; + UpdateSpaces(); if (PickerPage == null) { PickerTab.Visibility = Visibility.Collapsed; SearchTab.IsSelected = true; } } - void updateSpaces() { - if (spaces != null && DateTime.Now.AddMinutes(-60).CompareTo(lastLoad) > 0) { + void UpdateSpaces() { + if (_spaces != null && DateTime.Now.AddMinutes(-60).CompareTo(_lastLoad) > 0) { // Reset - spaces = null; + _spaces = null; } // Check if load is needed - if (spaces == null) { + if (_spaces == null) { (new Thread(() => { - spaces = ConfluencePlugin.ConfluenceConnector.getSpaceSummaries(); - lastLoad = DateTime.Now; + _spaces = ConfluencePlugin.ConfluenceConnector.GetSpaceSummaries(); + _lastLoad = DateTime.Now; }) { Name = "Loading spaces for confluence"}).Start(); } } diff --git a/GreenshotConfluencePlugin/Support/ITranslationProvider.cs b/GreenshotConfluencePlugin/Support/ITranslationProvider.cs index a19c27fd8..79efd538c 100644 --- a/GreenshotConfluencePlugin/Support/ITranslationProvider.cs +++ b/GreenshotConfluencePlugin/Support/ITranslationProvider.cs @@ -6,11 +6,5 @@ /// The key. /// object Translate(string key); - - /// - /// Gets the available languages. - /// - /// The available languages. - //IEnumerable Languages { get; } } } diff --git a/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs b/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs index f3ebcaca0..72a94da31 100644 --- a/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs +++ b/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs @@ -34,20 +34,5 @@ namespace TranslationByMarkupExtension { } #endregion - - #region ITranslationProvider Members - - /// - /// See - /// - /*public IEnumerable Languages { - get { - foreach (LanguageFile supportedLanguage in Language.SupportedLanguages) { - yield return new CultureInfo(supportedLanguage.Ietf); - } - } - }*/ - - #endregion } } diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index 4fd1dd01c..2f22c0b4e 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -34,12 +34,12 @@ namespace GreenshotDropboxPlugin { /// This is the Dropbox base code /// public class DropboxPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DropboxPlugin)); - private static DropboxPluginConfiguration config; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(DropboxPlugin)); + private static DropboxPluginConfiguration _config; public static PluginAttribute Attributes; - private IGreenshotHost host; - private ComponentResourceManager resources; - private ToolStripMenuItem itemPlugInConfig; + private IGreenshotHost _host; + private ComponentResourceManager _resources; + private ToolStripMenuItem _itemPlugInConfig; public void Dispose() { Dispose(true); @@ -48,9 +48,9 @@ namespace GreenshotDropboxPlugin { protected virtual void Dispose(bool disposing) { if (disposing) { - if (itemPlugInConfig != null) { - itemPlugInConfig.Dispose(); - itemPlugInConfig = null; + if (_itemPlugInConfig != null) { + _itemPlugInConfig.Dispose(); + _itemPlugInConfig = null; } } } @@ -70,56 +70,48 @@ namespace GreenshotDropboxPlugin { /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - host = (IGreenshotHost)pluginHost; + _host = pluginHost; Attributes = myAttributes; // Register configuration (don't need the configuration itself) - config = IniConfig.GetIniSection(); - resources = new ComponentResourceManager(typeof(DropboxPlugin)); + _config = IniConfig.GetIniSection(); + _resources = new ComponentResourceManager(typeof(DropboxPlugin)); - itemPlugInConfig = new ToolStripMenuItem(); - itemPlugInConfig.Text = Language.GetString("dropbox", LangKey.Configure); - itemPlugInConfig.Tag = host; - itemPlugInConfig.Click += new EventHandler(ConfigMenuClick); - itemPlugInConfig.Image = (Image)resources.GetObject("Dropbox"); + _itemPlugInConfig = new ToolStripMenuItem + { + Text = Language.GetString("dropbox", LangKey.Configure), + Tag = _host, + Image = (Image)_resources.GetObject("Dropbox") + }; + _itemPlugInConfig.Click += ConfigMenuClick; - PluginUtils.AddToContextMenu(host, itemPlugInConfig); - Language.LanguageChanged += new LanguageChangedHandler(OnLanguageChanged); + PluginUtils.AddToContextMenu(_host, _itemPlugInConfig); + Language.LanguageChanged += OnLanguageChanged; return true; } public void OnLanguageChanged(object sender, EventArgs e) { - if (itemPlugInConfig != null) { - itemPlugInConfig.Text = Language.GetString("dropbox", LangKey.Configure); + if (_itemPlugInConfig != null) { + _itemPlugInConfig.Text = Language.GetString("dropbox", LangKey.Configure); } } public virtual void Shutdown() { - LOG.Debug("Dropbox Plugin shutdown."); + Log.Debug("Dropbox Plugin shutdown."); } /// /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - config.ShowConfigDialog(); - } - - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Dropbox Plugin!"); - Shutdown(); + _config.ShowConfigDialog(); } public void ConfigMenuClick(object sender, EventArgs eventArgs) { - config.ShowConfigDialog(); + _config.ShowConfigDialog(); } /// @@ -127,12 +119,12 @@ namespace GreenshotDropboxPlugin { /// public bool Upload(ICaptureDetails captureDetails, ISurface surfaceToUpload, out string uploadUrl) { uploadUrl = null; - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality, false); + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(_config.UploadFormat, _config.UploadJpegQuality, false); try { string dropboxUrl = null; new PleaseWaitForm().ShowAndWait(Attributes.Name, Language.GetString("dropbox", LangKey.communication_wait), delegate() { - string filename = Path.GetFileName(FilenameHelper.GetFilename(config.UploadFormat, captureDetails)); + string filename = Path.GetFileName(FilenameHelper.GetFilename(_config.UploadFormat, captureDetails)); dropboxUrl = DropboxUtils.UploadToDropbox(surfaceToUpload, outputSettings, filename); } ); @@ -142,7 +134,7 @@ namespace GreenshotDropboxPlugin { uploadUrl = dropboxUrl; return true; } catch (Exception e) { - LOG.Error(e); + Log.Error(e); MessageBox.Show(Language.GetString("dropbox", LangKey.upload_failure) + " " + e.Message); return false; } diff --git a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs index 2d75754ad..57199fc17 100644 --- a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs +++ b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs @@ -30,19 +30,19 @@ namespace GreenshotDropboxPlugin { [IniSection("Dropbox", Description = "Greenshot Dropbox Plugin configuration")] public class DropboxPluginConfiguration : IniSection { [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("AfterUploadLinkToClipBoard", Description = "After upload send Dropbox link to clipboard.", DefaultValue = "true")] - public bool AfterUploadLinkToClipBoard; + public bool AfterUploadLinkToClipBoard { get; set; } [IniProperty("DropboxToken", Description = "The Dropbox token", Encrypted = true, ExcludeIfNull = true)] - public string DropboxToken; + public string DropboxToken { get; set; } [IniProperty("DropboxTokenSecret", Description = "The Dropbox token secret", Encrypted = true, ExcludeIfNull = true)] - public string DropboxTokenSecret; - + public string DropboxTokenSecret { get; set; } + /// /// A form for token /// diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index 3536083de..af223ebde 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -31,34 +31,34 @@ namespace ExternalCommand { [IniSection("ExternalCommand", Description="Greenshot ExternalCommand Plugin configuration")] public class ExternalCommandConfiguration : IniSection { [IniProperty("Commands", Description="The commands that are available.")] - public List commands; + public List Commands { get; set; } [IniProperty("RedirectStandardError", Description = "Redirect the standard error of all external commands, used to output as warning to the greenshot.log.", DefaultValue = "true")] - public bool RedirectStandardError; + public bool RedirectStandardError { get; set; } [IniProperty("RedirectStandardOutput", Description = "Redirect the standard output of all external commands, used for different other functions (more below).", DefaultValue = "true")] - public bool RedirectStandardOutput; + public bool RedirectStandardOutput { get; set; } [IniProperty("ShowStandardOutputInLog", Description = "Depends on 'RedirectStandardOutput': Show standard output of all external commands to the Greenshot log, this can be usefull for debugging.", DefaultValue = "false")] - public bool ShowStandardOutputInLog; + public bool ShowStandardOutputInLog { get; set; } [IniProperty("ParseForUri", Description = "Depends on 'RedirectStandardOutput': Parse the output and take the first found URI, if a URI is found than clicking on the notify bubble goes there.", DefaultValue = "true")] - public bool ParseOutputForUri; + public bool ParseOutputForUri { get; set; } [IniProperty("OutputToClipboard", Description = "Depends on 'RedirectStandardOutput': Place the standard output on the clipboard.", DefaultValue = "false")] - public bool OutputToClipboard; + public bool OutputToClipboard { get; set; } [IniProperty("UriToClipboard", Description = "Depends on 'RedirectStandardOutput' & 'ParseForUri': If an URI is found in the standard input, place it on the clipboard. (This overwrites the output from OutputToClipboard setting.)", DefaultValue = "true")] - public bool UriToClipboard; + public bool UriToClipboard { get; set; } [IniProperty("Commandline", Description="The commandline for the output command.")] - public Dictionary commandlines; + public Dictionary commandlines { get; set; } [IniProperty("Argument", Description="The arguments for the output command.")] - public Dictionary arguments; + public Dictionary arguments { get; set; } [IniProperty("RunInbackground", Description = "Should the command be started in the background.")] - public Dictionary runInbackground; + public Dictionary runInbackground { get; set; } private const string MSPAINT = "MS Paint"; private static readonly string paintPath; diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index b6f785e5d..c74ebd15d 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -55,7 +55,7 @@ namespace ExternalCommand { } public IEnumerable Destinations() { - foreach(string command in config.commands) { + foreach(string command in config.Commands) { yield return new ExternalCommandDestination(command); } } @@ -96,15 +96,14 @@ namespace ExternalCommand { /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// Use the ICaptureHost interface to register in the MainContextMenu - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { LOG.DebugFormat("Initialize called of {0}", myAttributes.Name); List commandsToDelete = new List(); // Check configuration - foreach(string command in config.commands) { + foreach(string command in config.Commands) { if (!isCommandValid(command)) { commandsToDelete.Add(command); } @@ -115,18 +114,17 @@ namespace ExternalCommand { config.runInbackground.Remove(command); config.commandlines.Remove(command); config.arguments.Remove(command); - config.commands.Remove(command); + config.Commands.Remove(command); } _host = pluginHost; _myAttributes = myAttributes; - _itemPlugInRoot = new ToolStripMenuItem(); - _itemPlugInRoot.Tag = _host; + _itemPlugInRoot = new ToolStripMenuItem {Tag = _host}; OnIconSizeChanged(this, new PropertyChangedEventArgs("IconSize")); OnLanguageChanged(this, null); - _itemPlugInRoot.Click += new EventHandler(ConfigMenuClick); + _itemPlugInRoot.Click += ConfigMenuClick; PluginUtils.AddToContextMenu(_host, _itemPlugInRoot); Language.LanguageChanged += OnLanguageChanged; diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 2e525f351..9f4923f81 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -56,7 +56,7 @@ namespace ExternalCommand { void ButtonDeleteClick(object sender, EventArgs e) { foreach(ListViewItem item in listView1.SelectedItems) { string commando = item.Tag as string; - config.commands.Remove(commando); + config.Commands.Remove(commando); config.commandlines.Remove(commando); config.arguments.Remove(commando); } @@ -65,12 +65,12 @@ namespace ExternalCommand { void UpdateView() { listView1.Items.Clear(); - if(config.commands != null) { + if(config.Commands != null) { listView1.ListViewItemSorter = new ListviewComparer(); ImageList imageList = new ImageList(); listView1.SmallImageList = imageList; int imageNr = 0; - foreach(string commando in config.commands) { + foreach(string commando in config.Commands) { ListViewItem item = null; Image iconForExe = IconCache.IconForCommand(commando); if(iconForExe != null) { diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index 772a9b4a2..ed940646a 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -47,7 +47,7 @@ namespace ExternalCommand { textBox_name.Text = commando; textBox_commandline.Text = config.commandlines[commando]; textBox_arguments.Text = config.arguments[commando]; - _commandIndex = config.commands.FindIndex(delegate(string s) { return s == commando; }); + _commandIndex = config.Commands.FindIndex(delegate(string s) { return s == commando; }); } else { textBox_arguments.Text = "\"{0}\""; } @@ -59,13 +59,13 @@ namespace ExternalCommand { string commandLine = textBox_commandline.Text; string arguments = textBox_arguments.Text; if(_commando != null) { - config.commands[_commandIndex] = commandName; + config.Commands[_commandIndex] = commandName; config.commandlines.Remove(_commando); config.commandlines.Add(commandName, commandLine); config.arguments.Remove(_commando); config.arguments.Add(commandName, arguments); } else { - config.commands.Add(commandName); + config.Commands.Add(commandName); config.commandlines.Add(commandName, commandLine); config.arguments.Add(commandName, arguments); } @@ -112,7 +112,7 @@ namespace ExternalCommand { buttonOk.Enabled = false; } // Check if commandname is unique - if(_commando == null && !string.IsNullOrEmpty(textBox_name.Text) && config.commands.Contains(textBox_name.Text)) { + if(_commando == null && !string.IsNullOrEmpty(textBox_name.Text) && config.Commands.Contains(textBox_name.Text)) { buttonOk.Enabled = false; textBox_name.BackColor = Color.Red; } diff --git a/GreenshotFlickrPlugin/FlickrConfiguration.cs b/GreenshotFlickrPlugin/FlickrConfiguration.cs index 6c784dc9d..e0751739b 100644 --- a/GreenshotFlickrPlugin/FlickrConfiguration.cs +++ b/GreenshotFlickrPlugin/FlickrConfiguration.cs @@ -34,36 +34,36 @@ namespace GreenshotFlickrPlugin { [IniSection("Flickr", Description = "Greenshot Flickr Plugin configuration")] public class FlickrConfiguration : IniSection { [IniProperty("flickrIsPublic", Description = "IsPublic.", DefaultValue = "true")] - public bool IsPublic; + public bool IsPublic { get; set; } [IniProperty("flickrIsFamily", Description = "IsFamily.", DefaultValue = "true")] - public bool IsFamily; + public bool IsFamily { get; set; } [IniProperty("flickrIsFriend", Description = "IsFriend.", DefaultValue = "true")] - public bool IsFriend; + public bool IsFriend { get; set; } [IniProperty("SafetyLevel", Description = "Safety level", DefaultValue = "Safe")] - public SafetyLevel SafetyLevel; + public SafetyLevel SafetyLevel { get; set; } [IniProperty("HiddenFromSearch", Description = "Hidden from search", DefaultValue = "false")] - public bool HiddenFromSearch; - + public bool HiddenFromSearch { get; set; } + [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("AfterUploadLinkToClipBoard", Description = "After upload send flickr link to clipboard.", DefaultValue = "true")] - public bool AfterUploadLinkToClipBoard; + public bool AfterUploadLinkToClipBoard { get; set; } [IniProperty("UsePageLink", Description = "Use pagelink instead of direct link on the clipboard", DefaultValue = "False")] - public bool UsePageLink; - + public bool UsePageLink { get; set; } + [IniProperty("FlickrToken", Description = "The Flickr token", Encrypted = true, ExcludeIfNull = true)] - public string FlickrToken; + public string FlickrToken { get; set; } [IniProperty("FlickrTokenSecret", Description = "The Flickr token secret", Encrypted = true, ExcludeIfNull = true)] - public string FlickrTokenSecret; + public string FlickrTokenSecret { get; set; } /// /// A form for token diff --git a/GreenshotFlickrPlugin/FlickrPlugin.cs b/GreenshotFlickrPlugin/FlickrPlugin.cs index f6d06f15d..6a67d285f 100644 --- a/GreenshotFlickrPlugin/FlickrPlugin.cs +++ b/GreenshotFlickrPlugin/FlickrPlugin.cs @@ -111,16 +111,6 @@ namespace GreenshotFlickrPlugin _config.ShowConfigDialog(); } - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Flickr Plugin!"); - Shutdown(); - } - public void ConfigMenuClick(object sender, EventArgs eventArgs) { _config.ShowConfigDialog(); } diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index cb5e0d929..c086f5594 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -31,20 +31,20 @@ namespace GreenshotImgurPlugin { /// /// Description of ImgurHistory. /// - public partial class ImgurHistory : ImgurForm { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurHistory)); - private readonly GreenshotColumnSorter columnSorter; - private static readonly ImgurConfiguration config = IniConfig.GetIniSection(); - private static ImgurHistory instance; + public sealed partial class ImgurHistory : ImgurForm { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurHistory)); + private readonly GreenshotColumnSorter _columnSorter; + private static readonly ImgurConfiguration Config = IniConfig.GetIniSection(); + private static ImgurHistory _instance; public static void ShowHistory() { // Make sure the history is loaded, will be done only once ImgurUtils.LoadHistory(); - if (instance == null) { - instance = new ImgurHistory(); + if (_instance == null) { + _instance = new ImgurHistory(); } - instance.Show(); - instance.redraw(); + _instance.Show(); + _instance.Redraw(); } private ImgurHistory() { @@ -56,21 +56,21 @@ namespace GreenshotImgurPlugin { AcceptButton = finishedButton; CancelButton = finishedButton; // Init sorting - columnSorter = new GreenshotColumnSorter(); - listview_imgur_uploads.ListViewItemSorter = columnSorter; - columnSorter.SortColumn = 3; - columnSorter.Order = SortOrder.Descending; - redraw(); + _columnSorter = new GreenshotColumnSorter(); + listview_imgur_uploads.ListViewItemSorter = _columnSorter; + _columnSorter.SortColumn = 3; + _columnSorter.Order = SortOrder.Descending; + Redraw(); if (listview_imgur_uploads.Items.Count > 0) { listview_imgur_uploads.Items[0].Selected = true; } ApplyLanguage(); - if (config.Credits > 0) { - Text = Text + " (" + config.Credits + " credits)"; + if (Config.Credits > 0) { + Text = Text + " (" + Config.Credits + " credits)"; } } - private void redraw() { + private void Redraw() { // Should fix Bug #3378699 pictureBox1.Image = pictureBox1.ErrorImage; listview_imgur_uploads.BeginUpdate(); @@ -80,7 +80,7 @@ namespace GreenshotImgurPlugin { foreach (string column in columns) { listview_imgur_uploads.Columns.Add(column); } - foreach (ImgurInfo imgurInfo in config.runtimeImgurHistory.Values) { + foreach (ImgurInfo imgurInfo in Config.runtimeImgurHistory.Values) { ListViewItem item = new ListViewItem(imgurInfo.Hash); item.Tag = imgurInfo; item.SubItems.Add(imgurInfo.Title); @@ -132,14 +132,14 @@ namespace GreenshotImgurPlugin { } ); } catch (Exception ex) { - LOG.Warn("Problem communicating with Imgur: ", ex); + Log.Warn("Problem communicating with Imgur: ", ex); } imgurInfo.Dispose(); } } } - redraw(); + Redraw(); } private void ClipboardButtonClick(object sender, EventArgs e) { @@ -147,7 +147,7 @@ namespace GreenshotImgurPlugin { if (listview_imgur_uploads.SelectedItems != null && listview_imgur_uploads.SelectedItems.Count > 0) { for (int i = 0; i < listview_imgur_uploads.SelectedItems.Count; i++) { ImgurInfo imgurInfo = (ImgurInfo)listview_imgur_uploads.SelectedItems[i].Tag; - if (config.UsePageLink) { + if (Config.UsePageLink) { links.AppendLine(imgurInfo.Page); } else { links.AppendLine(imgurInfo.Original); @@ -160,10 +160,10 @@ namespace GreenshotImgurPlugin { private void ClearHistoryButtonClick(object sender, EventArgs e) { DialogResult result = MessageBox.Show(Language.GetString("imgur", LangKey.clear_question), "Imgur", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { - config.runtimeImgurHistory.Clear(); - config.ImgurUploadHistory.Clear(); + Config.runtimeImgurHistory.Clear(); + Config.ImgurUploadHistory.Clear(); IniConfig.Save(); - redraw(); + Redraw(); } } @@ -183,17 +183,17 @@ namespace GreenshotImgurPlugin { private void listview_imgur_uploads_ColumnClick(object sender, ColumnClickEventArgs e) { // Determine if clicked column is already the column that is being sorted. - if (e.Column == columnSorter.SortColumn) { + if (e.Column == _columnSorter.SortColumn) { // Reverse the current sort direction for this column. - if (columnSorter.Order == SortOrder.Ascending) { - columnSorter.Order = SortOrder.Descending; + if (_columnSorter.Order == SortOrder.Ascending) { + _columnSorter.Order = SortOrder.Descending; } else { - columnSorter.Order = SortOrder.Ascending; + _columnSorter.Order = SortOrder.Ascending; } } else { // Set the column number that is to be sorted; default to ascending. - columnSorter.SortColumn = e.Column; - columnSorter.Order = SortOrder.Ascending; + _columnSorter.SortColumn = e.Column; + _columnSorter.Order = SortOrder.Ascending; } // Perform the sort with these new sort options. @@ -203,7 +203,7 @@ namespace GreenshotImgurPlugin { void ImgurHistoryFormClosing(object sender, FormClosingEventArgs e) { - instance = null; + _instance = null; } } } diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index db8edf152..440c993d2 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -33,44 +33,44 @@ namespace GreenshotImgurPlugin { [IniSection("Imgur", Description="Greenshot Imgur Plugin configuration")] public class ImgurConfiguration : IniSection { [IniProperty("ImgurApi3Url", Description = "Url to Imgur system.", DefaultValue = "https://api.imgur.com/3")] - public string ImgurApi3Url; + public string ImgurApi3Url { get; set; } [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("UploadReduceColors", Description="Reduce color amount of the uploaded image to 256", DefaultValue="False")] - public bool UploadReduceColors; + public bool UploadReduceColors { get; set; } [IniProperty("CopyLinkToClipboard", Description = "Copy the link, which one is controlled by the UsePageLink, on the clipboard", DefaultValue = "True")] - public bool CopyLinkToClipboard; + public bool CopyLinkToClipboard { get; set; } [IniProperty("UsePageLink", Description = "Use pagelink instead of direct link on the clipboard", DefaultValue = "False")] - public bool UsePageLink; + public bool UsePageLink { get; set; } [IniProperty("AnonymousAccess", Description = "Use anonymous access to Imgur", DefaultValue="true")] - public bool AnonymousAccess; + public bool AnonymousAccess { get; set; } [IniProperty("RefreshToken", Description = "Imgur refresh Token", Encrypted = true, ExcludeIfNull = true)] - public string RefreshToken; + public string RefreshToken { get; set; } /// /// AccessToken, not stored /// - public string AccessToken; + public string AccessToken { get; set; } /// /// AccessTokenExpires, not stored /// - public DateTimeOffset AccessTokenExpires; + public DateTimeOffset AccessTokenExpires { get; set; } [IniProperty("AddTitle", Description = "Is the title passed on to Imgur", DefaultValue = "False")] - public bool AddTitle; + public bool AddTitle { get; set; } [IniProperty("AddFilename", Description = "Is the filename passed on to Imgur", DefaultValue = "False")] - public bool AddFilename; + public bool AddFilename { get; set; } [IniProperty("FilenamePattern", Description = "Filename for the Imgur upload", DefaultValue = "${capturetime:d\"yyyyMMdd-HHmm\"}")] - public string FilenamePattern; + public string FilenamePattern { get; set; } [IniProperty("ImgurUploadHistory", Description="Imgur upload history (ImgurUploadHistory.hash=deleteHash)")] - public Dictionary ImgurUploadHistory; - + public Dictionary ImgurUploadHistory { get; set; } + // Not stored, only run-time! public Dictionary runtimeImgurHistory = new Dictionary(); public int Credits { diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index 7655a7a76..d26083f35 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -35,13 +35,13 @@ namespace GreenshotImgurPlugin { /// This is the ImgurPlugin code /// public class ImgurPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurPlugin)); - private static ImgurConfiguration config; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurPlugin)); + private static ImgurConfiguration _config; public static PluginAttribute Attributes; - private IGreenshotHost host; - private ComponentResourceManager resources; - private ToolStripMenuItem historyMenuItem = null; - private ToolStripMenuItem itemPlugInConfig; + private IGreenshotHost _host; + private ComponentResourceManager _resources; + private ToolStripMenuItem _historyMenuItem; + private ToolStripMenuItem _itemPlugInConfig; public void Dispose() { Dispose(true); @@ -50,13 +50,13 @@ namespace GreenshotImgurPlugin { protected virtual void Dispose(bool disposing) { if (disposing) { - if (historyMenuItem != null) { - historyMenuItem.Dispose(); - historyMenuItem = null; + if (_historyMenuItem != null) { + _historyMenuItem.Dispose(); + _historyMenuItem = null; } - if (itemPlugInConfig != null) { - itemPlugInConfig.Dispose(); - itemPlugInConfig = null; + if (_itemPlugInConfig != null) { + _itemPlugInConfig.Dispose(); + _itemPlugInConfig = null; } } } @@ -75,114 +75,112 @@ namespace GreenshotImgurPlugin { /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// Use the ICaptureHost interface to register in the MainContextMenu - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - host = (IGreenshotHost)pluginHost; + _host = pluginHost; Attributes = myAttributes; // Get configuration - config = IniConfig.GetIniSection(); - resources = new ComponentResourceManager(typeof(ImgurPlugin)); - - ToolStripMenuItem itemPlugInRoot = new ToolStripMenuItem("Imgur"); - itemPlugInRoot.Image = (Image)resources.GetObject("Imgur"); + _config = IniConfig.GetIniSection(); + _resources = new ComponentResourceManager(typeof(ImgurPlugin)); - historyMenuItem = new ToolStripMenuItem(Language.GetString("imgur", LangKey.history)); - historyMenuItem.Tag = host; - historyMenuItem.Click += delegate { + ToolStripMenuItem itemPlugInRoot = new ToolStripMenuItem("Imgur") + { + Image = (Image) _resources.GetObject("Imgur") + }; + + _historyMenuItem = new ToolStripMenuItem(Language.GetString("imgur", LangKey.history)) + { + Tag = _host + }; + _historyMenuItem.Click += delegate { ImgurHistory.ShowHistory(); }; - itemPlugInRoot.DropDownItems.Add(historyMenuItem); + itemPlugInRoot.DropDownItems.Add(_historyMenuItem); - itemPlugInConfig = new ToolStripMenuItem(Language.GetString("imgur", LangKey.configure)); - itemPlugInConfig.Tag = host; - itemPlugInConfig.Click += delegate { - config.ShowConfigDialog(); + _itemPlugInConfig = new ToolStripMenuItem(Language.GetString("imgur", LangKey.configure)) + { + Tag = _host }; - itemPlugInRoot.DropDownItems.Add(itemPlugInConfig); + _itemPlugInConfig.Click += delegate { + _config.ShowConfigDialog(); + }; + itemPlugInRoot.DropDownItems.Add(_itemPlugInConfig); - PluginUtils.AddToContextMenu(host, itemPlugInRoot); - Language.LanguageChanged += new LanguageChangedHandler(OnLanguageChanged); + PluginUtils.AddToContextMenu(_host, itemPlugInRoot); + Language.LanguageChanged += OnLanguageChanged; // retrieve history in the background - Thread backgroundTask = new Thread (new ThreadStart(CheckHistory)); - backgroundTask.Name = "Imgur History"; - backgroundTask.IsBackground = true; + Thread backgroundTask = new Thread(CheckHistory) + { + Name = "Imgur History", + IsBackground = true + }; backgroundTask.SetApartmentState(ApartmentState.STA); backgroundTask.Start(); return true; } public void OnLanguageChanged(object sender, EventArgs e) { - if (itemPlugInConfig != null) { - itemPlugInConfig.Text = Language.GetString("imgur", LangKey.configure); + if (_itemPlugInConfig != null) { + _itemPlugInConfig.Text = Language.GetString("imgur", LangKey.configure); } - if (historyMenuItem != null) { - historyMenuItem.Text = Language.GetString("imgur", LangKey.history); + if (_historyMenuItem != null) { + _historyMenuItem.Text = Language.GetString("imgur", LangKey.history); } } private void CheckHistory() { try { ImgurUtils.LoadHistory(); - host.GreenshotForm.BeginInvoke((MethodInvoker)delegate { - if (config.ImgurUploadHistory.Count > 0) { - historyMenuItem.Enabled = true; + _host.GreenshotForm.BeginInvoke((MethodInvoker)delegate { + if (_config.ImgurUploadHistory.Count > 0) { + _historyMenuItem.Enabled = true; } else { - historyMenuItem.Enabled = false; + _historyMenuItem.Enabled = false; } }); } catch (Exception ex) { - LOG.Error("Error loading history", ex); - }; + Log.Error("Error loading history", ex); + } } public virtual void Shutdown() { - LOG.Debug("Imgur Plugin shutdown."); - Language.LanguageChanged -= new LanguageChangedHandler(OnLanguageChanged); + Log.Debug("Imgur Plugin shutdown."); + Language.LanguageChanged -= OnLanguageChanged; } /// /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - config.ShowConfigDialog(); + _config.ShowConfigDialog(); } - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Imgur Plugin!"); - Shutdown(); - } - /// /// Upload the capture to imgur /// - /// - /// - /// out string for the url + /// ICaptureDetails + /// ISurface + /// out string for the url /// true if the upload succeeded - public bool Upload(ICaptureDetails captureDetails, ISurface surfaceToUpload, out string uploadURL) { - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality, config.UploadReduceColors); + public bool Upload(ICaptureDetails captureDetails, ISurface surfaceToUpload, out string uploadUrl) { + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(_config.UploadFormat, _config.UploadJpegQuality, _config.UploadReduceColors); try { - string filename = Path.GetFileName(FilenameHelper.GetFilenameFromPattern(config.FilenamePattern, config.UploadFormat, captureDetails)); + string filename = Path.GetFileName(FilenameHelper.GetFilenameFromPattern(_config.FilenamePattern, _config.UploadFormat, captureDetails)); ImgurInfo imgurInfo = null; // Run upload in the background new PleaseWaitForm().ShowAndWait("Imgur plug-in", Language.GetString("imgur", LangKey.communication_wait), - delegate() { + delegate + { imgurInfo = ImgurUtils.UploadToImgur(surfaceToUpload, outputSettings, captureDetails.Title, filename); - if (imgurInfo != null && config.AnonymousAccess) { - LOG.InfoFormat("Storing imgur upload for hash {0} and delete hash {1}", imgurInfo.Hash, imgurInfo.DeleteHash); - config.ImgurUploadHistory.Add(imgurInfo.Hash, imgurInfo.DeleteHash); - config.runtimeImgurHistory.Add(imgurInfo.Hash, imgurInfo); + if (imgurInfo != null && _config.AnonymousAccess) { + Log.InfoFormat("Storing imgur upload for hash {0} and delete hash {1}", imgurInfo.Hash, imgurInfo.DeleteHash); + _config.ImgurUploadHistory.Add(imgurInfo.Hash, imgurInfo.DeleteHash); + _config.runtimeImgurHistory.Add(imgurInfo.Hash, imgurInfo); CheckHistory(); } } @@ -195,34 +193,34 @@ namespace GreenshotImgurPlugin { } IniConfig.Save(); - if (config.UsePageLink) + if (_config.UsePageLink) { - uploadURL = imgurInfo.Page; + uploadUrl = imgurInfo.Page; } else { - uploadURL = imgurInfo.Original; + uploadUrl = imgurInfo.Original; } - if (!string.IsNullOrEmpty(uploadURL) && config.CopyLinkToClipboard) + if (!string.IsNullOrEmpty(uploadUrl) && _config.CopyLinkToClipboard) { try { - ClipboardHelper.SetClipboardData(uploadURL); + ClipboardHelper.SetClipboardData(uploadUrl); } catch (Exception ex) { - LOG.Error("Can't write to clipboard: ", ex); - uploadURL = null; + Log.Error("Can't write to clipboard: ", ex); + uploadUrl = null; } } return true; } } catch (Exception e) { - LOG.Error("Error uploading.", e); + Log.Error("Error uploading.", e); MessageBox.Show(Language.GetString("imgur", LangKey.upload_failure) + " " + e.Message); } - uploadURL = null; + uploadUrl = null; return false; } } diff --git a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs index a749454d0..18cc71047 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -namespace GreenshotJiraPlugin { +namespace GreenshotJiraPlugin.Forms { partial class JiraForm { /// /// Required designer variable. diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 943b8619a..bb6ab54eb 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -18,21 +18,20 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + using System; using System.Globalization; using System.Windows.Forms; - +using Greenshot.IniFile; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; -using Greenshot.IniFile; -using Jira; -namespace GreenshotJiraPlugin { +namespace GreenshotJiraPlugin.Forms { public partial class JiraForm : Form { - private readonly JiraConnector jiraConnector; - private JiraIssue selectedIssue; - private readonly GreenshotColumnSorter columnSorter; - private readonly JiraConfiguration config = IniConfig.GetIniSection(); + private readonly JiraConnector _jiraConnector; + private JiraIssue _selectedIssue; + private readonly GreenshotColumnSorter _columnSorter; + private readonly JiraConfiguration _config = IniConfig.GetIniSection(); public JiraForm(JiraConnector jiraConnector) { InitializeComponent(); @@ -40,90 +39,90 @@ namespace GreenshotJiraPlugin { AcceptButton = uploadButton; CancelButton = cancelButton; - initializeComponentText(); + InitializeComponentText(); - columnSorter = new GreenshotColumnSorter(); - jiraListView.ListViewItemSorter = columnSorter; + _columnSorter = new GreenshotColumnSorter(); + jiraListView.ListViewItemSorter = _columnSorter; - this.jiraConnector = jiraConnector; + _jiraConnector = jiraConnector; - changeModus(false); + ChangeModus(false); try { - if (!jiraConnector.isLoggedIn) { - jiraConnector.login(); + if (!jiraConnector.IsLoggedIn) { + jiraConnector.Login(); } } catch (Exception e) { MessageBox.Show(Language.GetFormattedString("jira", LangKey.login_error, e.Message)); } uploadButton.Enabled = false; - updateForm(); + UpdateForm(); } - private void initializeComponentText() { + private void InitializeComponentText() { label_jirafilter.Text = Language.GetString("jira", LangKey.label_jirafilter); label_comment.Text = Language.GetString("jira", LangKey.label_comment); label_filename.Text = Language.GetString("jira", LangKey.label_filename); } - private void updateForm() { - if (jiraConnector.isLoggedIn) { - JiraFilter[] filters = jiraConnector.getFilters(); + private void UpdateForm() { + if (_jiraConnector.IsLoggedIn) { + JiraFilter[] filters = _jiraConnector.GetFilters(); if (filters.Length > 0) { foreach (JiraFilter filter in filters) { jiraFilterBox.Items.Add(filter); } jiraFilterBox.SelectedIndex = 0; } - changeModus(true); - if (config.LastUsedJira != null) { - selectedIssue = jiraConnector.getIssue(config.LastUsedJira); - if (selectedIssue != null) { - jiraKey.Text = config.LastUsedJira; + ChangeModus(true); + if (_config.LastUsedJira != null) { + _selectedIssue = _jiraConnector.GetIssue(_config.LastUsedJira); + if (_selectedIssue != null) { + jiraKey.Text = _config.LastUsedJira; uploadButton.Enabled = true; } } } } - private void changeModus(bool enabled) { + private void ChangeModus(bool enabled) { jiraFilterBox.Enabled = enabled; jiraListView.Enabled = enabled; jiraFilenameBox.Enabled = enabled; jiraCommentBox.Enabled = enabled; } - public void setFilename(string filename) { + public void SetFilename(string filename) { jiraFilenameBox.Text = filename; } - public void setComment(string comment) { + public void SetComment(string comment) { jiraCommentBox.Text = comment; } - public JiraIssue getJiraIssue() { - return selectedIssue; + public JiraIssue GetJiraIssue() { + return _selectedIssue; } - public void upload(IBinaryContainer attachment) { - config.LastUsedJira = selectedIssue.Key; - jiraConnector.addAttachment(selectedIssue.Key, jiraFilenameBox.Text, attachment); - if (jiraCommentBox.Text != null && jiraCommentBox.Text.Length > 0) { - jiraConnector.addComment(selectedIssue.Key, jiraCommentBox.Text); + public void Upload(IBinaryContainer attachment) { + _config.LastUsedJira = _selectedIssue.Key; + _jiraConnector.AddAttachment(_selectedIssue.Key, jiraFilenameBox.Text, attachment); + if (!string.IsNullOrEmpty(jiraCommentBox.Text)) { + _jiraConnector.AddComment(_selectedIssue.Key, jiraCommentBox.Text); } } - public void logout() { - jiraConnector.logout(); + public void Logout() { + _jiraConnector.Logout(); } private void selectJiraToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; - selectedIssue = (JiraIssue)clickedItem.Tag; - jiraKey.Text = selectedIssue.Key; + _selectedIssue = (JiraIssue)clickedItem.Tag; + jiraKey.Text = _selectedIssue.Key; } private void jiraFilterBox_SelectedIndexChanged(object sender, EventArgs e) { - if (jiraConnector.isLoggedIn) { + if (_jiraConnector.IsLoggedIn) { JiraIssue[] issues = null; uploadButton.Enabled = false; JiraFilter filter = (JiraFilter)jiraFilterBox.SelectedItem; @@ -133,7 +132,7 @@ namespace GreenshotJiraPlugin { // Run upload in the background new PleaseWaitForm().ShowAndWait(JiraPlugin.Instance.JiraPluginAttributes.Name, Language.GetString("jira", LangKey.communication_wait), delegate() { - issues = jiraConnector.getIssuesForFilter(filter.Id); + issues = _jiraConnector.GetIssuesForFilter(filter.Id); } ); jiraListView.BeginUpdate(); @@ -145,8 +144,10 @@ namespace GreenshotJiraPlugin { jiraListView.Columns.Add(Language.GetString("jira", column)); } foreach (JiraIssue issue in issues) { - ListViewItem item = new ListViewItem(issue.Key); - item.Tag = issue; + ListViewItem item = new ListViewItem(issue.Key) + { + Tag = issue + }; item.SubItems.Add(issue.Created.Value.ToString("d", DateTimeFormatInfo.InvariantInfo)); item.SubItems.Add(issue.Assignee); item.SubItems.Add(issue.Reporter); @@ -164,8 +165,8 @@ namespace GreenshotJiraPlugin { private void jiraListView_SelectedIndexChanged(object sender, EventArgs e) { if (jiraListView.SelectedItems != null && jiraListView.SelectedItems.Count > 0) { - selectedIssue = (JiraIssue)jiraListView.SelectedItems[0].Tag; - jiraKey.Text = selectedIssue.Key; + _selectedIssue = (JiraIssue)jiraListView.SelectedItems[0].Tag; + jiraKey.Text = _selectedIssue.Key; uploadButton.Enabled = true; } else { uploadButton.Enabled = false; @@ -174,17 +175,17 @@ namespace GreenshotJiraPlugin { private void jiraListView_ColumnClick(object sender, ColumnClickEventArgs e) { // Determine if clicked column is already the column that is being sorted. - if (e.Column == columnSorter.SortColumn) { + if (e.Column == _columnSorter.SortColumn) { // Reverse the current sort direction for this column. - if (columnSorter.Order == SortOrder.Ascending) { - columnSorter.Order = SortOrder.Descending; + if (_columnSorter.Order == SortOrder.Ascending) { + _columnSorter.Order = SortOrder.Descending; } else { - columnSorter.Order = SortOrder.Ascending; + _columnSorter.Order = SortOrder.Ascending; } } else { // Set the column number that is to be sorted; default to ascending. - columnSorter.SortColumn = e.Column; - columnSorter.Order = SortOrder.Ascending; + _columnSorter.SortColumn = e.Column; + _columnSorter.Order = SortOrder.Ascending; } // Perform the sort with these new sort options. @@ -196,8 +197,8 @@ namespace GreenshotJiraPlugin { uploadButton.Enabled = false; int dashIndex = jiranumber.IndexOf('-'); if (dashIndex > 0 && jiranumber.Length > dashIndex+1) { - selectedIssue = jiraConnector.getIssue(jiraKey.Text); - if (selectedIssue != null) { + _selectedIssue = _jiraConnector.GetIssue(jiraKey.Text); + if (_selectedIssue != null) { uploadButton.Enabled = true; } } diff --git a/GreenshotJiraPlugin/Forms/JiraFormBase.cs b/GreenshotJiraPlugin/Forms/JiraFormBase.cs index ed43f199f..cd114513e 100644 --- a/GreenshotJiraPlugin/Forms/JiraFormBase.cs +++ b/GreenshotJiraPlugin/Forms/JiraFormBase.cs @@ -21,7 +21,7 @@ using GreenshotPlugin.Controls; -namespace GreenshotJiraPlugin { +namespace GreenshotJiraPlugin.Forms { public class JiraFormBase : GreenshotForm { } } diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs index 0b2132df6..98893e04b 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -namespace GreenshotJiraPlugin { +namespace GreenshotJiraPlugin.Forms { partial class SettingsForm { /// /// Designer variable used to keep track of non-visual components. diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.cs b/GreenshotJiraPlugin/Forms/SettingsForm.cs index 5e6e639da..673d4f4ea 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.cs @@ -19,12 +19,13 @@ * along with this program. If not, see . */ -namespace GreenshotJiraPlugin { +namespace GreenshotJiraPlugin.Forms { /// /// Description of PasswordRequestForm. /// public partial class SettingsForm : JiraFormBase { - public SettingsForm(JiraConfiguration config) :base () { + public SettingsForm() + { // // The InitializeComponent() call is required for Windows Forms designer support. // diff --git a/GreenshotJiraPlugin/Jira.cs b/GreenshotJiraPlugin/Jira.cs index a69a28c93..8af125b17 100644 --- a/GreenshotJiraPlugin/Jira.cs +++ b/GreenshotJiraPlugin/Jira.cs @@ -20,16 +20,16 @@ * along with this program. If not, see . */ -using Greenshot.IniFile; -using GreenshotJiraPlugin; -using GreenshotPlugin.Controls; -using GreenshotPlugin.Core; using System; using System.Collections.Generic; using System.Threading; using System.Windows.Forms; +using Greenshot.IniFile; +using GreenshotJiraPlugin.Web_References.JiraSoap; +using GreenshotPlugin.Controls; +using GreenshotPlugin.Core; -namespace Jira { +namespace GreenshotJiraPlugin { #region transport classes public class JiraFilter { public JiraFilter(string name, string id) { @@ -98,34 +98,34 @@ namespace Jira { #endregion public class JiraConnector : IDisposable { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(JiraConnector)); - private const string AUTH_FAILED_EXCEPTION_NAME = "com.atlassian.jira.rpc.exception.RemoteAuthenticationException"; - private static readonly JiraConfiguration config = IniConfig.GetIniSection(); - public const string DEFAULT_POSTFIX = "/rpc/soap/jirasoapservice-v2?wsdl"; - private string credentials; - private DateTime loggedInTime = DateTime.Now; - private bool loggedIn; - private JiraSoapServiceService jira; - private readonly int timeout; - private string url; - private readonly Cache jiraCache = new Cache(60 * config.Timeout); - private readonly Cache userCache = new Cache(60 * config.Timeout); - private readonly bool suppressBackgroundForm = false; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraConnector)); + private const string AuthFailedExceptionName = "com.atlassian.jira.rpc.exception.RemoteAuthenticationException"; + private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); + public const string DefaultPostfix = "/rpc/soap/jirasoapservice-v2?wsdl"; + private string _credentials; + private DateTime _loggedInTime = DateTime.Now; + private bool _loggedIn; + private JiraSoapServiceService _jira; + private readonly int _timeout; + private string _url; + private readonly Cache _jiraCache = new Cache(60 * Config.Timeout); + private readonly Cache _userCache = new Cache(60 * Config.Timeout); + private readonly bool _suppressBackgroundForm; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) { - if (jira != null) { - logout(); + protected void Dispose(bool disposing) { + if (_jira != null) { + Logout(); } if (disposing) { - if (jira != null) { - jira.Dispose(); - jira = null; + if (_jira != null) { + _jira.Dispose(); + _jira = null; } } } @@ -134,27 +134,27 @@ namespace Jira { } public JiraConnector(bool suppressBackgroundForm) { - url = config.Url; - timeout = config.Timeout; - this.suppressBackgroundForm = suppressBackgroundForm; - createService(); + _url = Config.Url; + _timeout = Config.Timeout; + _suppressBackgroundForm = suppressBackgroundForm; + CreateService(); } - private void createService() { - if (!suppressBackgroundForm) { + private void CreateService() { + if (!_suppressBackgroundForm) { new PleaseWaitForm().ShowAndWait(JiraPlugin.Instance.JiraPluginAttributes.Name, Language.GetString("jira", LangKey.communication_wait), - delegate() { - jira = new JiraSoapServiceService(); + delegate { + _jira = new JiraSoapServiceService(); } ); } else { - jira = new JiraSoapServiceService(); + _jira = new JiraSoapServiceService(); } - jira.Url = url; - jira.Proxy = NetworkHelper.CreateProxy(new Uri(url)); + _jira.Url = _url; + _jira.Proxy = NetworkHelper.CreateProxy(new Uri(_url)); // Do not use: //jira.AllowAutoRedirect = true; - jira.UserAgent = "Greenshot"; + _jira.UserAgent = "Greenshot"; } ~JiraConnector() { @@ -165,30 +165,30 @@ namespace Jira { /// Internal login which catches the exceptions /// /// true if login was done sucessfully - private bool doLogin(string user, string password, bool suppressBackgroundForm) { + private bool DoLogin(string user, string password, bool suppressBackgroundForm) { // This is what needs to be done ThreadStart jiraLogin = delegate { - LOG.DebugFormat("Loggin in"); + Log.DebugFormat("Loggin in"); try { - credentials = jira.login(user, password); + _credentials = _jira.login(user, password); } catch (Exception) { - if (!url.EndsWith("wsdl")) { - url = url + "/rpc/soap/jirasoapservice-v2?wsdl"; + if (!_url.EndsWith("wsdl")) { + _url = _url + "/rpc/soap/jirasoapservice-v2?wsdl"; // recreate the service with the new url - createService(); - credentials = jira.login(user, password); + CreateService(); + _credentials = _jira.login(user, password); // Worked, store the url in the configuration - config.Url = url; + Config.Url = _url; IniConfig.Save(); } else { throw; } } - LOG.DebugFormat("Logged in"); - loggedInTime = DateTime.Now; - loggedIn = true; + Log.DebugFormat("Logged in"); + _loggedInTime = DateTime.Now; + _loggedIn = true; }; // Here we do it @@ -200,125 +200,126 @@ namespace Jira { } } catch (Exception e) { // check if auth failed - if (e.Message.Contains(AUTH_FAILED_EXCEPTION_NAME)) { + if (e.Message.Contains(AuthFailedExceptionName)) { return false; } // Not an authentication issue - loggedIn = false; - credentials = null; + _loggedIn = false; + _credentials = null; e.Data.Add("user", user); - e.Data.Add("url", url); + e.Data.Add("url", _url); throw; } return true; } - public void login() { - login(false); + public void Login() { + Login(false); } - public void login(bool suppressBackgroundForm) { - logout(); + public void Login(bool suppressBackgroundForm) { + Logout(); try { // Get the system name, so the user knows where to login to - string systemName = url.Replace(DEFAULT_POSTFIX,""); - CredentialsDialog dialog = new CredentialsDialog(systemName); - dialog.Name = null; + string systemName = _url.Replace(DefaultPostfix,""); + CredentialsDialog dialog = new CredentialsDialog(systemName) + { + Name = null + }; while (dialog.Show(dialog.Name) == DialogResult.OK) { - if (doLogin(dialog.Name, dialog.Password, suppressBackgroundForm)) { + if (DoLogin(dialog.Name, dialog.Password, suppressBackgroundForm)) { if (dialog.SaveChecked) { dialog.Confirm(true); } return; - } else { - try { - dialog.Confirm(false); - } catch (ApplicationException e) { - // exception handling ... - LOG.Error("Problem using the credentials dialog", e); - } - // For every windows version after XP show an incorrect password baloon - dialog.IncorrectPassword = true; - // Make sure the dialog is display, the password was false! - dialog.AlwaysDisplay = true; } + try { + dialog.Confirm(false); + } catch (ApplicationException e) { + // exception handling ... + Log.Error("Problem using the credentials dialog", e); + } + // For every windows version after XP show an incorrect password baloon + dialog.IncorrectPassword = true; + // Make sure the dialog is display, the password was false! + dialog.AlwaysDisplay = true; } } catch (ApplicationException e) { // exception handling ... - LOG.Error("Problem using the credentials dialog", e); + Log.Error("Problem using the credentials dialog", e); } } - public void logout() { - if (credentials != null) { - jira.logout(credentials); - credentials = null; - loggedIn = false; + public void Logout() { + if (_credentials != null) { + _jira.logout(_credentials); + _credentials = null; + _loggedIn = false; } } - private void checkCredentials() { - if (loggedIn) { - if (loggedInTime.AddMinutes(timeout-1).CompareTo(DateTime.Now) < 0) { - logout(); - login(); + private void CheckCredentials() { + if (_loggedIn) { + if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) { + Logout(); + Login(); } } else { - login(); + Login(); } } - public bool isLoggedIn { + public bool IsLoggedIn { get { - return loggedIn; + return _loggedIn; } } - public JiraFilter[] getFilters() { + public JiraFilter[] GetFilters() { List filters = new List(); - checkCredentials(); - RemoteFilter[] remoteFilters = jira.getSavedFilters(credentials); + CheckCredentials(); + RemoteFilter[] remoteFilters = _jira.getSavedFilters(_credentials); foreach (RemoteFilter remoteFilter in remoteFilters) { filters.Add(new JiraFilter(remoteFilter.name, remoteFilter.id)); } return filters.ToArray(); } - private JiraIssue createDummyErrorIssue(Exception e) { + private JiraIssue CreateDummyErrorIssue(Exception e) { // Creating bogus jira to indicate a problem return new JiraIssue("error", DateTime.Now, "error", "error", "error", e.Message, "error", "error", null); } - public JiraIssue getIssue(string key) { + public JiraIssue GetIssue(string key) { JiraIssue jiraIssue = null; - if (jiraCache.Contains(key)) { - jiraIssue = jiraCache[key]; + if (_jiraCache.Contains(key)) { + jiraIssue = _jiraCache[key]; } if (jiraIssue == null) { - checkCredentials(); + CheckCredentials(); try { - RemoteIssue issue = jira.getIssue(credentials, key); - jiraIssue = new JiraIssue(issue.key, issue.created, getUserFullName(issue.reporter), getUserFullName(issue.assignee), issue.project, issue.summary, issue.description, issue.environment, issue.attachmentNames); - jiraCache.Add(key, jiraIssue); + RemoteIssue issue = _jira.getIssue(_credentials, key); + jiraIssue = new JiraIssue(issue.key, issue.created, GetUserFullName(issue.reporter), GetUserFullName(issue.assignee), issue.project, issue.summary, issue.description, issue.environment, issue.attachmentNames); + _jiraCache.Add(key, jiraIssue); } catch (Exception e) { - LOG.Error("Problem retrieving Jira: " + key, e); + Log.Error("Problem retrieving Jira: " + key, e); } } return jiraIssue; } - public JiraIssue[] getIssuesForFilter(string filterId) { + public JiraIssue[] GetIssuesForFilter(string filterId) { List issuesToReturn = new List(); - checkCredentials(); + CheckCredentials(); try { - RemoteIssue[] issues = jira.getIssuesFromFilter(credentials, filterId); + RemoteIssue[] issues = _jira.getIssuesFromFilter(_credentials, filterId); #region Username cache update List users = new List(); foreach (RemoteIssue issue in issues) { - if (issue.reporter != null && !hasUser(issue.reporter) && !users.Contains(issue.reporter)) { + if (issue.reporter != null && !HasUser(issue.reporter) && !users.Contains(issue.reporter)) { users.Add(issue.reporter); } - if (issue.assignee != null && !hasUser(issue.assignee) && !users.Contains(issue.assignee)) { + if (issue.assignee != null && !HasUser(issue.assignee) && !users.Contains(issue.assignee)) { users.Add(issue.assignee); } } @@ -327,8 +328,8 @@ namespace Jira { ManualResetEvent doneEvent = new ManualResetEvent(false); for (int i = 0; i < users.Count; i++) { ThreadPool.QueueUserWorkItem(delegate(object name) { - LOG.InfoFormat("Retrieving {0}", name); - getUserFullName((string)name); + Log.InfoFormat("Retrieving {0}", name); + GetUserFullName((string)name); if (Interlocked.Decrement(ref taskCount) == 0) { doneEvent.Set(); } @@ -340,65 +341,67 @@ namespace Jira { foreach (RemoteIssue issue in issues) { try { - JiraIssue jiraIssue = new JiraIssue(issue.key, issue.created, getUserFullName(issue.reporter), getUserFullName(issue.assignee), issue.project, issue.summary, issue.description, "", issue.attachmentNames); + JiraIssue jiraIssue = new JiraIssue(issue.key, issue.created, GetUserFullName(issue.reporter), GetUserFullName(issue.assignee), issue.project, issue.summary, issue.description, "", issue.attachmentNames); issuesToReturn.Add(jiraIssue); } catch (Exception e) { - LOG.Error("Problem retrieving Jira: " + issue.key, e); - JiraIssue jiraIssue = createDummyErrorIssue(e); + Log.Error("Problem retrieving Jira: " + issue.key, e); + JiraIssue jiraIssue = CreateDummyErrorIssue(e); jiraIssue.Key = issue.key; issuesToReturn.Add(jiraIssue); } } } catch (Exception e) { - LOG.Error("Problem retrieving Jiras for Filter: " + filterId, e); - issuesToReturn.Add(createDummyErrorIssue(e)); + Log.Error("Problem retrieving Jiras for Filter: " + filterId, e); + issuesToReturn.Add(CreateDummyErrorIssue(e)); } return issuesToReturn.ToArray(); ; } - public string getURL(string issueKey) { - return url.Replace(DEFAULT_POSTFIX,"") + "/browse/" + issueKey; + public string GetUrl(string issueKey) { + return _url.Replace(DefaultPostfix,"") + "/browse/" + issueKey; } - public void addAttachment(string issueKey, string filename, IBinaryContainer attachment) { - checkCredentials(); + public void AddAttachment(string issueKey, string filename, IBinaryContainer attachment) { + CheckCredentials(); try { - jira.addBase64EncodedAttachmentsToIssue(credentials, issueKey, new string[] { filename }, new string[] { attachment.ToBase64String(Base64FormattingOptions.InsertLineBreaks) }); + _jira.addBase64EncodedAttachmentsToIssue(_credentials, issueKey, new[] { filename }, new[] { attachment.ToBase64String(Base64FormattingOptions.InsertLineBreaks) }); } catch (Exception ex1) { - LOG.WarnFormat("Failed to upload by using method addBase64EncodedAttachmentsToIssue, error was {0}", ex1.Message); + Log.WarnFormat("Failed to upload by using method addBase64EncodedAttachmentsToIssue, error was {0}", ex1.Message); try { - LOG.Warn("Trying addAttachmentsToIssue instead"); - jira.addAttachmentsToIssue(credentials, issueKey, new string[] { filename }, (sbyte[])(Array)attachment.ToByteArray()); + Log.Warn("Trying addAttachmentsToIssue instead"); + _jira.addAttachmentsToIssue(_credentials, issueKey, new[] { filename }, (sbyte[])(Array)attachment.ToByteArray()); } catch (Exception ex2) { - LOG.WarnFormat("Failed to use alternative method, error was: {0}", ex2.Message); + Log.WarnFormat("Failed to use alternative method, error was: {0}", ex2.Message); throw; } } } - public void addComment(string issueKey, string commentString) { - RemoteComment comment = new RemoteComment(); - comment.body = commentString; - checkCredentials(); - jira.addComment(credentials, issueKey, comment); + public void AddComment(string issueKey, string commentString) { + RemoteComment comment = new RemoteComment + { + body = commentString + }; + CheckCredentials(); + _jira.addComment(_credentials, issueKey, comment); } - private bool hasUser(string user) { + private bool HasUser(string user) { if (user != null) { - return userCache.Contains(user); + return _userCache.Contains(user); } return false; } - private string getUserFullName(string user) { - string fullname = null; + private string GetUserFullName(string user) { + string fullname; if (user != null) { - if (userCache.Contains(user)) { - fullname = userCache[user].fullname; + if (_userCache.Contains(user)) { + fullname = _userCache[user].fullname; } else { - checkCredentials(); - RemoteUser remoteUser = jira.getUser(credentials, user); - userCache.Add(user, remoteUser); + CheckCredentials(); + RemoteUser remoteUser = _jira.getUser(_credentials, user); + _userCache.Add(user, remoteUser); fullname = remoteUser.fullname; } } else { diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 8dbdfb471..82a4982f8 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -using System.Windows.Forms; + using Greenshot.IniFile; using GreenshotPlugin.Core; @@ -28,35 +28,22 @@ namespace GreenshotJiraPlugin { /// [IniSection("Jira", Description="Greenshot Jira Plugin configuration")] public class JiraConfiguration : IniSection { - public const string DEFAULT_PREFIX = "http://"; - private const string DEFAULT_URL = DEFAULT_PREFIX + "jira" + Jira.JiraConnector.DEFAULT_POSTFIX; + public const string DefaultPrefix = "http://"; + private const string DefaultUrl = DefaultPrefix + "jira" + JiraConnector.DefaultPostfix; - [IniProperty("Url", Description="Url to Jira system, including wsdl.", DefaultValue=DEFAULT_URL)] - public string Url; + [IniProperty("Url", Description="Url to Jira system, including wsdl.", DefaultValue=DefaultUrl)] + public string Url { get; set; } [IniProperty("Timeout", Description="Session timeout in minutes", DefaultValue="30")] - public int Timeout; - + public int Timeout { get; set; } + [IniProperty("LastUsedJira", Description="Last used Jira")] - public string LastUsedJira; + public string LastUsedJira { get; set; } [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("UploadReduceColors", Description="Reduce color amount of the uploaded image to 256", DefaultValue="False")] - public bool UploadReduceColors; - - /// - /// A form for username/password - /// - /// bool true if OK was pressed, false if cancel - public bool ShowConfigDialog() { - SettingsForm settingsForm = new SettingsForm(this); - DialogResult result = settingsForm.ShowDialog(); - if (result == DialogResult.OK) { - return true; - } - return false; - } + public bool UploadReduceColors { get; set; } } } diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index bbce4e9bc..7d12bf79b 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -18,6 +18,7 @@ * 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; @@ -26,27 +27,27 @@ using System.IO; using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; +using GreenshotJiraPlugin.Forms; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; -using Jira; namespace GreenshotJiraPlugin { /// /// Description of JiraDestination. /// public class JiraDestination : AbstractDestination { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(JiraDestination)); - private static readonly JiraConfiguration config = IniConfig.GetIniSection(); - private readonly JiraPlugin jiraPlugin = null; - private readonly JiraIssue jira = null; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraDestination)); + private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); + private readonly JiraPlugin _jiraPlugin; + private readonly JiraIssue _jira; public JiraDestination(JiraPlugin jiraPlugin) { - this.jiraPlugin = jiraPlugin; + _jiraPlugin = jiraPlugin; } public JiraDestination(JiraPlugin jiraPlugin, JiraIssue jira) { - this.jiraPlugin = jiraPlugin; - this.jira = jira; + _jiraPlugin = jiraPlugin; + _jira = jira; } public override string Designation { @@ -60,18 +61,18 @@ namespace GreenshotJiraPlugin { } public override string Description { - get { - if (jira == null) { + get + { + if (_jira == null) { return Language.GetString("jira", LangKey.upload_menu_item); - } else { - return FormatUpload(jira); } + return FormatUpload(_jira); } } public override bool isActive { get { - return base.isActive && !string.IsNullOrEmpty(config.Url); + return base.isActive && !string.IsNullOrEmpty(Config.Url); } } @@ -82,36 +83,36 @@ namespace GreenshotJiraPlugin { } public override Image DisplayIcon { get { - ComponentResourceManager resources = new ComponentResourceManager(typeof(JiraPlugin)); + var resources = new ComponentResourceManager(typeof(JiraPlugin)); return (Image)resources.GetObject("Jira"); } } public override IEnumerable DynamicDestinations() { - if (JiraPlugin.Instance.CurrentJiraConnector == null || !JiraPlugin.Instance.CurrentJiraConnector.isLoggedIn) { + if (JiraPlugin.Instance.CurrentJiraConnector == null || !JiraPlugin.Instance.CurrentJiraConnector.IsLoggedIn) { yield break; } List issues = JiraUtils.GetCurrentJiras(); if (issues != null) { - foreach(JiraIssue jiraIssue in issues) { - yield return new JiraDestination(jiraPlugin, jiraIssue); + foreach(var jiraIssue in issues) { + yield return new JiraDestination(_jiraPlugin, jiraIssue); } } } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surfaceToUpload, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string filename = Path.GetFileName(FilenameHelper.GetFilename(config.UploadFormat, captureDetails)); - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality, config.UploadReduceColors); - if (jira != null) { + string filename = Path.GetFileName(FilenameHelper.GetFilename(Config.UploadFormat, captureDetails)); + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(Config.UploadFormat, Config.UploadJpegQuality, Config.UploadReduceColors); + if (_jira != null) { try { // Run upload in the background new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), - delegate() { - jiraPlugin.JiraConnector.addAttachment(jira.Key, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + delegate { + _jiraPlugin.JiraConnector.AddAttachment(_jira.Key, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); } ); - LOG.Debug("Uploaded to Jira."); + Log.Debug("Uploaded to Jira."); exportInformation.ExportMade = true; // TODO: This can't work: exportInformation.Uri = surfaceToUpload.UploadURL; @@ -119,19 +120,19 @@ namespace GreenshotJiraPlugin { MessageBox.Show(Language.GetString("jira", LangKey.upload_failure) + " " + e.Message); } } else { - JiraForm jiraForm = new JiraForm(jiraPlugin.JiraConnector); - if (jiraPlugin.JiraConnector.isLoggedIn) { - jiraForm.setFilename(filename); + JiraForm jiraForm = new JiraForm(_jiraPlugin.JiraConnector); + if (_jiraPlugin.JiraConnector.IsLoggedIn) { + jiraForm.SetFilename(filename); DialogResult result = jiraForm.ShowDialog(); if (result == DialogResult.OK) { try { // Run upload in the background new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), - delegate() { - jiraForm.upload(new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + delegate { + jiraForm.Upload(new SurfaceContainer(surfaceToUpload, outputSettings, filename)); } ); - LOG.Debug("Uploaded to Jira."); + Log.Debug("Uploaded to Jira."); exportInformation.ExportMade = true; // TODO: This can't work: exportInformation.Uri = surfaceToUpload.UploadURL; diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 217205e5e..84b81adcd 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -23,21 +23,19 @@ using System.ComponentModel; using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; -using Jira; using System; +using GreenshotJiraPlugin.Forms; namespace GreenshotJiraPlugin { /// /// This is the JiraPlugin base code /// public class JiraPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(JiraPlugin)); - private PluginAttribute jiraPluginAttributes; - private IGreenshotHost host; - private JiraConnector jiraConnector = null; - private JiraConfiguration config = null; - private ComponentResourceManager resources; - private static JiraPlugin instance = null; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraPlugin)); + private PluginAttribute _jiraPluginAttributes; + private JiraConnector _jiraConnector; + private JiraConfiguration _config; + private static JiraPlugin _instance; public void Dispose() { Dispose(true); @@ -46,26 +44,26 @@ namespace GreenshotJiraPlugin { protected virtual void Dispose(bool disposing) { if (disposing) { - if (jiraConnector != null) { - jiraConnector.Dispose(); - jiraConnector = null; + if (_jiraConnector != null) { + _jiraConnector.Dispose(); + _jiraConnector = null; } } } public static JiraPlugin Instance { get { - return instance; + return _instance; } } public JiraPlugin() { - instance = this; + _instance = this; } public PluginAttribute JiraPluginAttributes { get { - return jiraPluginAttributes; + return _jiraPluginAttributes; } } @@ -80,40 +78,38 @@ namespace GreenshotJiraPlugin { //Needed for a fail-fast public JiraConnector CurrentJiraConnector { get { - return jiraConnector; + return _jiraConnector; } } public JiraConnector JiraConnector { get { - if (jiraConnector == null) { - jiraConnector = new JiraConnector(true); + if (_jiraConnector == null) { + _jiraConnector = new JiraConnector(true); } - return jiraConnector; + return _jiraConnector; } } /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// Use the ICaptureHost interface to register in the MainContextMenu - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - host = (IGreenshotHost)pluginHost; - jiraPluginAttributes = myAttributes; + _jiraPluginAttributes = myAttributes; // Register configuration (don't need the configuration itself) - config = IniConfig.GetIniSection(); - resources = new ComponentResourceManager(typeof(JiraPlugin)); + _config = IniConfig.GetIniSection(); + new ComponentResourceManager(typeof(JiraPlugin)); return true; } public virtual void Shutdown() { - LOG.Debug("Jira Plugin shutdown."); - if (jiraConnector != null) { - jiraConnector.logout(); + Log.Debug("Jira Plugin shutdown."); + if (_jiraConnector != null) { + _jiraConnector.Logout(); } } @@ -121,25 +117,40 @@ namespace GreenshotJiraPlugin { /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - string url = config.Url; - if (config.ShowConfigDialog()) { + string url = _config.Url; + if (ShowConfigDialog()) { // check for re-login - if (jiraConnector != null && jiraConnector.isLoggedIn && !string.IsNullOrEmpty(url)) { - if (!url.Equals(config.Url)) { - jiraConnector.logout(); - jiraConnector.login(); + if (_jiraConnector != null && _jiraConnector.IsLoggedIn && !string.IsNullOrEmpty(url)) { + if (!url.Equals(_config.Url)) { + _jiraConnector.Logout(); + _jiraConnector.Login(); } } } } + /// + /// A form for username/password + /// + /// bool true if OK was pressed, false if cancel + private bool ShowConfigDialog() + { + var settingsForm = new SettingsForm(); + var result = settingsForm.ShowDialog(); + if (result == DialogResult.OK) + { + return true; + } + return false; + } + /// /// This will be called when Greenshot is shutting down /// /// /// public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, calling logout of jira!"); + Log.Debug("Application closing, calling logout of jira!"); Shutdown(); } } diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index 521b9ef58..3dcf945c4 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -22,15 +22,14 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using Greenshot.IniFile; using GreenshotPlugin.Core; -using Jira; namespace GreenshotJiraPlugin { /// /// Description of JiraUtils. /// - public class JiraUtils { - private static readonly Regex JIRA_KEY_REGEX = new Regex(@"/browse/([A-Z0-9]+\-[0-9]+)"); - private static readonly JiraConfiguration config = IniConfig.GetIniSection(); + public static class JiraUtils { + private static readonly Regex JiraKeyRegex = new Regex(@"/browse/([A-Z0-9]+\-[0-9]+)"); + private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); public static List GetCurrentJiras() { // Make sure we suppress the login @@ -39,24 +38,30 @@ namespace GreenshotJiraPlugin { if (url == null) { continue; } - MatchCollection jiraKeyMatch = JIRA_KEY_REGEX.Matches(url); - if (jiraKeyMatch != null && jiraKeyMatch.Count > 0) { + MatchCollection jiraKeyMatch = JiraKeyRegex.Matches(url); + if (jiraKeyMatch.Count > 0) { string jiraKey = jiraKeyMatch[0].Groups[1].Value; jirakeys.Add(jiraKey); } } - if (!string.IsNullOrEmpty(config.LastUsedJira) && !jirakeys.Contains(config.LastUsedJira)) { - jirakeys.Add(config.LastUsedJira); + if (!string.IsNullOrEmpty(Config.LastUsedJira) && !jirakeys.Contains(Config.LastUsedJira)) { + jirakeys.Add(Config.LastUsedJira); } if (jirakeys.Count > 0) { List jiraIssues = new List(); foreach(string jiraKey in jirakeys) { - try { - JiraIssue issue = JiraPlugin.Instance.JiraConnector.getIssue(jiraKey); - if (issue != null) { + try + { + JiraIssue issue = JiraPlugin.Instance.JiraConnector.GetIssue(jiraKey); + if (issue != null) + { jiraIssues.Add(issue); } - } catch {} + } + catch + { + + } } if (jiraIssues.Count > 0) { return jiraIssues; diff --git a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs index 38a34799f..dc12030a2 100644 --- a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs @@ -35,7 +35,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable -[assembly: PluginAttribute("GreenshotJiraPlugin.JiraPlugin", true)] +[assembly: Plugin("GreenshotJiraPlugin.JiraPlugin", 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. diff --git a/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs b/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs index d28aed3eb..6633d436c 100644 --- a/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs +++ b/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs @@ -8,26 +8,25 @@ // //------------------------------------------------------------------------------ -namespace Jira +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Web.Services; +using System.Web.Services.Protocols; +using System.Xml.Serialization; + +namespace GreenshotJiraPlugin.Web_References.JiraSoap { - using System.Diagnostics; - using System.Web.Services; - using System.ComponentModel; - using System.Web.Services.Protocols; - using System; - using System.Xml.Serialization; - - - /// + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name="jirasoapservice-v2SoapBinding", Namespace="http://jira/rpc/soap/jirasoapservice-v2")] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteRoleActor))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteFieldValue))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteCustomFieldValue))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemotePermissionMapping))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(AbstractRemoteEntity))] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [WebServiceBinding(Name="jirasoapservice-v2SoapBinding", Namespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapInclude(typeof(RemoteRoleActor))] + [SoapInclude(typeof(RemoteFieldValue))] + [SoapInclude(typeof(RemoteCustomFieldValue))] + [SoapInclude(typeof(RemotePermissionMapping))] + [SoapInclude(typeof(AbstractRemoteEntity))] public partial class JiraSoapServiceService : System.Web.Services.Protocols.SoapHttpClientProtocol { @@ -38,8 +37,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getCommentReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getCommentReturn")] public RemoteComment getComment(string in0, long in1) { object[] results = this.Invoke("getComment", new object[] { @@ -64,8 +63,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getServerInfoReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getServerInfoReturn")] public RemoteServerInfo getServerInfo(string in0) { object[] results = this.Invoke("getServerInfo", new object[] { @@ -88,8 +87,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getGroupReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getGroupReturn")] public RemoteGroup getGroup(string in0, string in1) { object[] results = this.Invoke("getGroup", new object[] { @@ -114,8 +113,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("loginReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("loginReturn")] public string login(string in0, string in1) { object[] results = this.Invoke("login", new object[] { @@ -140,8 +139,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getUserReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getUserReturn")] public RemoteUser getUser(string in0, string in1) { object[] results = this.Invoke("getUser", new object[] { @@ -166,8 +165,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssueReturn")] public RemoteIssue getIssue(string in0, string in1) { object[] results = this.Invoke("getIssue", new object[] { @@ -192,8 +191,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getVersionsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getVersionsReturn")] public RemoteVersion[] getVersions(string in0, string in1) { object[] results = this.Invoke("getVersions", new object[] { @@ -218,8 +217,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getComponentsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getComponentsReturn")] public RemoteComponent[] getComponents(string in0, string in1) { object[] results = this.Invoke("getComponents", new object[] { @@ -244,8 +243,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createGroupReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createGroupReturn")] public RemoteGroup createGroup(string in0, string in1, RemoteUser in2) { object[] results = this.Invoke("createGroup", new object[] { @@ -272,8 +271,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createUserReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createUserReturn")] public RemoteUser createUser(string in0, string in1, string in2, string in3, string in4) { object[] results = this.Invoke("createUser", new object[] { @@ -304,8 +303,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createIssueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createIssueReturn")] public RemoteIssue createIssue(string in0, RemoteIssue in1) { object[] results = this.Invoke("createIssue", new object[] { @@ -330,8 +329,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("updateIssueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("updateIssueReturn")] public RemoteIssue updateIssue(string in0, string in1, RemoteFieldValue[] in2) { object[] results = this.Invoke("updateIssue", new object[] { @@ -358,7 +357,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteIssue(string in0, string in1) { this.Invoke("deleteIssue", new object[] { @@ -381,8 +380,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getAvailableActionsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getAvailableActionsReturn")] public RemoteNamedObject[] getAvailableActions(string in0, string in1) { object[] results = this.Invoke("getAvailableActions", new object[] { @@ -407,8 +406,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getSubTaskIssueTypesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getSubTaskIssueTypesReturn")] public RemoteIssueType[] getSubTaskIssueTypes(string in0) { object[] results = this.Invoke("getSubTaskIssueTypes", new object[] { @@ -431,8 +430,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getConfigurationReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getConfigurationReturn")] public RemoteConfiguration getConfiguration(string in0) { object[] results = this.Invoke("getConfiguration", new object[] { @@ -455,8 +454,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createProjectReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createProjectReturn")] public RemoteProject createProject(string in0, string in1, string in2, string in3, string in4, string in5, RemotePermissionScheme in6, RemoteScheme in7, RemoteScheme in8) { object[] results = this.Invoke("createProject", new object[] { @@ -495,8 +494,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("updateProjectReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("updateProjectReturn")] public RemoteProject updateProject(string in0, RemoteProject in1) { object[] results = this.Invoke("updateProject", new object[] { @@ -521,8 +520,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectByKeyReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectByKeyReturn")] public RemoteProject getProjectByKey(string in0, string in1) { object[] results = this.Invoke("getProjectByKey", new object[] { @@ -547,7 +546,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void removeAllRoleActorsByProject(string in0, RemoteProject in1) { this.Invoke("removeAllRoleActorsByProject", new object[] { @@ -570,8 +569,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getPrioritiesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getPrioritiesReturn")] public RemotePriority[] getPriorities(string in0) { object[] results = this.Invoke("getPriorities", new object[] { @@ -594,8 +593,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getResolutionsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getResolutionsReturn")] public RemoteResolution[] getResolutions(string in0) { object[] results = this.Invoke("getResolutions", new object[] { @@ -618,8 +617,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssueTypesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssueTypesReturn")] public RemoteIssueType[] getIssueTypes(string in0) { object[] results = this.Invoke("getIssueTypes", new object[] { @@ -642,8 +641,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getStatusesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getStatusesReturn")] public RemoteStatus[] getStatuses(string in0) { object[] results = this.Invoke("getStatuses", new object[] { @@ -666,8 +665,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssueTypesForProjectReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssueTypesForProjectReturn")] public RemoteIssueType[] getIssueTypesForProject(string in0, string in1) { object[] results = this.Invoke("getIssueTypesForProject", new object[] { @@ -692,8 +691,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectRolesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectRolesReturn")] public RemoteProjectRole[] getProjectRoles(string in0) { object[] results = this.Invoke("getProjectRoles", new object[] { @@ -716,8 +715,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectRoleReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectRoleReturn")] public RemoteProjectRole getProjectRole(string in0, long in1) { object[] results = this.Invoke("getProjectRole", new object[] { @@ -742,8 +741,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectRoleActorsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectRoleActorsReturn")] public RemoteProjectRoleActors getProjectRoleActors(string in0, RemoteProjectRole in1, RemoteProject in2) { object[] results = this.Invoke("getProjectRoleActors", new object[] { @@ -770,8 +769,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getDefaultRoleActorsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getDefaultRoleActorsReturn")] public RemoteRoleActors getDefaultRoleActors(string in0, RemoteProjectRole in1) { object[] results = this.Invoke("getDefaultRoleActors", new object[] { @@ -796,7 +795,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void removeAllRoleActorsByNameAndType(string in0, string in1, string in2) { this.Invoke("removeAllRoleActorsByNameAndType", new object[] { @@ -821,7 +820,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteProjectRole(string in0, RemoteProjectRole in1, bool in2) { this.Invoke("deleteProjectRole", new object[] { @@ -846,7 +845,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void updateProjectRole(string in0, RemoteProjectRole in1) { this.Invoke("updateProjectRole", new object[] { @@ -869,8 +868,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createProjectRoleReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createProjectRoleReturn")] public RemoteProjectRole createProjectRole(string in0, RemoteProjectRole in1) { object[] results = this.Invoke("createProjectRole", new object[] { @@ -895,8 +894,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("isProjectRoleNameUniqueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("isProjectRoleNameUniqueReturn")] public bool isProjectRoleNameUnique(string in0, string in1) { object[] results = this.Invoke("isProjectRoleNameUnique", new object[] { @@ -921,7 +920,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void addActorsToProjectRole(string in0, string[] in1, RemoteProjectRole in2, RemoteProject in3, string in4) { this.Invoke("addActorsToProjectRole", new object[] { @@ -950,7 +949,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void removeActorsFromProjectRole(string in0, string[] in1, RemoteProjectRole in2, RemoteProject in3, string in4) { this.Invoke("removeActorsFromProjectRole", new object[] { @@ -979,7 +978,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void addDefaultActorsToProjectRole(string in0, string[] in1, RemoteProjectRole in2, string in3) { this.Invoke("addDefaultActorsToProjectRole", new object[] { @@ -1006,7 +1005,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void removeDefaultActorsFromProjectRole(string in0, string[] in1, RemoteProjectRole in2, string in3) { this.Invoke("removeDefaultActorsFromProjectRole", new object[] { @@ -1033,8 +1032,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getAssociatedNotificationSchemesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getAssociatedNotificationSchemesReturn")] public RemoteScheme[] getAssociatedNotificationSchemes(string in0, RemoteProjectRole in1) { object[] results = this.Invoke("getAssociatedNotificationSchemes", new object[] { @@ -1059,8 +1058,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getAssociatedPermissionSchemesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getAssociatedPermissionSchemesReturn")] public RemoteScheme[] getAssociatedPermissionSchemes(string in0, RemoteProjectRole in1) { object[] results = this.Invoke("getAssociatedPermissionSchemes", new object[] { @@ -1085,7 +1084,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteProject(string in0, string in1) { this.Invoke("deleteProject", new object[] { @@ -1108,8 +1107,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectByIdReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectByIdReturn")] public RemoteProject getProjectById(string in0, long in1) { object[] results = this.Invoke("getProjectById", new object[] { @@ -1134,8 +1133,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getCustomFieldsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getCustomFieldsReturn")] public RemoteField[] getCustomFields(string in0) { object[] results = this.Invoke("getCustomFields", new object[] { @@ -1158,8 +1157,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getCommentsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getCommentsReturn")] public RemoteComment[] getComments(string in0, string in1) { object[] results = this.Invoke("getComments", new object[] { @@ -1184,8 +1183,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getFavouriteFiltersReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getFavouriteFiltersReturn")] public RemoteFilter[] getFavouriteFilters(string in0) { object[] results = this.Invoke("getFavouriteFilters", new object[] { @@ -1208,7 +1207,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void releaseVersion(string in0, string in1, RemoteVersion in2) { this.Invoke("releaseVersion", new object[] { @@ -1233,7 +1232,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void archiveVersion(string in0, string in1, string in2, bool in3) { this.Invoke("archiveVersion", new object[] { @@ -1260,8 +1259,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getFieldsForEditReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getFieldsForEditReturn")] public RemoteField[] getFieldsForEdit(string in0, string in1) { object[] results = this.Invoke("getFieldsForEdit", new object[] { @@ -1286,8 +1285,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getSubTaskIssueTypesForProjectReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getSubTaskIssueTypesForProjectReturn")] public RemoteIssueType[] getSubTaskIssueTypesForProject(string in0, string in1) { object[] results = this.Invoke("getSubTaskIssueTypesForProject", new object[] { @@ -1312,7 +1311,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void addUserToGroup(string in0, RemoteGroup in1, RemoteUser in2) { this.Invoke("addUserToGroup", new object[] { @@ -1337,7 +1336,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void removeUserFromGroup(string in0, RemoteGroup in1, RemoteUser in2) { this.Invoke("removeUserFromGroup", new object[] { @@ -1362,8 +1361,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getSecurityLevelReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getSecurityLevelReturn")] public RemoteSecurityLevel getSecurityLevel(string in0, string in1) { object[] results = this.Invoke("getSecurityLevel", new object[] { @@ -1388,8 +1387,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("logoutReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("logoutReturn")] public bool logout(string in0) { object[] results = this.Invoke("logout", new object[] { @@ -1412,7 +1411,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void addComment(string in0, string in1, RemoteComment in2) { this.Invoke("addComment", new object[] { @@ -1437,8 +1436,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectWithSchemesByIdReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectWithSchemesByIdReturn")] public RemoteProject getProjectWithSchemesById(string in0, long in1) { object[] results = this.Invoke("getProjectWithSchemesById", new object[] { @@ -1463,8 +1462,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getSecurityLevelsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getSecurityLevelsReturn")] public RemoteSecurityLevel[] getSecurityLevels(string in0, string in1) { object[] results = this.Invoke("getSecurityLevels", new object[] { @@ -1489,8 +1488,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectAvatarsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectAvatarsReturn")] public RemoteAvatar[] getProjectAvatars(string in0, string in1, bool in2) { object[] results = this.Invoke("getProjectAvatars", new object[] { @@ -1517,7 +1516,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void setProjectAvatar(string in0, string in1, long in2) { this.Invoke("setProjectAvatar", new object[] { @@ -1542,8 +1541,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectAvatarReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectAvatarReturn")] public RemoteAvatar getProjectAvatar(string in0, string in1) { object[] results = this.Invoke("getProjectAvatar", new object[] { @@ -1568,7 +1567,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteProjectAvatar(string in0, long in1) { this.Invoke("deleteProjectAvatar", new object[] { @@ -1591,8 +1590,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getNotificationSchemesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getNotificationSchemesReturn")] public RemoteScheme[] getNotificationSchemes(string in0) { object[] results = this.Invoke("getNotificationSchemes", new object[] { @@ -1615,8 +1614,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getPermissionSchemesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getPermissionSchemesReturn")] public RemotePermissionScheme[] getPermissionSchemes(string in0) { object[] results = this.Invoke("getPermissionSchemes", new object[] { @@ -1639,8 +1638,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getAllPermissionsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getAllPermissionsReturn")] public RemotePermission[] getAllPermissions(string in0) { object[] results = this.Invoke("getAllPermissions", new object[] { @@ -1663,8 +1662,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createPermissionSchemeReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createPermissionSchemeReturn")] public RemotePermissionScheme createPermissionScheme(string in0, string in1, string in2) { object[] results = this.Invoke("createPermissionScheme", new object[] { @@ -1691,8 +1690,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addPermissionToReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addPermissionToReturn")] public RemotePermissionScheme addPermissionTo(string in0, RemotePermissionScheme in1, RemotePermission in2, RemoteEntity in3) { object[] results = this.Invoke("addPermissionTo", new object[] { @@ -1721,8 +1720,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("deletePermissionFromReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("deletePermissionFromReturn")] public RemotePermissionScheme deletePermissionFrom(string in0, RemotePermissionScheme in1, RemotePermission in2, RemoteEntity in3) { object[] results = this.Invoke("deletePermissionFrom", new object[] { @@ -1751,7 +1750,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deletePermissionScheme(string in0, string in1) { this.Invoke("deletePermissionScheme", new object[] { @@ -1774,8 +1773,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createIssueWithSecurityLevelReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createIssueWithSecurityLevelReturn")] public RemoteIssue createIssueWithSecurityLevel(string in0, RemoteIssue in1, long in2) { object[] results = this.Invoke("createIssueWithSecurityLevel", new object[] { @@ -1802,8 +1801,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addAttachmentsToIssueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addAttachmentsToIssueReturn")] public bool addAttachmentsToIssue(string in0, string in1, string[] in2, sbyte[] in3) { object[] results = this.Invoke("addAttachmentsToIssue", new object[] { @@ -1832,8 +1831,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getAttachmentsFromIssueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getAttachmentsFromIssueReturn")] public RemoteAttachment[] getAttachmentsFromIssue(string in0, string in1) { object[] results = this.Invoke("getAttachmentsFromIssue", new object[] { @@ -1858,8 +1857,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("hasPermissionToEditCommentReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("hasPermissionToEditCommentReturn")] public bool hasPermissionToEditComment(string in0, RemoteComment in1) { object[] results = this.Invoke("hasPermissionToEditComment", new object[] { @@ -1884,8 +1883,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("editCommentReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("editCommentReturn")] public RemoteComment editComment(string in0, RemoteComment in1) { object[] results = this.Invoke("editComment", new object[] { @@ -1910,8 +1909,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getFieldsForActionReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getFieldsForActionReturn")] public RemoteField[] getFieldsForAction(string in0, string in1, string in2) { object[] results = this.Invoke("getFieldsForAction", new object[] { @@ -1938,8 +1937,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("progressWorkflowActionReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("progressWorkflowActionReturn")] public RemoteIssue progressWorkflowAction(string in0, string in1, string in2, RemoteFieldValue[] in3) { object[] results = this.Invoke("progressWorkflowAction", new object[] { @@ -1968,8 +1967,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssueByIdReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssueByIdReturn")] public RemoteIssue getIssueById(string in0, string in1) { object[] results = this.Invoke("getIssueById", new object[] { @@ -1994,8 +1993,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addWorklogWithNewRemainingEstimateReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addWorklogWithNewRemainingEstimateReturn")] public RemoteWorklog addWorklogWithNewRemainingEstimate(string in0, string in1, RemoteWorklog in2, string in3) { object[] results = this.Invoke("addWorklogWithNewRemainingEstimate", new object[] { @@ -2024,8 +2023,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addWorklogAndAutoAdjustRemainingEstimateReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addWorklogAndAutoAdjustRemainingEstimateReturn")] public RemoteWorklog addWorklogAndAutoAdjustRemainingEstimate(string in0, string in1, RemoteWorklog in2) { object[] results = this.Invoke("addWorklogAndAutoAdjustRemainingEstimate", new object[] { @@ -2052,8 +2051,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addWorklogAndRetainRemainingEstimateReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addWorklogAndRetainRemainingEstimateReturn")] public RemoteWorklog addWorklogAndRetainRemainingEstimate(string in0, string in1, RemoteWorklog in2) { object[] results = this.Invoke("addWorklogAndRetainRemainingEstimate", new object[] { @@ -2080,7 +2079,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteWorklogWithNewRemainingEstimate(string in0, string in1, string in2) { this.Invoke("deleteWorklogWithNewRemainingEstimate", new object[] { @@ -2105,7 +2104,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteWorklogAndAutoAdjustRemainingEstimate(string in0, string in1) { this.Invoke("deleteWorklogAndAutoAdjustRemainingEstimate", new object[] { @@ -2128,7 +2127,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteWorklogAndRetainRemainingEstimate(string in0, string in1) { this.Invoke("deleteWorklogAndRetainRemainingEstimate", new object[] { @@ -2151,7 +2150,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void updateWorklogWithNewRemainingEstimate(string in0, RemoteWorklog in1, string in2) { this.Invoke("updateWorklogWithNewRemainingEstimate", new object[] { @@ -2176,7 +2175,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void updateWorklogAndAutoAdjustRemainingEstimate(string in0, RemoteWorklog in1) { this.Invoke("updateWorklogAndAutoAdjustRemainingEstimate", new object[] { @@ -2199,7 +2198,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void updateWorklogAndRetainRemainingEstimate(string in0, RemoteWorklog in1) { this.Invoke("updateWorklogAndRetainRemainingEstimate", new object[] { @@ -2222,8 +2221,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getWorklogsReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getWorklogsReturn")] public RemoteWorklog[] getWorklogs(string in0, string in1) { object[] results = this.Invoke("getWorklogs", new object[] { @@ -2248,8 +2247,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("hasPermissionToCreateWorklogReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("hasPermissionToCreateWorklogReturn")] public bool hasPermissionToCreateWorklog(string in0, string in1) { object[] results = this.Invoke("hasPermissionToCreateWorklog", new object[] { @@ -2274,8 +2273,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("hasPermissionToDeleteWorklogReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("hasPermissionToDeleteWorklogReturn")] public bool hasPermissionToDeleteWorklog(string in0, string in1) { object[] results = this.Invoke("hasPermissionToDeleteWorklog", new object[] { @@ -2300,8 +2299,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("hasPermissionToUpdateWorklogReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("hasPermissionToUpdateWorklogReturn")] public bool hasPermissionToUpdateWorklog(string in0, string in1) { object[] results = this.Invoke("hasPermissionToUpdateWorklog", new object[] { @@ -2326,8 +2325,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getResolutionDateByKeyReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getResolutionDateByKeyReturn")] public System.DateTime getResolutionDateByKey(string in0, string in1) { object[] results = this.Invoke("getResolutionDateByKey", new object[] { @@ -2352,8 +2351,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getResolutionDateByIdReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getResolutionDateByIdReturn")] public System.DateTime getResolutionDateById(string in0, long in1) { object[] results = this.Invoke("getResolutionDateById", new object[] { @@ -2378,8 +2377,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssueCountForFilterReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssueCountForFilterReturn")] public long getIssueCountForFilter(string in0, string in1) { object[] results = this.Invoke("getIssueCountForFilter", new object[] { @@ -2404,8 +2403,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssuesFromTextSearchReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssuesFromTextSearchReturn")] public RemoteIssue[] getIssuesFromTextSearch(string in0, string in1) { object[] results = this.Invoke("getIssuesFromTextSearch", new object[] { @@ -2430,8 +2429,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssuesFromTextSearchWithProjectReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssuesFromTextSearchWithProjectReturn")] public RemoteIssue[] getIssuesFromTextSearchWithProject(string in0, string[] in1, string in2, int in3) { object[] results = this.Invoke("getIssuesFromTextSearchWithProject", new object[] { @@ -2460,8 +2459,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssuesFromJqlSearchReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssuesFromJqlSearchReturn")] public RemoteIssue[] getIssuesFromJqlSearch(string in0, string in1, int in2) { object[] results = this.Invoke("getIssuesFromJqlSearch", new object[] { @@ -2488,7 +2487,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteUser(string in0, string in1) { this.Invoke("deleteUser", new object[] { @@ -2511,8 +2510,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("updateGroupReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("updateGroupReturn")] public RemoteGroup updateGroup(string in0, RemoteGroup in1) { object[] results = this.Invoke("updateGroup", new object[] { @@ -2537,7 +2536,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void deleteGroup(string in0, string in1, string in2) { this.Invoke("deleteGroup", new object[] { @@ -2562,7 +2561,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void refreshCustomFields(string in0) { this.Invoke("refreshCustomFields", new object[] { @@ -2583,8 +2582,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getSavedFiltersReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getSavedFiltersReturn")] public RemoteFilter[] getSavedFilters(string in0) { object[] results = this.Invoke("getSavedFilters", new object[] { @@ -2607,8 +2606,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addBase64EncodedAttachmentsToIssueReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addBase64EncodedAttachmentsToIssueReturn")] public bool addBase64EncodedAttachmentsToIssue(string in0, string in1, string[] in2, string[] in3) { object[] results = this.Invoke("addBase64EncodedAttachmentsToIssue", new object[] { @@ -2637,8 +2636,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("createProjectFromObjectReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("createProjectFromObjectReturn")] public RemoteProject createProjectFromObject(string in0, RemoteProject in1) { object[] results = this.Invoke("createProjectFromObject", new object[] { @@ -2663,8 +2662,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getSecuritySchemesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getSecuritySchemesReturn")] public RemoteScheme[] getSecuritySchemes(string in0) { object[] results = this.Invoke("getSecuritySchemes", new object[] { @@ -2687,8 +2686,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("addVersionReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("addVersionReturn")] public RemoteVersion addVersion(string in0, string in1, RemoteVersion in2) { object[] results = this.Invoke("addVersion", new object[] { @@ -2715,8 +2714,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssuesFromFilterReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssuesFromFilterReturn")] public RemoteIssue[] getIssuesFromFilter(string in0, string in1) { object[] results = this.Invoke("getIssuesFromFilter", new object[] { @@ -2741,8 +2740,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssuesFromFilterWithLimitReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssuesFromFilterWithLimitReturn")] public RemoteIssue[] getIssuesFromFilterWithLimit(string in0, string in1, int in2, int in3) { object[] results = this.Invoke("getIssuesFromFilterWithLimit", new object[] { @@ -2771,8 +2770,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getIssuesFromTextSearchWithLimitReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getIssuesFromTextSearchWithLimitReturn")] public RemoteIssue[] getIssuesFromTextSearchWithLimit(string in0, string in1, int in2, int in3) { object[] results = this.Invoke("getIssuesFromTextSearchWithLimit", new object[] { @@ -2801,8 +2800,8 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: System.Xml.Serialization.SoapElementAttribute("getProjectsNoSchemesReturn")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [return: SoapElement("getProjectsNoSchemesReturn")] public RemoteProject[] getProjectsNoSchemes(string in0) { object[] results = this.Invoke("getProjectsNoSchemes", new object[] { @@ -2825,7 +2824,7 @@ namespace Jira } /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] + [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] public void setNewProjectAvatar(string in0, string in1, string in2, string in3) { this.Invoke("setNewProjectAvatar", new object[] { @@ -2854,583 +2853,583 @@ namespace Jira /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteComment { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string author; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string body; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable created; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string groupLevel; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string id; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string roleLevel; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string updateAuthor; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable updated; } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteWorklogImpl))] + [SoapInclude(typeof(RemoteWorklogImpl))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteWorklog { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string author; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string comment; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable created; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string groupLevel; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string id; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string roleLevelId; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable startDate; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string timeSpent; /// public long timeSpentInSeconds; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string updateAuthor; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable updated; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://service.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://service.soap.rpc.jira.atlassian.com")] public partial class RemoteWorklogImpl : RemoteWorklog { } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteAvatar { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string base64Data; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string contentType; /// public long id; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string owner; /// public bool system; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string type; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteRoleActor { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string descriptor; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string parameter; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteProjectRole projectRole; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string type; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteUser[] users; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteProjectRole { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable id; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string name; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteUser : RemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string email; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string fullname; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string name; } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteGroup))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteUser))] + [SoapInclude(typeof(RemoteGroup))] + [SoapInclude(typeof(RemoteUser))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteEntity { } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteGroup : RemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string name; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteUser[] users; } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteProjectRoleActors))] + [SoapInclude(typeof(RemoteProjectRoleActors))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteRoleActors { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteProjectRole projectRole; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteRoleActor[] roleActors; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteUser[] users; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteProjectRoleActors : RemoteRoleActors { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteProject project; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteProject : AbstractNamedRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteScheme issueSecurityScheme; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string key; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string lead; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteScheme notificationScheme; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemotePermissionScheme permissionScheme; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string projectUrl; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string url; } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemotePermissionScheme))] + [SoapInclude(typeof(RemotePermissionScheme))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteScheme { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable id; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string name; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string type; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemotePermissionScheme : RemoteScheme { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemotePermissionMapping[] permissionMappings; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemotePermissionMapping { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemotePermission permission; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteEntity[] remoteEntities; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemotePermission { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string name; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable permission; } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteSecurityLevel))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteFilter))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteField))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteProject))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(AbstractRemoteConstant))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteStatus))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteResolution))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemotePriority))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteIssueType))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteNamedObject))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteComponent))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteVersion))] + [SoapInclude(typeof(RemoteSecurityLevel))] + [SoapInclude(typeof(RemoteFilter))] + [SoapInclude(typeof(RemoteField))] + [SoapInclude(typeof(RemoteProject))] + [SoapInclude(typeof(AbstractRemoteConstant))] + [SoapInclude(typeof(RemoteStatus))] + [SoapInclude(typeof(RemoteResolution))] + [SoapInclude(typeof(RemotePriority))] + [SoapInclude(typeof(RemoteIssueType))] + [SoapInclude(typeof(RemoteNamedObject))] + [SoapInclude(typeof(RemoteComponent))] + [SoapInclude(typeof(RemoteVersion))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public abstract partial class AbstractNamedRemoteEntity : AbstractRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string name; } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteAttachment))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteIssue))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(AbstractNamedRemoteEntity))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteSecurityLevel))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteFilter))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteField))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteProject))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(AbstractRemoteConstant))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteStatus))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteResolution))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemotePriority))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteIssueType))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteNamedObject))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteComponent))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteVersion))] + [SoapInclude(typeof(RemoteAttachment))] + [SoapInclude(typeof(RemoteIssue))] + [SoapInclude(typeof(AbstractNamedRemoteEntity))] + [SoapInclude(typeof(RemoteSecurityLevel))] + [SoapInclude(typeof(RemoteFilter))] + [SoapInclude(typeof(RemoteField))] + [SoapInclude(typeof(RemoteProject))] + [SoapInclude(typeof(AbstractRemoteConstant))] + [SoapInclude(typeof(RemoteStatus))] + [SoapInclude(typeof(RemoteResolution))] + [SoapInclude(typeof(RemotePriority))] + [SoapInclude(typeof(RemoteIssueType))] + [SoapInclude(typeof(RemoteNamedObject))] + [SoapInclude(typeof(RemoteComponent))] + [SoapInclude(typeof(RemoteVersion))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public abstract partial class AbstractRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string id; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteAttachment : AbstractRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string author; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable created; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string filename; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable filesize; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string mimetype; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteIssue : AbstractRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteVersion[] affectsVersions; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string assignee; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string[] attachmentNames; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteComponent[] components; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable created; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteCustomFieldValue[] customFieldValues; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable duedate; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string environment; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteVersion[] fixVersions; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string key; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string priority; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string project; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string reporter; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string resolution; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string status; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string summary; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string type; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable updated; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable votes; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteVersion : AbstractNamedRemoteEntity { @@ -3438,161 +3437,161 @@ namespace Jira public bool archived; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable releaseDate; /// public bool released; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable sequence; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteComponent : AbstractNamedRemoteEntity { } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteCustomFieldValue { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string customfieldId; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string key; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string[] values; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteSecurityLevel : AbstractNamedRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteFilter : AbstractNamedRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string author; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string project; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string xml; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteField : AbstractNamedRemoteEntity { } /// - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteStatus))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteResolution))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemotePriority))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(RemoteIssueType))] + [SoapInclude(typeof(RemoteStatus))] + [SoapInclude(typeof(RemoteResolution))] + [SoapInclude(typeof(RemotePriority))] + [SoapInclude(typeof(RemoteIssueType))] [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public abstract partial class AbstractRemoteConstant : AbstractNamedRemoteEntity { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string description; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string icon; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteStatus : AbstractRemoteConstant { } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteResolution : AbstractRemoteConstant { } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemotePriority : AbstractRemoteConstant { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string color; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteIssueType : AbstractRemoteConstant { @@ -3602,20 +3601,20 @@ namespace Jira /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteNamedObject : AbstractNamedRemoteEntity { } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteConfiguration { @@ -3652,71 +3651,71 @@ namespace Jira /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteFieldValue { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string id; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string[] values; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteTimeInfo { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string serverTime; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string timeZoneId; } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://beans.soap.rpc.jira.atlassian.com")] + [Serializable()] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] public partial class RemoteServerInfo { /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string baseUrl; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public System.Nullable buildDate; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string buildNumber; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string edition; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public RemoteTimeInfo serverTime; /// - [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)] + [SoapElement(IsNullable=true)] public string version; } } diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index c4d35cc1c..c1f6b8dc5 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -38,55 +38,42 @@ namespace Greenshot.Interop { /// /// Holds reference to the actual COM object which is wrapped by this proxy /// - private object _COMObject; + private readonly object _comObject; /// /// Type of the COM object, set on constructor after getting the COM reference /// - private readonly Type _COMType; + private readonly Type _comType; /// /// The type of which method calls are intercepted and executed on the COM object. /// - private readonly Type _InterceptType; + private readonly Type _interceptType; #endregion - [DllImport("ole32.dll")] - static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID); #region Construction /// /// Gets a COM object and returns the transparent proxy which intercepts all calls to the object /// - /// Interface which defines the method and properties to intercept + /// Interface which defines the method and properties to intercept /// Transparent proxy to the real proxy for the object - /// The must be an interface decorated with the attribute. + /// T must be an interface decorated with the attribute. public static T GetInstance() { Type type = typeof(T); if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(T)); } if (!type.IsInterface) { - throw new ArgumentException("The specified type must be an interface.", "type"); + throw new ArgumentException("The specified type must be an interface.", nameof(T)); } - ComProgIdAttribute progIDAttribute = ComProgIdAttribute.GetAttribute(type); - if (null == progIDAttribute || null == progIDAttribute.Value || 0 == progIDAttribute.Value.Length) { - throw new ArgumentException("The specified type must define a ComProgId attribute.", "type"); - } - string progId = progIDAttribute.Value; - - // Convert from clsid to Prog ID, if needed - if (progId.StartsWith("clsid:")) { - Guid guid = new Guid(progId.Substring(6)); - int result = ProgIDFromCLSID(ref guid, out progId); - if (result != 0) { - //LOG.WarnFormat("Error {0} getting progId {1}", result, progIDAttribute.Value); - } else { - //LOG.InfoFormat("Mapped {0} to progId {1}", progIDAttribute.Value, progId); - } + ComProgIdAttribute progIdAttribute = ComProgIdAttribute.GetAttribute(type); + if (string.IsNullOrEmpty(progIdAttribute?.Value)) { + throw new ArgumentException("The specified type must define a ComProgId attribute.", nameof(T)); } + string progId = progIdAttribute.Value; object comObject = null; try { @@ -96,8 +83,6 @@ namespace Greenshot.Interop { //LOG.DebugFormat("No current instance of {0} object available.", progId); } else if (comE.ErrorCode == CO_E_CLASSSTRING) { //LOG.WarnFormat("Unknown progId {0}", progId); - } else { - //LOG.Warn("Error getting active object for " + progId, comE); } } catch (Exception) { //LOG.Warn("Error getting active object for " + progId, e); @@ -114,37 +99,26 @@ namespace Greenshot.Interop { /// Gets or creates a COM object and returns the transparent proxy which intercepts all calls to the object /// The ComProgId can be a normal ComProgId or a GUID prefixed with "clsid:" /// - /// Interface which defines the method and properties to intercept + /// Interface which defines the method and properties to intercept /// Transparent proxy to the real proxy for the object - /// The must be an interface decorated with the attribute. + /// The type must be an interface decorated with the attribute. public static T GetOrCreateInstance() { Type type = typeof(T); if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(T)); } if (!type.IsInterface) { - throw new ArgumentException("The specified type must be an interface.", "type"); + throw new ArgumentException("The specified type must be an interface.", nameof(T)); } - ComProgIdAttribute progIDAttribute = ComProgIdAttribute.GetAttribute(type); - if (null == progIDAttribute || null == progIDAttribute.Value || 0 == progIDAttribute.Value.Length) { - throw new ArgumentException("The specified type must define a ComProgId attribute.", "type"); + ComProgIdAttribute progIdAttribute = ComProgIdAttribute.GetAttribute(type); + if (string.IsNullOrEmpty(progIdAttribute?.Value)) { + throw new ArgumentException("The specified type must define a ComProgId attribute.", nameof(T)); } object comObject = null; Type comType = null; - string progId = progIDAttribute.Value; - - // Convert from clsid to Prog ID, if needed - if (progId.StartsWith("clsid:")) { - Guid guid = new Guid(progId.Substring(6)); - int result = ProgIDFromCLSID(ref guid, out progId); - if (result != 0) { - //LOG.WarnFormat("Error {0} getting progId {1}", result, progIDAttribute.Value); - } else { - //LOG.InfoFormat("Mapped {0} to progId {1}", progIDAttribute.Value, progId); - } - } + string progId = progIdAttribute.Value; try { comObject = Marshal.GetActiveObject(progId); @@ -154,8 +128,6 @@ namespace Greenshot.Interop { } else if (comE.ErrorCode == CO_E_CLASSSTRING) { //LOG.WarnFormat("Unknown progId {0} (application not installed)", progId); return default(T); - } else { - //LOG.Warn("Error getting active object for " + progId, comE); } } catch (Exception) { //LOG.Warn("Error getting active object for " + progId, e); @@ -193,10 +165,10 @@ namespace Greenshot.Interop { /// Transparent proxy to the real proxy for the object private static object Wrap(object comObject, Type type) { if (null == comObject) { - throw new ArgumentNullException("comObject"); + throw new ArgumentNullException(nameof(comObject)); } if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(type)); } COMWrapper wrapper = new COMWrapper(comObject, type); @@ -214,9 +186,9 @@ namespace Greenshot.Interop { /// private COMWrapper(object comObject, Type type) : base(type) { - _COMObject = comObject; - _COMType = comObject.GetType(); - _InterceptType = type; + _comObject = comObject; + _comType = comObject.GetType(); + _interceptType = type; } #endregion @@ -247,17 +219,17 @@ namespace Greenshot.Interop { /// interface. /// private void Dispose(bool disposing) { - if (disposing && null != _COMObject) { - if (Marshal.IsComObject(_COMObject)) { + if (disposing && null != _comObject) { + if (Marshal.IsComObject(_comObject)) { try { - while (Marshal.ReleaseComObject(_COMObject) > 0); + while (Marshal.ReleaseComObject(_comObject) > 0) + { + } } catch (Exception) { //LOG.WarnFormat("Problem releasing {0}", _COMType); //LOG.Warn("Error: ", ex); } } - - _COMObject = null; } } @@ -272,7 +244,7 @@ namespace Greenshot.Interop { /// The full name of the intercepted type. /// public override string ToString() { - return _InterceptType.FullName; + return _interceptType.FullName; } /// @@ -282,7 +254,7 @@ namespace Greenshot.Interop { /// The hash code of the wrapped object. /// public override int GetHashCode() { - return _COMObject.GetHashCode(); + return _comObject.GetHashCode(); } /// @@ -298,7 +270,7 @@ namespace Greenshot.Interop { if (null != value && RemotingServices.IsTransparentProxy(value)) { COMWrapper wrapper = RemotingServices.GetRealProxy(value) as COMWrapper; if (null != wrapper) { - return _COMObject == wrapper._COMObject; + return _comObject == wrapper._comObject; } } @@ -319,7 +291,7 @@ namespace Greenshot.Interop { /// private static Type GetByValType(Type byRefType) { if (null == byRefType) { - throw new ArgumentNullException("byRefType"); + throw new ArgumentNullException(nameof(byRefType)); } if (byRefType.IsByRef) { @@ -333,97 +305,6 @@ namespace Greenshot.Interop { #endregion - /// - /// Use this static method to cast a wrapped proxy to a new wrapper proxy of the supplied type. - /// In English, use this to cast you base "COM" interface to a specialized interface. - /// E.G. Outlook Item -> MailItem - /// - /// the type you want to cast to - /// The wrapper interface, e.g. something you got back from calling GetItem - /// A new wrapper proxy for the specified type - public static T Cast(object wrapperProxy) { - if (wrapperProxy == null) { - return default(T); - } - - Type newType = typeof(T); - COMWrapper oldWrapper = RemotingServices.GetRealProxy(wrapperProxy) as COMWrapper; - if (oldWrapper == null) { - throw new ArgumentException("wrapper proxy was no COMWrapper"); - } - if (oldWrapper._InterceptType.IsAssignableFrom(newType)) { - COMWrapper newWrapper = new COMWrapper(oldWrapper._COMObject, newType); - return (T)newWrapper.GetTransparentProxy(); - } - throw new InvalidCastException(string.Format("{0} is not assignable from {1}", oldWrapper._InterceptType, newType)); - } - - /// - /// Returns the "com" type of the wrapperproxy, making it possible to perform reflection on it. - /// - /// wrapperProxy to get the type from - /// Type - public static Type GetUnderlyingTypeForWrapper(object wrapperProxy) { - Type returnType = null; - COMWrapper wrapper = RemotingServices.GetRealProxy(wrapperProxy) as COMWrapper; - if (wrapper != null) { - IDispatch dispatch = wrapper._COMObject as IDispatch; - if (dispatch != null) { - int result = dispatch.GetTypeInfo(0, 0, out returnType); - if (result != 0) { - //LOG.DebugFormat("GetTypeInfo : 0x{0} ({1})", result.ToString("X"), result); - } - } - } - return returnType; - } - - /// - /// Return the Type of a IDispatch - /// - /// IDispatch to get the type object for - /// Type of the IDispatch - public static Type GetUnderlyingType(IDispatch dispatch) { - Type returnType = null; - if (dispatch != null) { - int result = dispatch.GetTypeInfo(0, 0, out returnType); - if (result != 0) { - //LOG.DebugFormat("GetTypeInfo : 0x{0} ({1})", result.ToString("X"), result); - } - } - return returnType; - } - - /// - /// Dump the Type-Information for the Type to the log, this uses reflection - /// - /// Type to inspect - public static void DumpTypeInfo(Type type) { - //LOG.InfoFormat("Type information for Type with name: {0}", type.Name); - try { - foreach (MemberInfo memberInfo in type.GetMembers()) { - //LOG.InfoFormat("Member: {0};", memberInfo.ToString()); - } - } catch (Exception) { - //LOG.Error(memberException); - } - try { - foreach (PropertyInfo propertyInfo in type.GetProperties()) { - //LOG.InfoFormat("Property: {0};", propertyInfo.ToString()); - } - } catch (Exception) { - //LOG.Error(propertyException); - } - try { - foreach (FieldInfo fieldInfo in type.GetFields()) { - //LOG.InfoFormat("Field: {0};", fieldInfo.ToString()); - } - } catch (Exception) { - //LOG.Error(fieldException); - } - //LOG.InfoFormat("Type information end."); - } - /// /// Intercept method calls /// @@ -473,22 +354,19 @@ namespace Greenshot.Interop { } else if ("ToString" == methodName && 0 == argCount && typeof(string) == returnType) { returnValue = ToString(); } else if ("GetType" == methodName && 0 == argCount && typeof(Type) == returnType) { - returnValue = _InterceptType; + returnValue = _interceptType; } else if ("GetHashCode" == methodName && 0 == argCount && typeof(int) == returnType) { returnValue = GetHashCode(); } else if ("Equals" == methodName && 1 == argCount && typeof(bool) == returnType) { returnValue = Equals(callMessage.Args[0]); } else if (1 == argCount && typeof(void) == returnType && (methodName.StartsWith("add_") || methodName.StartsWith("remove_"))) { - bool removeHandler = methodName.StartsWith("remove_"); - methodName = methodName.Substring(removeHandler ? 7 : 4); - - Delegate handler = callMessage.InArgs[0] as Delegate; + var handler = callMessage.InArgs[0] as Delegate; if (null == handler) { - return new ReturnMessage(new ArgumentNullException("handler"), callMessage); + return new ReturnMessage(new ArgumentNullException(nameof(handler)), callMessage); } } else { - invokeObject = _COMObject; - invokeType = _COMType; + invokeObject = _comObject; + invokeType = _comType; if (methodName.StartsWith("get_")) { // Property Get @@ -532,7 +410,7 @@ namespace Greenshot.Interop { wrapper = RemotingServices.GetRealProxy(args[i]) as COMWrapper; if (null != wrapper) { originalArgs[i] = wrapper; - args[i] = wrapper._COMObject; + args[i] = wrapper._comObject; } } else if (0 != outArgsCount && argModifiers[0][i]) { byValType = GetByValType(parameters[i].ParameterType); @@ -543,7 +421,7 @@ namespace Greenshot.Interop { if (null == args[i]) { args[i] = new DispatchWrapper(null); } - } else if (typeof(Decimal) == byValType) { + } else if (typeof(decimal) == byValType) { // If we're passing a decimal value by reference, // we need to pass a CurrencyWrapper to avoid a // type mismatch exception. @@ -590,7 +468,7 @@ namespace Greenshot.Interop { wrapper = null; byValType = GetByValType(parameter.ParameterType); - if (typeof(Decimal) == byValType) { + if (typeof(decimal) == byValType) { if (arg is CurrencyWrapper) { arg = ((CurrencyWrapper)arg).WrappedObject; } @@ -599,7 +477,7 @@ namespace Greenshot.Interop { } else if (byValType.IsInterface) { if (Marshal.IsComObject(arg)) { wrapper = originalArgs[i]; - if (null != wrapper && wrapper._COMObject != arg) { + if (null != wrapper && wrapper._comObject != arg) { wrapper.Dispose(); wrapper = null; } @@ -626,7 +504,7 @@ namespace Greenshot.Interop { /// object to cast /// public bool CanCastTo(Type toType, object o) { - bool returnValue = _InterceptType.IsAssignableFrom(toType); + bool returnValue = _interceptType.IsAssignableFrom(toType); return returnValue; } diff --git a/GreenshotOCRPlugin/OCRConfiguration.cs b/GreenshotOCRPlugin/OCRConfiguration.cs index 2d67d0d33..64ee9ac37 100644 --- a/GreenshotOCRPlugin/OCRConfiguration.cs +++ b/GreenshotOCRPlugin/OCRConfiguration.cs @@ -27,10 +27,10 @@ namespace GreenshotOCR { [IniSection("OCR", Description="Greenshot OCR Plugin configuration")] public class OCRConfiguration : IniSection { [IniProperty("Language", Description="Language for OCR", DefaultValue="miLANG_ENGLISH")] - public string Language; + public string Language { get; set; } [IniProperty("orientimage", Description="Orient image?", DefaultValue="true")] - public bool Orientimage; + public bool Orientimage { get; set; } [IniProperty("straightenImage", Description="Straighten image?", DefaultValue="true")] - public bool StraightenImage; + public bool StraightenImage { get; set; } } } diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 7719a03e8..93b7bffb4 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -94,9 +94,8 @@ namespace GreenshotOCR { /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// Use the ICaptureHost interface to register in the MainContextMenu - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public virtual bool Initialize(IGreenshotHost greenshotHost, PluginAttribute myAttributes) { LOG.Debug("Initialize called of " + myAttributes.Name); diff --git a/GreenshotOfficePlugin/OfficeConfiguration.cs b/GreenshotOfficePlugin/OfficeConfiguration.cs index 982411901..52f277ae4 100644 --- a/GreenshotOfficePlugin/OfficeConfiguration.cs +++ b/GreenshotOfficePlugin/OfficeConfiguration.cs @@ -28,24 +28,25 @@ namespace GreenshotOfficePlugin { /// [IniSection("Office", Description="Greenshot Office configuration")] public class OfficeConfiguration : IniSection { - [IniProperty("OutlookEmailFormat", Description = "Default type for emails. (Text, HTML)", DefaultValue="HTML")] - public EmailFormat OutlookEmailFormat; + [IniProperty("OutlookEmailFormat", Description = "Default type for emails. (Text, HTML)", DefaultValue = "HTML")] + public EmailFormat OutlookEmailFormat { get; set; } + [IniProperty("EmailSubjectPattern", Description = "Email subject pattern, works like the OutputFileFilenamePattern", DefaultValue = "${title}")] - public string EmailSubjectPattern; + public string EmailSubjectPattern { get; set; } [IniProperty("EmailTo", Description = "Default value for the to in emails that are created", DefaultValue = "")] - public string EmailTo; + public string EmailTo { get; set; } [IniProperty("EmailCC", Description = "Default value for the CC in emails that are created", DefaultValue = "")] - public string EmailCC; + public string EmailCC { get; set; } [IniProperty("EmailBCC", Description = "Default value for the BCC in emails that are created", DefaultValue = "")] - public string EmailBCC; + public string EmailBCC { get; set; } [IniProperty("OutlookAllowExportInMeetings", Description = "For Outlook: Allow export in meeting items", DefaultValue = "False")] - public bool OutlookAllowExportInMeetings; + public bool OutlookAllowExportInMeetings { get; set; } [IniProperty("WordLockAspectRatio", Description = "For Word: Lock the aspect ratio of the image", DefaultValue = "True")] - public bool WordLockAspectRatio; + public bool WordLockAspectRatio { get; set; } [IniProperty("PowerpointLockAspectRatio", Description = "For Powerpoint: Lock the aspect ratio of the image", DefaultValue = "True")] - public bool PowerpointLockAspectRatio; + public bool PowerpointLockAspectRatio { get; set; } [IniProperty("PowerpointSlideLayout", Description = "For Powerpoint: Slide layout, changing this to a wrong value will fallback on ppLayoutBlank!!", DefaultValue = "ppLayoutPictureWithCaption")] - public PPSlideLayout PowerpointSlideLayout; + public PPSlideLayout PowerpointSlideLayout { get; set; } } } \ No newline at end of file diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 64c6a02e5..34656850d 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -34,7 +34,7 @@ namespace Greenshot.Interop.Office { /// /// Get all currently opened workbooks /// - /// List with names of the workbooks + /// List of string with names of the workbooks public static List GetWorkbooks() { List currentWorkbooks = new List(); using (IExcelApplication excelApplication = GetExcelApplication()) { diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index 712cdd44b..bd2ddd6cc 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -49,7 +49,7 @@ namespace Greenshot.Interop.Office { /// /// A method to retrieve all inspectors which can act as an export target /// - /// List with inspector captions (window title) + /// List of strings with inspector captions (window title) public static IDictionary RetrievePossibleTargets() { IDictionary inspectorCaptions = new SortedDictionary(); try { @@ -76,7 +76,6 @@ namespace Greenshot.Interop.Office { if (inspectors != null && inspectors.Count > 0) { for (int i = 1; i <= inspectors.Count; i++) { using (IInspector inspector = outlookApplication.Inspectors[i]) { - string inspectorCaption = inspector.Caption; using (IItem currentItem = inspector.CurrentItem) { if (canExportToInspector(currentItem)) { OlObjectClass currentItemClass = currentItem.Class; @@ -328,13 +327,20 @@ namespace Greenshot.Interop.Office { LOG.Debug("Finished!"); return true; } + /// /// Export image to a new email /// /// + /// /// - /// - private static void ExportToNewEmail(IOutlookApplication outlookApplication, EmailFormat format, string tmpFile, string subject, string attachmentName, string to, string CC, string BCC, string url) { + /// + /// + /// + /// + /// + /// + private static void ExportToNewEmail(IOutlookApplication outlookApplication, EmailFormat format, string tmpFile, string subject, string attachmentName, string to, string cc, string bcc, string url) { using (IItem newItem = outlookApplication.CreateItem(OlItemType.olMailItem)) { if (newItem == null) { return; @@ -345,11 +351,11 @@ namespace Greenshot.Interop.Office { if (!string.IsNullOrEmpty(to)) { newMail.To = to; } - if (!string.IsNullOrEmpty(CC)) { - newMail.CC = CC; + if (!string.IsNullOrEmpty(cc)) { + newMail.CC = cc; } - if (!string.IsNullOrEmpty(BCC)) { - newMail.BCC = BCC; + if (!string.IsNullOrEmpty(bcc)) { + newMail.BCC = bcc; } newMail.BodyFormat = OlBodyFormat.olFormatHTML; string bodyString = null; @@ -362,7 +368,8 @@ namespace Greenshot.Interop.Office { switch (format) { case EmailFormat.Text: // Create the attachment (and dispose the COM object after using) - using (IAttachment attachment = newMail.Attachments.Add(tmpFile, OlAttachmentType.olByValue, 1, attachmentName)) { + using (newMail.Attachments.Add(tmpFile, OlAttachmentType.olByValue, 1, attachmentName)) + { newMail.BodyFormat = OlBodyFormat.olFormatPlain; if (bodyString == null) { bodyString = ""; @@ -433,14 +440,21 @@ namespace Greenshot.Interop.Office { /// /// Helper method to create an outlook mail item with attachment /// - /// The file to send, do not delete the file right away! + /// + /// The file to send, do not delete the file right away! + /// + /// + /// + /// + /// + /// /// true if it worked, false if not - public static bool ExportToOutlook(EmailFormat format, string tmpFile, string subject, string attachmentName, string to, string CC, string BCC, string url) { + public static bool ExportToOutlook(EmailFormat format, string tmpFile, string subject, string attachmentName, string to, string cc, string bcc, string url) { bool exported = false; try { using (IOutlookApplication outlookApplication = GetOrCreateOutlookApplication()) { if (outlookApplication != null) { - ExportToNewEmail(outlookApplication, format, tmpFile, subject, attachmentName, to, CC, BCC, url); + ExportToNewEmail(outlookApplication, format, tmpFile, subject, attachmentName, to, cc, bcc, url); exported = true; } } diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index faad20870..30906e681 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -69,7 +69,7 @@ namespace Greenshot.Interop.Office { /// /// /// - /// link for the image + /// link for the image /// tooltip of the image /// internal static bool InsertIntoExistingDocument(IWordApplication wordApplication, IWordDocument wordDocument, string tmpFile, string address, string tooltip) { diff --git a/GreenshotOfficePlugin/OfficePlugin.cs b/GreenshotOfficePlugin/OfficePlugin.cs index 142b9dee0..9536f93b4 100644 --- a/GreenshotOfficePlugin/OfficePlugin.cs +++ b/GreenshotOfficePlugin/OfficePlugin.cs @@ -20,8 +20,6 @@ */ using System; using System.Collections.Generic; -using System.Windows.Forms; - using Greenshot.Plugin; namespace GreenshotOfficePlugin { @@ -30,15 +28,14 @@ namespace GreenshotOfficePlugin { /// public class OfficePlugin : IGreenshotPlugin { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OfficePlugin)); - public static PluginAttribute Attributes; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) { - //if (disposing) {} + protected void Dispose(bool disposing) { + // Do nothing } public IEnumerable Destinations() { @@ -100,7 +97,6 @@ namespace GreenshotOfficePlugin { /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - Attributes = myAttributes; return true; } @@ -113,15 +109,5 @@ namespace GreenshotOfficePlugin { /// public virtual void Configure() { } - - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Office Plugin!"); - Shutdown(); - } } } diff --git a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs index 1b7d8c829..bfb800cd7 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs @@ -30,22 +30,22 @@ namespace GreenshotPhotobucketPlugin { [IniSection("Photobucket", Description="Greenshot Photobucket Plugin configuration")] public class PhotobucketConfiguration : IniSection { [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("UploadReduceColors", Description="Reduce color amount of the uploaded image to 256", DefaultValue="False")] - public bool UploadReduceColors; + public bool UploadReduceColors { get; set; } [IniProperty("UsePageLink", Description = "Use pagelink instead of direct link on the clipboard", DefaultValue = "False")] - public bool UsePageLink; + public bool UsePageLink { get; set; } [IniProperty("Token", Description = "The Photobucket token", Encrypted=true, ExcludeIfNull=true)] - public string Token; + public string Token { get; set; } [IniProperty("TokenSecret", Description = "The Photobucket token secret", Encrypted=true, ExcludeIfNull=true)] - public string TokenSecret; + public string TokenSecret { get; set; } [IniProperty("SubDomain", Description = "The Photobucket api subdomain", Encrypted = true, ExcludeIfNull = true)] - public string SubDomain; + public string SubDomain { get; set; } [IniProperty("Username", Description = "The Photobucket api username", ExcludeIfNull = true)] - public string Username; - + public string Username { get; set; } + public int Credits { get; set; diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index 8e5013b6d..b424a4d3e 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -34,12 +34,12 @@ namespace GreenshotPhotobucketPlugin { /// This is the GreenshotPhotobucketPlugin base code /// public class PhotobucketPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PhotobucketPlugin)); - private static PhotobucketConfiguration config; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(PhotobucketPlugin)); + private static PhotobucketConfiguration _config; public static PluginAttribute Attributes; - private IGreenshotHost host; - private ComponentResourceManager resources; - private ToolStripMenuItem itemPlugInConfig; + private IGreenshotHost _host; + private ComponentResourceManager _resources; + private ToolStripMenuItem _itemPlugInConfig; public void Dispose() { Dispose(true); @@ -48,9 +48,9 @@ namespace GreenshotPhotobucketPlugin { protected virtual void Dispose(bool disposing) { if (disposing) { - if (itemPlugInConfig != null) { - itemPlugInConfig.Dispose(); - itemPlugInConfig = null; + if (_itemPlugInConfig != null) { + _itemPlugInConfig.Dispose(); + _itemPlugInConfig = null; } } } @@ -69,97 +69,89 @@ namespace GreenshotPhotobucketPlugin { /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// Use the ICaptureHost interface to register in the MainContextMenu - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - host = (IGreenshotHost)pluginHost; + _host = pluginHost; Attributes = myAttributes; // Get configuration - config = IniConfig.GetIniSection(); - resources = new ComponentResourceManager(typeof(PhotobucketPlugin)); - - itemPlugInConfig = new ToolStripMenuItem(Language.GetString("photobucket", LangKey.configure)); - itemPlugInConfig.Tag = host; - itemPlugInConfig.Click += delegate { - config.ShowConfigDialog(); - }; - itemPlugInConfig.Image = (Image)resources.GetObject("Photobucket"); + _config = IniConfig.GetIniSection(); + _resources = new ComponentResourceManager(typeof(PhotobucketPlugin)); - PluginUtils.AddToContextMenu(host, itemPlugInConfig); - Language.LanguageChanged += new LanguageChangedHandler(OnLanguageChanged); + _itemPlugInConfig = new ToolStripMenuItem(Language.GetString("photobucket", LangKey.configure)) + { + Tag = _host, + Image = (Image)_resources.GetObject("Photobucket") + }; + _itemPlugInConfig.Click += delegate { + _config.ShowConfigDialog(); + }; + + PluginUtils.AddToContextMenu(_host, _itemPlugInConfig); + Language.LanguageChanged += OnLanguageChanged; return true; } public void OnLanguageChanged(object sender, EventArgs e) { - if (itemPlugInConfig != null) { - itemPlugInConfig.Text = Language.GetString("photobucket", LangKey.configure); + if (_itemPlugInConfig != null) { + _itemPlugInConfig.Text = Language.GetString("photobucket", LangKey.configure); } } public virtual void Shutdown() { - LOG.Debug("Photobucket Plugin shutdown."); - Language.LanguageChanged -= new LanguageChangedHandler(OnLanguageChanged); + Log.Debug("Photobucket Plugin shutdown."); + Language.LanguageChanged -= OnLanguageChanged; } /// /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - config.ShowConfigDialog(); + _config.ShowConfigDialog(); } - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Photobucket Plugin!"); - Shutdown(); - } - /// /// Upload the capture to Photobucket /// /// /// ISurface - /// out string for the url + /// Path to the album + /// out string for the url /// true if the upload succeeded - public bool Upload(ICaptureDetails captureDetails, ISurface surfaceToUpload, string albumPath, out string uploadURL) { - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality, config.UploadReduceColors); + public bool Upload(ICaptureDetails captureDetails, ISurface surfaceToUpload, string albumPath, out string uploadUrl) { + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(_config.UploadFormat, _config.UploadJpegQuality, _config.UploadReduceColors); try { - string filename = Path.GetFileName(FilenameHelper.GetFilename(config.UploadFormat, captureDetails)); + string filename = Path.GetFileName(FilenameHelper.GetFilename(_config.UploadFormat, captureDetails)); PhotobucketInfo photobucketInfo = null; // Run upload in the background new PleaseWaitForm().ShowAndWait(Attributes.Name, Language.GetString("photobucket", LangKey.communication_wait), - delegate() { + delegate { photobucketInfo = PhotobucketUtils.UploadToPhotobucket(surfaceToUpload, outputSettings, albumPath, captureDetails.Title, filename); } ); // This causes an exeption if the upload failed :) - LOG.DebugFormat("Uploaded to Photobucket page: " + photobucketInfo.Page); - uploadURL = null; + Log.DebugFormat("Uploaded to Photobucket page: " + photobucketInfo.Page); + uploadUrl = null; try { - if (config.UsePageLink) { - uploadURL = photobucketInfo.Page; + if (_config.UsePageLink) { + uploadUrl = photobucketInfo.Page; Clipboard.SetText(photobucketInfo.Page); } else { - uploadURL = photobucketInfo.Original; + uploadUrl = photobucketInfo.Original; Clipboard.SetText(photobucketInfo.Original); } } catch (Exception ex) { - LOG.Error("Can't write to clipboard: ", ex); + Log.Error("Can't write to clipboard: ", ex); } return true; } catch (Exception e) { - LOG.Error(e); + Log.Error(e); MessageBox.Show(Language.GetString("photobucket", LangKey.upload_failure) + " " + e.Message); } - uploadURL = null; + uploadUrl = null; return false; } } diff --git a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs index 58d64ed93..c57946119 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs @@ -142,7 +142,7 @@ namespace GreenshotPhotobucketPlugin { /// /// Get list of photobucket albums /// - /// List + /// List of string public static List RetrievePhotobucketAlbums() { if (albumsCache != null) { return albumsCache; diff --git a/GreenshotPicasaPlugin/PicasaConfiguration.cs b/GreenshotPicasaPlugin/PicasaConfiguration.cs index c7b81e3c2..dc906d8c9 100644 --- a/GreenshotPicasaPlugin/PicasaConfiguration.cs +++ b/GreenshotPicasaPlugin/PicasaConfiguration.cs @@ -29,14 +29,13 @@ namespace GreenshotPicasaPlugin { [IniSection("Picasa", Description = "Greenshot Picasa Plugin configuration")] public class PicasaConfiguration : IniSection { [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] - public OutputFormat UploadFormat; + public OutputFormat UploadFormat { get; set; } [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int UploadJpegQuality; + public int UploadJpegQuality { get; set; } [IniProperty("AfterUploadLinkToClipBoard", Description = "After upload send Picasa link to clipboard.", DefaultValue = "true")] - public bool AfterUploadLinkToClipBoard; - + public bool AfterUploadLinkToClipBoard { get; set; } [IniProperty("AddFilename", Description = "Is the filename passed on to Picasa", DefaultValue = "False")] public bool AddFilename { get; diff --git a/GreenshotPicasaPlugin/PicasaPlugin.cs b/GreenshotPicasaPlugin/PicasaPlugin.cs index 334cead8c..84ba7547e 100644 --- a/GreenshotPicasaPlugin/PicasaPlugin.cs +++ b/GreenshotPicasaPlugin/PicasaPlugin.cs @@ -33,12 +33,12 @@ namespace GreenshotPicasaPlugin { /// This is the Picasa base code /// public class PicasaPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PicasaPlugin)); - private static PicasaConfiguration config; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(PicasaPlugin)); + private static PicasaConfiguration _config; public static PluginAttribute Attributes; - private IGreenshotHost host; - private ComponentResourceManager resources; - private ToolStripMenuItem itemPlugInRoot; + private IGreenshotHost _host; + private ComponentResourceManager _resources; + private ToolStripMenuItem _itemPlugInRoot; public void Dispose() { Dispose(true); @@ -47,9 +47,9 @@ namespace GreenshotPicasaPlugin { protected virtual void Dispose(bool disposing) { if (disposing) { - if (itemPlugInRoot != null) { - itemPlugInRoot.Dispose(); - itemPlugInRoot = null; + if (_itemPlugInRoot != null) { + _itemPlugInRoot.Dispose(); + _itemPlugInRoot = null; } } } @@ -69,36 +69,35 @@ namespace GreenshotPicasaPlugin { /// /// Implementation of the IGreenshotPlugin.Initialize /// - /// Use the IGreenshotPluginHost interface to register events - /// Use the ICaptureHost interface to register in the MainContextMenu - /// My own attributes + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - host = (IGreenshotHost)pluginHost; + _host = pluginHost; Attributes = myAttributes; // Get configuration - config = IniConfig.GetIniSection(); - resources = new ComponentResourceManager(typeof(PicasaPlugin)); + _config = IniConfig.GetIniSection(); + _resources = new ComponentResourceManager(typeof(PicasaPlugin)); - itemPlugInRoot = new ToolStripMenuItem(); - itemPlugInRoot.Text = Language.GetString("picasa", LangKey.Configure); - itemPlugInRoot.Tag = host; - itemPlugInRoot.Image = (Image)resources.GetObject("Picasa"); - itemPlugInRoot.Click += new EventHandler(ConfigMenuClick); - PluginUtils.AddToContextMenu(host, itemPlugInRoot); - Language.LanguageChanged += new LanguageChangedHandler(OnLanguageChanged); + _itemPlugInRoot = new ToolStripMenuItem(); + _itemPlugInRoot.Text = Language.GetString("picasa", LangKey.Configure); + _itemPlugInRoot.Tag = _host; + _itemPlugInRoot.Image = (Image)_resources.GetObject("Picasa"); + _itemPlugInRoot.Click += ConfigMenuClick; + PluginUtils.AddToContextMenu(_host, _itemPlugInRoot); + Language.LanguageChanged += OnLanguageChanged; return true; } public void OnLanguageChanged(object sender, EventArgs e) { - if (itemPlugInRoot != null) { - itemPlugInRoot.Text = Language.GetString("picasa", LangKey.Configure); + if (_itemPlugInRoot != null) { + _itemPlugInRoot.Text = Language.GetString("picasa", LangKey.Configure); } } public virtual void Shutdown() { - LOG.Debug("Picasa Plugin shutdown."); - Language.LanguageChanged -= new LanguageChangedHandler(OnLanguageChanged); + Log.Debug("Picasa Plugin shutdown."); + Language.LanguageChanged -= OnLanguageChanged; //host.OnImageEditorOpen -= new OnImageEditorOpenHandler(ImageEditorOpened); } @@ -106,17 +105,7 @@ namespace GreenshotPicasaPlugin { /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - config.ShowConfigDialog(); - } - - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - LOG.Debug("Application closing, de-registering Picasa Plugin!"); - Shutdown(); + _config.ShowConfigDialog(); } public void ConfigMenuClick(object sender, EventArgs eventArgs) { @@ -124,24 +113,24 @@ namespace GreenshotPicasaPlugin { } public bool Upload(ICaptureDetails captureDetails, ISurface surfaceToUpload, out string uploadUrl) { - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality); + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(_config.UploadFormat, _config.UploadJpegQuality); try { string url = null; new PleaseWaitForm().ShowAndWait(Attributes.Name, Language.GetString("picasa", LangKey.communication_wait), - delegate() { - string filename = Path.GetFileName(FilenameHelper.GetFilename(config.UploadFormat, captureDetails)); - string contentType = "image/" + config.UploadFormat.ToString(); + delegate + { + string filename = Path.GetFileName(FilenameHelper.GetFilename(_config.UploadFormat, captureDetails)); url = PicasaUtils.UploadToPicasa(surfaceToUpload, outputSettings, captureDetails.Title, filename); } ); uploadUrl = url; - if (uploadUrl != null && config.AfterUploadLinkToClipBoard) { + if (uploadUrl != null && _config.AfterUploadLinkToClipBoard) { ClipboardHelper.SetClipboardData(uploadUrl); } return true; } catch (Exception e) { - LOG.Error("Error uploading.", e); + Log.Error("Error uploading.", e); MessageBox.Show(Language.GetString("picasa", LangKey.upload_failure) + " " + e.Message); } uploadUrl = null; diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index 499b83518..a34e443c9 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -28,7 +28,7 @@ namespace GreenshotPlugin.Controls { /// /// Description of PleaseWaitForm. /// - public partial class BackgroundForm : Form { + public sealed partial class BackgroundForm : Form { private volatile bool _shouldClose; private void BackgroundShowDialog() { diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 7bd756fef..1fb7683d0 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -457,7 +457,6 @@ namespace GreenshotPlugin.Controls { /// /// Register a hotkey /// - /// The window which will get the event /// The modifier, e.g.: Modifiers.CTRL, Modifiers.NONE or Modifiers.ALT /// The virtual key code /// A HotKeyHandler, this will be called to handle the hotkey press diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index 054a01110..256f7f042 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -299,14 +299,17 @@ namespace GreenshotPlugin.Core { /// /// Return a menu item /// + /// + /// /// /// ToolStripMenuItem public virtual ToolStripMenuItem GetMenuItem(bool addDynamics, ContextMenuStrip menu, EventHandler destinationClickHandler) { - ToolStripMenuItem basisMenuItem; - basisMenuItem = new ToolStripMenuItem(Description); - basisMenuItem.Image = DisplayIcon; - basisMenuItem.Tag = this; - basisMenuItem.Text = Description; + var basisMenuItem = new ToolStripMenuItem(Description) + { + Image = DisplayIcon, + Tag = this, + Text = Description + }; AddTagEvents(basisMenuItem, menu, Description); basisMenuItem.Click -= destinationClickHandler; basisMenuItem.Click += destinationClickHandler; diff --git a/GreenshotPlugin/Core/BinaryStructHelper.cs b/GreenshotPlugin/Core/BinaryStructHelper.cs index 0d43679b4..297bebf1b 100644 --- a/GreenshotPlugin/Core/BinaryStructHelper.cs +++ b/GreenshotPlugin/Core/BinaryStructHelper.cs @@ -50,7 +50,7 @@ namespace GreenshotPlugin.Core { /// Get a struct from a byte array /// /// typeof struct - /// byte[] + /// Pointer to the structor to return /// struct public static T FromIntPtr(IntPtr intPtr) where T : struct { object obj = Marshal.PtrToStructure(intPtr, typeof(T)); diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 69130babc..7765a57b6 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -304,7 +304,7 @@ EndSelection:<<<<<<<4 /// Returned images must be disposed by the calling code! /// /// - /// IEnumerable + /// IEnumerable of Image public static IEnumerable GetImages(IDataObject dataObject) { // Get single image, this takes the "best" match Image singleImage = GetImage(dataObject); @@ -708,7 +708,7 @@ EndSelection:<<<<<<<4 /// /// Retrieve a list of all formats currently on the clipboard /// - /// List with the current formats + /// List of strings with the current formats public static List GetFormats() { return GetFormats(GetDataObject()); } @@ -716,7 +716,7 @@ EndSelection:<<<<<<<4 /// /// Retrieve a list of all formats currently in the IDataObject /// - /// List with the current formats + /// List of string with the current formats public static List GetFormats(IDataObject dataObj) { string[] formats = null; @@ -733,7 +733,6 @@ EndSelection:<<<<<<<4 /// /// Check if there is currently something in the dataObject which has the supplied format /// - /// IDataObject /// string with format /// true if one the format is found public static bool ContainsFormat(string format) { @@ -743,6 +742,7 @@ EndSelection:<<<<<<<4 /// /// Check if there is currently something on the clipboard which has the supplied format /// + /// IDataObject /// string with format /// true if one the format is found public static bool ContainsFormat(IDataObject dataObject, string format) { diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index 07a4eaf4a..70e0d4a16 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -62,206 +62,206 @@ namespace GreenshotPlugin.Core { public event PropertyChangedEventHandler PropertyChanged; [IniProperty("Language", Description = "The language in IETF format (e.g. en-US)")] - public string Language; + public string Language { get; set; } [IniProperty("RegionHotkey", Description="Hotkey for starting the region capture", DefaultValue="PrintScreen")] - public string RegionHotkey; + public string RegionHotkey { get; set; } [IniProperty("WindowHotkey", Description="Hotkey for starting the window capture", DefaultValue="Alt + PrintScreen")] - public string WindowHotkey; + public string WindowHotkey { get; set; } [IniProperty("FullscreenHotkey", Description="Hotkey for starting the fullscreen capture", DefaultValue="Ctrl + PrintScreen")] - public string FullscreenHotkey; + public string FullscreenHotkey { get; set; } [IniProperty("LastregionHotkey", Description="Hotkey for starting the last region capture", DefaultValue="Shift + PrintScreen")] - public string LastregionHotkey; + public string LastregionHotkey { get; set; } [IniProperty("IEHotkey", Description="Hotkey for starting the IE capture", DefaultValue="Shift + Ctrl + PrintScreen")] - public string IEHotkey; + public string IEHotkey { get; set; } [IniProperty("IsFirstLaunch", Description="Is this the first time launch?", DefaultValue="true")] - public bool IsFirstLaunch; + public bool IsFirstLaunch { get; set; } [IniProperty("Destinations", Separator=",", Description="Which destinations? Possible options (more might be added by plugins) are: Editor, FileDefault, FileWithDialog, Clipboard, Printer, EMail, Picker", DefaultValue="Picker")] - public List OutputDestinations = new List(); + public List OutputDestinations { get; set; } = new List(); [IniProperty("ClipboardFormats", Separator=",", Description="Specify which formats we copy on the clipboard? Options are: PNG, HTML, HTMLDATAURL and DIB", DefaultValue="PNG,DIB")] - public List ClipboardFormats = new List(); + public List ClipboardFormats { get; set; } = new List(); [IniProperty("CaptureMousepointer", Description="Should the mouse be captured?", DefaultValue="true")] - public bool CaptureMousepointer; + public bool CaptureMousepointer { get; set; } [IniProperty("CaptureWindowsInteractive", Description="Use interactive window selection to capture? (false=Capture active window)", DefaultValue="false")] - public bool CaptureWindowsInteractive; + public bool CaptureWindowsInteractive { get; set; } [IniProperty("CaptureDelay", Description="Capture delay in millseconds.", DefaultValue="100")] - public int CaptureDelay; + public int CaptureDelay { get; set; } [IniProperty("ScreenCaptureMode", Description = "The capture mode used to capture a screen. (Auto, FullScreen, Fixed)", DefaultValue = "Auto")] - public ScreenCaptureMode ScreenCaptureMode; + public ScreenCaptureMode ScreenCaptureMode { get; set; } [IniProperty("ScreenToCapture", Description = "The screen number to capture when using ScreenCaptureMode Fixed.", DefaultValue = "1")] - public int ScreenToCapture; + public int ScreenToCapture { get; set; } [IniProperty("WindowCaptureMode", Description = "The capture mode used to capture a Window (Screen, GDI, Aero, AeroTransparent, Auto).", DefaultValue = "Auto")] - public WindowCaptureMode WindowCaptureMode; + public WindowCaptureMode WindowCaptureMode { get; set; } [IniProperty("WindowCaptureAllChildLocations", Description="Enable/disable capture all children, very slow but will make it possible to use this information in the editor.", DefaultValue="False")] - public bool WindowCaptureAllChildLocations; + public bool WindowCaptureAllChildLocations { get; set; } [IniProperty("DWMBackgroundColor", Description="The background color for a DWM window capture.")] - public Color DWMBackgroundColor; + public Color DWMBackgroundColor { get; set; } [IniProperty("PlayCameraSound", LanguageKey="settings_playsound",Description="Play a camera sound after taking a capture.", DefaultValue="false")] - public bool PlayCameraSound = false; + public bool PlayCameraSound { get; set; } = false; [IniProperty("ShowTrayNotification", LanguageKey="settings_shownotify",Description="Show a notification from the systray when a capture is taken.", DefaultValue="true")] - public bool ShowTrayNotification = true; + public bool ShowTrayNotification { get; set; } = true; [IniProperty("OutputFilePath", Description="Output file path.")] - public string OutputFilePath; + public string OutputFilePath { get; set; } [IniProperty("OutputFileAllowOverwrite", Description = "If the target file already exists True will make Greenshot always overwrite and False will display a 'Save-As' dialog.", DefaultValue = "true")] - public bool OutputFileAllowOverwrite; + public bool OutputFileAllowOverwrite { get; set; } [IniProperty("OutputFileFilenamePattern", Description = "Filename pattern for screenshot.", DefaultValue = "${capturetime:d\"yyyy-MM-dd HH_mm_ss\"}-${title}")] - public string OutputFileFilenamePattern; + public string OutputFileFilenamePattern { get; set; } [IniProperty("OutputFileFormat", Description="Default file type for writing screenshots. (bmp, gif, jpg, png, tiff)", DefaultValue="png")] - public OutputFormat OutputFileFormat = OutputFormat.png; + public OutputFormat OutputFileFormat { get; set; } = OutputFormat.png; [IniProperty("OutputFileReduceColors", Description="If set to true, than the colors of the output file are reduced to 256 (8-bit) colors", DefaultValue="false")] - public bool OutputFileReduceColors; + public bool OutputFileReduceColors { get; set; } [IniProperty("OutputFileAutoReduceColors", Description = "If set to true the amount of colors is counted and if smaller than 256 the color reduction is automatically used.", DefaultValue = "false")] - public bool OutputFileAutoReduceColors; + public bool OutputFileAutoReduceColors { get; set; } [IniProperty("OutputFileReduceColorsTo", Description = "Amount of colors to reduce to, when reducing", DefaultValue = "256")] - public int OutputFileReduceColorsTo; + public int OutputFileReduceColorsTo { get; set; } [IniProperty("OutputFileCopyPathToClipboard", Description="When saving a screenshot, copy the path to the clipboard?", DefaultValue="true")] - public bool OutputFileCopyPathToClipboard; + public bool OutputFileCopyPathToClipboard { get; set; } [IniProperty("OutputFileAsFullpath", Description="SaveAs Full path?")] - public string OutputFileAsFullpath; - + public string OutputFileAsFullpath { get; set; } + [IniProperty("OutputFileJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] - public int OutputFileJpegQuality; + public int OutputFileJpegQuality { get; set; } [IniProperty("OutputFilePromptQuality", Description="Ask for the quality before saving?", DefaultValue="false")] - public bool OutputFilePromptQuality; + public bool OutputFilePromptQuality { get; set; } [IniProperty("OutputFileIncrementingNumber", Description="The number for the ${NUM} in the filename pattern, is increased automatically after each save.", DefaultValue="1")] - public uint OutputFileIncrementingNumber; - + public uint OutputFileIncrementingNumber { get; set; } + [IniProperty("OutputPrintPromptOptions", LanguageKey="settings_alwaysshowprintoptionsdialog", Description="Ask for print options when printing?", DefaultValue="true")] - public bool OutputPrintPromptOptions; + public bool OutputPrintPromptOptions { get; set; } [IniProperty("OutputPrintAllowRotate", LanguageKey="printoptions_allowrotate", Description="Allow rotating the picture for fitting on paper?", DefaultValue="false")] - public bool OutputPrintAllowRotate; + public bool OutputPrintAllowRotate { get; set; } [IniProperty("OutputPrintAllowEnlarge", LanguageKey="printoptions_allowenlarge", Description="Allow growing the picture for fitting on paper?", DefaultValue="false")] - public bool OutputPrintAllowEnlarge; + public bool OutputPrintAllowEnlarge { get; set; } [IniProperty("OutputPrintAllowShrink", LanguageKey="printoptions_allowshrink", Description="Allow shrinking the picture for fitting on paper?", DefaultValue="true")] - public bool OutputPrintAllowShrink; + public bool OutputPrintAllowShrink { get; set; } [IniProperty("OutputPrintCenter", LanguageKey="printoptions_allowcenter", Description="Center image when printing?", DefaultValue="true")] - public bool OutputPrintCenter; + public bool OutputPrintCenter { get; set; } [IniProperty("OutputPrintInverted", LanguageKey="printoptions_inverted", Description="Print image inverted (use e.g. for console captures)", DefaultValue="false")] - public bool OutputPrintInverted; + public bool OutputPrintInverted { get; set; } [IniProperty("OutputPrintGrayscale", LanguageKey = "printoptions_printgrayscale", Description = "Force grayscale printing", DefaultValue = "false")] - public bool OutputPrintGrayscale; + public bool OutputPrintGrayscale { get; set; } [IniProperty("OutputPrintMonochrome", LanguageKey = "printoptions_printmonochrome", Description = "Force monorchrome printing", DefaultValue = "false")] - public bool OutputPrintMonochrome; + public bool OutputPrintMonochrome { get; set; } [IniProperty("OutputPrintMonochromeThreshold", Description = "Threshold for monochrome filter (0 - 255), lower value means less black", DefaultValue = "127")] - public byte OutputPrintMonochromeThreshold; + public byte OutputPrintMonochromeThreshold { get; set; } [IniProperty("OutputPrintFooter", LanguageKey = "printoptions_timestamp", Description = "Print footer on print?", DefaultValue = "true")] - public bool OutputPrintFooter; + public bool OutputPrintFooter { get; set; } [IniProperty("OutputPrintFooterPattern", Description = "Footer pattern", DefaultValue = "${capturetime:d\"D\"} ${capturetime:d\"T\"} - ${title}")] - public string OutputPrintFooterPattern; + public string OutputPrintFooterPattern { get; set; } [IniProperty("NotificationSound", Description = "The wav-file to play when a capture is taken, loaded only once at the Greenshot startup", DefaultValue="default")] - public string NotificationSound; + public string NotificationSound { get; set; } [IniProperty("UseProxy", Description="Use your global proxy?", DefaultValue="True")] - public bool UseProxy; + public bool UseProxy { get; set; } [IniProperty("IECapture", Description="Enable/disable IE capture", DefaultValue="True")] - public bool IECapture; + public bool IECapture { get; set; } [IniProperty("IEFieldCapture", Description="Enable/disable IE field capture, very slow but will make it possible to annotate the fields of a capture in the editor.", DefaultValue="False")] - public bool IEFieldCapture; + public bool IEFieldCapture { get; set; } [IniProperty("WindowClassesToCheckForIE", Description = "Comma separated list of Window-Classes which need to be checked for a IE instance!", DefaultValue = "AfxFrameOrView70,IMWindowClass")] - public List WindowClassesToCheckForIE; + public List WindowClassesToCheckForIE { get; set; } [IniProperty("AutoCropDifference", Description="Sets how to compare the colors for the autocrop detection, the higher the more is 'selected'. Possible values are from 0 to 255, where everything above ~150 doesn't make much sense!", DefaultValue="10")] - public int AutoCropDifference; + public int AutoCropDifference { get; set; } [IniProperty("IncludePlugins", Description="Comma separated list of Plugins which are allowed. If something in the list, than every plugin not in the list will not be loaded!")] - public List IncludePlugins; + public List IncludePlugins { get; set; } [IniProperty("ExcludePlugins", Description="Comma separated list of Plugins which are NOT allowed.")] - public List ExcludePlugins; + public List ExcludePlugins { get; set; } [IniProperty("ExcludeDestinations", Description = "Comma separated list of destinations which should be disabled.")] - public List ExcludeDestinations; + public List ExcludeDestinations { get; set; } [IniProperty("UpdateCheckInterval", Description="How many days between every update check? (0=no checks)", DefaultValue="1")] - public int UpdateCheckInterval; + public int UpdateCheckInterval { get; set; } [IniProperty("LastUpdateCheck", Description="Last update check")] - public DateTime LastUpdateCheck; + public DateTime LastUpdateCheck { get; set; } [IniProperty("DisableSettings", Description = "Enable/disable the access to the settings, can only be changed manually in this .ini", DefaultValue = "False")] - public bool DisableSettings; + public bool DisableSettings { get; set; } [IniProperty("DisableQuickSettings", Description = "Enable/disable the access to the quick settings, can only be changed manually in this .ini", DefaultValue = "False")] - public bool DisableQuickSettings; + public bool DisableQuickSettings { get; set; } [IniProperty("DisableTrayicon", Description = "Disable the trayicon, can only be changed manually in this .ini", DefaultValue = "False")] - public bool HideTrayicon; + public bool HideTrayicon { get; set; } [IniProperty("HideExpertSettings", Description = "Hide expert tab in the settings, can only be changed manually in this .ini", DefaultValue = "False")] - public bool HideExpertSettings; + public bool HideExpertSettings { get; set; } [IniProperty("ThumnailPreview", Description="Enable/disable thumbnail previews", DefaultValue="True")] - public bool ThumnailPreview; - + public bool ThumnailPreview { get; set; } + [IniProperty("NoGDICaptureForProduct", Description = "List of productnames for which GDI capturing is skipped (using fallback).", DefaultValue = "IntelliJ IDEA")] - public List NoGDICaptureForProduct; + public List NoGDICaptureForProduct { get; set; } [IniProperty("NoDWMCaptureForProduct", Description = "List of productnames for which DWM capturing is skipped (using fallback).", DefaultValue = "Citrix ICA Client")] - public List NoDWMCaptureForProduct; + public List NoDWMCaptureForProduct { get; set; } [IniProperty("OptimizeForRDP", Description="Make some optimizations for usage with remote desktop", DefaultValue="False")] - public bool OptimizeForRDP; + public bool OptimizeForRDP { get; set; } [IniProperty("DisableRDPOptimizing", Description = "Disable all optimizations for usage with remote desktop", DefaultValue = "False")] - public bool DisableRDPOptimizing; + public bool DisableRDPOptimizing { get; set; } [IniProperty("MinimizeWorkingSetSize", Description="Optimize memory footprint, but with a performance penalty!", DefaultValue="False")] - public bool MinimizeWorkingSetSize; + public bool MinimizeWorkingSetSize { get; set; } [IniProperty("WindowCaptureRemoveCorners", Description = "Remove the corners from a window capture", DefaultValue = "True")] - public bool WindowCaptureRemoveCorners; + public bool WindowCaptureRemoveCorners { get; set; } [IniProperty("CheckForUnstable", Description = "Also check for unstable version updates", DefaultValue = "False")] - public bool CheckForUnstable; + public bool CheckForUnstable { get; set; } [IniProperty("ActiveTitleFixes", Description="The fixes that are active.")] - public List ActiveTitleFixes; - + public List ActiveTitleFixes { get; set; } + [IniProperty("TitleFixMatcher", Description="The regular expressions to match the title with.")] - public Dictionary TitleFixMatcher; + public Dictionary TitleFixMatcher { get; set; } [IniProperty("TitleFixReplacer", Description="The replacements for the matchers.")] - public Dictionary TitleFixReplacer; + public Dictionary TitleFixReplacer { get; set; } [IniProperty("ExperimentalFeatures", Description="A list of experimental features, this allows us to test certain features before releasing them.", ExcludeIfNull=true)] - public List ExperimentalFeatures; + public List ExperimentalFeatures { get; set; } [IniProperty("EnableSpecialDIBClipboardReader", Description = "Enable a special DIB clipboard reader", DefaultValue="True")] - public bool EnableSpecialDIBClipboardReader; + public bool EnableSpecialDIBClipboardReader { get; set; } [IniProperty("WindowCornerCutShape", Description = "The cutshape which is used to remove the window corners, is mirrorred for all corners", DefaultValue = "5,3,2,1,1")] - public List WindowCornerCutShape; + public List WindowCornerCutShape { get; set; } [IniProperty("LeftClickAction", Description = "Specify what action is made if the tray icon is left clicked, if a double-click action is specified this action is initiated after a delay (configurable via the windows double-click speed)", DefaultValue = "SHOW_CONTEXT_MENU")] - public ClickActions LeftClickAction; + public ClickActions LeftClickAction { get; set; } [IniProperty("DoubleClickAction", Description = "Specify what action is made if the tray icon is double clicked", DefaultValue = "OPEN_LAST_IN_EXPLORER")] - public ClickActions DoubleClickAction; + public ClickActions DoubleClickAction { get; set; } [IniProperty("ZoomerEnabled", Description = "Sets if the zoomer is enabled", DefaultValue = "True")] - public bool ZoomerEnabled; + public bool ZoomerEnabled { get; set; } [IniProperty("ZoomerOpacity", Description = "Specify the transparency for the zoomer, from 0-1 (where 1 is no transparency and 0 is complete transparent. An usefull setting would be 0.7)", DefaultValue = "1")] - public float ZoomerOpacity; + public float ZoomerOpacity { get; set; } [IniProperty("MaxMenuItemLength", Description = "Maximum length of submenu items in the context menu, making this longer might cause context menu issues on dual screen systems.", DefaultValue = "25")] - public int MaxMenuItemLength; + public int MaxMenuItemLength { get; set; } [IniProperty("MailApiTo", Description = "The 'to' field for the email destination (settings for Outlook can be found under the Office section)", DefaultValue = "")] - public string MailApiTo; + public string MailApiTo { get; set; } [IniProperty("MailApiCC", Description = "The 'CC' field for the email destination (settings for Outlook can be found under the Office section)", DefaultValue = "")] - public string MailApiCC; + public string MailApiCC { get; set; } [IniProperty("MailApiBCC", Description = "The 'BCC' field for the email destination (settings for Outlook can be found under the Office section)", DefaultValue = "")] - public string MailApiBCC; + public string MailApiBCC { get; set; } [IniProperty("OptimizePNGCommand", Description = "Optional command to execute on a temporary PNG file, the command should overwrite the file and Greenshot will read it back. Note: this command is also executed when uploading PNG's!", DefaultValue = "")] - public string OptimizePNGCommand; + public string OptimizePNGCommand { get; set; } [IniProperty("OptimizePNGCommandArguments", Description = "Arguments for the optional command to execute on a PNG, {0} is replaced by the temp-filename from Greenshot. Note: Temp-file is deleted afterwards by Greenshot.", DefaultValue = "\"{0}\"")] - public string OptimizePNGCommandArguments; + public string OptimizePNGCommandArguments { get; set; } [IniProperty("LastSaveWithVersion", Description = "Version of Greenshot which created this .ini")] - public string LastSaveWithVersion; + public string LastSaveWithVersion { get; set; } [IniProperty("ProcessEXIFOrientation", Description = "When reading images from files or clipboard, use the EXIF information to correct the orientation", DefaultValue = "True")] - public bool ProcessEXIFOrientation; + public bool ProcessEXIFOrientation { get; set; } [IniProperty("LastCapturedRegion", Description = "The last used region, for reuse in the capture last region")] - public Rectangle LastCapturedRegion; + public Rectangle LastCapturedRegion { get; set; } private Size _iconSize; [IniProperty("IconSize", Description = "Defines the size of the icons (e.g. for the buttons in the editor), default value 16,16 anything bigger will cause scaling", DefaultValue = "16,16")] @@ -295,9 +295,9 @@ namespace GreenshotPlugin.Core { } [IniProperty("WebRequestTimeout", Description = "The connect timeout value for webrequets, these are seconds", DefaultValue = "100")] - public int WebRequestTimeout; + public int WebRequestTimeout { get; set; } [IniProperty("WebRequestReadWriteTimeout", Description = "The read/write timeout value for webrequets, these are seconds", DefaultValue = "100")] - public int WebRequestReadWriteTimeout; + public int WebRequestReadWriteTimeout { get; set; } /// /// Specifies what THIS build is diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 6d8138963..ddff6d907 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -25,37 +25,37 @@ using System.Text; using System.Threading; using System.Windows.Forms; -/// -/// The following code comes from: http://www.developerfusion.com/code/4693/using-the-credential-management-api/ -/// and is slightly modified so it works for us. -/// As the "Stored usernames and passwords" which can be accessed by: Start-> Run and type "Control keymgr.dll" -/// doesn't show all credentials use the tool here: http://www.microsoft.com/indonesia/msdn/credmgmt.aspx -/// The following code is an example for a login, it will call the Authenticate with user/password -/// which should return true if the login worked, false if not. -/// private static bool Login(string system, string name) { -/// try { -/// CredentialsDialog dialog = new CredentialsDialog(system); -/// dialog.Name = name; -/// while (dialog.Show(dialog.Name) == DialogResult.OK) { -/// if (Authenticate(dialog.Name, dialog.Password)) { -/// if (dialog.SaveChecked) dialog.Confirm(true); -/// return true; -/// } else { -/// try { -/// dialog.Confirm(false); -/// } catch (ApplicationException) { -/// // exception handling ... -/// } -/// dialog.IncorrectPassword = true; -/// } -/// } -/// } catch (ApplicationException) { -/// // exception handling ... -/// } -/// return false; -/// } -/// namespace GreenshotPlugin.Core { + /// + /// The following code comes from: http://www.developerfusion.com/code/4693/using-the-credential-management-api/ + /// and is slightly modified so it works for us. + /// As the "Stored usernames and passwords" which can be accessed by: Start-> Run and type "Control keymgr.dll" + /// doesn't show all credentials use the tool here: http://www.microsoft.com/indonesia/msdn/credmgmt.aspx + /// The following code is an example for a login, it will call the Authenticate with user/password + /// which should return true if the login worked, false if not. + /// private static bool Login(string system, string name) { + /// try { + /// CredentialsDialog dialog = new CredentialsDialog(system); + /// dialog.Name = name; + /// while (dialog.Show(dialog.Name) == DialogResult.OK) { + /// if (Authenticate(dialog.Name, dialog.Password)) { + /// if (dialog.SaveChecked) dialog.Confirm(true); + /// return true; + /// } else { + /// try { + /// dialog.Confirm(false); + /// } catch (ApplicationException) { + /// // exception handling ... + /// } + /// dialog.IncorrectPassword = true; + /// } + /// } + /// } catch (ApplicationException) { + /// // exception handling ... + /// } + /// return false; + /// } + /// /// Encapsulates dialog functionality from the Credential Management API. public sealed class CredentialsDialog { [DllImport("gdi32.dll", SetLastError=true)] diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index a3432875c..e86f28d72 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -52,7 +52,8 @@ namespace GreenshotPlugin.Core { /// The returned byte[] color depends on the underlying pixel format /// /// int x - /// int yint y + /// byte array void GetColorAt(int x, int y, byte[] color); /// @@ -139,7 +140,7 @@ namespace GreenshotPlugin.Core { /// /// Returns if this FastBitmap has an alpha channel /// - bool hasAlphaChannel { + bool HasAlphaChannel { get; } @@ -216,7 +217,8 @@ namespace GreenshotPlugin.Core { /// The returned byte[] color depends on the underlying pixel format /// /// int x - /// int yint y + /// byte array new void GetColorAt(int x, int y, byte[] color); new int Left { @@ -283,20 +285,20 @@ namespace GreenshotPlugin.Core { /// /// The base class for the fast bitmap implementation /// - public unsafe abstract class FastBitmap : IFastBitmap, IFastBitmapWithClip, IFastBitmapWithOffset { - private static ILog LOG = LogManager.GetLogger(typeof(FastBitmap)); + public abstract unsafe class FastBitmap : IFastBitmap, IFastBitmapWithClip, IFastBitmapWithOffset { + private static ILog _log = LogManager.GetLogger(typeof(FastBitmap)); - protected const int PIXELFORMAT_INDEX_A = 3; - protected const int PIXELFORMAT_INDEX_R = 2; - protected const int PIXELFORMAT_INDEX_G = 1; - protected const int PIXELFORMAT_INDEX_B = 0; + protected const int PixelformatIndexA = 3; + protected const int PixelformatIndexR = 2; + protected const int PixelformatIndexG = 1; + protected const int PixelformatIndexB = 0; - public const int COLOR_INDEX_R = 0; - public const int COLOR_INDEX_G = 1; - public const int COLOR_INDEX_B = 2; - public const int COLOR_INDEX_A = 3; + public const int ColorIndexR = 0; + public const int ColorIndexG = 1; + public const int ColorIndexB = 2; + public const int ColorIndexA = 3; - protected Rectangle area = Rectangle.Empty; + protected Rectangle Area = Rectangle.Empty; /// /// If this is set to true, the bitmap will be disposed when disposing the IFastBitmap /// @@ -318,19 +320,19 @@ namespace GreenshotPlugin.Core { /// /// The bitmap for which the FastBitmap is creating access /// - protected Bitmap bitmap; + protected Bitmap Bitmap; - protected BitmapData bmData; - protected int stride; /* bytes per pixel row */ - protected bool bitsLocked; - protected byte* pointer; + protected BitmapData BmData; + protected int Stride; /* bytes per pixel row */ + protected bool BitsLocked; + protected byte* Pointer; public static IFastBitmap Create(Bitmap source) { return Create(source, Rectangle.Empty); } public void SetResolution(float horizontal, float vertical) { - bitmap.SetResolution(horizontal, vertical); + Bitmap.SetResolution(horizontal, vertical); } /// @@ -345,12 +347,12 @@ namespace GreenshotPlugin.Core { case PixelFormat.Format8bppIndexed: return new FastChunkyBitmap(source, area); case PixelFormat.Format24bppRgb: - return new Fast24RGBBitmap(source, area); + return new Fast24RgbBitmap(source, area); case PixelFormat.Format32bppRgb: - return new Fast32RGBBitmap(source, area); + return new Fast32RgbBitmap(source, area); case PixelFormat.Format32bppArgb: case PixelFormat.Format32bppPArgb: - return new Fast32ARGBBitmap(source, area); + return new Fast32ArgbBitmap(source, area); default: throw new NotSupportedException(string.Format("Not supported Pixelformat {0}", source.PixelFormat)); } @@ -417,21 +419,22 @@ namespace GreenshotPlugin.Core { /// /// Constructor which stores the image and locks it when called /// - /// + /// Bitmap + /// Rectangle protected FastBitmap(Bitmap bitmap, Rectangle area) { - this.bitmap = bitmap; + Bitmap = bitmap; Rectangle bitmapArea = new Rectangle(Point.Empty, bitmap.Size); if (area != Rectangle.Empty) { area.Intersect(bitmapArea); - this.area = area; + Area = area; } else { - this.area = bitmapArea; + Area = bitmapArea; } // As the lock takes care that only the specified area is made available we need to calculate the offset Left = area.Left; Top = area.Top; // Default cliping is done to the area without invert - Clip = this.area; + Clip = Area; InvertClip = false; // Always lock, so we don't need to do this ourselves Lock(); @@ -442,10 +445,10 @@ namespace GreenshotPlugin.Core { /// public Size Size { get { - if (area == Rectangle.Empty) { - return bitmap.Size; + if (Area == Rectangle.Empty) { + return Bitmap.Size; } - return area.Size; + return Area.Size; } } @@ -454,10 +457,10 @@ namespace GreenshotPlugin.Core { /// public int Width { get { - if (area == Rectangle.Empty) { - return bitmap.Width; + if (Area == Rectangle.Empty) { + return Bitmap.Width; } - return area.Width; + return Area.Width; } } @@ -466,14 +469,14 @@ namespace GreenshotPlugin.Core { /// public int Height { get { - if (area == Rectangle.Empty) { - return bitmap.Height; + if (Area == Rectangle.Empty) { + return Bitmap.Height; } - return area.Height; + return Area.Height; } } - private int left; + private int _left; /// /// Return the left of the fastbitmap, this is also used as an offset /// @@ -482,7 +485,7 @@ namespace GreenshotPlugin.Core { return 0; } set { - left = value; + _left = value; } } @@ -491,14 +494,14 @@ namespace GreenshotPlugin.Core { /// int IFastBitmapWithOffset.Left { get { - return left; + return _left; } set { - left = value; + _left = value; } } - private int top; + private int _top; /// /// Return the top of the fastbitmap, this is also used as an offset /// @@ -507,7 +510,7 @@ namespace GreenshotPlugin.Core { return 0; } set { - top = value; + _top = value; } } @@ -516,10 +519,10 @@ namespace GreenshotPlugin.Core { /// int IFastBitmapWithOffset.Top { get { - return top; + return _top; } set { - top = value; + _top = value; } } @@ -545,14 +548,14 @@ namespace GreenshotPlugin.Core { /// Returns the underlying bitmap, unlocks it and prevents that it will be disposed /// public Bitmap UnlockAndReturnBitmap() { - if (bitsLocked) { + if (BitsLocked) { Unlock(); } NeedsDispose = false; - return bitmap; + return Bitmap; } - public virtual bool hasAlphaChannel { + public virtual bool HasAlphaChannel { get { return false; } @@ -584,26 +587,26 @@ namespace GreenshotPlugin.Core { protected virtual void Dispose(bool disposing) { Unlock(); if (disposing) { - if (bitmap != null && NeedsDispose) { - bitmap.Dispose(); + if (Bitmap != null && NeedsDispose) { + Bitmap.Dispose(); } } - bitmap = null; - bmData = null; - pointer = null; + Bitmap = null; + BmData = null; + Pointer = null; } /// /// Lock the bitmap so we have direct access to the memory /// public void Lock() { - if (Width > 0 && Height > 0 && !bitsLocked) { - bmData = bitmap.LockBits(area, ImageLockMode.ReadWrite, bitmap.PixelFormat); - bitsLocked = true; + if (Width > 0 && Height > 0 && !BitsLocked) { + BmData = Bitmap.LockBits(Area, ImageLockMode.ReadWrite, Bitmap.PixelFormat); + BitsLocked = true; - IntPtr Scan0 = bmData.Scan0; - pointer = (byte*)(void*)Scan0; - stride = bmData.Stride; + IntPtr scan0 = BmData.Scan0; + Pointer = (byte*)(void*)scan0; + Stride = BmData.Stride; } } @@ -611,9 +614,9 @@ namespace GreenshotPlugin.Core { /// Unlock the System Memory /// public void Unlock() { - if (bitsLocked) { - bitmap.UnlockBits(bmData); - bitsLocked = false; + if (BitsLocked) { + Bitmap.UnlockBits(BmData); + BitsLocked = false; } } @@ -623,7 +626,7 @@ namespace GreenshotPlugin.Core { /// /// public void DrawTo(Graphics graphics, Point destination) { - DrawTo(graphics, new Rectangle(destination, area.Size)); + DrawTo(graphics, new Rectangle(destination, Area.Size)); } /// @@ -635,12 +638,12 @@ namespace GreenshotPlugin.Core { /// public void DrawTo(Graphics graphics, Rectangle destinationRect) { // Make sure this.bitmap is unlocked, if it was locked - bool isLocked = bitsLocked; + bool isLocked = BitsLocked; if (isLocked) { Unlock(); } - graphics.DrawImage(bitmap, destinationRect, area, GraphicsUnit.Pixel); + graphics.DrawImage(Bitmap, destinationRect, Area, GraphicsUnit.Pixel); } /// @@ -650,7 +653,7 @@ namespace GreenshotPlugin.Core { /// /// true if x & y are inside the FastBitmap public bool Contains(int x, int y) { - return area.Contains(x - Left, y - Top); + return Area.Contains(x - Left, y - Top); } public abstract Color GetColorAt(int x, int y); @@ -693,29 +696,29 @@ namespace GreenshotPlugin.Core { /// /// true if x & y are inside the FastBitmap bool IFastBitmapWithOffset.Contains(int x, int y) { - return area.Contains(x - Left, y - Top); + return Area.Contains(x - Left, y - Top); } Color IFastBitmapWithOffset.GetColorAt(int x, int y) { - x -= left; - y -= top; + x -= _left; + y -= _top; return GetColorAt(x, y); } void IFastBitmapWithOffset.GetColorAt(int x, int y, byte[] color) { - x -= left; - y -= top; + x -= _left; + y -= _top; GetColorAt(x, y, color); } void IFastBitmapWithOffset.SetColorAt(int x, int y, byte[] color) { - x -= left; - y -= top; + x -= _left; + y -= _top; SetColorAt(x, y, color); } void IFastBitmapWithOffset.SetColorAt(int x, int y, Color color) { - x -= left; - y -= top; + x -= _left; + y -= _top; SetColorAt(x, y, color); } #endregion @@ -726,11 +729,11 @@ namespace GreenshotPlugin.Core { /// public unsafe class FastChunkyBitmap : FastBitmap { // Used for indexed images - private readonly Color[] colorEntries; - private readonly Dictionary colorCache = new Dictionary(); + private readonly Color[] _colorEntries; + private readonly Dictionary _colorCache = new Dictionary(); public FastChunkyBitmap(Bitmap source, Rectangle area) : base(source, area) { - colorEntries = bitmap.Palette.Entries; + _colorEntries = Bitmap.Palette.Entries; } /// @@ -740,9 +743,9 @@ namespace GreenshotPlugin.Core { /// /// Color public override Color GetColorAt(int x, int y) { - int offset = x + (y * stride); - byte colorIndex = pointer[offset]; - return colorEntries[colorIndex]; + int offset = x + (y * Stride); + byte colorIndex = Pointer[offset]; + return _colorEntries[colorIndex]; } /// @@ -772,8 +775,8 @@ namespace GreenshotPlugin.Core { /// /// byte with index public byte GetColorIndexAt(int x, int y) { - int offset = x + (y * stride); - return pointer[offset]; + int offset = x + (y * Stride); + return Pointer[offset]; } /// @@ -781,10 +784,10 @@ namespace GreenshotPlugin.Core { /// /// /// - /// + /// public void SetColorIndexAt(int x, int y, byte colorIndex) { - int offset = x + (y * stride); - pointer[offset] = colorIndex; + int offset = x + (y * Stride); + Pointer[offset] = colorIndex; } /// @@ -795,13 +798,13 @@ namespace GreenshotPlugin.Core { /// /// Color to set public override void SetColorAt(int x, int y, Color color) { - int offset = x + (y * stride); + int offset = x + (y * Stride); byte colorIndex; - if (!colorCache.TryGetValue(color, out colorIndex)) { + if (!_colorCache.TryGetValue(color, out colorIndex)) { bool foundColor = false; - for (colorIndex = 0; colorIndex < colorEntries.Length; colorIndex++) { - if (color == colorEntries[colorIndex]) { - colorCache.Add(color, colorIndex); + for (colorIndex = 0; colorIndex < _colorEntries.Length; colorIndex++) { + if (color == _colorEntries[colorIndex]) { + _colorCache.Add(color, colorIndex); foundColor = true; break; } @@ -810,16 +813,16 @@ namespace GreenshotPlugin.Core { throw new ArgumentException("No such color!"); } } - pointer[offset] = colorIndex; + Pointer[offset] = colorIndex; } } /// /// This is the implementation of the IFastBitmap for 24 bit images (no Alpha) /// - public unsafe class Fast24RGBBitmap : FastBitmap { + public unsafe class Fast24RgbBitmap : FastBitmap { - public Fast24RGBBitmap(Bitmap source, Rectangle area) : base(source, area) { + public Fast24RgbBitmap(Bitmap source, Rectangle area) : base(source, area) { } /// @@ -830,8 +833,8 @@ namespace GreenshotPlugin.Core { /// Y Coordinate /// Color public override Color GetColorAt(int x, int y) { - int offset = (x * 3) + (y * stride); - return Color.FromArgb(255, pointer[PIXELFORMAT_INDEX_R + offset], pointer[PIXELFORMAT_INDEX_G + offset], pointer[PIXELFORMAT_INDEX_B + offset]); + int offset = (x * 3) + (y * Stride); + return Color.FromArgb(255, Pointer[PixelformatIndexR + offset], Pointer[PixelformatIndexG + offset], Pointer[PixelformatIndexB + offset]); } /// @@ -842,10 +845,10 @@ namespace GreenshotPlugin.Core { /// /// public override void SetColorAt(int x, int y, Color color) { - int offset = (x * 3) + (y * stride); - pointer[PIXELFORMAT_INDEX_R + offset] = color.R; - pointer[PIXELFORMAT_INDEX_G + offset] = color.G; - pointer[PIXELFORMAT_INDEX_B + offset] = color.B; + int offset = (x * 3) + (y * Stride); + Pointer[PixelformatIndexR + offset] = color.R; + Pointer[PixelformatIndexG + offset] = color.G; + Pointer[PixelformatIndexB + offset] = color.B; } /// @@ -855,10 +858,10 @@ namespace GreenshotPlugin.Core { /// /// byte[4] as reference (r,g,b) public override void GetColorAt(int x, int y, byte[] color) { - int offset = (x * 3) + (y * stride); - color[PIXELFORMAT_INDEX_R] = pointer[PIXELFORMAT_INDEX_R + offset]; - color[PIXELFORMAT_INDEX_G] = pointer[PIXELFORMAT_INDEX_G + offset]; - color[PIXELFORMAT_INDEX_B] = pointer[PIXELFORMAT_INDEX_B + offset]; + int offset = (x * 3) + (y * Stride); + color[PixelformatIndexR] = Pointer[PixelformatIndexR + offset]; + color[PixelformatIndexG] = Pointer[PixelformatIndexG + offset]; + color[PixelformatIndexB] = Pointer[PixelformatIndexB + offset]; } /// @@ -868,10 +871,10 @@ namespace GreenshotPlugin.Core { /// /// byte[4] as reference (r,g,b) public override void SetColorAt(int x, int y, byte[] color) { - int offset = (x * 3) + (y * stride); - pointer[PIXELFORMAT_INDEX_R + offset] = color[PIXELFORMAT_INDEX_R]; - pointer[PIXELFORMAT_INDEX_G + offset] = color[PIXELFORMAT_INDEX_G]; - pointer[PIXELFORMAT_INDEX_B + offset] = color[PIXELFORMAT_INDEX_B]; + int offset = (x * 3) + (y * Stride); + Pointer[PixelformatIndexR + offset] = color[PixelformatIndexR]; + Pointer[PixelformatIndexG + offset] = color[PixelformatIndexG]; + Pointer[PixelformatIndexB + offset] = color[PixelformatIndexB]; } } @@ -879,8 +882,8 @@ namespace GreenshotPlugin.Core { /// /// This is the implementation of the IFastBitmap for 32 bit images (no Alpha) /// - public unsafe class Fast32RGBBitmap : FastBitmap { - public Fast32RGBBitmap(Bitmap source, Rectangle area) : base(source, area) { + public unsafe class Fast32RgbBitmap : FastBitmap { + public Fast32RgbBitmap(Bitmap source, Rectangle area) : base(source, area) { } @@ -892,8 +895,8 @@ namespace GreenshotPlugin.Core { /// Y Coordinate /// Color public override Color GetColorAt(int x, int y) { - int offset = (x * 4) + (y * stride); - return Color.FromArgb(255, pointer[PIXELFORMAT_INDEX_R + offset], pointer[PIXELFORMAT_INDEX_G + offset], pointer[PIXELFORMAT_INDEX_B + offset]); + int offset = (x * 4) + (y * Stride); + return Color.FromArgb(255, Pointer[PixelformatIndexR + offset], Pointer[PixelformatIndexG + offset], Pointer[PixelformatIndexB + offset]); } /// @@ -904,10 +907,10 @@ namespace GreenshotPlugin.Core { /// /// public override void SetColorAt(int x, int y, Color color) { - int offset = (x * 4) + (y * stride); - pointer[PIXELFORMAT_INDEX_R + offset] = color.R; - pointer[PIXELFORMAT_INDEX_G + offset] = color.G; - pointer[PIXELFORMAT_INDEX_B + offset] = color.B; + int offset = (x * 4) + (y * Stride); + Pointer[PixelformatIndexR + offset] = color.R; + Pointer[PixelformatIndexG + offset] = color.G; + Pointer[PixelformatIndexB + offset] = color.B; } /// @@ -917,10 +920,10 @@ namespace GreenshotPlugin.Core { /// /// byte[4] as reference (a,r,g,b) public override void GetColorAt(int x, int y, byte[] color) { - int offset = (x * 4) + (y * stride); - color[COLOR_INDEX_R] = pointer[PIXELFORMAT_INDEX_R + offset]; - color[COLOR_INDEX_G] = pointer[PIXELFORMAT_INDEX_G + offset]; - color[COLOR_INDEX_B] = pointer[PIXELFORMAT_INDEX_B + offset]; + int offset = (x * 4) + (y * Stride); + color[ColorIndexR] = Pointer[PixelformatIndexR + offset]; + color[ColorIndexG] = Pointer[PixelformatIndexG + offset]; + color[ColorIndexB] = Pointer[PixelformatIndexB + offset]; } /// @@ -930,18 +933,18 @@ namespace GreenshotPlugin.Core { /// /// byte[4] as reference (r,g,b) public override void SetColorAt(int x, int y, byte[] color) { - int offset = (x * 4) + (y * stride); - pointer[PIXELFORMAT_INDEX_R + offset] = color[COLOR_INDEX_R]; // R - pointer[PIXELFORMAT_INDEX_G + offset] = color[COLOR_INDEX_G]; - pointer[PIXELFORMAT_INDEX_B + offset] = color[COLOR_INDEX_B]; + int offset = (x * 4) + (y * Stride); + Pointer[PixelformatIndexR + offset] = color[ColorIndexR]; // R + Pointer[PixelformatIndexG + offset] = color[ColorIndexG]; + Pointer[PixelformatIndexB + offset] = color[ColorIndexB]; } } /// /// This is the implementation of the IFastBitmap for 32 bit images with Alpha /// - public unsafe class Fast32ARGBBitmap : FastBitmap, IFastBitmapWithBlend { - public override bool hasAlphaChannel { + public unsafe class Fast32ArgbBitmap : FastBitmap, IFastBitmapWithBlend { + public override bool HasAlphaChannel { get { return true; } @@ -951,7 +954,7 @@ namespace GreenshotPlugin.Core { get; set; } - public Fast32ARGBBitmap(Bitmap source, Rectangle area) : base(source, area) { + public Fast32ArgbBitmap(Bitmap source, Rectangle area) : base(source, area) { BackgroundBlendColor = Color.White; } @@ -962,8 +965,8 @@ namespace GreenshotPlugin.Core { /// Y Coordinate /// Color public override Color GetColorAt(int x, int y) { - int offset = (x * 4) + (y * stride); - return Color.FromArgb(pointer[PIXELFORMAT_INDEX_A + offset], pointer[PIXELFORMAT_INDEX_R + offset], pointer[PIXELFORMAT_INDEX_G + offset], pointer[PIXELFORMAT_INDEX_B + offset]); + int offset = (x * 4) + (y * Stride); + return Color.FromArgb(Pointer[PixelformatIndexA + offset], Pointer[PixelformatIndexR + offset], Pointer[PixelformatIndexG + offset], Pointer[PixelformatIndexB + offset]); } /// @@ -974,11 +977,11 @@ namespace GreenshotPlugin.Core { /// /// public override void SetColorAt(int x, int y, Color color) { - int offset = (x * 4) + (y * stride); - pointer[PIXELFORMAT_INDEX_A + offset] = color.A; - pointer[PIXELFORMAT_INDEX_R + offset] = color.R; - pointer[PIXELFORMAT_INDEX_G + offset] = color.G; - pointer[PIXELFORMAT_INDEX_B + offset] = color.B; + int offset = (x * 4) + (y * Stride); + Pointer[PixelformatIndexA + offset] = color.A; + Pointer[PixelformatIndexR + offset] = color.R; + Pointer[PixelformatIndexG + offset] = color.G; + Pointer[PixelformatIndexB + offset] = color.B; } /// @@ -988,11 +991,11 @@ namespace GreenshotPlugin.Core { /// /// byte[4] as reference (r,g,b,a) public override void GetColorAt(int x, int y, byte[] color) { - int offset = (x * 4) + (y * stride); - color[COLOR_INDEX_R] = pointer[PIXELFORMAT_INDEX_R + offset]; - color[COLOR_INDEX_G] = pointer[PIXELFORMAT_INDEX_G + offset]; - color[COLOR_INDEX_B] = pointer[PIXELFORMAT_INDEX_B + offset]; - color[COLOR_INDEX_A] = pointer[PIXELFORMAT_INDEX_A + offset]; + int offset = (x * 4) + (y * Stride); + color[ColorIndexR] = Pointer[PixelformatIndexR + offset]; + color[ColorIndexG] = Pointer[PixelformatIndexG + offset]; + color[ColorIndexB] = Pointer[PixelformatIndexB + offset]; + color[ColorIndexA] = Pointer[PixelformatIndexA + offset]; } /// @@ -1002,11 +1005,11 @@ namespace GreenshotPlugin.Core { /// /// byte[4] as reference (r,g,b,a) public override void SetColorAt(int x, int y, byte[] color) { - int offset = (x * 4) + (y * stride); - pointer[PIXELFORMAT_INDEX_R + offset] = color[COLOR_INDEX_R]; // R - pointer[PIXELFORMAT_INDEX_G + offset] = color[COLOR_INDEX_G]; - pointer[PIXELFORMAT_INDEX_B + offset] = color[COLOR_INDEX_B]; - pointer[PIXELFORMAT_INDEX_A + offset] = color[COLOR_INDEX_A]; + int offset = (x * 4) + (y * Stride); + Pointer[PixelformatIndexR + offset] = color[ColorIndexR]; // R + Pointer[PixelformatIndexG + offset] = color[ColorIndexG]; + Pointer[PixelformatIndexB + offset] = color[ColorIndexB]; + Pointer[PixelformatIndexA + offset] = color[ColorIndexA]; } /// @@ -1017,11 +1020,11 @@ namespace GreenshotPlugin.Core { /// Y Coordinate /// Color public Color GetBlendedColorAt(int x, int y) { - int offset = (x * 4) + (y * stride); - int a = pointer[PIXELFORMAT_INDEX_A + offset]; - int red = pointer[PIXELFORMAT_INDEX_R + offset]; - int green = pointer[PIXELFORMAT_INDEX_G + offset]; - int blue = pointer[PIXELFORMAT_INDEX_B + offset]; + int offset = (x * 4) + (y * Stride); + int a = Pointer[PixelformatIndexA + offset]; + int red = Pointer[PixelformatIndexR + offset]; + int green = Pointer[PixelformatIndexG + offset]; + int blue = Pointer[PixelformatIndexB + offset]; if (a < 255) { // As the request is to get without alpha, we blend. diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index f3c5af085..d927178f9 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -48,7 +48,7 @@ namespace GreenshotPlugin.Core { /// /// Remove invalid characters from the fully qualified filename /// - /// string with the full path to a file + /// string with the full path to a file /// string with the full path to a file, without invalid characters public static string MakeFQFilenameSafe(string fullPath) { string path = MakePathSafe(Path.GetDirectoryName(fullPath)); @@ -60,7 +60,7 @@ namespace GreenshotPlugin.Core { /// /// Remove invalid characters from the filename /// - /// string with the full path to a file + /// string with the full path to a file /// string with the full path to a file, without invalid characters public static string MakeFilenameSafe(string filename) { // Make the filename save! @@ -121,6 +121,7 @@ namespace GreenshotPlugin.Core { /// /// This method will be called by the regexp.replace as a MatchEvaluator delegate! /// Will delegate this to the MatchVarEvaluatorInternal and catch any exceptions + /// /// What are we matching? /// The detail, can be null /// Variables from the process @@ -141,6 +142,10 @@ namespace GreenshotPlugin.Core { /// /// What are we matching? /// The detail, can be null + /// + /// + /// + /// /// private static string MatchVarEvaluatorInternal(Match match, ICaptureDetails captureDetails, IDictionary processVars, IDictionary userVars, IDictionary machineVars, bool filenameSafeMode) { // some defaults diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 1219fe1a5..ae402090c 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -356,7 +356,6 @@ namespace GreenshotPlugin.Core { /// /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/ms648069%28v=vs.85%29.aspx /// - /// The icon to /// The file (EXE or DLL) to get the icon from /// Index of the icon /// true if the large icon is wanted @@ -409,8 +408,7 @@ namespace GreenshotPlugin.Core { /// /// Bitmap public static Image ApplyEffect(Image sourceImage, IEffect effect, Matrix matrix) { - List effects = new List(); - effects.Add(effect); + List effects = new List {effect}; return ApplyEffects(sourceImage, effects, matrix); } @@ -418,7 +416,7 @@ namespace GreenshotPlugin.Core { /// Apply the effects in the supplied order to the bitmap /// /// Bitmap - /// List + /// List of IEffect /// /// Bitmap public static Image ApplyEffects(Image sourceImage, List effects, Matrix matrix) { @@ -577,7 +575,7 @@ namespace GreenshotPlugin.Core { // By the central limit theorem, if applied 3 times on the same image, a box blur approximates the Gaussian kernel to within about 3%, yielding the same result as a quadratic convolution kernel. // This might be true, but the GDI+ BlurEffect doesn't look the same, a 2x blur is more simular and we only make 2x Box-Blur. // (Might also be a mistake in our blur, but for now it looks great) - if (fastBitmap.hasAlphaChannel) { + if (fastBitmap.HasAlphaChannel) { BoxBlurHorizontalAlpha(fastBitmap, range); BoxBlurVerticalAlpha(fastBitmap, range); BoxBlurHorizontalAlpha(fastBitmap, range); @@ -596,7 +594,7 @@ namespace GreenshotPlugin.Core { /// Target BitmapBuffer /// Range must be odd! private static void BoxBlurHorizontal(IFastBitmap targetFastBitmap, int range) { - if (targetFastBitmap.hasAlphaChannel) { + if (targetFastBitmap.HasAlphaChannel) { throw new NotSupportedException("BoxBlurHorizontal should NOT be called for bitmaps with alpha channel"); } int halfRange = range / 2; @@ -611,18 +609,18 @@ namespace GreenshotPlugin.Core { int oldPixel = x - halfRange - 1; if (oldPixel >= targetFastBitmap.Left) { targetFastBitmap.GetColorAt(oldPixel, y, tmpColor); - r -= tmpColor[FastBitmap.COLOR_INDEX_R]; - g -= tmpColor[FastBitmap.COLOR_INDEX_G]; - b -= tmpColor[FastBitmap.COLOR_INDEX_B]; + r -= tmpColor[FastBitmap.ColorIndexR]; + g -= tmpColor[FastBitmap.ColorIndexG]; + b -= tmpColor[FastBitmap.ColorIndexB]; hits--; } int newPixel = x + halfRange; if (newPixel < targetFastBitmap.Right) { targetFastBitmap.GetColorAt(newPixel, y, tmpColor); - r += tmpColor[FastBitmap.COLOR_INDEX_R]; - g += tmpColor[FastBitmap.COLOR_INDEX_G]; - b += tmpColor[FastBitmap.COLOR_INDEX_B]; + r += tmpColor[FastBitmap.ColorIndexR]; + g += tmpColor[FastBitmap.ColorIndexG]; + b += tmpColor[FastBitmap.ColorIndexB]; hits++; } @@ -641,7 +639,7 @@ namespace GreenshotPlugin.Core { /// Target BitmapBuffer /// Range must be odd! private static void BoxBlurHorizontalAlpha(IFastBitmap targetFastBitmap, int range) { - if (!targetFastBitmap.hasAlphaChannel) { + if (!targetFastBitmap.HasAlphaChannel) { throw new NotSupportedException("BoxBlurHorizontalAlpha should be called for bitmaps with alpha channel"); } int halfRange = range / 2; @@ -657,20 +655,20 @@ namespace GreenshotPlugin.Core { int oldPixel = x - halfRange - 1; if (oldPixel >= targetFastBitmap.Left) { targetFastBitmap.GetColorAt(oldPixel, y, tmpColor); - a -= tmpColor[FastBitmap.COLOR_INDEX_A]; - r -= tmpColor[FastBitmap.COLOR_INDEX_R]; - g -= tmpColor[FastBitmap.COLOR_INDEX_G]; - b -= tmpColor[FastBitmap.COLOR_INDEX_B]; + a -= tmpColor[FastBitmap.ColorIndexA]; + r -= tmpColor[FastBitmap.ColorIndexR]; + g -= tmpColor[FastBitmap.ColorIndexG]; + b -= tmpColor[FastBitmap.ColorIndexB]; hits--; } int newPixel = x + halfRange; if (newPixel < targetFastBitmap.Right) { targetFastBitmap.GetColorAt(newPixel, y, tmpColor); - a += tmpColor[FastBitmap.COLOR_INDEX_A]; - r += tmpColor[FastBitmap.COLOR_INDEX_R]; - g += tmpColor[FastBitmap.COLOR_INDEX_G]; - b += tmpColor[FastBitmap.COLOR_INDEX_B]; + a += tmpColor[FastBitmap.ColorIndexA]; + r += tmpColor[FastBitmap.ColorIndexR]; + g += tmpColor[FastBitmap.ColorIndexG]; + b += tmpColor[FastBitmap.ColorIndexB]; hits++; } @@ -690,7 +688,7 @@ namespace GreenshotPlugin.Core { /// BitmapBuffer which previously was created with BoxBlurHorizontal /// Range must be odd! private static void BoxBlurVertical(IFastBitmap targetFastBitmap, int range) { - if (targetFastBitmap.hasAlphaChannel) { + if (targetFastBitmap.HasAlphaChannel) { throw new NotSupportedException("BoxBlurVertical should NOT be called for bitmaps with alpha channel"); } int halfRange = range / 2; @@ -705,18 +703,18 @@ namespace GreenshotPlugin.Core { int oldPixel = y - halfRange - 1; if (oldPixel >= targetFastBitmap.Top) { targetFastBitmap.GetColorAt(x, oldPixel, tmpColor); - r -= tmpColor[FastBitmap.COLOR_INDEX_R]; - g -= tmpColor[FastBitmap.COLOR_INDEX_G]; - b -= tmpColor[FastBitmap.COLOR_INDEX_B]; + r -= tmpColor[FastBitmap.ColorIndexR]; + g -= tmpColor[FastBitmap.ColorIndexG]; + b -= tmpColor[FastBitmap.ColorIndexB]; hits--; } int newPixel = y + halfRange; if (newPixel < targetFastBitmap.Bottom) { targetFastBitmap.GetColorAt(x, newPixel, tmpColor); - r += tmpColor[FastBitmap.COLOR_INDEX_R]; - g += tmpColor[FastBitmap.COLOR_INDEX_G]; - b += tmpColor[FastBitmap.COLOR_INDEX_B]; + r += tmpColor[FastBitmap.ColorIndexR]; + g += tmpColor[FastBitmap.ColorIndexG]; + b += tmpColor[FastBitmap.ColorIndexB]; hits++; } @@ -737,7 +735,7 @@ namespace GreenshotPlugin.Core { /// BitmapBuffer which previously was created with BoxBlurHorizontal /// Range must be odd! private static void BoxBlurVerticalAlpha(IFastBitmap targetFastBitmap, int range) { - if (!targetFastBitmap.hasAlphaChannel) { + if (!targetFastBitmap.HasAlphaChannel) { throw new NotSupportedException("BoxBlurVerticalAlpha should be called for bitmaps with alpha channel"); } @@ -754,10 +752,10 @@ namespace GreenshotPlugin.Core { int oldPixel = y - halfRange - 1; if (oldPixel >= targetFastBitmap.Top) { targetFastBitmap.GetColorAt(x, oldPixel, tmpColor); - a -= tmpColor[FastBitmap.COLOR_INDEX_A]; - r -= tmpColor[FastBitmap.COLOR_INDEX_R]; - g -= tmpColor[FastBitmap.COLOR_INDEX_G]; - b -= tmpColor[FastBitmap.COLOR_INDEX_B]; + a -= tmpColor[FastBitmap.ColorIndexA]; + r -= tmpColor[FastBitmap.ColorIndexR]; + g -= tmpColor[FastBitmap.ColorIndexG]; + b -= tmpColor[FastBitmap.ColorIndexB]; hits--; } @@ -765,10 +763,10 @@ namespace GreenshotPlugin.Core { if (newPixel < targetFastBitmap.Bottom) { //int colorg = pixels[index + newPixelOffset]; targetFastBitmap.GetColorAt(x, newPixel, tmpColor); - a += tmpColor[FastBitmap.COLOR_INDEX_A]; - r += tmpColor[FastBitmap.COLOR_INDEX_R]; - g += tmpColor[FastBitmap.COLOR_INDEX_G]; - b += tmpColor[FastBitmap.COLOR_INDEX_B]; + a += tmpColor[FastBitmap.ColorIndexA]; + r += tmpColor[FastBitmap.ColorIndexR]; + g += tmpColor[FastBitmap.ColorIndexG]; + b += tmpColor[FastBitmap.ColorIndexB]; hits++; } diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 501782029..18d718620 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -474,7 +474,7 @@ namespace GreenshotPlugin.Core { if (key == null) { return false; } - return hasKey(prefix + "." + key.ToString()); + return hasKey(prefix + "." + key); } /// @@ -534,7 +534,7 @@ namespace GreenshotPlugin.Core { public static string Translate(object key) { string typename = key.GetType().Name; - string enumKey = typename + "." + key.ToString(); + string enumKey = typename + "." + key; if (hasKey(enumKey)) { return GetString(enumKey); } @@ -563,7 +563,7 @@ namespace GreenshotPlugin.Core { if (key == null) { return null; } - return GetString(prefix + "." + key.ToString()); + return GetString(prefix + "." + key); } /// @@ -596,6 +596,7 @@ namespace GreenshotPlugin.Core { /// Get the resource for key, format with with string.format an supply the parameters /// /// + /// /// formatted resource or a "string ###key### not found" public static string GetFormattedString(Enum key, object param) { return GetFormattedString(key.ToString(), param); @@ -604,7 +605,9 @@ namespace GreenshotPlugin.Core { /// /// Get the resource for prefix.key, format with with string.format an supply the parameters /// + /// /// + /// /// formatted resource or a "string ###prefix.key### not found" public static string GetFormattedString(string prefix, Enum key, object param) { return GetFormattedString(prefix, key.ToString(), param); @@ -613,7 +616,9 @@ namespace GreenshotPlugin.Core { /// /// Get the resource for prefix.key, format with with string.format an supply the parameters /// + /// /// + /// /// formatted resource or a "string ###prefix.key### not found" public static string GetFormattedString(string prefix, string key, object param) { return GetFormattedString(prefix + "." + key, param); @@ -623,6 +628,7 @@ namespace GreenshotPlugin.Core { /// Get the resource for key, format with with string.format an supply the parameters /// /// + /// /// formatted resource or a "string ###key### not found" public static string GetFormattedString(string key, object param) { string returnValue; diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index 4112aae86..ad8241009 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -709,20 +709,20 @@ namespace GreenshotPlugin.Core { /// And additionally a signature is added. /// /// Method (POST,PUT,GET) - /// Url to call - /// IDictionary - private void Sign(HTTPMethod method, string requestURL, IDictionary parameters) { + /// Url to call + /// IDictionary of string and string + private void Sign(HTTPMethod method, string requestUrl, IDictionary parameters) { if (parameters == null) { - throw new ArgumentNullException("parameters"); + throw new ArgumentNullException(nameof(parameters)); } // Build the signature base StringBuilder signatureBase = new StringBuilder(); // Add Method to signature base - signatureBase.Append(method.ToString()).Append("&"); + signatureBase.Append(method).Append("&"); // Add normalized URL - Uri url = new Uri(requestURL); + Uri url = new Uri(requestUrl); string normalizedUrl = string.Format(CultureInfo.InvariantCulture, "{0}://{1}", url.Scheme, url.Host); if (!((url.Scheme == "http" && url.Port == 80) || (url.Scheme == "https" && url.Port == 443))) { normalizedUrl += ":" + url.Port; @@ -747,7 +747,7 @@ namespace GreenshotPlugin.Core { break; } parameters.Add(OAUTH_CONSUMER_KEY_KEY, _consumerKey); - if (CallbackUrl != null && RequestTokenUrl != null && requestURL.StartsWith(RequestTokenUrl)) { + if (CallbackUrl != null && RequestTokenUrl != null && requestUrl.StartsWith(RequestTokenUrl)) { parameters.Add(OAUTH_CALLBACK_KEY, CallbackUrl); } if (!string.IsNullOrEmpty(Verifier)) { @@ -810,7 +810,7 @@ namespace GreenshotPlugin.Core { /// Response from server private string MakeRequest(HTTPMethod method, string requestURL, IDictionary headers, IDictionary parameters, IBinaryContainer postData) { if (parameters == null) { - throw new ArgumentNullException("parameters"); + throw new ArgumentNullException(nameof(parameters)); } IDictionary requestParameters; // Add oAuth values as HTTP headers, if this is allowed @@ -1085,7 +1085,6 @@ Greenshot received information from CloudServiceName. You can close this browser /// /// Generate an OAuth 2 Token by using the supplied code /// - /// Code to get the RefreshToken /// OAuth2Settings to update with the information that was retrieved public static void GenerateRefreshToken(OAuth2Settings settings) { IDictionary data = new Dictionary(); diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 513c93c83..b946b37aa 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -156,6 +156,7 @@ namespace GreenshotPlugin.Core { /// /// Helper method to add a MenuItem to the File MenuItem of an ImageEditor /// + /// /// Image to display in the menu /// Text to display in the menu /// The TAG value @@ -215,8 +216,8 @@ namespace GreenshotPlugin.Core { /// /// Helper method to add a plugin MenuItem to the Greenshot context menu /// - /// - /// + /// IGreenshotHost + /// ToolStripMenuItem public static void AddToContextMenu(IGreenshotHost host, ToolStripMenuItem item) { // Here we can hang ourselves to the main context menu! ContextMenuStrip contextMenu = host.MainMenu; diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index d29f4412b..09fd91560 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -31,69 +31,69 @@ namespace GreenshotPlugin.Core { /// Gets or sets the red minimum. /// /// The red minimum. - public Int32 RedMinimum { get; set; } + public int RedMinimum { get; set; } /// /// Gets or sets the red maximum. /// /// The red maximum. - public Int32 RedMaximum { get; set; } + public int RedMaximum { get; set; } /// /// Gets or sets the green minimum. /// /// The green minimum. - public Int32 GreenMinimum { get; set; } + public int GreenMinimum { get; set; } /// /// Gets or sets the green maximum. /// /// The green maximum. - public Int32 GreenMaximum { get; set; } + public int GreenMaximum { get; set; } /// /// Gets or sets the blue minimum. /// /// The blue minimum. - public Int32 BlueMinimum { get; set; } + public int BlueMinimum { get; set; } /// /// Gets or sets the blue maximum. /// /// The blue maximum. - public Int32 BlueMaximum { get; set; } + public int BlueMaximum { get; set; } /// /// Gets or sets the cube volume. /// /// The volume. - public Int32 Volume { get; set; } + public int Volume { get; set; } } public class WuQuantizer : IDisposable { private static readonly ILog LOG = LogManager.GetLogger(typeof(WuQuantizer)); - private const Int32 MAXCOLOR = 512; - private const Int32 RED = 2; - private const Int32 GREEN = 1; - private const Int32 BLUE = 0; - private const Int32 SIDESIZE = 33; - private const Int32 MAXSIDEINDEX = 32; - private const Int32 MAXVOLUME = SIDESIZE * SIDESIZE * SIDESIZE; + private const int MAXCOLOR = 512; + private const int RED = 2; + private const int GREEN = 1; + private const int BLUE = 0; + private const int SIDESIZE = 33; + private const int MAXSIDEINDEX = 32; + private const int MAXVOLUME = SIDESIZE * SIDESIZE * SIDESIZE; // To count the colors private readonly int colorCount; - private Int32[] reds; - private Int32[] greens; - private Int32[] blues; - private Int32[] sums; + private int[] reds; + private int[] greens; + private int[] blues; + private int[] sums; - private readonly Int64[, ,] weights; - private readonly Int64[, ,] momentsRed; - private readonly Int64[, ,] momentsGreen; - private readonly Int64[, ,] momentsBlue; - private readonly Single[, ,] moments; + private readonly long[,,] weights; + private readonly long[,,] momentsRed; + private readonly long[,,] momentsGreen; + private readonly long[,,] momentsBlue; + private readonly float[,,] moments; private byte[] tag; @@ -128,7 +128,7 @@ namespace GreenshotPlugin.Core { cubes = new WuColorCube[MAXCOLOR]; // initializes all the cubes - for (Int32 cubeIndex = 0; cubeIndex < MAXCOLOR; cubeIndex++) { + for (int cubeIndex = 0; cubeIndex < MAXCOLOR; cubeIndex++) { cubes[cubeIndex] = new WuColorCube(); } @@ -142,15 +142,15 @@ namespace GreenshotPlugin.Core { cubes[0].GreenMaximum = MAXSIDEINDEX; cubes[0].BlueMaximum = MAXSIDEINDEX; - weights = new Int64[SIDESIZE, SIDESIZE, SIDESIZE]; - momentsRed = new Int64[SIDESIZE, SIDESIZE, SIDESIZE]; - momentsGreen = new Int64[SIDESIZE, SIDESIZE, SIDESIZE]; - momentsBlue = new Int64[SIDESIZE, SIDESIZE, SIDESIZE]; - moments = new Single[SIDESIZE, SIDESIZE, SIDESIZE]; + weights = new long[SIDESIZE, SIDESIZE, SIDESIZE]; + momentsRed = new long[SIDESIZE, SIDESIZE, SIDESIZE]; + momentsGreen = new long[SIDESIZE, SIDESIZE, SIDESIZE]; + momentsBlue = new long[SIDESIZE, SIDESIZE, SIDESIZE]; + moments = new float[SIDESIZE, SIDESIZE, SIDESIZE]; - Int32[] table = new Int32[256]; + int[] table = new int[256]; - for (Int32 tableIndex = 0; tableIndex < 256; ++tableIndex) { + for (int tableIndex = 0; tableIndex < 256; ++tableIndex) { table[tableIndex] = tableIndex * tableIndex; } @@ -177,9 +177,9 @@ namespace GreenshotPlugin.Core { bitArray.Set(index, true); } - Int32 indexRed = (color.R >> 3) + 1; - Int32 indexGreen = (color.G >> 3) + 1; - Int32 indexBlue = (color.B >> 3) + 1; + int indexRed = (color.R >> 3) + 1; + int indexGreen = (color.G >> 3) + 1; + int indexBlue = (color.B >> 3) + 1; weights[indexRed, indexGreen, indexBlue]++; momentsRed[indexRed, indexGreen, indexBlue] += color.R; @@ -188,7 +188,7 @@ namespace GreenshotPlugin.Core { moments[indexRed, indexGreen, indexBlue] += table[color.R] + table[color.G] + table[color.B]; // Store the initial "match" - Int32 paletteIndex = (indexRed << 10) + (indexRed << 6) + indexRed + (indexGreen << 5) + indexGreen + indexBlue; + int paletteIndex = (indexRed << 10) + (indexRed << 6) + indexRed + (indexGreen << 5) + indexGreen + indexBlue; destinationFastBitmap.SetColorIndexAt(x, y, (byte)(paletteIndex & 0xff)); } } @@ -200,7 +200,7 @@ namespace GreenshotPlugin.Core { /// /// See for more details. /// - public Int32 GetColorCount() { + public int GetColorCount() { return colorCount; } @@ -242,7 +242,7 @@ namespace GreenshotPlugin.Core { // generates palette ColorPalette imagePalette = resultBitmap.Palette; Color[] entries = imagePalette.Entries; - for (Int32 paletteIndex = 0; paletteIndex < 256; paletteIndex++) { + for (int paletteIndex = 0; paletteIndex < 256; paletteIndex++) { if (paletteIndex < colorCount) { entries[paletteIndex] = colors[paletteIndex]; } else { @@ -262,7 +262,7 @@ namespace GreenshotPlugin.Core { /// public Bitmap GetQuantizedImage(int allowedColorCount) { if (allowedColorCount > 256) { - throw new ArgumentOutOfRangeException("Quantizing muss be done to get less than 256 colors"); + throw new ArgumentOutOfRangeException(nameof(allowedColorCount), "Quantizing muss be done to get less than 256 colors"); } if (colorCount < allowedColorCount) { // Simple logic to reduce to 8 bit @@ -272,11 +272,11 @@ namespace GreenshotPlugin.Core { // preprocess the colors CalculateMoments(); LOG.Info("Calculated the moments..."); - Int32 next = 0; - Single[] volumeVariance = new Single[MAXCOLOR]; + int next = 0; + float[] volumeVariance = new float[MAXCOLOR]; // processes the cubes - for (Int32 cubeIndex = 1; cubeIndex < allowedColorCount; ++cubeIndex) { + for (int cubeIndex = 1; cubeIndex < allowedColorCount; ++cubeIndex) { // if cut is possible; make it if (Cut(cubes[next], cubes[cubeIndex])) { volumeVariance[next] = cubes[next].Volume > 1 ? CalculateVariance(cubes[next]) : 0.0f; @@ -288,9 +288,9 @@ namespace GreenshotPlugin.Core { } next = 0; - Single temp = volumeVariance[0]; + float temp = volumeVariance[0]; - for (Int32 index = 1; index <= cubeIndex; ++index) { + for (int index = 1; index <= cubeIndex; ++index) { if (volumeVariance[index] > temp) { temp = volumeVariance[index]; next = index; @@ -303,9 +303,9 @@ namespace GreenshotPlugin.Core { } } - Int32[] lookupRed = new Int32[MAXCOLOR]; - Int32[] lookupGreen = new Int32[MAXCOLOR]; - Int32[] lookupBlue = new Int32[MAXCOLOR]; + int[] lookupRed = new int[MAXCOLOR]; + int[] lookupGreen = new int[MAXCOLOR]; + int[] lookupBlue = new int[MAXCOLOR]; tag = new byte[MAXVOLUME]; @@ -326,10 +326,10 @@ namespace GreenshotPlugin.Core { } } - reds = new Int32[allowedColorCount + 1]; - greens = new Int32[allowedColorCount + 1]; - blues = new Int32[allowedColorCount + 1]; - sums = new Int32[allowedColorCount + 1]; + reds = new int[allowedColorCount + 1]; + greens = new int[allowedColorCount + 1]; + blues = new int[allowedColorCount + 1]; + sums = new int[allowedColorCount + 1]; LOG.Info("Starting bitmap reconstruction..."); @@ -356,16 +356,16 @@ namespace GreenshotPlugin.Core { bestMatch = dest.GetColorIndexAt(x, y); bestMatch = tag[bestMatch]; - Int32 bestDistance = 100000000; + int bestDistance = 100000000; for (int lookupIndex = 0; lookupIndex < allowedColorCount; lookupIndex++) { - Int32 foundRed = lookupRed[lookupIndex]; - Int32 foundGreen = lookupGreen[lookupIndex]; - Int32 foundBlue = lookupBlue[lookupIndex]; - Int32 deltaRed = color.R - foundRed; - Int32 deltaGreen = color.G - foundGreen; - Int32 deltaBlue = color.B - foundBlue; + int foundRed = lookupRed[lookupIndex]; + int foundGreen = lookupGreen[lookupIndex]; + int foundBlue = lookupBlue[lookupIndex]; + int deltaRed = color.R - foundRed; + int deltaGreen = color.G - foundGreen; + int deltaBlue = color.B - foundBlue; - Int32 distance = deltaRed * deltaRed + deltaGreen * deltaGreen + deltaBlue * deltaBlue; + int distance = deltaRed * deltaRed + deltaGreen * deltaGreen + deltaBlue * deltaBlue; if (distance < bestDistance) { bestDistance = distance; @@ -393,7 +393,7 @@ namespace GreenshotPlugin.Core { // generates palette ColorPalette imagePalette = resultBitmap.Palette; Color[] entries = imagePalette.Entries; - for (Int32 paletteIndex = 0; paletteIndex < allowedColorCount; paletteIndex++) { + for (int paletteIndex = 0; paletteIndex < allowedColorCount; paletteIndex++) { if (sums[paletteIndex] > 0) { reds[paletteIndex] /= sums[paletteIndex]; greens[paletteIndex] /= sums[paletteIndex]; @@ -414,14 +414,14 @@ namespace GreenshotPlugin.Core { /// Converts the histogram to a series of moments. /// private void CalculateMoments() { - Int64[] area = new Int64[SIDESIZE]; - Int64[] areaRed = new Int64[SIDESIZE]; - Int64[] areaGreen = new Int64[SIDESIZE]; - Int64[] areaBlue = new Int64[SIDESIZE]; - Single[] area2 = new Single[SIDESIZE]; + long[] area = new long[SIDESIZE]; + long[] areaRed = new long[SIDESIZE]; + long[] areaGreen = new long[SIDESIZE]; + long[] areaBlue = new long[SIDESIZE]; + float[] area2 = new float[SIDESIZE]; - for (Int32 redIndex = 1; redIndex <= MAXSIDEINDEX; ++redIndex) { - for (Int32 index = 0; index <= MAXSIDEINDEX; ++index) { + for (int redIndex = 1; redIndex <= MAXSIDEINDEX; ++redIndex) { + for (int index = 0; index <= MAXSIDEINDEX; ++index) { area[index] = 0; areaRed[index] = 0; areaGreen[index] = 0; @@ -429,14 +429,14 @@ namespace GreenshotPlugin.Core { area2[index] = 0; } - for (Int32 greenIndex = 1; greenIndex <= MAXSIDEINDEX; ++greenIndex) { - Int64 line = 0; - Int64 lineRed = 0; - Int64 lineGreen = 0; - Int64 lineBlue = 0; - Single line2 = 0.0f; + for (int greenIndex = 1; greenIndex <= MAXSIDEINDEX; ++greenIndex) { + long line = 0; + long lineRed = 0; + long lineGreen = 0; + long lineBlue = 0; + float line2 = 0.0f; - for (Int32 blueIndex = 1; blueIndex <= MAXSIDEINDEX; ++blueIndex) { + for (int blueIndex = 1; blueIndex <= MAXSIDEINDEX; ++blueIndex) { line += weights[redIndex, greenIndex, blueIndex]; lineRed += momentsRed[redIndex, greenIndex, blueIndex]; lineGreen += momentsGreen[redIndex, greenIndex, blueIndex]; @@ -462,7 +462,7 @@ namespace GreenshotPlugin.Core { /// /// Computes the volume of the cube in a specific moment. /// - private static Int64 Volume(WuColorCube cube, Int64[, ,] moment) { + private static long Volume(WuColorCube cube, long[,,] moment) { return moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMaximum] - moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMinimum] - moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMaximum] + @@ -476,7 +476,7 @@ namespace GreenshotPlugin.Core { /// /// Computes the volume of the cube in a specific moment. For the floating-point values. /// - private static Single VolumeFloat(WuColorCube cube, Single[, ,] moment) { + private static float VolumeFloat(WuColorCube cube, float[,,] moment) { return moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMaximum] - moment[cube.RedMaximum, cube.GreenMaximum, cube.BlueMinimum] - moment[cube.RedMaximum, cube.GreenMinimum, cube.BlueMaximum] + @@ -490,7 +490,7 @@ namespace GreenshotPlugin.Core { /// /// Splits the cube in given position, and color direction. /// - private static Int64 Top(WuColorCube cube, Int32 direction, Int32 position, Int64[, ,] moment) { + private static long Top(WuColorCube cube, int direction, int position, long[,,] moment) { switch (direction) { case RED: return (moment[position, cube.GreenMaximum, cube.BlueMaximum] - @@ -518,7 +518,7 @@ namespace GreenshotPlugin.Core { /// /// Splits the cube in a given color direction at its minimum. /// - private static Int64 Bottom(WuColorCube cube, Int32 direction, Int64[, ,] moment) { + private static long Bottom(WuColorCube cube, int direction, long[,,] moment) { switch (direction) { case RED: return (-moment[cube.RedMinimum, cube.GreenMaximum, cube.BlueMaximum] + @@ -545,14 +545,14 @@ namespace GreenshotPlugin.Core { /// /// Calculates statistical variance for a given cube. /// - private Single CalculateVariance(WuColorCube cube) { - Single volumeRed = Volume(cube, momentsRed); - Single volumeGreen = Volume(cube, momentsGreen); - Single volumeBlue = Volume(cube, momentsBlue); - Single volumeMoment = VolumeFloat(cube, moments); - Single volumeWeight = Volume(cube, weights); + private float CalculateVariance(WuColorCube cube) { + float volumeRed = Volume(cube, momentsRed); + float volumeGreen = Volume(cube, momentsGreen); + float volumeBlue = Volume(cube, momentsBlue); + float volumeMoment = VolumeFloat(cube, moments); + float volumeWeight = Volume(cube, weights); - Single distance = volumeRed * volumeRed + volumeGreen * volumeGreen + volumeBlue * volumeBlue; + float distance = volumeRed * volumeRed + volumeGreen * volumeGreen + volumeBlue * volumeBlue; return volumeMoment - (distance / volumeWeight); } @@ -560,26 +560,26 @@ namespace GreenshotPlugin.Core { /// /// Finds the optimal (maximal) position for the cut. /// - private Single Maximize(WuColorCube cube, Int32 direction, Int32 first, Int32 last, Int32[] cut, Int64 wholeRed, Int64 wholeGreen, Int64 wholeBlue, Int64 wholeWeight) { - Int64 bottomRed = Bottom(cube, direction, momentsRed); - Int64 bottomGreen = Bottom(cube, direction, momentsGreen); - Int64 bottomBlue = Bottom(cube, direction, momentsBlue); - Int64 bottomWeight = Bottom(cube, direction, weights); + private float Maximize(WuColorCube cube, int direction, int first, int last, int[] cut, long wholeRed, long wholeGreen, long wholeBlue, long wholeWeight) { + long bottomRed = Bottom(cube, direction, momentsRed); + long bottomGreen = Bottom(cube, direction, momentsGreen); + long bottomBlue = Bottom(cube, direction, momentsBlue); + long bottomWeight = Bottom(cube, direction, weights); - Single result = 0.0f; + float result = 0.0f; cut[0] = -1; - for (Int32 position = first; position < last; ++position) { + for (int position = first; position < last; ++position) { // determines the cube cut at a certain position - Int64 halfRed = bottomRed + Top(cube, direction, position, momentsRed); - Int64 halfGreen = bottomGreen + Top(cube, direction, position, momentsGreen); - Int64 halfBlue = bottomBlue + Top(cube, direction, position, momentsBlue); - Int64 halfWeight = bottomWeight + Top(cube, direction, position, weights); + long halfRed = bottomRed + Top(cube, direction, position, momentsRed); + long halfGreen = bottomGreen + Top(cube, direction, position, momentsGreen); + long halfBlue = bottomBlue + Top(cube, direction, position, momentsBlue); + long halfWeight = bottomWeight + Top(cube, direction, position, weights); // the cube cannot be cut at bottom (this would lead to empty cube) if (halfWeight != 0) { - Single halfDistance = (Single)halfRed * halfRed + (Single)halfGreen * halfGreen + (Single)halfBlue * halfBlue; - Single temp = halfDistance / halfWeight; + float halfDistance = (float)halfRed * halfRed + (float)halfGreen * halfGreen + (float)halfBlue * halfBlue; + float temp = halfDistance / halfWeight; halfRed = wholeRed - halfRed; halfGreen = wholeGreen - halfGreen; @@ -587,7 +587,7 @@ namespace GreenshotPlugin.Core { halfWeight = wholeWeight - halfWeight; if (halfWeight != 0) { - halfDistance = (Single)halfRed * halfRed + (Single)halfGreen * halfGreen + (Single)halfBlue * halfBlue; + halfDistance = (float)halfRed * halfRed + (float)halfGreen * halfGreen + (float)halfBlue * halfBlue; temp += halfDistance / halfWeight; if (temp > result) { @@ -604,21 +604,21 @@ namespace GreenshotPlugin.Core { /// /// Cuts a cube with another one. /// - private Boolean Cut(WuColorCube first, WuColorCube second) { - Int32 direction; + private bool Cut(WuColorCube first, WuColorCube second) { + int direction; - Int32[] cutRed = { 0 }; - Int32[] cutGreen = { 0 }; - Int32[] cutBlue = { 0 }; + int[] cutRed = { 0 }; + int[] cutGreen = { 0 }; + int[] cutBlue = { 0 }; - Int64 wholeRed = Volume(first, momentsRed); - Int64 wholeGreen = Volume(first, momentsGreen); - Int64 wholeBlue = Volume(first, momentsBlue); - Int64 wholeWeight = Volume(first, weights); + long wholeRed = Volume(first, momentsRed); + long wholeGreen = Volume(first, momentsGreen); + long wholeBlue = Volume(first, momentsBlue); + long wholeWeight = Volume(first, weights); - Single maxRed = Maximize(first, RED, first.RedMinimum + 1, first.RedMaximum, cutRed, wholeRed, wholeGreen, wholeBlue, wholeWeight); - Single maxGreen = Maximize(first, GREEN, first.GreenMinimum + 1, first.GreenMaximum, cutGreen, wholeRed, wholeGreen, wholeBlue, wholeWeight); - Single maxBlue = Maximize(first, BLUE, first.BlueMinimum + 1, first.BlueMaximum, cutBlue, wholeRed, wholeGreen, wholeBlue, wholeWeight); + float maxRed = Maximize(first, RED, first.RedMinimum + 1, first.RedMaximum, cutRed, wholeRed, wholeGreen, wholeBlue, wholeWeight); + float maxGreen = Maximize(first, GREEN, first.GreenMinimum + 1, first.GreenMaximum, cutGreen, wholeRed, wholeGreen, wholeBlue, wholeWeight); + float maxBlue = Maximize(first, BLUE, first.BlueMinimum + 1, first.BlueMaximum, cutBlue, wholeRed, wholeGreen, wholeBlue, wholeWeight); if ((maxRed >= maxGreen) && (maxRed >= maxBlue)) { direction = RED; @@ -669,10 +669,10 @@ namespace GreenshotPlugin.Core { /// /// Marks all the tags with a given label. /// - private void Mark(WuColorCube cube, Int32 label, byte[] tag) { - for (Int32 redIndex = cube.RedMinimum + 1; redIndex <= cube.RedMaximum; ++redIndex) { - for (Int32 greenIndex = cube.GreenMinimum + 1; greenIndex <= cube.GreenMaximum; ++greenIndex) { - for (Int32 blueIndex = cube.BlueMinimum + 1; blueIndex <= cube.BlueMaximum; ++blueIndex) { + private void Mark(WuColorCube cube, int label, byte[] tag) { + for (int redIndex = cube.RedMinimum + 1; redIndex <= cube.RedMaximum; ++redIndex) { + for (int greenIndex = cube.GreenMinimum + 1; greenIndex <= cube.GreenMaximum; ++greenIndex) { + for (int blueIndex = cube.BlueMinimum + 1; blueIndex <= cube.BlueMaximum; ++blueIndex) { tag[(redIndex << 10) + (redIndex << 6) + redIndex + (greenIndex << 5) + greenIndex + blueIndex] = (byte)label; } } diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index f6bd71e68..5a63b299c 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -26,7 +26,6 @@ using GreenshotPlugin.UnmanagedHelpers; using log4net; using System; using System.Collections.Generic; -using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; @@ -154,9 +153,8 @@ namespace GreenshotPlugin.Core { /// Main code is taken from vbAccelerator, location: /// http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows/Enumerating_Windows/article.asp /// but a LOT of changes/enhancements were made to adapt it for Greenshot. - /// - /// Provides details about a Window returned by the - /// enumeration + /// + /// Provides details about a Window returned by the enumeration /// public class WindowDetails : IEquatable{ private const string METRO_WINDOWS_CLASS = "Windows.UI.Core.CoreWindow"; // Windows 10 uses ApplicationFrameWindow @@ -167,15 +165,21 @@ namespace GreenshotPlugin.Core { private static readonly CoreConfiguration Conf = IniConfig.GetIniSection(); private static readonly List IgnoreHandles = new List(); private static readonly List ExcludeProcessesFromFreeze = new List(); - private static readonly IAppVisibility appVisibility; + private static readonly IAppVisibility AppVisibility; static WindowDetails() { - try { + try + { // Only try to instantiate when Windows 8 or later. - if (Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 2) { - appVisibility = COMWrapper.CreateInstance(); + if (Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 2) + { + AppVisibility = COMWrapper.CreateInstance(); } - } catch {} + } + catch (Exception ex) + { + LOG.WarnFormat("Couldn't create instance of IAppVisibility: {0}", ex.Message); + } } public static void AddProcessToExcludeFromFreeze(string processname) { @@ -529,7 +533,7 @@ namespace GreenshotPlugin.Core { /// This method will find the child window according to a path of classnames. /// Usually used for finding a certain "content" window like for the IE Browser /// - /// List with classname "path" + /// List of string with classname "path" /// true allows the search to skip a classname of the path /// WindowDetails if found public WindowDetails FindPath(List classnames, bool allowSkip) { @@ -695,8 +699,8 @@ namespace GreenshotPlugin.Core { RECT rect = new RECT(screen.Bounds); IntPtr monitor = User32.MonitorFromRect(ref rect, User32.MONITOR_DEFAULTTONULL); if (monitor != IntPtr.Zero) { - if (appVisibility != null) { - MONITOR_APP_VISIBILITY monitorAppVisibility = appVisibility.GetAppVisibilityOnMonitor(monitor); + if (AppVisibility != null) { + MONITOR_APP_VISIBILITY monitorAppVisibility = AppVisibility.GetAppVisibilityOnMonitor(monitor); //LOG.DebugFormat("App {0} visible: {1} on {2}", Text, monitorAppVisibility, screen.Bounds); if (monitorAppVisibility == MONITOR_APP_VISIBILITY.MAV_APP_VISIBLE) { return true; @@ -1395,7 +1399,7 @@ namespace GreenshotPlugin.Core { Rectangle windowRect = WindowRectangle; // Start the capture Exception exceptionOccured = null; - Image returnImage = null; + Image returnImage; using (Region region = GetRegion()) { PixelFormat pixelFormat = PixelFormat.Format24bppRgb; // Only use 32 bpp ARGB when the window has a region @@ -1446,7 +1450,7 @@ namespace GreenshotPlugin.Core { /// /// The Window Handle public WindowDetails(IntPtr hWnd) { - this._hWnd = hWnd; + _hWnd = hWnd; } /// @@ -1455,7 +1459,7 @@ namespace GreenshotPlugin.Core { /// WindowDetails of the current window public static WindowDetails GetActiveWindow() { IntPtr hWnd = User32.GetForegroundWindow(); - if (hWnd != null && hWnd != IntPtr.Zero) { + if (hWnd != IntPtr.Zero) { if (IgnoreHandles.Contains(hWnd)) { return GetDesktopWindow(); } @@ -1499,7 +1503,7 @@ namespace GreenshotPlugin.Core { /// /// Get all the top level windows /// - /// List with all the top level windows + /// List of WindowDetails with all the top level windows public static List GetAllWindows() { return GetAllWindows(null); } @@ -1582,7 +1586,7 @@ namespace GreenshotPlugin.Core { public static List GetMetroApps() { List metroApps = new List(); // if the appVisibility != null we have Windows 8. - if (appVisibility == null) { + if (AppVisibility == null) { return metroApps; } //string[] wcs = {"ImmersiveGutter", "Snapped Desktop", "ImmersiveBackgroundWindow","ImmersiveLauncher","Windows.UI.Core.CoreWindow","ApplicationManager_ImmersiveShellWindow","SearchPane","MetroGhostWindow","EdgeUiInputWndClass", "NativeHWNDHost", "Shell_CharmWindow"}; @@ -1712,7 +1716,7 @@ namespace GreenshotPlugin.Core { /// public static WindowDetails GetAppLauncher() { // Only if Windows 8 (or higher) - if (appVisibility == null) { + if (AppVisibility == null) { return null; } IntPtr appLauncher = User32.FindWindow(METRO_APPLAUNCHER_CLASS, null); @@ -1728,8 +1732,8 @@ namespace GreenshotPlugin.Core { /// public static bool IsAppLauncherVisible { get { - if (appVisibility != null) { - return appVisibility.IsLauncherVisible; + if (AppVisibility != null) { + return AppVisibility.IsLauncherVisible; } return false; } diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index 027808087..2841faf61 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -89,11 +89,11 @@ namespace Greenshot.IniFile { /// /// Initialize the ini config /// - /// + /// /// - public static void Init(string appName, string confName) { + public static void Init(string appName, string configName) { applicationName = appName; - configName = confName; + IniConfig.configName = configName; Reload(); } @@ -320,7 +320,7 @@ namespace Greenshot.IniFile { /// /// public static IniSection GetIniSection(string sectionName) { - IniSection returnValue = null; + IniSection returnValue; sectionMap.TryGetValue(sectionName, out returnValue); return returnValue; } @@ -369,11 +369,10 @@ namespace Greenshot.IniFile { /// /// /// - public static Dictionary PropertiesForSection(IniSection section) { - Type iniSectionType = section.GetType(); + public static IDictionary PropertiesForSection(IniSection section) { string sectionName = section.IniSectionAttribute.Name; // Get the properties for the section - Dictionary properties = null; + IDictionary properties; if (sections.ContainsKey(sectionName)) { properties = sections[sectionName]; } else { diff --git a/GreenshotPlugin/IniFile/IniSection.cs b/GreenshotPlugin/IniFile/IniSection.cs index 97982d172..0c5c1bbf6 100644 --- a/GreenshotPlugin/IniFile/IniSection.cs +++ b/GreenshotPlugin/IniFile/IniSection.cs @@ -120,7 +120,7 @@ namespace Greenshot.IniFile { /// Fill the section with the supplied properties /// /// - public void Fill(Dictionary properties) { + public void Fill(IDictionary properties) { Type iniSectionType = GetType(); // Iterate over the members and create IniValueContainers diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index 0c0f44c3e..5be58f928 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -229,9 +229,8 @@ namespace Greenshot.IniFile { /// Set the value to the value in the ini file, or default /// /// - public void SetValueFromProperties(Dictionary properties) { + public void SetValueFromProperties(IDictionary properties) { string propertyName = attributes.Name; - string defaultValue = attributes.DefaultValue; string propertyValue = null; if (properties.ContainsKey(propertyName) && properties[propertyName] != null) { propertyValue = containingIniSection.PreCheckValue(propertyName, properties[propertyName]); @@ -273,7 +272,7 @@ namespace Greenshot.IniFile { object dictionary = Activator.CreateInstance(valueType); MethodInfo addMethodInfo = valueType.GetMethod("Add"); bool addedElements = false; - Dictionary properties = IniConfig.PropertiesForSection(containingIniSection); + IDictionary properties = IniConfig.PropertiesForSection(containingIniSection); foreach (string key in properties.Keys) { if (key != null && key.StartsWith(propertyName + ".")) { // What "key" do we need to store it under? @@ -354,6 +353,7 @@ namespace Greenshot.IniFile { /// /// Type to convert tp /// string to convert from + /// /// Value private static object ConvertStringToValueType(Type valueType, string valueString, string separator) { if (valueString == null) { @@ -460,7 +460,8 @@ namespace Greenshot.IniFile { } } return stringBuilder.ToString(); - } else if (valueType == typeof(object)) { + } + if (valueType == typeof(object)) { // object to String, this is the hardest // Format will be "FQTypename[,Assemblyname]:Value" @@ -478,12 +479,11 @@ namespace Greenshot.IniFile { if (assemblyName.StartsWith("Green")) { assemblyName = assemblyName.Substring(0, assemblyName.IndexOf(',')); } - return String.Format("{0},{1}:{2}", valueTypeName, assemblyName, ourValue); - } else { - TypeConverter converter = TypeDescriptor.GetConverter(valueType); - if (converter != null) { - return converter.ConvertToInvariantString(valueObject); - } + return string.Format("{0},{1}:{2}", valueTypeName, assemblyName, ourValue); + } + TypeConverter converter = TypeDescriptor.GetConverter(valueType); + if (converter != null) { + return converter.ConvertToInvariantString(valueObject); } // All other types return valueObject.ToString(); diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index ca0ea04b7..5d7b83b5d 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -21,7 +21,6 @@ using Greenshot.Core; using Greenshot.Memento; using Greenshot.Plugin.Drawing; -using GreenshotPlugin.Interfaces.Drawing; using System; using System.Drawing; using System.IO; @@ -207,6 +206,7 @@ namespace Greenshot.Plugin /// /// IDrawableContainer /// false to skip invalidation + /// false to skip event generation void SelectElement(IDrawableContainer container, bool invalidate = true, bool generateEvents = true); /// /// Is the supplied container "on" the surface? diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index 764c337b6..8abae8940 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -139,7 +139,7 @@ namespace Greenshot.Plugin { /// Return a menu item /// /// Resolve the dynamic destinations too? - /// The menu for which the item is created + /// The menu for which the item is created /// Handler which is called when clicked /// ToolStripMenuItem ToolStripMenuItem GetMenuItem(bool addDynamics, ContextMenuStrip menu, EventHandler destinationClickHandler); diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index 6d6301d6f..5e632ca71 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -30,7 +30,7 @@ using Greenshot.Core; namespace Greenshot.Plugin { [Serializable] [AttributeUsage(AttributeTargets.Assembly, Inherited = false, AllowMultiple = false)] - sealed public class PluginAttribute : Attribute, IComparable { + public sealed class PluginAttribute : Attribute, IComparable { public string Name { get; set; @@ -173,10 +173,13 @@ namespace Greenshot.Plugin { NotifyIcon NotifyIcon { get; } + /// /// Create a Thumbnail /// /// Image of which we need a Thumbnail + /// + /// /// Image with Thumbnail Image GetThumbnail(Image image, int width, int height); @@ -191,14 +194,14 @@ namespace Greenshot.Plugin { /// /// Get a destination by it's designation /// - /// + /// /// IDestination IDestination GetDestination(string designation); /// /// Get a list of all available destinations /// - /// List + /// List of IDestination List GetAllDestinations(); /// diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 3cde05cf5..2c723440c 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -45,12 +45,12 @@ namespace Greenshot.Interop { /// /// Holds reference to the actual COM object which is wrapped by this proxy /// - private object _COMObject; + private readonly object _comObject; /// /// Type of the COM object, set on constructor after getting the COM reference /// - private readonly Type _COMType; + private readonly Type _comType; /// /// The type of which method calls are intercepted and executed on the COM object. @@ -64,33 +64,33 @@ namespace Greenshot.Interop { #endregion [DllImport("ole32.dll")] - static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID); + static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgId); // Converts failure HRESULTs to exceptions: [DllImport("oleaut32", PreserveSig=false)] - static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out Object ppunk); + static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out object ppunk); #region Construction /// /// Gets a COM object and returns the transparent proxy which intercepts all calls to the object /// - /// Interface which defines the method and properties to intercept + /// Interface which defines the method and properties to intercept /// Transparent proxy to the real proxy for the object - /// The must be an interface decorated with the attribute. + /// T must be an interface decorated with the attribute. public static T GetInstance() { Type type = typeof(T); if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(T)); } if (!type.IsInterface) { - throw new ArgumentException("The specified type must be an interface.", "type"); + throw new ArgumentException("The specified type must be an interface.", nameof(T)); } - ComProgIdAttribute progIDAttribute = ComProgIdAttribute.GetAttribute(type); - if (null == progIDAttribute || null == progIDAttribute.Value || 0 == progIDAttribute.Value.Length) { - throw new ArgumentException("The specified type must define a ComProgId attribute.", "type"); + var progIdAttribute = ComProgIdAttribute.GetAttribute(type); + if (string.IsNullOrEmpty(progIdAttribute?.Value)) { + throw new ArgumentException("The specified type must define a ComProgId attribute.", nameof(T)); } - string progId = progIDAttribute.Value; + string progId = progIdAttribute.Value; object comObject = null; @@ -100,18 +100,18 @@ namespace Greenshot.Interop { int result = ProgIDFromCLSID(ref guid, out progId); if (result != 0) { // Restore progId, as it's overwritten - progId = progIDAttribute.Value; + progId = progIdAttribute.Value; try { GetActiveObject(ref guid, IntPtr.Zero, out comObject); } catch (Exception) { - LOG.WarnFormat("Error {0} getting instance for class id {1}", result, progIDAttribute.Value); + LOG.WarnFormat("Error {0} getting instance for class id {1}", result, progIdAttribute.Value); } if (comObject == null) { - LOG.WarnFormat("Error {0} getting progId {1}", result, progIDAttribute.Value); + LOG.WarnFormat("Error {0} getting progId {1}", result, progIdAttribute.Value); } } else { - LOG.InfoFormat("Mapped {0} to progId {1}", progIDAttribute.Value, progId); + LOG.InfoFormat("Mapped {0} to progId {1}", progIdAttribute.Value, progId); } } @@ -124,16 +124,16 @@ namespace Greenshot.Interop { } else if (comE.ErrorCode == CO_E_CLASSSTRING) { LOG.WarnFormat("Unknown progId {0}", progId); } else { - LOG.Warn("Error getting active object for " + progIDAttribute.Value, comE); + LOG.Warn("Error getting active object for " + progIdAttribute.Value, comE); } } catch (Exception e) { - LOG.Warn("Error getting active object for " + progIDAttribute.Value, e); + LOG.Warn("Error getting active object for " + progIdAttribute.Value, e); } } if (comObject != null) { if (comObject is IDispatch) { - COMWrapper wrapper = new COMWrapper(comObject, type, progIDAttribute.Value); + COMWrapper wrapper = new COMWrapper(comObject, type, progIdAttribute.Value); return (T)wrapper.GetTransparentProxy(); } else { return (T)comObject; @@ -149,17 +149,17 @@ namespace Greenshot.Interop { public static T CreateInstance() { Type type = typeof(T); if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(T)); } if (!type.IsInterface) { - throw new ArgumentException("The specified type must be an interface.", "type"); + throw new ArgumentException("The specified type must be an interface.", nameof(T)); } - ComProgIdAttribute progIDAttribute = ComProgIdAttribute.GetAttribute(type); - if (null == progIDAttribute || null == progIDAttribute.Value || 0 == progIDAttribute.Value.Length) { - throw new ArgumentException("The specified type must define a ComProgId attribute.", "type"); + ComProgIdAttribute progIdAttribute = ComProgIdAttribute.GetAttribute(type); + if (string.IsNullOrEmpty(progIdAttribute?.Value)) { + throw new ArgumentException("The specified type must define a ComProgId attribute.", nameof(T)); } - string progId = progIDAttribute.Value; + string progId = progIdAttribute.Value; Type comType = null; if (progId.StartsWith("clsid:")) { Guid guid = new Guid(progId.Substring(6)); @@ -197,26 +197,26 @@ namespace Greenshot.Interop { /// Gets or creates a COM object and returns the transparent proxy which intercepts all calls to the object /// The ComProgId can be a normal ComProgId or a GUID prefixed with "clsid:" /// - /// Interface which defines the method and properties to intercept + /// Interface which defines the method and properties to intercept /// Transparent proxy to the real proxy for the object - /// The must be an interface decorated with the attribute. + /// T must be an interface decorated with the attribute. public static T GetOrCreateInstance() { Type type = typeof(T); if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(T)); } if (!type.IsInterface) { - throw new ArgumentException("The specified type must be an interface.", "type"); + throw new ArgumentException("The specified type must be an interface.", nameof(T)); } - ComProgIdAttribute progIDAttribute = ComProgIdAttribute.GetAttribute(type); - if (null == progIDAttribute || null == progIDAttribute.Value || 0 == progIDAttribute.Value.Length) { - throw new ArgumentException("The specified type must define a ComProgId attribute.", "type"); + var progIdAttribute = ComProgIdAttribute.GetAttribute(type); + if (string.IsNullOrEmpty(progIdAttribute?.Value)) { + throw new ArgumentException("The specified type must define a ComProgId attribute.", nameof(T)); } object comObject = null; Type comType = null; - string progId = progIDAttribute.Value; + string progId = progIdAttribute.Value; Guid guid = Guid.Empty; // Convert from clsid to Prog ID, if needed @@ -225,17 +225,17 @@ namespace Greenshot.Interop { int result = ProgIDFromCLSID(ref guid, out progId); if (result != 0) { // Restore progId, as it's overwritten - progId = progIDAttribute.Value; + progId = progIdAttribute.Value; try { GetActiveObject(ref guid, IntPtr.Zero, out comObject); } catch (Exception) { - LOG.WarnFormat("Error {0} getting instance for class id {1}", result, progIDAttribute.Value); + LOG.WarnFormat("Error {0} getting instance for class id {1}", result, progIdAttribute.Value); } if (comObject == null) { - LOG.WarnFormat("Error {0} getting progId {1}", result, progIDAttribute.Value); + LOG.WarnFormat("Error {0} getting progId {1}", result, progIdAttribute.Value); } } else { - LOG.InfoFormat("Mapped {0} to progId {1}", progIDAttribute.Value, progId); + LOG.InfoFormat("Mapped {0} to progId {1}", progIdAttribute.Value, progId); } } @@ -283,7 +283,7 @@ namespace Greenshot.Interop { } if (comObject != null) { if (comObject is IDispatch) { - COMWrapper wrapper = new COMWrapper(comObject, type, progIDAttribute.Value); + COMWrapper wrapper = new COMWrapper(comObject, type, progIdAttribute.Value); return (T)wrapper.GetTransparentProxy(); } else { return (T)comObject; @@ -295,16 +295,16 @@ namespace Greenshot.Interop { /// /// Wrap a com object as COMWrapper /// + /// Interface which defines the method and properties to intercept /// An object to intercept - /// Interface which defines the method and properties to intercept /// Transparent proxy to the real proxy for the object public static T Wrap(object comObject) { Type type = typeof (T); if (null == comObject) { - throw new ArgumentNullException("comObject"); + throw new ArgumentNullException(nameof(comObject)); } if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(T)); } COMWrapper wrapper = new COMWrapper(comObject, type, type.FullName); @@ -316,13 +316,14 @@ namespace Greenshot.Interop { /// /// An object to intercept /// Interface which defines the method and properties to intercept + /// /// Transparent proxy to the real proxy for the object private static object Wrap(object comObject, Type type, string targetName) { if (null == comObject) { - throw new ArgumentNullException("comObject"); + throw new ArgumentNullException(nameof(comObject)); } if (null == type) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(type)); } COMWrapper wrapper = new COMWrapper(comObject, type, targetName); @@ -338,9 +339,10 @@ namespace Greenshot.Interop { /// /// The interface type to impersonate. /// + /// private COMWrapper(object comObject, Type type, string targetName) : base(type) { - _COMObject = comObject; - _COMType = comObject.GetType(); + _comObject = comObject; + _comType = comObject.GetType(); _interceptType = type; _targetName = targetName; } @@ -374,24 +376,22 @@ namespace Greenshot.Interop { /// interface. /// private void Dispose(bool disposing) { - if (null != _COMObject) { + if (null != _comObject) { LOG.DebugFormat("Disposing {0}", _interceptType); - if (Marshal.IsComObject(_COMObject)) { + if (Marshal.IsComObject(_comObject)) { try { int count; do { - count = Marshal.ReleaseComObject(_COMObject); + count = Marshal.ReleaseComObject(_comObject); LOG.DebugFormat("RCW count for {0} now is {1}", _interceptType, count); } while (count > 0); } catch (Exception ex) { - LOG.WarnFormat("Problem releasing COM object {0}", _COMType); + LOG.WarnFormat("Problem releasing COM object {0}", _comType); LOG.Warn("Error: ", ex); } } else { - LOG.WarnFormat("{0} is not a COM object", _COMType); + LOG.WarnFormat("{0} is not a COM object", _comType); } - - _COMObject = null; } } @@ -416,7 +416,7 @@ namespace Greenshot.Interop { /// The hash code of the wrapped object. /// public override int GetHashCode() { - return _COMObject.GetHashCode(); + return _comObject.GetHashCode(); } /// @@ -432,7 +432,7 @@ namespace Greenshot.Interop { if (null != value && RemotingServices.IsTransparentProxy(value)) { COMWrapper wrapper = RemotingServices.GetRealProxy(value) as COMWrapper; if (null != wrapper) { - return _COMObject == wrapper._COMObject; + return _comObject == wrapper._comObject; } } @@ -453,7 +453,7 @@ namespace Greenshot.Interop { /// private static Type GetByValType(Type byRefType) { if (null == byRefType) { - throw new ArgumentNullException("byRefType"); + throw new ArgumentNullException(nameof(byRefType)); } if (byRefType.IsByRef) { @@ -467,97 +467,6 @@ namespace Greenshot.Interop { #endregion - /// - /// Use this static method to cast a wrapped proxy to a new wrapper proxy of the supplied type. - /// In English, use this to cast you base "COM" interface to a specialized interface. - /// E.G. Outlook Item -> MailItem - /// - /// the type you want to cast to - /// The wrapper interface, e.g. something you got back from calling GetItem - /// A new wrapper proxy for the specified type - public static T Cast(object wrapperProxy) { - if (wrapperProxy == null) { - return default(T); - } - - Type newType = typeof(T); - COMWrapper oldWrapper = RemotingServices.GetRealProxy(wrapperProxy) as COMWrapper; - if (oldWrapper == null) { - throw new ArgumentException("wrapper proxy was no COMWrapper"); - } - if (oldWrapper._interceptType.IsAssignableFrom(newType)) { - COMWrapper newWrapper = new COMWrapper(oldWrapper._COMObject, newType, oldWrapper._targetName); - return (T)newWrapper.GetTransparentProxy(); - } - throw new InvalidCastException(string.Format("{0} is not assignable from {1}", oldWrapper._interceptType, newType)); - } - - /// - /// Returns the "com" type of the wrapperproxy, making it possible to perform reflection on it. - /// - /// wrapperProxy to get the type from - /// Type - public static Type GetUnderlyingTypeForWrapper(object wrapperProxy) { - Type returnType = null; - COMWrapper wrapper = RemotingServices.GetRealProxy(wrapperProxy) as COMWrapper; - if (wrapper != null) { - IDispatch dispatch = wrapper._COMObject as IDispatch; - if (dispatch != null) { - int result = dispatch.GetTypeInfo(0, 0, out returnType); - if (result != 0) { - LOG.DebugFormat("GetTypeInfo : 0x{0} ({1})", result.ToString("X"), result); - } - } - } - return returnType; - } - - /// - /// Return the Type of a IDispatch - /// - /// IDispatch to get the type object for - /// Type of the IDispatch - public static Type GetUnderlyingType(IDispatch dispatch) { - Type returnType = null; - if (dispatch != null) { - int result = dispatch.GetTypeInfo(0, 0, out returnType); - if (result != 0) { - LOG.DebugFormat("GetTypeInfo : 0x{0} ({1})", result.ToString("X"), result); - } - } - return returnType; - } - - /// - /// Dump the Type-Information for the Type to the log, this uses reflection - /// - /// Type to inspect - public static void DumpTypeInfo(Type type) { - LOG.InfoFormat("Type information for Type with name: {0}", type.Name); - try { - foreach (MemberInfo memberInfo in type.GetMembers()) { - LOG.InfoFormat("Member: {0};", memberInfo); - } - } catch (Exception memberException) { - LOG.Error(memberException); - } - try { - foreach (PropertyInfo propertyInfo in type.GetProperties()) { - LOG.InfoFormat("Property: {0};", propertyInfo); - } - } catch (Exception propertyException) { - LOG.Error(propertyException); - } - try { - foreach (FieldInfo fieldInfo in type.GetFields()) { - LOG.InfoFormat("Field: {0};", fieldInfo); - } - } catch (Exception fieldException) { - LOG.Error(fieldException); - } - LOG.InfoFormat("Type information end."); - } - /// /// Intercept method calls /// @@ -605,14 +514,14 @@ namespace Greenshot.Interop { } else if (1 == argCount && typeof(void) == returnType && (methodName.StartsWith("add_") || methodName.StartsWith("remove_"))) { bool removeHandler = methodName.StartsWith("remove_"); methodName = methodName.Substring(removeHandler ? 7 : 4); - + // TODO: Something is missing here Delegate handler = callMessage.InArgs[0] as Delegate; if (null == handler) { - return new ReturnMessage(new ArgumentNullException("handler"), callMessage); + return new ReturnMessage(new ArgumentNullException(nameof(handler)), callMessage); } } else { - var invokeObject = _COMObject; - var invokeType = _COMType; + var invokeObject = _comObject; + var invokeType = _comType; object[] args; ParameterInfo parameter; @@ -661,7 +570,7 @@ namespace Greenshot.Interop { wrapper = RemotingServices.GetRealProxy(args[i]) as COMWrapper; if (null != wrapper) { originalArgs[i] = wrapper; - args[i] = wrapper._COMObject; + args[i] = wrapper._comObject; } } else if (0 != outArgsCount && argModifiers[0][i]) { byValType = GetByValType(parameters[i].ParameterType); @@ -755,7 +664,7 @@ namespace Greenshot.Interop { } else if (byValType.IsInterface) { if (Marshal.IsComObject(arg)) { wrapper = originalArgs[i]; - if (null != wrapper && wrapper._COMObject != arg) { + if (null != wrapper && wrapper._comObject != arg) { wrapper.Dispose(); wrapper = null; } diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index 3ad858623..e3d06d1fa 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -64,7 +64,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { return new Point(X, Y); } - override public string ToString() { + public override string ToString() { return X + "," + Y; } } diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index f6614d1b5..6c9b802d4 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -22,9 +22,6 @@ using System; using System.Runtime.InteropServices; using System.Text; -/// -/// Win32 error codes -/// namespace GreenshotPlugin.UnmanagedHelpers { /// /// A Win32 error code. From a3f3c20d7143ca61df357c6fca5a222383cb9518 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 16 Aug 2016 16:53:37 +0200 Subject: [PATCH 087/170] Work in progress for the Jira backport. [skip ci] --- GreenshotJiraPlugin/Forms/JiraForm.cs | 136 +- .../GreenshotJiraPlugin.csproj | 51 +- GreenshotJiraPlugin/Jira.cs | 413 -- GreenshotJiraPlugin/JiraConfiguration.cs | 5 +- GreenshotJiraPlugin/JiraConnector.cs | 181 + GreenshotJiraPlugin/JiraDestination.cs | 64 +- GreenshotJiraPlugin/JiraPlugin.cs | 35 +- GreenshotJiraPlugin/JiraUtils.cs | 19 +- .../Web References/JiraSoap/Reference.cs | 3721 ----------------- GreenshotJiraPlugin/packages.config | 7 + GreenshotPlugin/Controls/PleaseWaitForm.cs | 46 +- GreenshotPlugin/Core/NetworkHelper.cs | 14 +- 12 files changed, 402 insertions(+), 4290 deletions(-) delete mode 100644 GreenshotJiraPlugin/Jira.cs create mode 100644 GreenshotJiraPlugin/JiraConnector.cs delete mode 100644 GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs create mode 100644 GreenshotJiraPlugin/packages.config diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index bb6ab54eb..56cf7a3e9 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -22,14 +22,19 @@ using System; using System.Globalization; using System.Windows.Forms; +using Dapplo.Jira.Entities; using Greenshot.IniFile; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; namespace GreenshotJiraPlugin.Forms { public partial class JiraForm : Form { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraForm)); private readonly JiraConnector _jiraConnector; - private JiraIssue _selectedIssue; + private Issue _selectedIssue; private readonly GreenshotColumnSorter _columnSorter; private readonly JiraConfiguration _config = IniConfig.GetIniSection(); @@ -47,15 +52,46 @@ namespace GreenshotJiraPlugin.Forms { _jiraConnector = jiraConnector; ChangeModus(false); - try { - if (!jiraConnector.IsLoggedIn) { - jiraConnector.Login(); + + uploadButton.Enabled = false; + Load += OnLoad; + } + + private async void OnLoad(object sender, EventArgs eventArgs) + { + try + { + if (!_jiraConnector.IsLoggedIn) + { + await _jiraConnector.Login(); } - } catch (Exception e) { + } + catch (Exception e) + { MessageBox.Show(Language.GetFormattedString("jira", LangKey.login_error, e.Message)); } - uploadButton.Enabled = false; - UpdateForm(); + if (_jiraConnector.IsLoggedIn) + { + var filters = await _jiraConnector.GetFavoriteFiltersAsync(); + if (filters.Count > 0) + { + foreach (var filter in filters) + { + jiraFilterBox.Items.Add(filter); + } + jiraFilterBox.SelectedIndex = 0; + } + ChangeModus(true); + if (_config.LastUsedJira != null) + { + _selectedIssue = await _jiraConnector.GetIssueAsync(_config.LastUsedJira); + if (_selectedIssue != null) + { + jiraKey.Text = _config.LastUsedJira; + uploadButton.Enabled = true; + } + } + } } private void InitializeComponentText() { @@ -64,26 +100,6 @@ namespace GreenshotJiraPlugin.Forms { label_filename.Text = Language.GetString("jira", LangKey.label_filename); } - private void UpdateForm() { - if (_jiraConnector.IsLoggedIn) { - JiraFilter[] filters = _jiraConnector.GetFilters(); - if (filters.Length > 0) { - foreach (JiraFilter filter in filters) { - jiraFilterBox.Items.Add(filter); - } - jiraFilterBox.SelectedIndex = 0; - } - ChangeModus(true); - if (_config.LastUsedJira != null) { - _selectedIssue = _jiraConnector.GetIssue(_config.LastUsedJira); - if (_selectedIssue != null) { - jiraKey.Text = _config.LastUsedJira; - uploadButton.Enabled = true; - } - } - } - } - private void ChangeModus(bool enabled) { jiraFilterBox.Enabled = enabled; jiraListView.Enabled = enabled; @@ -99,59 +115,67 @@ namespace GreenshotJiraPlugin.Forms { jiraCommentBox.Text = comment; } - public JiraIssue GetJiraIssue() { + public Issue GetJiraIssue() { return _selectedIssue; } - public void Upload(IBinaryContainer attachment) { + public async Task UploadAsync(IBinaryContainer attachment) { _config.LastUsedJira = _selectedIssue.Key; - _jiraConnector.AddAttachment(_selectedIssue.Key, jiraFilenameBox.Text, attachment); - if (!string.IsNullOrEmpty(jiraCommentBox.Text)) { - _jiraConnector.AddComment(_selectedIssue.Key, jiraCommentBox.Text); + using (var memoryStream = new MemoryStream()) + { + attachment.WriteToStream(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + await _jiraConnector.AttachAsync(_selectedIssue.Key, memoryStream, jiraFilenameBox.Text, attachment.ContentType); } - } - public void Logout() { - _jiraConnector.Logout(); + if (!string.IsNullOrEmpty(jiraCommentBox.Text)) { + await _jiraConnector.AddCommentAsync(_selectedIssue.Key, jiraCommentBox.Text); + } } private void selectJiraToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; - _selectedIssue = (JiraIssue)clickedItem.Tag; + _selectedIssue = (Issue)clickedItem.Tag; jiraKey.Text = _selectedIssue.Key; } - private void jiraFilterBox_SelectedIndexChanged(object sender, EventArgs e) { + private async void jiraFilterBox_SelectedIndexChanged(object sender, EventArgs e) { if (_jiraConnector.IsLoggedIn) { - JiraIssue[] issues = null; + uploadButton.Enabled = false; - JiraFilter filter = (JiraFilter)jiraFilterBox.SelectedItem; + var filter = (Filter)jiraFilterBox.SelectedItem; if (filter == null) { return; } - // Run upload in the background - new PleaseWaitForm().ShowAndWait(JiraPlugin.Instance.JiraPluginAttributes.Name, Language.GetString("jira", LangKey.communication_wait), - delegate() { - issues = _jiraConnector.GetIssuesForFilter(filter.Id); - } - ); + IList issues = null; + try + { + var searchResult = await _jiraConnector.SearchAsync(filter.Jql); + issues = searchResult.Issues; + } + catch (Exception ex) + { + Log.Error(ex); + MessageBox.Show(this, ex.Message, "Error in filter", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + jiraListView.BeginUpdate(); jiraListView.Items.Clear(); - if (issues.Length > 0) { + if (issues?.Count > 0) { jiraListView.Columns.Clear(); LangKey[] columns = { LangKey.column_id, LangKey.column_created, LangKey.column_assignee, LangKey.column_reporter, LangKey.column_summary }; foreach (LangKey column in columns) { jiraListView.Columns.Add(Language.GetString("jira", column)); } - foreach (JiraIssue issue in issues) { - ListViewItem item = new ListViewItem(issue.Key) + foreach (var issue in issues) { + var item = new ListViewItem(issue.Key) { Tag = issue }; - item.SubItems.Add(issue.Created.Value.ToString("d", DateTimeFormatInfo.InvariantInfo)); - item.SubItems.Add(issue.Assignee); - item.SubItems.Add(issue.Reporter); - item.SubItems.Add(issue.Summary); + item.SubItems.Add(issue.Fields.Created.ToString("d", DateTimeFormatInfo.InvariantInfo)); + item.SubItems.Add(issue.Fields.Assignee?.DisplayName); + item.SubItems.Add(issue.Fields.Reporter?.DisplayName); + item.SubItems.Add(issue.Fields.Summary); jiraListView.Items.Add(item); } for (int i = 0; i < columns.Length; i++) { @@ -164,8 +188,8 @@ namespace GreenshotJiraPlugin.Forms { } private void jiraListView_SelectedIndexChanged(object sender, EventArgs e) { - if (jiraListView.SelectedItems != null && jiraListView.SelectedItems.Count > 0) { - _selectedIssue = (JiraIssue)jiraListView.SelectedItems[0].Tag; + if (jiraListView.SelectedItems.Count > 0) { + _selectedIssue = (Issue)jiraListView.SelectedItems[0].Tag; jiraKey.Text = _selectedIssue.Key; uploadButton.Enabled = true; } else { @@ -192,12 +216,12 @@ namespace GreenshotJiraPlugin.Forms { jiraListView.Sort(); } - void JiraKeyTextChanged(object sender, EventArgs e) { + private async void JiraKeyTextChanged(object sender, EventArgs e) { string jiranumber = jiraKey.Text; uploadButton.Enabled = false; int dashIndex = jiranumber.IndexOf('-'); if (dashIndex > 0 && jiranumber.Length > dashIndex+1) { - _selectedIssue = _jiraConnector.GetIssue(jiraKey.Text); + _selectedIssue = await _jiraConnector.GetIssueAsync(jiraKey.Text); if (_selectedIssue != null) { uploadButton.Enabled = true; } diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 0af0eaeb9..d70a3c9c4 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -6,7 +6,7 @@ Library GreenshotJiraPlugin GreenshotJiraPlugin - v2.0 + v4.5 Properties False False @@ -20,8 +20,36 @@ + + false + + + false + + + false + + + false + + + ..\packages\Dapplo.HttpExtensions.0.5.30\lib\net45\Dapplo.HttpExtensions.dll + True + + + ..\packages\Dapplo.Jira.0.1.56\lib\net45\Dapplo.Jira.dll + True + + + ..\packages\Dapplo.Log.Facade.0.5.4\lib\net45\Dapplo.Log.Facade.dll + True + + + ..\packages\Dapplo.Utils.0.1.113\lib\net45\Dapplo.Utils.dll + True + ..\Greenshot\Lib\log4net.dll @@ -47,18 +75,13 @@ SettingsForm.cs - + - - True - True - Reference.map - Always @@ -72,23 +95,12 @@ Always - - - MSDiscoCodeGenerator - Reference.cs - + JiraPlugin.cs - - - Static - http://jira/rpc/soap/jirasoapservice-v2%3fwsdl - Web References\JiraSoap - Jira - {5B924697-4DCD-4F98-85F1-105CB84B7341} GreenshotPlugin @@ -97,6 +109,7 @@ mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\Dapplo.*" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" diff --git a/GreenshotJiraPlugin/Jira.cs b/GreenshotJiraPlugin/Jira.cs deleted file mode 100644 index 8af125b17..000000000 --- a/GreenshotJiraPlugin/Jira.cs +++ /dev/null @@ -1,413 +0,0 @@ - -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Threading; -using System.Windows.Forms; -using Greenshot.IniFile; -using GreenshotJiraPlugin.Web_References.JiraSoap; -using GreenshotPlugin.Controls; -using GreenshotPlugin.Core; - -namespace GreenshotJiraPlugin { - #region transport classes - public class JiraFilter { - public JiraFilter(string name, string id) { - Name = name; - Id = id; - } - public string Name { - get; - set; - } - public string Id { - get; - set; - } - } - - public class JiraIssue { - public JiraIssue(string key, DateTime? created, string reporter, string assignee, string project, string summary, string description, string environment, string [] attachmentNames) { - Key = key; - Created = created; - Reporter = reporter; - Assignee = assignee; - Project = project; - Summary = summary; - Description = description; - Environment = environment; - AttachmentNames = attachmentNames; - } - public string Key { - get; - set; - } - public DateTime? Created { - get; - private set; - } - public string Reporter { - get; - private set; - } - public string Assignee { - get; - private set; - } - public string Project { - get; - private set; - } - public string Summary { - get; - private set; - } - public string Description { - get; - private set; - } - public string Environment { - get; - private set; - } - public string[] AttachmentNames { - get; - private set; - } - } - #endregion - - public class JiraConnector : IDisposable { - private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraConnector)); - private const string AuthFailedExceptionName = "com.atlassian.jira.rpc.exception.RemoteAuthenticationException"; - private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); - public const string DefaultPostfix = "/rpc/soap/jirasoapservice-v2?wsdl"; - private string _credentials; - private DateTime _loggedInTime = DateTime.Now; - private bool _loggedIn; - private JiraSoapServiceService _jira; - private readonly int _timeout; - private string _url; - private readonly Cache _jiraCache = new Cache(60 * Config.Timeout); - private readonly Cache _userCache = new Cache(60 * Config.Timeout); - private readonly bool _suppressBackgroundForm; - - public void Dispose() { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected void Dispose(bool disposing) { - if (_jira != null) { - Logout(); - } - - if (disposing) { - if (_jira != null) { - _jira.Dispose(); - _jira = null; - } - } - } - - public JiraConnector() : this(false) { - } - - public JiraConnector(bool suppressBackgroundForm) { - _url = Config.Url; - _timeout = Config.Timeout; - _suppressBackgroundForm = suppressBackgroundForm; - CreateService(); - } - - private void CreateService() { - if (!_suppressBackgroundForm) { - new PleaseWaitForm().ShowAndWait(JiraPlugin.Instance.JiraPluginAttributes.Name, Language.GetString("jira", LangKey.communication_wait), - delegate { - _jira = new JiraSoapServiceService(); - } - ); - } else { - _jira = new JiraSoapServiceService(); - } - _jira.Url = _url; - _jira.Proxy = NetworkHelper.CreateProxy(new Uri(_url)); - // Do not use: - //jira.AllowAutoRedirect = true; - _jira.UserAgent = "Greenshot"; - } - - ~JiraConnector() { - Dispose(false); - } - - /// - /// Internal login which catches the exceptions - /// - /// true if login was done sucessfully - private bool DoLogin(string user, string password, bool suppressBackgroundForm) { - - // This is what needs to be done - ThreadStart jiraLogin = delegate { - Log.DebugFormat("Loggin in"); - try { - _credentials = _jira.login(user, password); - } catch (Exception) { - if (!_url.EndsWith("wsdl")) { - _url = _url + "/rpc/soap/jirasoapservice-v2?wsdl"; - // recreate the service with the new url - CreateService(); - _credentials = _jira.login(user, password); - // Worked, store the url in the configuration - Config.Url = _url; - IniConfig.Save(); - } else { - throw; - } - } - - Log.DebugFormat("Logged in"); - _loggedInTime = DateTime.Now; - _loggedIn = true; - - }; - // Here we do it - try { - if (!suppressBackgroundForm) { - new PleaseWaitForm().ShowAndWait(JiraPlugin.Instance.JiraPluginAttributes.Name, Language.GetString("jira", LangKey.communication_wait), jiraLogin); - } else { - jiraLogin.Invoke(); - } - } catch (Exception e) { - // check if auth failed - if (e.Message.Contains(AuthFailedExceptionName)) { - return false; - } - // Not an authentication issue - _loggedIn = false; - _credentials = null; - e.Data.Add("user", user); - e.Data.Add("url", _url); - throw; - } - return true; - } - - public void Login() { - Login(false); - } - public void Login(bool suppressBackgroundForm) { - Logout(); - try { - // Get the system name, so the user knows where to login to - string systemName = _url.Replace(DefaultPostfix,""); - CredentialsDialog dialog = new CredentialsDialog(systemName) - { - Name = null - }; - while (dialog.Show(dialog.Name) == DialogResult.OK) { - if (DoLogin(dialog.Name, dialog.Password, suppressBackgroundForm)) { - if (dialog.SaveChecked) { - dialog.Confirm(true); - } - return; - } - try { - dialog.Confirm(false); - } catch (ApplicationException e) { - // exception handling ... - Log.Error("Problem using the credentials dialog", e); - } - // For every windows version after XP show an incorrect password baloon - dialog.IncorrectPassword = true; - // Make sure the dialog is display, the password was false! - dialog.AlwaysDisplay = true; - } - } catch (ApplicationException e) { - // exception handling ... - Log.Error("Problem using the credentials dialog", e); - } - } - - public void Logout() { - if (_credentials != null) { - _jira.logout(_credentials); - _credentials = null; - _loggedIn = false; - } - } - - private void CheckCredentials() { - if (_loggedIn) { - if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) { - Logout(); - Login(); - } - } else { - Login(); - } - } - - public bool IsLoggedIn { - get { - return _loggedIn; - } - } - - public JiraFilter[] GetFilters() { - List filters = new List(); - CheckCredentials(); - RemoteFilter[] remoteFilters = _jira.getSavedFilters(_credentials); - foreach (RemoteFilter remoteFilter in remoteFilters) { - filters.Add(new JiraFilter(remoteFilter.name, remoteFilter.id)); - } - return filters.ToArray(); - } - - private JiraIssue CreateDummyErrorIssue(Exception e) { - // Creating bogus jira to indicate a problem - return new JiraIssue("error", DateTime.Now, "error", "error", "error", e.Message, "error", "error", null); - } - - public JiraIssue GetIssue(string key) { - JiraIssue jiraIssue = null; - if (_jiraCache.Contains(key)) { - jiraIssue = _jiraCache[key]; - } - if (jiraIssue == null) { - CheckCredentials(); - try { - RemoteIssue issue = _jira.getIssue(_credentials, key); - jiraIssue = new JiraIssue(issue.key, issue.created, GetUserFullName(issue.reporter), GetUserFullName(issue.assignee), issue.project, issue.summary, issue.description, issue.environment, issue.attachmentNames); - _jiraCache.Add(key, jiraIssue); - } catch (Exception e) { - Log.Error("Problem retrieving Jira: " + key, e); - } - } - return jiraIssue; - } - - public JiraIssue[] GetIssuesForFilter(string filterId) { - List issuesToReturn = new List(); - CheckCredentials(); - try { - RemoteIssue[] issues = _jira.getIssuesFromFilter(_credentials, filterId); - - #region Username cache update - List users = new List(); - foreach (RemoteIssue issue in issues) { - if (issue.reporter != null && !HasUser(issue.reporter) && !users.Contains(issue.reporter)) { - users.Add(issue.reporter); - } - if (issue.assignee != null && !HasUser(issue.assignee) && !users.Contains(issue.assignee)) { - users.Add(issue.assignee); - } - } - int taskCount = users.Count; - if (taskCount > 0) { - ManualResetEvent doneEvent = new ManualResetEvent(false); - for (int i = 0; i < users.Count; i++) { - ThreadPool.QueueUserWorkItem(delegate(object name) { - Log.InfoFormat("Retrieving {0}", name); - GetUserFullName((string)name); - if (Interlocked.Decrement(ref taskCount) == 0) { - doneEvent.Set(); - } - }, users[i]); - } - doneEvent.WaitOne(); - } - #endregion - - foreach (RemoteIssue issue in issues) { - try { - JiraIssue jiraIssue = new JiraIssue(issue.key, issue.created, GetUserFullName(issue.reporter), GetUserFullName(issue.assignee), issue.project, issue.summary, issue.description, "", issue.attachmentNames); - issuesToReturn.Add(jiraIssue); - } catch (Exception e) { - Log.Error("Problem retrieving Jira: " + issue.key, e); - JiraIssue jiraIssue = CreateDummyErrorIssue(e); - jiraIssue.Key = issue.key; - issuesToReturn.Add(jiraIssue); - } - } - } catch (Exception e) { - Log.Error("Problem retrieving Jiras for Filter: " + filterId, e); - issuesToReturn.Add(CreateDummyErrorIssue(e)); - } - return issuesToReturn.ToArray(); ; - } - - public string GetUrl(string issueKey) { - return _url.Replace(DefaultPostfix,"") + "/browse/" + issueKey; - } - - public void AddAttachment(string issueKey, string filename, IBinaryContainer attachment) { - CheckCredentials(); - try { - _jira.addBase64EncodedAttachmentsToIssue(_credentials, issueKey, new[] { filename }, new[] { attachment.ToBase64String(Base64FormattingOptions.InsertLineBreaks) }); - } catch (Exception ex1) { - Log.WarnFormat("Failed to upload by using method addBase64EncodedAttachmentsToIssue, error was {0}", ex1.Message); - try { - Log.Warn("Trying addAttachmentsToIssue instead"); - _jira.addAttachmentsToIssue(_credentials, issueKey, new[] { filename }, (sbyte[])(Array)attachment.ToByteArray()); - } catch (Exception ex2) { - Log.WarnFormat("Failed to use alternative method, error was: {0}", ex2.Message); - throw; - } - } - } - - public void AddComment(string issueKey, string commentString) { - RemoteComment comment = new RemoteComment - { - body = commentString - }; - CheckCredentials(); - _jira.addComment(_credentials, issueKey, comment); - } - - private bool HasUser(string user) { - if (user != null) { - return _userCache.Contains(user); - } - return false; - } - - private string GetUserFullName(string user) { - string fullname; - if (user != null) { - if (_userCache.Contains(user)) { - fullname = _userCache[user].fullname; - } else { - CheckCredentials(); - RemoteUser remoteUser = _jira.getUser(_credentials, user); - _userCache.Add(user, remoteUser); - fullname = remoteUser.fullname; - } - } else { - fullname = "Not assigned"; - } - return fullname; - } - } -} \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 82a4982f8..869f9129a 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -29,10 +29,11 @@ namespace GreenshotJiraPlugin { [IniSection("Jira", Description="Greenshot Jira Plugin configuration")] public class JiraConfiguration : IniSection { public const string DefaultPrefix = "http://"; - private const string DefaultUrl = DefaultPrefix + "jira" + JiraConnector.DefaultPostfix; + private const string DefaultUrl = DefaultPrefix + "jira"; - [IniProperty("Url", Description="Url to Jira system, including wsdl.", DefaultValue=DefaultUrl)] + [IniProperty("Url", Description="Base url to Jira system, without anything else", DefaultValue=DefaultUrl)] public string Url { get; set; } + [IniProperty("Timeout", Description="Session timeout in minutes", DefaultValue="30")] public int Timeout { get; set; } diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs new file mode 100644 index 000000000..bbd791e7b --- /dev/null +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -0,0 +1,181 @@ + +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Dapplo.Jira; +using Dapplo.Jira.Entities; +using Greenshot.IniFile; +using GreenshotPlugin.Core; + +namespace GreenshotJiraPlugin { + public class JiraConnector : IDisposable { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraConnector)); + private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); + public const string DefaultPostfix = "/rpc/soap/jirasoapservice-v2?wsdl"; + private DateTime _loggedInTime = DateTime.Now; + private bool _loggedIn; + private readonly int _timeout; + private string _url; + private JiraApi _jiraApi; + + public void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) { + if (_jiraApi != null) + { + Task.Run(async () => await Logout()).Wait(); + } + } + + public JiraConnector() { + _url = Config.Url.Replace(DefaultPostfix, ""); + _timeout = Config.Timeout; + _jiraApi = new JiraApi(new Uri(_url)); + } + + ~JiraConnector() { + Dispose(false); + } + + /// + /// Internal login which catches the exceptions + /// + /// true if login was done sucessfully + private async Task DoLogin(string user, string password) + { + if (_url.EndsWith("wsdl")) + { + _url = _url.Replace(DefaultPostfix, ""); + // recreate the service with the new url + _jiraApi = new JiraApi(new Uri(_url)); + } + + LoginInfo loginInfo; + try + { + loginInfo = await _jiraApi.StartSessionAsync(user, password); + // Worked, store the url in the configuration + Config.Url = _url; + IniConfig.Save(); + } + catch (Exception) + { + return false; + } + return loginInfo != null; + } + + public async Task Login() { + await Logout(); + try { + // Get the system name, so the user knows where to login to + string systemName = _url.Replace(DefaultPostfix,""); + var credentialsDialog = new CredentialsDialog(systemName) + { + Name = null + }; + while (credentialsDialog.Show(credentialsDialog.Name) == DialogResult.OK) { + if (await DoLogin(credentialsDialog.Name, credentialsDialog.Password)) { + if (credentialsDialog.SaveChecked) { + credentialsDialog.Confirm(true); + } + _loggedIn = true; + _loggedInTime = DateTime.Now; + return; + } + try { + credentialsDialog.Confirm(false); + } catch (ApplicationException e) { + // exception handling ... + Log.Error("Problem using the credentials dialog", e); + } + // For every windows version after XP show an incorrect password baloon + credentialsDialog.IncorrectPassword = true; + // Make sure the dialog is display, the password was false! + credentialsDialog.AlwaysDisplay = true; + } + } catch (ApplicationException e) { + // exception handling ... + Log.Error("Problem using the credentials dialog", e); + } + + } + + public async Task Logout() { + if (_jiraApi != null) + { + await _jiraApi.EndSessionAsync(); + _loggedIn = false; + } + } + + private async Task CheckCredentials() { + if (_loggedIn) { + if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) { + await Logout(); + await Login(); + } + } else { + await Login(); + } + } + + public async Task> GetFavoriteFiltersAsync() + { + await CheckCredentials(); + return await _jiraApi.GetFavoriteFiltersAsync(); + } + + public async Task GetIssueAsync(string issueKey) + { + await CheckCredentials(); + return await _jiraApi.GetIssueAsync(issueKey); + } + public async Task AttachAsync(string issueKey, TContent content, string filename, string contentType = null, CancellationToken cancellationToken = default(CancellationToken)) where TContent : class + { + await CheckCredentials(); + return await _jiraApi.AttachAsync(issueKey, content, filename, contentType, cancellationToken); + } + + public async Task AddCommentAsync(string issueKey, string body, string visibility = null, CancellationToken cancellationToken = default(CancellationToken)) + { + await CheckCredentials(); + await _jiraApi.AddCommentAsync(issueKey, body, visibility, cancellationToken); + } + public async Task SearchAsync(string jql, int maxResults = 20, IList fields = null, CancellationToken cancellationToken = default(CancellationToken)) + { + await CheckCredentials(); + return await _jiraApi.SearchAsync(jql, maxResults, fields, cancellationToken); + } + + public Uri JiraBaseUri => _jiraApi.JiraBaseUri; + + public bool IsLoggedIn => _loggedIn; + } +} \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index 7d12bf79b..ba78a1fe4 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -25,6 +25,8 @@ using System.ComponentModel; using System.Drawing; using System.IO; using System.Windows.Forms; +using Dapplo.HttpExtensions; +using Dapplo.Jira.Entities; using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotJiraPlugin.Forms; @@ -39,13 +41,13 @@ namespace GreenshotJiraPlugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraDestination)); private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); private readonly JiraPlugin _jiraPlugin; - private readonly JiraIssue _jira; + private readonly Issue _jira; public JiraDestination(JiraPlugin jiraPlugin) { _jiraPlugin = jiraPlugin; } - public JiraDestination(JiraPlugin jiraPlugin, JiraIssue jira) { + public JiraDestination(JiraPlugin jiraPlugin, Issue jira) { _jiraPlugin = jiraPlugin; _jira = jira; } @@ -56,8 +58,8 @@ namespace GreenshotJiraPlugin { } } - private string FormatUpload(JiraIssue jira) { - return Designation + " - " + jira.Key + ": " + jira.Summary.Substring(0, Math.Min(20, jira.Summary.Length)); + private string FormatUpload(Issue jira) { + return Designation + " - " + jira.Key + ": " + jira.Fields.Summary.Substring(0, Math.Min(20, jira.Fields.Summary.Length)); } public override string Description { @@ -92,7 +94,7 @@ namespace GreenshotJiraPlugin { if (JiraPlugin.Instance.CurrentJiraConnector == null || !JiraPlugin.Instance.CurrentJiraConnector.IsLoggedIn) { yield break; } - List issues = JiraUtils.GetCurrentJiras(); + var issues = JiraUtils.GetCurrentJirasAsync().Result; if (issues != null) { foreach(var jiraIssue in issues) { yield return new JiraDestination(_jiraPlugin, jiraIssue); @@ -108,37 +110,43 @@ namespace GreenshotJiraPlugin { try { // Run upload in the background new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), - delegate { - _jiraPlugin.JiraConnector.AddAttachment(_jira.Key, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + async () => + { + var surfaceContainer = new SurfaceContainer(surfaceToUpload, outputSettings, filename); + using (var memoryStream = new MemoryStream()) + { + surfaceContainer.WriteToStream(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + await _jiraPlugin.JiraConnector.AttachAsync(_jira.Key, memoryStream, filename, surfaceContainer.ContentType); + } + surfaceToUpload.UploadURL = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", _jira.Key).AbsoluteUri; } ); - Log.Debug("Uploaded to Jira."); + Log.DebugFormat("Uploaded to Jira {0}", _jira.Key); exportInformation.ExportMade = true; - // TODO: This can't work: exportInformation.Uri = surfaceToUpload.UploadURL; } catch (Exception e) { MessageBox.Show(Language.GetString("jira", LangKey.upload_failure) + " " + e.Message); } } else { - JiraForm jiraForm = new JiraForm(_jiraPlugin.JiraConnector); - if (_jiraPlugin.JiraConnector.IsLoggedIn) { - jiraForm.SetFilename(filename); - DialogResult result = jiraForm.ShowDialog(); - if (result == DialogResult.OK) { - try { - // Run upload in the background - new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), - delegate { - jiraForm.Upload(new SurfaceContainer(surfaceToUpload, outputSettings, filename)); - } - ); - Log.Debug("Uploaded to Jira."); - exportInformation.ExportMade = true; - // TODO: This can't work: - exportInformation.Uri = surfaceToUpload.UploadURL; - } catch(Exception e) { - MessageBox.Show(Language.GetString("jira", LangKey.upload_failure) + " " + e.Message); - } + var jiraForm = new JiraForm(_jiraPlugin.JiraConnector); + jiraForm.SetFilename(filename); + var dialogResult = jiraForm.ShowDialog(); + if (dialogResult == DialogResult.OK) { + try { + surfaceToUpload.UploadURL = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", jiraForm.GetJiraIssue().Key).AbsoluteUri; + // Run upload in the background + new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), + async () => + { + await jiraForm.UploadAsync(new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + } + ); + Log.DebugFormat("Uploaded to Jira {0}", jiraForm.GetJiraIssue().Key); + exportInformation.ExportMade = true; + exportInformation.Uri = surfaceToUpload.UploadURL; + } catch(Exception e) { + MessageBox.Show(Language.GetString("jira", LangKey.upload_failure) + " " + e.Message); } } } diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 84b81adcd..1133fdca5 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -19,11 +19,11 @@ * along with this program. If not, see . */ using System.Collections.Generic; -using System.ComponentModel; using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; using System; +using System.Threading.Tasks; using GreenshotJiraPlugin.Forms; namespace GreenshotJiraPlugin { @@ -42,7 +42,7 @@ namespace GreenshotJiraPlugin { GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) { + protected void Dispose(bool disposing) { if (disposing) { if (_jiraConnector != null) { _jiraConnector.Dispose(); @@ -85,7 +85,7 @@ namespace GreenshotJiraPlugin { public JiraConnector JiraConnector { get { if (_jiraConnector == null) { - _jiraConnector = new JiraConnector(true); + _jiraConnector = new JiraConnector(); } return _jiraConnector; } @@ -97,33 +97,36 @@ namespace GreenshotJiraPlugin { /// Use the IGreenshotPluginHost interface to register events /// My own attributes /// true if plugin is initialized, false if not (doesn't show) - public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { + public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { _jiraPluginAttributes = myAttributes; // Register configuration (don't need the configuration itself) _config = IniConfig.GetIniSection(); - new ComponentResourceManager(typeof(JiraPlugin)); return true; } - public virtual void Shutdown() { + public void Shutdown() { Log.Debug("Jira Plugin shutdown."); - if (_jiraConnector != null) { - _jiraConnector.Logout(); + if (_jiraConnector != null) + { + Task.Run(async () => await _jiraConnector.Logout()); } } /// /// Implementation of the IPlugin.Configure /// - public virtual void Configure() { + public void Configure() { string url = _config.Url; if (ShowConfigDialog()) { // check for re-login if (_jiraConnector != null && _jiraConnector.IsLoggedIn && !string.IsNullOrEmpty(url)) { if (!url.Equals(_config.Url)) { - _jiraConnector.Logout(); - _jiraConnector.Login(); + Task.Run(async () => + { + await _jiraConnector.Logout(); + await _jiraConnector.Login(); + }); } } } @@ -143,15 +146,5 @@ namespace GreenshotJiraPlugin { } return false; } - - /// - /// This will be called when Greenshot is shutting down - /// - /// - /// - public void Closing(object sender, FormClosingEventArgs e) { - Log.Debug("Application closing, calling logout of jira!"); - Shutdown(); - } } } diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index 3dcf945c4..1f801ca11 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -18,8 +18,12 @@ * 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.Text.RegularExpressions; +using System.Threading.Tasks; +using Dapplo.Jira.Entities; using Greenshot.IniFile; using GreenshotPlugin.Core; @@ -30,15 +34,16 @@ namespace GreenshotJiraPlugin { public static class JiraUtils { private static readonly Regex JiraKeyRegex = new Regex(@"/browse/([A-Z0-9]+\-[0-9]+)"); private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraUtils)); - public static List GetCurrentJiras() { + public static async Task> GetCurrentJirasAsync() { // Make sure we suppress the login - List jirakeys = new List(); + var jirakeys = new List(); foreach(string url in IEHelper.GetIEUrls()) { if (url == null) { continue; } - MatchCollection jiraKeyMatch = JiraKeyRegex.Matches(url); + var jiraKeyMatch = JiraKeyRegex.Matches(url); if (jiraKeyMatch.Count > 0) { string jiraKey = jiraKeyMatch[0].Groups[1].Value; jirakeys.Add(jiraKey); @@ -48,19 +53,19 @@ namespace GreenshotJiraPlugin { jirakeys.Add(Config.LastUsedJira); } if (jirakeys.Count > 0) { - List jiraIssues = new List(); + var jiraIssues = new List(); foreach(string jiraKey in jirakeys) { try { - JiraIssue issue = JiraPlugin.Instance.JiraConnector.GetIssue(jiraKey); + var issue = await JiraPlugin.Instance.JiraConnector.GetIssueAsync(jiraKey); if (issue != null) { jiraIssues.Add(issue); } } - catch + catch (Exception ex) { - + Log.Error(ex); } } if (jiraIssues.Count > 0) { diff --git a/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs b/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs deleted file mode 100644 index 6633d436c..000000000 --- a/GreenshotJiraPlugin/Web References/JiraSoap/Reference.cs +++ /dev/null @@ -1,3721 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3620 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Web.Services; -using System.Web.Services.Protocols; -using System.Xml.Serialization; - -namespace GreenshotJiraPlugin.Web_References.JiraSoap -{ - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [WebServiceBinding(Name="jirasoapservice-v2SoapBinding", Namespace="http://jira/rpc/soap/jirasoapservice-v2")] - [SoapInclude(typeof(RemoteRoleActor))] - [SoapInclude(typeof(RemoteFieldValue))] - [SoapInclude(typeof(RemoteCustomFieldValue))] - [SoapInclude(typeof(RemotePermissionMapping))] - [SoapInclude(typeof(AbstractRemoteEntity))] - public partial class JiraSoapServiceService : System.Web.Services.Protocols.SoapHttpClientProtocol - { - - /// - public JiraSoapServiceService() - { - this.Url = "http://jira/rpc/soap/jirasoapservice-v2"; - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getCommentReturn")] - public RemoteComment getComment(string in0, long in1) - { - object[] results = this.Invoke("getComment", new object[] { - in0, - in1}); - return ((RemoteComment)(results[0])); - } - - /// - public System.IAsyncResult BegingetComment(string in0, long in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getComment", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteComment EndgetComment(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteComment)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getServerInfoReturn")] - public RemoteServerInfo getServerInfo(string in0) - { - object[] results = this.Invoke("getServerInfo", new object[] { - in0}); - return ((RemoteServerInfo)(results[0])); - } - - /// - public System.IAsyncResult BegingetServerInfo(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getServerInfo", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteServerInfo EndgetServerInfo(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteServerInfo)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getGroupReturn")] - public RemoteGroup getGroup(string in0, string in1) - { - object[] results = this.Invoke("getGroup", new object[] { - in0, - in1}); - return ((RemoteGroup)(results[0])); - } - - /// - public System.IAsyncResult BegingetGroup(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getGroup", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteGroup EndgetGroup(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteGroup)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("loginReturn")] - public string login(string in0, string in1) - { - object[] results = this.Invoke("login", new object[] { - in0, - in1}); - return ((string)(results[0])); - } - - /// - public System.IAsyncResult Beginlogin(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("login", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public string Endlogin(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((string)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getUserReturn")] - public RemoteUser getUser(string in0, string in1) - { - object[] results = this.Invoke("getUser", new object[] { - in0, - in1}); - return ((RemoteUser)(results[0])); - } - - /// - public System.IAsyncResult BegingetUser(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getUser", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteUser EndgetUser(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteUser)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssueReturn")] - public RemoteIssue getIssue(string in0, string in1) - { - object[] results = this.Invoke("getIssue", new object[] { - in0, - in1}); - return ((RemoteIssue)(results[0])); - } - - /// - public System.IAsyncResult BegingetIssue(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssue", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssue EndgetIssue(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getVersionsReturn")] - public RemoteVersion[] getVersions(string in0, string in1) - { - object[] results = this.Invoke("getVersions", new object[] { - in0, - in1}); - return ((RemoteVersion[])(results[0])); - } - - /// - public System.IAsyncResult BegingetVersions(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getVersions", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteVersion[] EndgetVersions(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteVersion[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getComponentsReturn")] - public RemoteComponent[] getComponents(string in0, string in1) - { - object[] results = this.Invoke("getComponents", new object[] { - in0, - in1}); - return ((RemoteComponent[])(results[0])); - } - - /// - public System.IAsyncResult BegingetComponents(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getComponents", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteComponent[] EndgetComponents(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteComponent[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createGroupReturn")] - public RemoteGroup createGroup(string in0, string in1, RemoteUser in2) - { - object[] results = this.Invoke("createGroup", new object[] { - in0, - in1, - in2}); - return ((RemoteGroup)(results[0])); - } - - /// - public System.IAsyncResult BegincreateGroup(string in0, string in1, RemoteUser in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createGroup", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteGroup EndcreateGroup(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteGroup)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createUserReturn")] - public RemoteUser createUser(string in0, string in1, string in2, string in3, string in4) - { - object[] results = this.Invoke("createUser", new object[] { - in0, - in1, - in2, - in3, - in4}); - return ((RemoteUser)(results[0])); - } - - /// - public System.IAsyncResult BegincreateUser(string in0, string in1, string in2, string in3, string in4, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createUser", new object[] { - in0, - in1, - in2, - in3, - in4}, callback, asyncState); - } - - /// - public RemoteUser EndcreateUser(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteUser)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createIssueReturn")] - public RemoteIssue createIssue(string in0, RemoteIssue in1) - { - object[] results = this.Invoke("createIssue", new object[] { - in0, - in1}); - return ((RemoteIssue)(results[0])); - } - - /// - public System.IAsyncResult BegincreateIssue(string in0, RemoteIssue in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createIssue", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssue EndcreateIssue(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("updateIssueReturn")] - public RemoteIssue updateIssue(string in0, string in1, RemoteFieldValue[] in2) - { - object[] results = this.Invoke("updateIssue", new object[] { - in0, - in1, - in2}); - return ((RemoteIssue)(results[0])); - } - - /// - public System.IAsyncResult BeginupdateIssue(string in0, string in1, RemoteFieldValue[] in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateIssue", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteIssue EndupdateIssue(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteIssue(string in0, string in1) - { - this.Invoke("deleteIssue", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeleteIssue(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteIssue", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeleteIssue(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getAvailableActionsReturn")] - public RemoteNamedObject[] getAvailableActions(string in0, string in1) - { - object[] results = this.Invoke("getAvailableActions", new object[] { - in0, - in1}); - return ((RemoteNamedObject[])(results[0])); - } - - /// - public System.IAsyncResult BegingetAvailableActions(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getAvailableActions", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteNamedObject[] EndgetAvailableActions(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteNamedObject[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getSubTaskIssueTypesReturn")] - public RemoteIssueType[] getSubTaskIssueTypes(string in0) - { - object[] results = this.Invoke("getSubTaskIssueTypes", new object[] { - in0}); - return ((RemoteIssueType[])(results[0])); - } - - /// - public System.IAsyncResult BegingetSubTaskIssueTypes(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getSubTaskIssueTypes", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteIssueType[] EndgetSubTaskIssueTypes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssueType[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getConfigurationReturn")] - public RemoteConfiguration getConfiguration(string in0) - { - object[] results = this.Invoke("getConfiguration", new object[] { - in0}); - return ((RemoteConfiguration)(results[0])); - } - - /// - public System.IAsyncResult BegingetConfiguration(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getConfiguration", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteConfiguration EndgetConfiguration(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteConfiguration)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createProjectReturn")] - public RemoteProject createProject(string in0, string in1, string in2, string in3, string in4, string in5, RemotePermissionScheme in6, RemoteScheme in7, RemoteScheme in8) - { - object[] results = this.Invoke("createProject", new object[] { - in0, - in1, - in2, - in3, - in4, - in5, - in6, - in7, - in8}); - return ((RemoteProject)(results[0])); - } - - /// - public System.IAsyncResult BegincreateProject(string in0, string in1, string in2, string in3, string in4, string in5, RemotePermissionScheme in6, RemoteScheme in7, RemoteScheme in8, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createProject", new object[] { - in0, - in1, - in2, - in3, - in4, - in5, - in6, - in7, - in8}, callback, asyncState); - } - - /// - public RemoteProject EndcreateProject(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("updateProjectReturn")] - public RemoteProject updateProject(string in0, RemoteProject in1) - { - object[] results = this.Invoke("updateProject", new object[] { - in0, - in1}); - return ((RemoteProject)(results[0])); - } - - /// - public System.IAsyncResult BeginupdateProject(string in0, RemoteProject in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateProject", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProject EndupdateProject(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectByKeyReturn")] - public RemoteProject getProjectByKey(string in0, string in1) - { - object[] results = this.Invoke("getProjectByKey", new object[] { - in0, - in1}); - return ((RemoteProject)(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectByKey(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectByKey", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProject EndgetProjectByKey(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void removeAllRoleActorsByProject(string in0, RemoteProject in1) - { - this.Invoke("removeAllRoleActorsByProject", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BeginremoveAllRoleActorsByProject(string in0, RemoteProject in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("removeAllRoleActorsByProject", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EndremoveAllRoleActorsByProject(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getPrioritiesReturn")] - public RemotePriority[] getPriorities(string in0) - { - object[] results = this.Invoke("getPriorities", new object[] { - in0}); - return ((RemotePriority[])(results[0])); - } - - /// - public System.IAsyncResult BegingetPriorities(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getPriorities", new object[] { - in0}, callback, asyncState); - } - - /// - public RemotePriority[] EndgetPriorities(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemotePriority[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getResolutionsReturn")] - public RemoteResolution[] getResolutions(string in0) - { - object[] results = this.Invoke("getResolutions", new object[] { - in0}); - return ((RemoteResolution[])(results[0])); - } - - /// - public System.IAsyncResult BegingetResolutions(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getResolutions", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteResolution[] EndgetResolutions(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteResolution[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssueTypesReturn")] - public RemoteIssueType[] getIssueTypes(string in0) - { - object[] results = this.Invoke("getIssueTypes", new object[] { - in0}); - return ((RemoteIssueType[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssueTypes(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssueTypes", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteIssueType[] EndgetIssueTypes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssueType[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getStatusesReturn")] - public RemoteStatus[] getStatuses(string in0) - { - object[] results = this.Invoke("getStatuses", new object[] { - in0}); - return ((RemoteStatus[])(results[0])); - } - - /// - public System.IAsyncResult BegingetStatuses(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getStatuses", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteStatus[] EndgetStatuses(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteStatus[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssueTypesForProjectReturn")] - public RemoteIssueType[] getIssueTypesForProject(string in0, string in1) - { - object[] results = this.Invoke("getIssueTypesForProject", new object[] { - in0, - in1}); - return ((RemoteIssueType[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssueTypesForProject(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssueTypesForProject", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssueType[] EndgetIssueTypesForProject(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssueType[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectRolesReturn")] - public RemoteProjectRole[] getProjectRoles(string in0) - { - object[] results = this.Invoke("getProjectRoles", new object[] { - in0}); - return ((RemoteProjectRole[])(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectRoles(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectRoles", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteProjectRole[] EndgetProjectRoles(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProjectRole[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectRoleReturn")] - public RemoteProjectRole getProjectRole(string in0, long in1) - { - object[] results = this.Invoke("getProjectRole", new object[] { - in0, - in1}); - return ((RemoteProjectRole)(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectRole(string in0, long in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectRole", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProjectRole EndgetProjectRole(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProjectRole)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectRoleActorsReturn")] - public RemoteProjectRoleActors getProjectRoleActors(string in0, RemoteProjectRole in1, RemoteProject in2) - { - object[] results = this.Invoke("getProjectRoleActors", new object[] { - in0, - in1, - in2}); - return ((RemoteProjectRoleActors)(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectRoleActors(string in0, RemoteProjectRole in1, RemoteProject in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectRoleActors", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteProjectRoleActors EndgetProjectRoleActors(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProjectRoleActors)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getDefaultRoleActorsReturn")] - public RemoteRoleActors getDefaultRoleActors(string in0, RemoteProjectRole in1) - { - object[] results = this.Invoke("getDefaultRoleActors", new object[] { - in0, - in1}); - return ((RemoteRoleActors)(results[0])); - } - - /// - public System.IAsyncResult BegingetDefaultRoleActors(string in0, RemoteProjectRole in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getDefaultRoleActors", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteRoleActors EndgetDefaultRoleActors(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteRoleActors)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void removeAllRoleActorsByNameAndType(string in0, string in1, string in2) - { - this.Invoke("removeAllRoleActorsByNameAndType", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginremoveAllRoleActorsByNameAndType(string in0, string in1, string in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("removeAllRoleActorsByNameAndType", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndremoveAllRoleActorsByNameAndType(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteProjectRole(string in0, RemoteProjectRole in1, bool in2) - { - this.Invoke("deleteProjectRole", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BegindeleteProjectRole(string in0, RemoteProjectRole in1, bool in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteProjectRole", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EnddeleteProjectRole(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void updateProjectRole(string in0, RemoteProjectRole in1) - { - this.Invoke("updateProjectRole", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BeginupdateProjectRole(string in0, RemoteProjectRole in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateProjectRole", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EndupdateProjectRole(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createProjectRoleReturn")] - public RemoteProjectRole createProjectRole(string in0, RemoteProjectRole in1) - { - object[] results = this.Invoke("createProjectRole", new object[] { - in0, - in1}); - return ((RemoteProjectRole)(results[0])); - } - - /// - public System.IAsyncResult BegincreateProjectRole(string in0, RemoteProjectRole in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createProjectRole", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProjectRole EndcreateProjectRole(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProjectRole)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("isProjectRoleNameUniqueReturn")] - public bool isProjectRoleNameUnique(string in0, string in1) - { - object[] results = this.Invoke("isProjectRoleNameUnique", new object[] { - in0, - in1}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginisProjectRoleNameUnique(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("isProjectRoleNameUnique", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public bool EndisProjectRoleNameUnique(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void addActorsToProjectRole(string in0, string[] in1, RemoteProjectRole in2, RemoteProject in3, string in4) - { - this.Invoke("addActorsToProjectRole", new object[] { - in0, - in1, - in2, - in3, - in4}); - } - - /// - public System.IAsyncResult BeginaddActorsToProjectRole(string in0, string[] in1, RemoteProjectRole in2, RemoteProject in3, string in4, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addActorsToProjectRole", new object[] { - in0, - in1, - in2, - in3, - in4}, callback, asyncState); - } - - /// - public void EndaddActorsToProjectRole(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void removeActorsFromProjectRole(string in0, string[] in1, RemoteProjectRole in2, RemoteProject in3, string in4) - { - this.Invoke("removeActorsFromProjectRole", new object[] { - in0, - in1, - in2, - in3, - in4}); - } - - /// - public System.IAsyncResult BeginremoveActorsFromProjectRole(string in0, string[] in1, RemoteProjectRole in2, RemoteProject in3, string in4, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("removeActorsFromProjectRole", new object[] { - in0, - in1, - in2, - in3, - in4}, callback, asyncState); - } - - /// - public void EndremoveActorsFromProjectRole(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void addDefaultActorsToProjectRole(string in0, string[] in1, RemoteProjectRole in2, string in3) - { - this.Invoke("addDefaultActorsToProjectRole", new object[] { - in0, - in1, - in2, - in3}); - } - - /// - public System.IAsyncResult BeginaddDefaultActorsToProjectRole(string in0, string[] in1, RemoteProjectRole in2, string in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addDefaultActorsToProjectRole", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public void EndaddDefaultActorsToProjectRole(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void removeDefaultActorsFromProjectRole(string in0, string[] in1, RemoteProjectRole in2, string in3) - { - this.Invoke("removeDefaultActorsFromProjectRole", new object[] { - in0, - in1, - in2, - in3}); - } - - /// - public System.IAsyncResult BeginremoveDefaultActorsFromProjectRole(string in0, string[] in1, RemoteProjectRole in2, string in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("removeDefaultActorsFromProjectRole", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public void EndremoveDefaultActorsFromProjectRole(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getAssociatedNotificationSchemesReturn")] - public RemoteScheme[] getAssociatedNotificationSchemes(string in0, RemoteProjectRole in1) - { - object[] results = this.Invoke("getAssociatedNotificationSchemes", new object[] { - in0, - in1}); - return ((RemoteScheme[])(results[0])); - } - - /// - public System.IAsyncResult BegingetAssociatedNotificationSchemes(string in0, RemoteProjectRole in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getAssociatedNotificationSchemes", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteScheme[] EndgetAssociatedNotificationSchemes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteScheme[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getAssociatedPermissionSchemesReturn")] - public RemoteScheme[] getAssociatedPermissionSchemes(string in0, RemoteProjectRole in1) - { - object[] results = this.Invoke("getAssociatedPermissionSchemes", new object[] { - in0, - in1}); - return ((RemoteScheme[])(results[0])); - } - - /// - public System.IAsyncResult BegingetAssociatedPermissionSchemes(string in0, RemoteProjectRole in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getAssociatedPermissionSchemes", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteScheme[] EndgetAssociatedPermissionSchemes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteScheme[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteProject(string in0, string in1) - { - this.Invoke("deleteProject", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeleteProject(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteProject", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeleteProject(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectByIdReturn")] - public RemoteProject getProjectById(string in0, long in1) - { - object[] results = this.Invoke("getProjectById", new object[] { - in0, - in1}); - return ((RemoteProject)(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectById(string in0, long in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectById", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProject EndgetProjectById(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getCustomFieldsReturn")] - public RemoteField[] getCustomFields(string in0) - { - object[] results = this.Invoke("getCustomFields", new object[] { - in0}); - return ((RemoteField[])(results[0])); - } - - /// - public System.IAsyncResult BegingetCustomFields(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getCustomFields", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteField[] EndgetCustomFields(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteField[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getCommentsReturn")] - public RemoteComment[] getComments(string in0, string in1) - { - object[] results = this.Invoke("getComments", new object[] { - in0, - in1}); - return ((RemoteComment[])(results[0])); - } - - /// - public System.IAsyncResult BegingetComments(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getComments", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteComment[] EndgetComments(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteComment[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getFavouriteFiltersReturn")] - public RemoteFilter[] getFavouriteFilters(string in0) - { - object[] results = this.Invoke("getFavouriteFilters", new object[] { - in0}); - return ((RemoteFilter[])(results[0])); - } - - /// - public System.IAsyncResult BegingetFavouriteFilters(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getFavouriteFilters", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteFilter[] EndgetFavouriteFilters(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteFilter[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void releaseVersion(string in0, string in1, RemoteVersion in2) - { - this.Invoke("releaseVersion", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginreleaseVersion(string in0, string in1, RemoteVersion in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("releaseVersion", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndreleaseVersion(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void archiveVersion(string in0, string in1, string in2, bool in3) - { - this.Invoke("archiveVersion", new object[] { - in0, - in1, - in2, - in3}); - } - - /// - public System.IAsyncResult BeginarchiveVersion(string in0, string in1, string in2, bool in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("archiveVersion", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public void EndarchiveVersion(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getFieldsForEditReturn")] - public RemoteField[] getFieldsForEdit(string in0, string in1) - { - object[] results = this.Invoke("getFieldsForEdit", new object[] { - in0, - in1}); - return ((RemoteField[])(results[0])); - } - - /// - public System.IAsyncResult BegingetFieldsForEdit(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getFieldsForEdit", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteField[] EndgetFieldsForEdit(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteField[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getSubTaskIssueTypesForProjectReturn")] - public RemoteIssueType[] getSubTaskIssueTypesForProject(string in0, string in1) - { - object[] results = this.Invoke("getSubTaskIssueTypesForProject", new object[] { - in0, - in1}); - return ((RemoteIssueType[])(results[0])); - } - - /// - public System.IAsyncResult BegingetSubTaskIssueTypesForProject(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getSubTaskIssueTypesForProject", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssueType[] EndgetSubTaskIssueTypesForProject(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssueType[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void addUserToGroup(string in0, RemoteGroup in1, RemoteUser in2) - { - this.Invoke("addUserToGroup", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginaddUserToGroup(string in0, RemoteGroup in1, RemoteUser in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addUserToGroup", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndaddUserToGroup(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void removeUserFromGroup(string in0, RemoteGroup in1, RemoteUser in2) - { - this.Invoke("removeUserFromGroup", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginremoveUserFromGroup(string in0, RemoteGroup in1, RemoteUser in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("removeUserFromGroup", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndremoveUserFromGroup(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getSecurityLevelReturn")] - public RemoteSecurityLevel getSecurityLevel(string in0, string in1) - { - object[] results = this.Invoke("getSecurityLevel", new object[] { - in0, - in1}); - return ((RemoteSecurityLevel)(results[0])); - } - - /// - public System.IAsyncResult BegingetSecurityLevel(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getSecurityLevel", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteSecurityLevel EndgetSecurityLevel(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteSecurityLevel)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("logoutReturn")] - public bool logout(string in0) - { - object[] results = this.Invoke("logout", new object[] { - in0}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult Beginlogout(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("logout", new object[] { - in0}, callback, asyncState); - } - - /// - public bool Endlogout(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void addComment(string in0, string in1, RemoteComment in2) - { - this.Invoke("addComment", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginaddComment(string in0, string in1, RemoteComment in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addComment", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndaddComment(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectWithSchemesByIdReturn")] - public RemoteProject getProjectWithSchemesById(string in0, long in1) - { - object[] results = this.Invoke("getProjectWithSchemesById", new object[] { - in0, - in1}); - return ((RemoteProject)(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectWithSchemesById(string in0, long in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectWithSchemesById", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProject EndgetProjectWithSchemesById(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getSecurityLevelsReturn")] - public RemoteSecurityLevel[] getSecurityLevels(string in0, string in1) - { - object[] results = this.Invoke("getSecurityLevels", new object[] { - in0, - in1}); - return ((RemoteSecurityLevel[])(results[0])); - } - - /// - public System.IAsyncResult BegingetSecurityLevels(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getSecurityLevels", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteSecurityLevel[] EndgetSecurityLevels(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteSecurityLevel[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectAvatarsReturn")] - public RemoteAvatar[] getProjectAvatars(string in0, string in1, bool in2) - { - object[] results = this.Invoke("getProjectAvatars", new object[] { - in0, - in1, - in2}); - return ((RemoteAvatar[])(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectAvatars(string in0, string in1, bool in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectAvatars", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteAvatar[] EndgetProjectAvatars(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteAvatar[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void setProjectAvatar(string in0, string in1, long in2) - { - this.Invoke("setProjectAvatar", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginsetProjectAvatar(string in0, string in1, long in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("setProjectAvatar", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndsetProjectAvatar(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectAvatarReturn")] - public RemoteAvatar getProjectAvatar(string in0, string in1) - { - object[] results = this.Invoke("getProjectAvatar", new object[] { - in0, - in1}); - return ((RemoteAvatar)(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectAvatar(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectAvatar", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteAvatar EndgetProjectAvatar(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteAvatar)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteProjectAvatar(string in0, long in1) - { - this.Invoke("deleteProjectAvatar", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeleteProjectAvatar(string in0, long in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteProjectAvatar", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeleteProjectAvatar(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getNotificationSchemesReturn")] - public RemoteScheme[] getNotificationSchemes(string in0) - { - object[] results = this.Invoke("getNotificationSchemes", new object[] { - in0}); - return ((RemoteScheme[])(results[0])); - } - - /// - public System.IAsyncResult BegingetNotificationSchemes(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getNotificationSchemes", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteScheme[] EndgetNotificationSchemes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteScheme[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getPermissionSchemesReturn")] - public RemotePermissionScheme[] getPermissionSchemes(string in0) - { - object[] results = this.Invoke("getPermissionSchemes", new object[] { - in0}); - return ((RemotePermissionScheme[])(results[0])); - } - - /// - public System.IAsyncResult BegingetPermissionSchemes(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getPermissionSchemes", new object[] { - in0}, callback, asyncState); - } - - /// - public RemotePermissionScheme[] EndgetPermissionSchemes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemotePermissionScheme[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getAllPermissionsReturn")] - public RemotePermission[] getAllPermissions(string in0) - { - object[] results = this.Invoke("getAllPermissions", new object[] { - in0}); - return ((RemotePermission[])(results[0])); - } - - /// - public System.IAsyncResult BegingetAllPermissions(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getAllPermissions", new object[] { - in0}, callback, asyncState); - } - - /// - public RemotePermission[] EndgetAllPermissions(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemotePermission[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createPermissionSchemeReturn")] - public RemotePermissionScheme createPermissionScheme(string in0, string in1, string in2) - { - object[] results = this.Invoke("createPermissionScheme", new object[] { - in0, - in1, - in2}); - return ((RemotePermissionScheme)(results[0])); - } - - /// - public System.IAsyncResult BegincreatePermissionScheme(string in0, string in1, string in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createPermissionScheme", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemotePermissionScheme EndcreatePermissionScheme(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemotePermissionScheme)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addPermissionToReturn")] - public RemotePermissionScheme addPermissionTo(string in0, RemotePermissionScheme in1, RemotePermission in2, RemoteEntity in3) - { - object[] results = this.Invoke("addPermissionTo", new object[] { - in0, - in1, - in2, - in3}); - return ((RemotePermissionScheme)(results[0])); - } - - /// - public System.IAsyncResult BeginaddPermissionTo(string in0, RemotePermissionScheme in1, RemotePermission in2, RemoteEntity in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addPermissionTo", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemotePermissionScheme EndaddPermissionTo(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemotePermissionScheme)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("deletePermissionFromReturn")] - public RemotePermissionScheme deletePermissionFrom(string in0, RemotePermissionScheme in1, RemotePermission in2, RemoteEntity in3) - { - object[] results = this.Invoke("deletePermissionFrom", new object[] { - in0, - in1, - in2, - in3}); - return ((RemotePermissionScheme)(results[0])); - } - - /// - public System.IAsyncResult BegindeletePermissionFrom(string in0, RemotePermissionScheme in1, RemotePermission in2, RemoteEntity in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deletePermissionFrom", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemotePermissionScheme EnddeletePermissionFrom(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemotePermissionScheme)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deletePermissionScheme(string in0, string in1) - { - this.Invoke("deletePermissionScheme", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeletePermissionScheme(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deletePermissionScheme", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeletePermissionScheme(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createIssueWithSecurityLevelReturn")] - public RemoteIssue createIssueWithSecurityLevel(string in0, RemoteIssue in1, long in2) - { - object[] results = this.Invoke("createIssueWithSecurityLevel", new object[] { - in0, - in1, - in2}); - return ((RemoteIssue)(results[0])); - } - - /// - public System.IAsyncResult BegincreateIssueWithSecurityLevel(string in0, RemoteIssue in1, long in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createIssueWithSecurityLevel", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteIssue EndcreateIssueWithSecurityLevel(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addAttachmentsToIssueReturn")] - public bool addAttachmentsToIssue(string in0, string in1, string[] in2, sbyte[] in3) - { - object[] results = this.Invoke("addAttachmentsToIssue", new object[] { - in0, - in1, - in2, - in3}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginaddAttachmentsToIssue(string in0, string in1, string[] in2, sbyte[] in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addAttachmentsToIssue", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public bool EndaddAttachmentsToIssue(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getAttachmentsFromIssueReturn")] - public RemoteAttachment[] getAttachmentsFromIssue(string in0, string in1) - { - object[] results = this.Invoke("getAttachmentsFromIssue", new object[] { - in0, - in1}); - return ((RemoteAttachment[])(results[0])); - } - - /// - public System.IAsyncResult BegingetAttachmentsFromIssue(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getAttachmentsFromIssue", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteAttachment[] EndgetAttachmentsFromIssue(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteAttachment[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("hasPermissionToEditCommentReturn")] - public bool hasPermissionToEditComment(string in0, RemoteComment in1) - { - object[] results = this.Invoke("hasPermissionToEditComment", new object[] { - in0, - in1}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginhasPermissionToEditComment(string in0, RemoteComment in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("hasPermissionToEditComment", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public bool EndhasPermissionToEditComment(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("editCommentReturn")] - public RemoteComment editComment(string in0, RemoteComment in1) - { - object[] results = this.Invoke("editComment", new object[] { - in0, - in1}); - return ((RemoteComment)(results[0])); - } - - /// - public System.IAsyncResult BegineditComment(string in0, RemoteComment in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("editComment", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteComment EndeditComment(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteComment)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getFieldsForActionReturn")] - public RemoteField[] getFieldsForAction(string in0, string in1, string in2) - { - object[] results = this.Invoke("getFieldsForAction", new object[] { - in0, - in1, - in2}); - return ((RemoteField[])(results[0])); - } - - /// - public System.IAsyncResult BegingetFieldsForAction(string in0, string in1, string in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getFieldsForAction", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteField[] EndgetFieldsForAction(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteField[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("progressWorkflowActionReturn")] - public RemoteIssue progressWorkflowAction(string in0, string in1, string in2, RemoteFieldValue[] in3) - { - object[] results = this.Invoke("progressWorkflowAction", new object[] { - in0, - in1, - in2, - in3}); - return ((RemoteIssue)(results[0])); - } - - /// - public System.IAsyncResult BeginprogressWorkflowAction(string in0, string in1, string in2, RemoteFieldValue[] in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("progressWorkflowAction", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemoteIssue EndprogressWorkflowAction(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssueByIdReturn")] - public RemoteIssue getIssueById(string in0, string in1) - { - object[] results = this.Invoke("getIssueById", new object[] { - in0, - in1}); - return ((RemoteIssue)(results[0])); - } - - /// - public System.IAsyncResult BegingetIssueById(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssueById", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssue EndgetIssueById(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addWorklogWithNewRemainingEstimateReturn")] - public RemoteWorklog addWorklogWithNewRemainingEstimate(string in0, string in1, RemoteWorklog in2, string in3) - { - object[] results = this.Invoke("addWorklogWithNewRemainingEstimate", new object[] { - in0, - in1, - in2, - in3}); - return ((RemoteWorklog)(results[0])); - } - - /// - public System.IAsyncResult BeginaddWorklogWithNewRemainingEstimate(string in0, string in1, RemoteWorklog in2, string in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addWorklogWithNewRemainingEstimate", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemoteWorklog EndaddWorklogWithNewRemainingEstimate(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteWorklog)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addWorklogAndAutoAdjustRemainingEstimateReturn")] - public RemoteWorklog addWorklogAndAutoAdjustRemainingEstimate(string in0, string in1, RemoteWorklog in2) - { - object[] results = this.Invoke("addWorklogAndAutoAdjustRemainingEstimate", new object[] { - in0, - in1, - in2}); - return ((RemoteWorklog)(results[0])); - } - - /// - public System.IAsyncResult BeginaddWorklogAndAutoAdjustRemainingEstimate(string in0, string in1, RemoteWorklog in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addWorklogAndAutoAdjustRemainingEstimate", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteWorklog EndaddWorklogAndAutoAdjustRemainingEstimate(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteWorklog)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addWorklogAndRetainRemainingEstimateReturn")] - public RemoteWorklog addWorklogAndRetainRemainingEstimate(string in0, string in1, RemoteWorklog in2) - { - object[] results = this.Invoke("addWorklogAndRetainRemainingEstimate", new object[] { - in0, - in1, - in2}); - return ((RemoteWorklog)(results[0])); - } - - /// - public System.IAsyncResult BeginaddWorklogAndRetainRemainingEstimate(string in0, string in1, RemoteWorklog in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addWorklogAndRetainRemainingEstimate", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteWorklog EndaddWorklogAndRetainRemainingEstimate(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteWorklog)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteWorklogWithNewRemainingEstimate(string in0, string in1, string in2) - { - this.Invoke("deleteWorklogWithNewRemainingEstimate", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BegindeleteWorklogWithNewRemainingEstimate(string in0, string in1, string in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteWorklogWithNewRemainingEstimate", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EnddeleteWorklogWithNewRemainingEstimate(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteWorklogAndAutoAdjustRemainingEstimate(string in0, string in1) - { - this.Invoke("deleteWorklogAndAutoAdjustRemainingEstimate", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeleteWorklogAndAutoAdjustRemainingEstimate(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteWorklogAndAutoAdjustRemainingEstimate", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeleteWorklogAndAutoAdjustRemainingEstimate(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteWorklogAndRetainRemainingEstimate(string in0, string in1) - { - this.Invoke("deleteWorklogAndRetainRemainingEstimate", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeleteWorklogAndRetainRemainingEstimate(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteWorklogAndRetainRemainingEstimate", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeleteWorklogAndRetainRemainingEstimate(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void updateWorklogWithNewRemainingEstimate(string in0, RemoteWorklog in1, string in2) - { - this.Invoke("updateWorklogWithNewRemainingEstimate", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BeginupdateWorklogWithNewRemainingEstimate(string in0, RemoteWorklog in1, string in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateWorklogWithNewRemainingEstimate", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EndupdateWorklogWithNewRemainingEstimate(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void updateWorklogAndAutoAdjustRemainingEstimate(string in0, RemoteWorklog in1) - { - this.Invoke("updateWorklogAndAutoAdjustRemainingEstimate", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BeginupdateWorklogAndAutoAdjustRemainingEstimate(string in0, RemoteWorklog in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateWorklogAndAutoAdjustRemainingEstimate", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EndupdateWorklogAndAutoAdjustRemainingEstimate(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void updateWorklogAndRetainRemainingEstimate(string in0, RemoteWorklog in1) - { - this.Invoke("updateWorklogAndRetainRemainingEstimate", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BeginupdateWorklogAndRetainRemainingEstimate(string in0, RemoteWorklog in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateWorklogAndRetainRemainingEstimate", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EndupdateWorklogAndRetainRemainingEstimate(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getWorklogsReturn")] - public RemoteWorklog[] getWorklogs(string in0, string in1) - { - object[] results = this.Invoke("getWorklogs", new object[] { - in0, - in1}); - return ((RemoteWorklog[])(results[0])); - } - - /// - public System.IAsyncResult BegingetWorklogs(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getWorklogs", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteWorklog[] EndgetWorklogs(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteWorklog[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("hasPermissionToCreateWorklogReturn")] - public bool hasPermissionToCreateWorklog(string in0, string in1) - { - object[] results = this.Invoke("hasPermissionToCreateWorklog", new object[] { - in0, - in1}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginhasPermissionToCreateWorklog(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("hasPermissionToCreateWorklog", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public bool EndhasPermissionToCreateWorklog(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("hasPermissionToDeleteWorklogReturn")] - public bool hasPermissionToDeleteWorklog(string in0, string in1) - { - object[] results = this.Invoke("hasPermissionToDeleteWorklog", new object[] { - in0, - in1}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginhasPermissionToDeleteWorklog(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("hasPermissionToDeleteWorklog", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public bool EndhasPermissionToDeleteWorklog(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("hasPermissionToUpdateWorklogReturn")] - public bool hasPermissionToUpdateWorklog(string in0, string in1) - { - object[] results = this.Invoke("hasPermissionToUpdateWorklog", new object[] { - in0, - in1}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginhasPermissionToUpdateWorklog(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("hasPermissionToUpdateWorklog", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public bool EndhasPermissionToUpdateWorklog(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getResolutionDateByKeyReturn")] - public System.DateTime getResolutionDateByKey(string in0, string in1) - { - object[] results = this.Invoke("getResolutionDateByKey", new object[] { - in0, - in1}); - return ((System.DateTime)(results[0])); - } - - /// - public System.IAsyncResult BegingetResolutionDateByKey(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getResolutionDateByKey", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public System.DateTime EndgetResolutionDateByKey(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((System.DateTime)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getResolutionDateByIdReturn")] - public System.DateTime getResolutionDateById(string in0, long in1) - { - object[] results = this.Invoke("getResolutionDateById", new object[] { - in0, - in1}); - return ((System.DateTime)(results[0])); - } - - /// - public System.IAsyncResult BegingetResolutionDateById(string in0, long in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getResolutionDateById", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public System.DateTime EndgetResolutionDateById(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((System.DateTime)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssueCountForFilterReturn")] - public long getIssueCountForFilter(string in0, string in1) - { - object[] results = this.Invoke("getIssueCountForFilter", new object[] { - in0, - in1}); - return ((long)(results[0])); - } - - /// - public System.IAsyncResult BegingetIssueCountForFilter(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssueCountForFilter", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public long EndgetIssueCountForFilter(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((long)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssuesFromTextSearchReturn")] - public RemoteIssue[] getIssuesFromTextSearch(string in0, string in1) - { - object[] results = this.Invoke("getIssuesFromTextSearch", new object[] { - in0, - in1}); - return ((RemoteIssue[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssuesFromTextSearch(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssuesFromTextSearch", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssue[] EndgetIssuesFromTextSearch(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssuesFromTextSearchWithProjectReturn")] - public RemoteIssue[] getIssuesFromTextSearchWithProject(string in0, string[] in1, string in2, int in3) - { - object[] results = this.Invoke("getIssuesFromTextSearchWithProject", new object[] { - in0, - in1, - in2, - in3}); - return ((RemoteIssue[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssuesFromTextSearchWithProject(string in0, string[] in1, string in2, int in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssuesFromTextSearchWithProject", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemoteIssue[] EndgetIssuesFromTextSearchWithProject(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssuesFromJqlSearchReturn")] - public RemoteIssue[] getIssuesFromJqlSearch(string in0, string in1, int in2) - { - object[] results = this.Invoke("getIssuesFromJqlSearch", new object[] { - in0, - in1, - in2}); - return ((RemoteIssue[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssuesFromJqlSearch(string in0, string in1, int in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssuesFromJqlSearch", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteIssue[] EndgetIssuesFromJqlSearch(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteUser(string in0, string in1) - { - this.Invoke("deleteUser", new object[] { - in0, - in1}); - } - - /// - public System.IAsyncResult BegindeleteUser(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteUser", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public void EnddeleteUser(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("updateGroupReturn")] - public RemoteGroup updateGroup(string in0, RemoteGroup in1) - { - object[] results = this.Invoke("updateGroup", new object[] { - in0, - in1}); - return ((RemoteGroup)(results[0])); - } - - /// - public System.IAsyncResult BeginupdateGroup(string in0, RemoteGroup in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("updateGroup", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteGroup EndupdateGroup(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteGroup)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void deleteGroup(string in0, string in1, string in2) - { - this.Invoke("deleteGroup", new object[] { - in0, - in1, - in2}); - } - - /// - public System.IAsyncResult BegindeleteGroup(string in0, string in1, string in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("deleteGroup", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public void EnddeleteGroup(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void refreshCustomFields(string in0) - { - this.Invoke("refreshCustomFields", new object[] { - in0}); - } - - /// - public System.IAsyncResult BeginrefreshCustomFields(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("refreshCustomFields", new object[] { - in0}, callback, asyncState); - } - - /// - public void EndrefreshCustomFields(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getSavedFiltersReturn")] - public RemoteFilter[] getSavedFilters(string in0) - { - object[] results = this.Invoke("getSavedFilters", new object[] { - in0}); - return ((RemoteFilter[])(results[0])); - } - - /// - public System.IAsyncResult BegingetSavedFilters(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getSavedFilters", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteFilter[] EndgetSavedFilters(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteFilter[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addBase64EncodedAttachmentsToIssueReturn")] - public bool addBase64EncodedAttachmentsToIssue(string in0, string in1, string[] in2, string[] in3) - { - object[] results = this.Invoke("addBase64EncodedAttachmentsToIssue", new object[] { - in0, - in1, - in2, - in3}); - return ((bool)(results[0])); - } - - /// - public System.IAsyncResult BeginaddBase64EncodedAttachmentsToIssue(string in0, string in1, string[] in2, string[] in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addBase64EncodedAttachmentsToIssue", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public bool EndaddBase64EncodedAttachmentsToIssue(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("createProjectFromObjectReturn")] - public RemoteProject createProjectFromObject(string in0, RemoteProject in1) - { - object[] results = this.Invoke("createProjectFromObject", new object[] { - in0, - in1}); - return ((RemoteProject)(results[0])); - } - - /// - public System.IAsyncResult BegincreateProjectFromObject(string in0, RemoteProject in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("createProjectFromObject", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteProject EndcreateProjectFromObject(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getSecuritySchemesReturn")] - public RemoteScheme[] getSecuritySchemes(string in0) - { - object[] results = this.Invoke("getSecuritySchemes", new object[] { - in0}); - return ((RemoteScheme[])(results[0])); - } - - /// - public System.IAsyncResult BegingetSecuritySchemes(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getSecuritySchemes", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteScheme[] EndgetSecuritySchemes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteScheme[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("addVersionReturn")] - public RemoteVersion addVersion(string in0, string in1, RemoteVersion in2) - { - object[] results = this.Invoke("addVersion", new object[] { - in0, - in1, - in2}); - return ((RemoteVersion)(results[0])); - } - - /// - public System.IAsyncResult BeginaddVersion(string in0, string in1, RemoteVersion in2, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("addVersion", new object[] { - in0, - in1, - in2}, callback, asyncState); - } - - /// - public RemoteVersion EndaddVersion(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteVersion)(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssuesFromFilterReturn")] - public RemoteIssue[] getIssuesFromFilter(string in0, string in1) - { - object[] results = this.Invoke("getIssuesFromFilter", new object[] { - in0, - in1}); - return ((RemoteIssue[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssuesFromFilter(string in0, string in1, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssuesFromFilter", new object[] { - in0, - in1}, callback, asyncState); - } - - /// - public RemoteIssue[] EndgetIssuesFromFilter(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssuesFromFilterWithLimitReturn")] - public RemoteIssue[] getIssuesFromFilterWithLimit(string in0, string in1, int in2, int in3) - { - object[] results = this.Invoke("getIssuesFromFilterWithLimit", new object[] { - in0, - in1, - in2, - in3}); - return ((RemoteIssue[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssuesFromFilterWithLimit(string in0, string in1, int in2, int in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssuesFromFilterWithLimit", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemoteIssue[] EndgetIssuesFromFilterWithLimit(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getIssuesFromTextSearchWithLimitReturn")] - public RemoteIssue[] getIssuesFromTextSearchWithLimit(string in0, string in1, int in2, int in3) - { - object[] results = this.Invoke("getIssuesFromTextSearchWithLimit", new object[] { - in0, - in1, - in2, - in3}); - return ((RemoteIssue[])(results[0])); - } - - /// - public System.IAsyncResult BegingetIssuesFromTextSearchWithLimit(string in0, string in1, int in2, int in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getIssuesFromTextSearchWithLimit", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public RemoteIssue[] EndgetIssuesFromTextSearchWithLimit(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteIssue[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - [return: SoapElement("getProjectsNoSchemesReturn")] - public RemoteProject[] getProjectsNoSchemes(string in0) - { - object[] results = this.Invoke("getProjectsNoSchemes", new object[] { - in0}); - return ((RemoteProject[])(results[0])); - } - - /// - public System.IAsyncResult BegingetProjectsNoSchemes(string in0, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("getProjectsNoSchemes", new object[] { - in0}, callback, asyncState); - } - - /// - public RemoteProject[] EndgetProjectsNoSchemes(System.IAsyncResult asyncResult) - { - object[] results = this.EndInvoke(asyncResult); - return ((RemoteProject[])(results[0])); - } - - /// - [SoapRpcMethod("", RequestNamespace="http://soap.rpc.jira.atlassian.com", ResponseNamespace="http://jira/rpc/soap/jirasoapservice-v2")] - public void setNewProjectAvatar(string in0, string in1, string in2, string in3) - { - this.Invoke("setNewProjectAvatar", new object[] { - in0, - in1, - in2, - in3}); - } - - /// - public System.IAsyncResult BeginsetNewProjectAvatar(string in0, string in1, string in2, string in3, System.AsyncCallback callback, object asyncState) - { - return this.BeginInvoke("setNewProjectAvatar", new object[] { - in0, - in1, - in2, - in3}, callback, asyncState); - } - - /// - public void EndsetNewProjectAvatar(System.IAsyncResult asyncResult) - { - this.EndInvoke(asyncResult); - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteComment - { - - /// - [SoapElement(IsNullable=true)] - public string author; - - /// - [SoapElement(IsNullable=true)] - public string body; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable created; - - /// - [SoapElement(IsNullable=true)] - public string groupLevel; - - /// - [SoapElement(IsNullable=true)] - public string id; - - /// - [SoapElement(IsNullable=true)] - public string roleLevel; - - /// - [SoapElement(IsNullable=true)] - public string updateAuthor; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable updated; - } - - /// - [SoapInclude(typeof(RemoteWorklogImpl))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteWorklog - { - - /// - [SoapElement(IsNullable=true)] - public string author; - - /// - [SoapElement(IsNullable=true)] - public string comment; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable created; - - /// - [SoapElement(IsNullable=true)] - public string groupLevel; - - /// - [SoapElement(IsNullable=true)] - public string id; - - /// - [SoapElement(IsNullable=true)] - public string roleLevelId; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable startDate; - - /// - [SoapElement(IsNullable=true)] - public string timeSpent; - - /// - public long timeSpentInSeconds; - - /// - [SoapElement(IsNullable=true)] - public string updateAuthor; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable updated; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://service.soap.rpc.jira.atlassian.com")] - public partial class RemoteWorklogImpl : RemoteWorklog - { - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteAvatar - { - - /// - [SoapElement(IsNullable=true)] - public string base64Data; - - /// - [SoapElement(IsNullable=true)] - public string contentType; - - /// - public long id; - - /// - [SoapElement(IsNullable=true)] - public string owner; - - /// - public bool system; - - /// - [SoapElement(IsNullable=true)] - public string type; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteRoleActor - { - - /// - [SoapElement(IsNullable=true)] - public string descriptor; - - /// - [SoapElement(IsNullable=true)] - public string parameter; - - /// - [SoapElement(IsNullable=true)] - public RemoteProjectRole projectRole; - - /// - [SoapElement(IsNullable=true)] - public string type; - - /// - [SoapElement(IsNullable=true)] - public RemoteUser[] users; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteProjectRole - { - - /// - [SoapElement(IsNullable=true)] - public string description; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable id; - - /// - [SoapElement(IsNullable=true)] - public string name; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteUser : RemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string email; - - /// - [SoapElement(IsNullable=true)] - public string fullname; - - /// - [SoapElement(IsNullable=true)] - public string name; - } - - /// - [SoapInclude(typeof(RemoteGroup))] - [SoapInclude(typeof(RemoteUser))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteEntity - { - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteGroup : RemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string name; - - /// - [SoapElement(IsNullable=true)] - public RemoteUser[] users; - } - - /// - [SoapInclude(typeof(RemoteProjectRoleActors))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteRoleActors - { - - /// - [SoapElement(IsNullable=true)] - public RemoteProjectRole projectRole; - - /// - [SoapElement(IsNullable=true)] - public RemoteRoleActor[] roleActors; - - /// - [SoapElement(IsNullable=true)] - public RemoteUser[] users; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteProjectRoleActors : RemoteRoleActors - { - - /// - [SoapElement(IsNullable=true)] - public RemoteProject project; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteProject : AbstractNamedRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string description; - - /// - [SoapElement(IsNullable=true)] - public RemoteScheme issueSecurityScheme; - - /// - [SoapElement(IsNullable=true)] - public string key; - - /// - [SoapElement(IsNullable=true)] - public string lead; - - /// - [SoapElement(IsNullable=true)] - public RemoteScheme notificationScheme; - - /// - [SoapElement(IsNullable=true)] - public RemotePermissionScheme permissionScheme; - - /// - [SoapElement(IsNullable=true)] - public string projectUrl; - - /// - [SoapElement(IsNullable=true)] - public string url; - } - - /// - [SoapInclude(typeof(RemotePermissionScheme))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteScheme - { - - /// - [SoapElement(IsNullable=true)] - public string description; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable id; - - /// - [SoapElement(IsNullable=true)] - public string name; - - /// - [SoapElement(IsNullable=true)] - public string type; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemotePermissionScheme : RemoteScheme - { - - /// - [SoapElement(IsNullable=true)] - public RemotePermissionMapping[] permissionMappings; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemotePermissionMapping - { - - /// - [SoapElement(IsNullable=true)] - public RemotePermission permission; - - /// - [SoapElement(IsNullable=true)] - public RemoteEntity[] remoteEntities; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemotePermission - { - - /// - [SoapElement(IsNullable=true)] - public string name; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable permission; - } - - /// - [SoapInclude(typeof(RemoteSecurityLevel))] - [SoapInclude(typeof(RemoteFilter))] - [SoapInclude(typeof(RemoteField))] - [SoapInclude(typeof(RemoteProject))] - [SoapInclude(typeof(AbstractRemoteConstant))] - [SoapInclude(typeof(RemoteStatus))] - [SoapInclude(typeof(RemoteResolution))] - [SoapInclude(typeof(RemotePriority))] - [SoapInclude(typeof(RemoteIssueType))] - [SoapInclude(typeof(RemoteNamedObject))] - [SoapInclude(typeof(RemoteComponent))] - [SoapInclude(typeof(RemoteVersion))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public abstract partial class AbstractNamedRemoteEntity : AbstractRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string name; - } - - /// - [SoapInclude(typeof(RemoteAttachment))] - [SoapInclude(typeof(RemoteIssue))] - [SoapInclude(typeof(AbstractNamedRemoteEntity))] - [SoapInclude(typeof(RemoteSecurityLevel))] - [SoapInclude(typeof(RemoteFilter))] - [SoapInclude(typeof(RemoteField))] - [SoapInclude(typeof(RemoteProject))] - [SoapInclude(typeof(AbstractRemoteConstant))] - [SoapInclude(typeof(RemoteStatus))] - [SoapInclude(typeof(RemoteResolution))] - [SoapInclude(typeof(RemotePriority))] - [SoapInclude(typeof(RemoteIssueType))] - [SoapInclude(typeof(RemoteNamedObject))] - [SoapInclude(typeof(RemoteComponent))] - [SoapInclude(typeof(RemoteVersion))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public abstract partial class AbstractRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string id; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteAttachment : AbstractRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string author; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable created; - - /// - [SoapElement(IsNullable=true)] - public string filename; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable filesize; - - /// - [SoapElement(IsNullable=true)] - public string mimetype; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteIssue : AbstractRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public RemoteVersion[] affectsVersions; - - /// - [SoapElement(IsNullable=true)] - public string assignee; - - /// - [SoapElement(IsNullable=true)] - public string[] attachmentNames; - - /// - [SoapElement(IsNullable=true)] - public RemoteComponent[] components; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable created; - - /// - [SoapElement(IsNullable=true)] - public RemoteCustomFieldValue[] customFieldValues; - - /// - [SoapElement(IsNullable=true)] - public string description; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable duedate; - - /// - [SoapElement(IsNullable=true)] - public string environment; - - /// - [SoapElement(IsNullable=true)] - public RemoteVersion[] fixVersions; - - /// - [SoapElement(IsNullable=true)] - public string key; - - /// - [SoapElement(IsNullable=true)] - public string priority; - - /// - [SoapElement(IsNullable=true)] - public string project; - - /// - [SoapElement(IsNullable=true)] - public string reporter; - - /// - [SoapElement(IsNullable=true)] - public string resolution; - - /// - [SoapElement(IsNullable=true)] - public string status; - - /// - [SoapElement(IsNullable=true)] - public string summary; - - /// - [SoapElement(IsNullable=true)] - public string type; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable updated; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable votes; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteVersion : AbstractNamedRemoteEntity - { - - /// - public bool archived; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable releaseDate; - - /// - public bool released; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable sequence; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteComponent : AbstractNamedRemoteEntity - { - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteCustomFieldValue - { - - /// - [SoapElement(IsNullable=true)] - public string customfieldId; - - /// - [SoapElement(IsNullable=true)] - public string key; - - /// - [SoapElement(IsNullable=true)] - public string[] values; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteSecurityLevel : AbstractNamedRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string description; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteFilter : AbstractNamedRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string author; - - /// - [SoapElement(IsNullable=true)] - public string description; - - /// - [SoapElement(IsNullable=true)] - public string project; - - /// - [SoapElement(IsNullable=true)] - public string xml; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteField : AbstractNamedRemoteEntity - { - } - - /// - [SoapInclude(typeof(RemoteStatus))] - [SoapInclude(typeof(RemoteResolution))] - [SoapInclude(typeof(RemotePriority))] - [SoapInclude(typeof(RemoteIssueType))] - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public abstract partial class AbstractRemoteConstant : AbstractNamedRemoteEntity - { - - /// - [SoapElement(IsNullable=true)] - public string description; - - /// - [SoapElement(IsNullable=true)] - public string icon; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteStatus : AbstractRemoteConstant - { - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteResolution : AbstractRemoteConstant - { - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemotePriority : AbstractRemoteConstant - { - - /// - [SoapElement(IsNullable=true)] - public string color; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteIssueType : AbstractRemoteConstant - { - - /// - public bool subTask; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteNamedObject : AbstractNamedRemoteEntity - { - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteConfiguration - { - - /// - public bool allowAttachments; - - /// - public bool allowExternalUserManagment; - - /// - public bool allowIssueLinking; - - /// - public bool allowSubTasks; - - /// - public bool allowTimeTracking; - - /// - public bool allowUnassignedIssues; - - /// - public bool allowVoting; - - /// - public bool allowWatching; - - /// - public int timeTrackingDaysPerWeek; - - /// - public int timeTrackingHoursPerDay; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteFieldValue - { - - /// - [SoapElement(IsNullable=true)] - public string id; - - /// - [SoapElement(IsNullable=true)] - public string[] values; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteTimeInfo - { - - /// - [SoapElement(IsNullable=true)] - public string serverTime; - - /// - [SoapElement(IsNullable=true)] - public string timeZoneId; - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("SharpDevelop", "3.2.0.5777")] - [Serializable()] - [DebuggerStepThrough()] - [DesignerCategory("code")] - [SoapType(Namespace="http://beans.soap.rpc.jira.atlassian.com")] - public partial class RemoteServerInfo - { - - /// - [SoapElement(IsNullable=true)] - public string baseUrl; - - /// - [SoapElement(IsNullable=true)] - public System.Nullable buildDate; - - /// - [SoapElement(IsNullable=true)] - public string buildNumber; - - /// - [SoapElement(IsNullable=true)] - public string edition; - - /// - [SoapElement(IsNullable=true)] - public RemoteTimeInfo serverTime; - - /// - [SoapElement(IsNullable=true)] - public string version; - } -} diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config new file mode 100644 index 000000000..9baf9d660 --- /dev/null +++ b/GreenshotJiraPlugin/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index 17978419d..cd2e6b0ba 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -30,8 +30,8 @@ namespace GreenshotPlugin.Controls { /// public partial class PleaseWaitForm : Form { private static readonly ILog LOG = LogManager.GetLogger(typeof(PleaseWaitForm)); - private Thread waitFor; - private string title; + private Thread _waitFor; + private string _title; public PleaseWaitForm() { // // The InitializeComponent() call is required for Windows Forms designer support. @@ -60,7 +60,7 @@ namespace GreenshotPlugin.Controls { /// The text in the form /// delegate { with your code } public void ShowAndWait(string title, string text, ThreadStart waitDelegate) { - this.title = title; + _title = title; Text = title; label_pleasewait.Text = text; cancelButton.Text = Language.GetString("CANCEL"); @@ -72,23 +72,29 @@ namespace GreenshotPlugin.Controls { Exception threadException = null; try { // Wrap the passed delegate in a try/catch which makes it possible to save the exception - waitFor = new Thread(new ThreadStart( - delegate { - try { - waitDelegate.Invoke(); - } catch (Exception ex) { - LOG.Error("invoke error:", ex); - threadException = ex; - } - }) - ); - waitFor.Name = title; - waitFor.IsBackground = true; - waitFor.SetApartmentState(ApartmentState.STA); - waitFor.Start(); + _waitFor = new Thread(new ThreadStart( + delegate + { + try + { + waitDelegate.Invoke(); + } + catch (Exception ex) + { + LOG.Error("invoke error:", ex); + threadException = ex; + } + }) + ) + { + Name = title, + IsBackground = true + }; + _waitFor.SetApartmentState(ApartmentState.STA); + _waitFor.Start(); // Wait until finished - while (!waitFor.Join(TimeSpan.FromMilliseconds(100))) { + while (!_waitFor.Join(TimeSpan.FromMilliseconds(100))) { Application.DoEvents(); } LOG.DebugFormat("Finished {0}", title); @@ -110,9 +116,9 @@ namespace GreenshotPlugin.Controls { /// /// void CancelButtonClick(object sender, EventArgs e) { - LOG.DebugFormat("Cancel clicked on {0}", title); + LOG.DebugFormat("Cancel clicked on {0}", _title); cancelButton.Enabled = false; - waitFor.Abort(); + _waitFor.Abort(); } } } diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index ff0e43fdb..993e63927 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -555,6 +555,8 @@ namespace GreenshotPlugin.Core { string ToBase64String(Base64FormattingOptions formattingOptions); byte[] ToByteArray(); void Upload(HttpWebRequest webRequest); + + string ContentType { get; } } /// @@ -634,6 +636,8 @@ namespace GreenshotPlugin.Core { WriteToStream(requestStream); } } + + public string ContentType => _contentType; } /// @@ -686,7 +690,7 @@ namespace GreenshotPlugin.Core { boundary, name, _fileName ?? name, - "image/" + _outputSettings.Format); + ContentType); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); ImageOutput.SaveToStream(_bitmap, null, formDataStream, _outputSettings); @@ -711,6 +715,8 @@ namespace GreenshotPlugin.Core { WriteToStream(requestStream); } } + + public string ContentType => "image/" + _outputSettings.Format; } /// @@ -763,7 +769,7 @@ namespace GreenshotPlugin.Core { boundary, name, _fileName ?? name, - "image/" + _outputSettings.Format); + ContentType); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); ImageOutput.SaveToStream(_surface, formDataStream, _outputSettings); @@ -783,10 +789,12 @@ namespace GreenshotPlugin.Core { /// /// public void Upload(HttpWebRequest webRequest) { - webRequest.ContentType = "image/" + _outputSettings.Format.ToString(); + webRequest.ContentType = ContentType; using (var requestStream = webRequest.GetRequestStream()) { WriteToStream(requestStream); } } + + public string ContentType => "image/" + _outputSettings.Format; } } From c2603579e77dd5d35c8ec48287cd50f650bf329f Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 16 Aug 2016 16:58:22 +0200 Subject: [PATCH 088/170] BUG-2011: Fix for unavailable (whatever reason) font --- Greenshot/Drawing/TextContainer.cs | 336 ++++++++++++------ .../additional_files/readme.txt.template | 1 + 2 files changed, 220 insertions(+), 117 deletions(-) diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index a6673d091..3557bcf52 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -32,12 +32,14 @@ using System.Drawing.Text; using System.Runtime.Serialization; using System.Windows.Forms; -namespace Greenshot.Drawing { +namespace Greenshot.Drawing +{ /// /// Represents a textbox (extends RectangleContainer for border/background support /// - [Serializable] - public class TextContainer : RectangleContainer, ITextContainer { + [Serializable] + public class TextContainer : RectangleContainer, ITextContainer + { // If makeUndoable is true the next text-change will make the change undoable. // This is set to true AFTER the first change is made, as there is already a "add element" on the undo stack // Although the name is wrong, we can't change it due to file serialization @@ -61,29 +63,36 @@ namespace Greenshot.Drawing { // ReSharper disable once InconsistentNaming private string text; // there is a binding on the following property! - public string Text { + public string Text + { get { return text; } - set { + set + { ChangeText(value, true); } } - - internal void ChangeText(string newText, bool allowUndoable) { - if ((text == null && newText != null) || !string.Equals(text, newText)) { - if (makeUndoable && allowUndoable) { + + internal void ChangeText(string newText, bool allowUndoable) + { + if ((text == null && newText != null) || !string.Equals(text, newText)) + { + if (makeUndoable && allowUndoable) + { makeUndoable = false; _parent.MakeUndoable(new TextChangeMemento(this), false); } - text = newText; - OnPropertyChanged("Text"); + text = newText; + OnPropertyChanged("Text"); } } - - public TextContainer(Surface parent) : base(parent) { + + public TextContainer(Surface parent) : base(parent) + { Init(); } - protected override void InitializeFields() { + protected override void InitializeFields() + { AddField(GetType(), FieldType.LINE_THICKNESS, 2); AddField(GetType(), FieldType.LINE_COLOR, Color.Red); AddField(GetType(), FieldType.SHADOW, true); @@ -100,30 +109,37 @@ namespace Greenshot.Drawing { /// Do some logic to make sure all field are initiated correctly /// /// StreamingContext - protected override void OnDeserialized(StreamingContext streamingContext) { + protected override void OnDeserialized(StreamingContext streamingContext) + { base.OnDeserialized(streamingContext); Init(); } - protected override void Dispose(bool disposing) { - if (disposing) { - if (_font != null) { + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (_font != null) + { _font.Dispose(); _font = null; } - if (_stringFormat != null) { + if (_stringFormat != null) + { _stringFormat.Dispose(); _stringFormat = null; } - if (_textBox != null) { + if (_textBox != null) + { _textBox.Dispose(); _textBox = null; } } base.Dispose(disposing); } - - private void Init() { + + private void Init() + { _stringFormat = new StringFormat { Trimming = StringTrimming.EllipsisWord @@ -139,69 +155,89 @@ namespace Greenshot.Drawing { } - public override void Invalidate() { + public override void Invalidate() + { base.Invalidate(); - if (_textBox != null && _textBox.Visible) { + if (_textBox != null && _textBox.Visible) + { _textBox.Invalidate(); } } - - public void FitToText() { + + public void FitToText() + { 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 (_textBox.Visible) { + void TextContainer_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (_textBox.Visible) + { _textBox.Invalidate(); } UpdateTextBoxPosition(); UpdateTextBoxFormat(); - if (e.PropertyName.Equals("Selected")) { - if (!Selected && _textBox.Visible) { + if (e.PropertyName.Equals("Selected")) + { + if (!Selected && _textBox.Visible) + { HideTextBox(); - } else if (Selected && Status == EditStatus.DRAWING) { + } + else if (Selected && Status == EditStatus.DRAWING) + { ShowTextBox(); - } else if (_parent != null && Selected && Status == EditStatus.IDLE && _textBox.Visible) { + } + else if (_parent != null && Selected && Status == EditStatus.IDLE && _textBox.Visible) + { // Fix (workaround) for BUG-1698 _parent.KeysLocked = true; } } - if (_textBox.Visible) { + if (_textBox.Visible) + { _textBox.Invalidate(); } } - - void TextContainer_FieldChanged(object sender, FieldChangedEventArgs e) { - if (_textBox.Visible) { + + void TextContainer_FieldChanged(object sender, FieldChangedEventArgs e) + { + if (_textBox.Visible) + { _textBox.Invalidate(); } // Only dispose the font, and re-create it, when a font field has changed. - if (e.Field.FieldType.Name.StartsWith("FONT")) { + if (e.Field.FieldType.Name.StartsWith("FONT")) + { if (_font != null) { _font.Dispose(); _font = null; } UpdateFormat(); - } else { + } + else + { UpdateAlignment(); } UpdateTextBoxFormat(); - - if (_textBox != null && _textBox.Visible) { + + if (_textBox != null && _textBox.Visible) + { _textBox.Invalidate(); } } - - public override void OnDoubleClick() { + + public override void OnDoubleClick() + { ShowTextBox(); } - - private void CreateTextBox() { + + private void CreateTextBox() + { _textBox = new TextBox { ImeMode = ImeMode.On, @@ -217,7 +253,8 @@ namespace Greenshot.Drawing { _textBox.KeyDown += textBox_KeyDown; } - private void ShowTextBox() { + private void ShowTextBox() + { if (_parent != null) { _parent.KeysLocked = true; @@ -231,16 +268,21 @@ namespace Greenshot.Drawing { /// /// Makes textbox background dark if text color is very bright /// - private void EnsureTextBoxContrast() { + private void EnsureTextBoxContrast() + { Color lc = GetFieldValueAsColor(FieldType.LINE_COLOR); - if (lc.R > 203 && lc.G > 203 && lc.B > 203) { + if (lc.R > 203 && lc.G > 203 && lc.B > 203) + { _textBox.BackColor = Color.FromArgb(51, 51, 51); - } else { + } + else + { _textBox.BackColor = Color.White; } } - - private void HideTextBox() { + + private void HideTextBox() + { _parent.Focus(); _textBox.Hide(); _parent.KeysLocked = false; @@ -251,7 +293,8 @@ namespace Greenshot.Drawing { /// Make sure the size of the font is scaled /// /// - public override void Transform(Matrix matrix) { + public override void Transform(Matrix matrix) + { Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); int pixelsBefore = rect.Width * rect.Height; @@ -268,59 +311,94 @@ namespace Greenshot.Drawing { UpdateFormat(); } + private Font CreateFont(string fontFamily, bool fontBold, bool fontItalic, float fontSize) + { + 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; + } + } + } + return new Font(fam, fontSize, fs, GraphicsUnit.Pixel); + } + } + /// /// Generate the Font-Formal so we can draw correctly /// - protected void UpdateFormat() { + protected void UpdateFormat() + { string fontFamily = GetFieldValueAsString(FieldType.FONT_FAMILY); bool fontBold = GetFieldValueAsBool(FieldType.FONT_BOLD); bool fontItalic = GetFieldValueAsBool(FieldType.FONT_ITALIC); float fontSize = GetFieldValueAsFloat(FieldType.FONT_SIZE); - try { - 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; - } - } - } + try + { + var newFont = CreateFont(fontFamily, fontBold, fontItalic, fontSize); + _font?.Dispose(); + _font = newFont; + _textBox.Font = _font; + } + catch (Exception ex) + { + // Problem, try again with the default + try + { + fontFamily = FontFamily.GenericSansSerif.Name; + SetFieldValue(FieldType.FONT_FAMILY, fontFamily); + var newFont = CreateFont(fontFamily, fontBold, fontItalic, fontSize); _font?.Dispose(); - _font = new Font(fam, fontSize, fs, GraphicsUnit.Pixel); + _font = newFont; _textBox.Font = _font; } - } catch (Exception ex) { - ex.Data.Add("fontFamily", fontFamily); - ex.Data.Add("fontBold", fontBold); - ex.Data.Add("fontItalic", fontItalic); - ex.Data.Add("fontSize", fontSize); - throw; + catch (Exception ex2) + { + // When this happens... the PC is broken + ex.Data.Add("fontFamily", fontFamily); + ex.Data.Add("fontBold", fontBold); + ex.Data.Add("fontItalic", fontItalic); + ex.Data.Add("fontSize", fontSize); + throw ex; + } } - + UpdateAlignment(); } - private void UpdateAlignment() { + private void UpdateAlignment() + { _stringFormat.Alignment = (StringAlignment)GetFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); _stringFormat.LineAlignment = (StringAlignment)GetFieldValue(FieldType.TEXT_VERTICAL_ALIGNMENT); } @@ -329,36 +407,43 @@ namespace Greenshot.Drawing { /// This will create the textbox exactly to the inner size of the element /// is a bit of a hack, but for now it seems to work... /// - private void UpdateTextBoxPosition() { + private void UpdateTextBoxPosition() + { int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); int lineWidth = (int)Math.Floor(lineThickness / 2d); - int correction = (lineThickness +1 ) % 2; - if (lineThickness <= 1) { + int correction = (lineThickness + 1) % 2; + if (lineThickness <= 1) + { lineWidth = 1; correction = -1; } Rectangle absRectangle = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); _textBox.Left = absRectangle.Left + lineWidth; _textBox.Top = absRectangle.Top + lineWidth; - if (lineThickness <= 1) { + if (lineThickness <= 1) + { lineWidth = 0; } _textBox.Width = absRectangle.Width - 2 * lineWidth + correction; _textBox.Height = absRectangle.Height - 2 * lineWidth + correction; } - public override void ApplyBounds(RectangleF newBounds) { + public override void ApplyBounds(RectangleF newBounds) + { base.ApplyBounds(newBounds); UpdateTextBoxPosition(); } - private void UpdateTextBoxFormat() { - if (_textBox == null) { + private void UpdateTextBoxFormat() + { + if (_textBox == null) + { return; } StringAlignment alignment = (StringAlignment)GetFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); - switch (alignment) { + switch (alignment) + { case StringAlignment.Near: _textBox.TextAlign = HorizontalAlignment.Left; break; @@ -373,22 +458,26 @@ namespace Greenshot.Drawing { Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); _textBox.ForeColor = lineColor; } - - void textBox_KeyDown(object sender, KeyEventArgs e) { + + 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.None)) { + if (e.KeyCode == Keys.Escape || ((e.KeyCode == Keys.Return || e.KeyCode == Keys.Enter) && e.Modifiers == Keys.None)) + { HideTextBox(); e.SuppressKeyPress = true; } } - void textBox_LostFocus(object sender, EventArgs e) { + void textBox_LostFocus(object sender, EventArgs e) + { // next change will be made undoable makeUndoable = true; HideTextBox(); } - - public override void Draw(Graphics graphics, RenderMode rm) { + + public override void Draw(Graphics graphics, RenderMode rm) + { base.Draw(graphics, rm); graphics.SmoothingMode = SmoothingMode.HighQuality; @@ -398,11 +487,13 @@ namespace Greenshot.Drawing { graphics.TextRenderingHint = TextRenderingHint.SystemDefault; Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - if (Selected && rm == RenderMode.EDIT) { + if (Selected && rm == RenderMode.EDIT) + { DrawSelectionBorder(graphics, rect); } - - if (string.IsNullOrEmpty(text) ) { + + if (string.IsNullOrEmpty(text)) + { return; } @@ -427,21 +518,26 @@ namespace Greenshot.Drawing { /// /// /// - public static void DrawText(Graphics graphics, Rectangle drawingRectange, int lineThickness, Color fontColor, bool drawShadow, StringFormat stringFormat, string text, Font font) { + public static void DrawText(Graphics graphics, Rectangle drawingRectange, int lineThickness, Color fontColor, bool drawShadow, StringFormat stringFormat, string text, Font font) + { int textOffset = lineThickness > 0 ? (int)Math.Ceiling(lineThickness / 2d) : 0; // draw shadow before anything else - if (drawShadow) { + if (drawShadow) + { int basealpha = 100; int alpha = basealpha; int steps = 5; int currentStep = 1; - while (currentStep <= steps) { + while (currentStep <= steps) + { int offset = currentStep; Rectangle shadowRect = GuiRectangle.GetGuiRectangle(drawingRectange.Left + offset, drawingRectange.Top + offset, drawingRectange.Width, drawingRectange.Height); - if (lineThickness > 0) { + if (lineThickness > 0) + { shadowRect.Inflate(-textOffset, -textOffset); } - using (Brush fontBrush = new SolidBrush(Color.FromArgb(alpha, 100, 100, 100))) { + using (Brush fontBrush = new SolidBrush(Color.FromArgb(alpha, 100, 100, 100))) + { graphics.DrawString(text, font, fontBrush, shadowRect, stringFormat); currentStep++; alpha = alpha - basealpha / steps; @@ -449,19 +545,25 @@ namespace Greenshot.Drawing { } } - if (lineThickness > 0) { + if (lineThickness > 0) + { drawingRectange.Inflate(-textOffset, -textOffset); } - using (Brush fontBrush = new SolidBrush(fontColor)) { - if (stringFormat != null) { + using (Brush fontBrush = new SolidBrush(fontColor)) + { + if (stringFormat != null) + { graphics.DrawString(text, font, fontBrush, drawingRectange, stringFormat); - } else { + } + else + { graphics.DrawString(text, font, fontBrush, drawingRectange); } } } - public override bool ClickableAt(int x, int y) { + public override bool ClickableAt(int x, int y) + { Rectangle r = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); r.Inflate(5, 5); return r.Contains(x, y); diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 699607d51..7d6b75922 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -26,6 +26,7 @@ Fixed: * BUG-1949: Can't delete Imgur upload * BUG-1965: Activation border around window is visible in the capture * BUG-1991: Greenshot portable (PAF) uses wrong log configuration +* BUG-2011: Editor issues when the font is gone or broken * FEATURE-916: Added ico file format * FEATURE-919: Allow adding of space around screenshot (use Ctrl + / Ctrl -) * FEATURE-945: Added environment variables resolving to the external command From a38929aa84ced760e937c53b72f17f6aa8a1d693 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 16 Aug 2016 17:06:09 +0200 Subject: [PATCH 089/170] Finished merge. --- Greenshot/Drawing/TextContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 3557bcf52..2fe2e2425 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -383,7 +383,7 @@ namespace Greenshot.Drawing _font = newFont; _textBox.Font = _font; } - catch (Exception ex2) + catch (Exception) { // When this happens... the PC is broken ex.Data.Add("fontFamily", fontFamily); From 4c7baa94762884335215b416e0643b6a2041d81b Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 16 Aug 2016 17:18:29 +0200 Subject: [PATCH 090/170] Fixing an async issue with the UI [skip ci] --- GreenshotJiraPlugin/JiraConnector.cs | 12 ++++++------ GreenshotJiraPlugin/JiraUtils.cs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index bbd791e7b..1eb02c3bb 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -149,29 +149,29 @@ namespace GreenshotJiraPlugin { public async Task> GetFavoriteFiltersAsync() { await CheckCredentials(); - return await _jiraApi.GetFavoriteFiltersAsync(); + return await _jiraApi.GetFavoriteFiltersAsync().ConfigureAwait(false); } public async Task GetIssueAsync(string issueKey) { await CheckCredentials(); - return await _jiraApi.GetIssueAsync(issueKey); + return await _jiraApi.GetIssueAsync(issueKey).ConfigureAwait(false); } public async Task AttachAsync(string issueKey, TContent content, string filename, string contentType = null, CancellationToken cancellationToken = default(CancellationToken)) where TContent : class { - await CheckCredentials(); - return await _jiraApi.AttachAsync(issueKey, content, filename, contentType, cancellationToken); + await CheckCredentials().ConfigureAwait(false); + return await _jiraApi.AttachAsync(issueKey, content, filename, contentType, cancellationToken).ConfigureAwait(false); } public async Task AddCommentAsync(string issueKey, string body, string visibility = null, CancellationToken cancellationToken = default(CancellationToken)) { await CheckCredentials(); - await _jiraApi.AddCommentAsync(issueKey, body, visibility, cancellationToken); + await _jiraApi.AddCommentAsync(issueKey, body, visibility, cancellationToken).ConfigureAwait(false); } public async Task SearchAsync(string jql, int maxResults = 20, IList fields = null, CancellationToken cancellationToken = default(CancellationToken)) { await CheckCredentials(); - return await _jiraApi.SearchAsync(jql, maxResults, fields, cancellationToken); + return await _jiraApi.SearchAsync(jql, maxResults, fields, cancellationToken).ConfigureAwait(false); } public Uri JiraBaseUri => _jiraApi.JiraBaseUri; diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index 1f801ca11..30e5df7d6 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -57,7 +57,7 @@ namespace GreenshotJiraPlugin { foreach(string jiraKey in jirakeys) { try { - var issue = await JiraPlugin.Instance.JiraConnector.GetIssueAsync(jiraKey); + var issue = await JiraPlugin.Instance.JiraConnector.GetIssueAsync(jiraKey).ConfigureAwait(false); if (issue != null) { jiraIssues.Add(issue); From 56855317707a0889ac9e59011339cd5e43ece103 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 16 Aug 2016 17:39:56 +0200 Subject: [PATCH 091/170] cleanup [skip ci] --- GreenshotJiraPlugin/JiraConnector.cs | 9 --------- GreenshotJiraPlugin/JiraDestination.cs | 19 ++++--------------- GreenshotJiraPlugin/JiraPlugin.cs | 23 +++-------------------- 3 files changed, 7 insertions(+), 44 deletions(-) diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index 1eb02c3bb..cc4e980de 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -42,11 +42,6 @@ namespace GreenshotJiraPlugin { private JiraApi _jiraApi; public void Dispose() { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected void Dispose(bool disposing) { if (_jiraApi != null) { Task.Run(async () => await Logout()).Wait(); @@ -59,10 +54,6 @@ namespace GreenshotJiraPlugin { _jiraApi = new JiraApi(new Uri(_url)); } - ~JiraConnector() { - Dispose(false); - } - /// /// Internal login which catches the exceptions /// diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index ba78a1fe4..8326e320c 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -52,11 +52,7 @@ namespace GreenshotJiraPlugin { _jira = jira; } - public override string Designation { - get { - return "Jira"; - } - } + public override string Designation => "Jira"; private string FormatUpload(Issue jira) { return Designation + " - " + jira.Key + ": " + jira.Fields.Summary.Substring(0, Math.Min(20, jira.Fields.Summary.Length)); @@ -72,17 +68,10 @@ namespace GreenshotJiraPlugin { } } - public override bool isActive { - get { - return base.isActive && !string.IsNullOrEmpty(Config.Url); - } - } + public override bool isActive => base.isActive && !string.IsNullOrEmpty(Config.Url); + + public override bool isDynamic => true; - public override bool isDynamic { - get { - return true; - } - } public override Image DisplayIcon { get { var resources = new ComponentResourceManager(typeof(JiraPlugin)); diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 1133fdca5..3f2cdc969 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -32,7 +32,6 @@ namespace GreenshotJiraPlugin { /// public class JiraPlugin : IGreenshotPlugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraPlugin)); - private PluginAttribute _jiraPluginAttributes; private JiraConnector _jiraConnector; private JiraConfiguration _config; private static JiraPlugin _instance; @@ -51,21 +50,11 @@ namespace GreenshotJiraPlugin { } } - public static JiraPlugin Instance { - get { - return _instance; - } - } + public static JiraPlugin Instance => _instance; public JiraPlugin() { _instance = this; } - - public PluginAttribute JiraPluginAttributes { - get { - return _jiraPluginAttributes; - } - } public IEnumerable Destinations() { yield return new JiraDestination(this); @@ -76,12 +65,8 @@ namespace GreenshotJiraPlugin { } //Needed for a fail-fast - public JiraConnector CurrentJiraConnector { - get { - return _jiraConnector; - } - } - + public JiraConnector CurrentJiraConnector => _jiraConnector; + public JiraConnector JiraConnector { get { if (_jiraConnector == null) { @@ -98,8 +83,6 @@ namespace GreenshotJiraPlugin { /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - _jiraPluginAttributes = myAttributes; - // Register configuration (don't need the configuration itself) _config = IniConfig.GetIniSection(); return true; From 669ab696cfe33c5903e6d17f5373a1325556b31e Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 14:26:56 +0200 Subject: [PATCH 092/170] Missing Log4NetLogger updated the inno setup script for Jira, so it can only install when .NET 4.5 is available. [skip ci] --- .../innosetup/scripts/isxdl/dutch.ini | 49 +++++++ .../innosetup/scripts/isxdl/english.ini | 4 +- .../innosetup/scripts/isxdl/french.ini | 4 +- .../innosetup/scripts/isxdl/french2.ini | 4 +- .../innosetup/scripts/isxdl/german.ini | 35 ++--- .../innosetup/scripts/isxdl/isxdl.iss | 4 +- .../innosetup/scripts/isxdl/italian.ini | 49 +++++++ .../innosetup/scripts/isxdl/japanese.ini | 49 +++++++ .../innosetup/scripts/isxdl/korean.ini | 49 +++++++ .../innosetup/scripts/isxdl/portuguese.ini | 4 +- .../releases/innosetup/scripts/products.iss | 115 ++++++++++++----- .../scripts/products/directxruntime.iss | 31 +++++ .../innosetup/scripts/products/dotnetfx11.iss | 11 +- .../scripts/products/dotnetfx11lp.iss | 5 +- .../scripts/products/dotnetfx11sp1.iss | 13 +- .../innosetup/scripts/products/dotnetfx20.iss | 17 +-- .../scripts/products/dotnetfx20lp.iss | 9 +- .../scripts/products/dotnetfx20sp1.iss | 13 +- .../scripts/products/dotnetfx20sp1lp.iss | 9 +- .../scripts/products/dotnetfx20sp2.iss | 9 +- .../scripts/products/dotnetfx20sp2lp.iss | 9 +- .../innosetup/scripts/products/dotnetfx35.iss | 17 +-- .../scripts/products/dotnetfx35lp.iss | 7 +- .../scripts/products/dotnetfx35sp1.iss | 17 +-- .../scripts/products/dotnetfx35sp1lp.iss | 9 +- .../scripts/products/dotnetfx40client.iss | 23 ++-- .../scripts/products/dotnetfx40full.iss | 23 ++-- .../innosetup/scripts/products/dotnetfx46.iss | 29 +++++ .../scripts/products/dotnetfxversion.iss | 27 +++- .../scripts/products/fileversion.iss | 2 + .../innosetup/scripts/products/ie6.iss | 17 +-- .../innosetup/scripts/products/iis.iss | 5 +- .../innosetup/scripts/products/jet4sp8.iss | 13 +- .../innosetup/scripts/products/kb835732.iss | 15 ++- .../innosetup/scripts/products/mdac28.iss | 11 +- .../innosetup/scripts/products/msi20.iss | 11 +- .../innosetup/scripts/products/msi31.iss | 11 +- .../innosetup/scripts/products/msi45.iss | 15 ++- .../innosetup/scripts/products/msiproduct.iss | 25 ++++ .../scripts/products/sql2005express.iss | 17 +-- .../scripts/products/sql2008express.iss | 21 +-- .../scripts/products/sqlcompact35sp2.iss | 5 +- .../scripts/products/stringversion.iss | 12 +- .../scripts/products/vcredist2005.iss | 40 ++++++ .../scripts/products/vcredist2008.iss | 40 ++++++ .../scripts/products/vcredist2010.iss | 35 +++-- .../scripts/products/vcredist2010sp1.iss | 41 ++++++ .../scripts/products/vcredist2012.iss | 35 +++++ .../scripts/products/vcredist2013.iss | 35 +++++ .../scripts/products/vcredist2015.iss | 35 +++++ .../innosetup/scripts/products/wic.iss | 11 +- .../innosetup/scripts/products/winversion.iss | 4 +- GreenshotJiraPlugin/Log4NetLogger.cs | 120 ++++++++++++++++++ 53 files changed, 980 insertions(+), 240 deletions(-) create mode 100644 Greenshot/releases/innosetup/scripts/isxdl/dutch.ini create mode 100644 Greenshot/releases/innosetup/scripts/isxdl/italian.ini create mode 100644 Greenshot/releases/innosetup/scripts/isxdl/japanese.ini create mode 100644 Greenshot/releases/innosetup/scripts/isxdl/korean.ini create mode 100644 Greenshot/releases/innosetup/scripts/products/directxruntime.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/dotnetfx46.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/msiproduct.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/vcredist2005.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/vcredist2008.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/vcredist2010sp1.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/vcredist2012.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/vcredist2013.iss create mode 100644 Greenshot/releases/innosetup/scripts/products/vcredist2015.iss create mode 100644 GreenshotJiraPlugin/Log4NetLogger.cs diff --git a/Greenshot/releases/innosetup/scripts/isxdl/dutch.ini b/Greenshot/releases/innosetup/scripts/isxdl/dutch.ini new file mode 100644 index 000000000..6fe8ca75b --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/isxdl/dutch.ini @@ -0,0 +1,49 @@ +[strings] +; Algemeen +100=Bestand downloaden +101=Wilt u de download annuleren? +102=1% (%2 van %3) +103=%1 KB +104=%1 KB van %2 KB (%3%) + +; Status informatie +110=Bestandsinformatie ophalen ... +111=omgeleid naar %1 +112=Verzoek verzenden ... +113=oplossen %1 +114=Verbonden met 1% +115=Het ontvangen ... +116=Verbinden met %1 + +; foutmeldingen +120=Fout bij het verbinden met Internet. \n\n%1 +121=Fout bij het openen van %1.\n\nDe server terug statuscode %2. +122=Fout bij het lezen URL.\n\n%1 +123=Fout bij het schrijven bestand %1.\n\n%2 +124=Fout bij openen bestand %1.\n\n%2 +125='%1' is een ongeldige URL. +126=Fout bij openen %1.\n\n%2 +127=Fout bij het verzenden verzoek.\n\n%1 +128=Niet ondersteund protocol. Alleen HTTP en FTP-protocollen worden ondersteund. +129=Kan geen verbinding maken %1.\n\n%2 +130=Kan de status code opvragen.\n\n%1 +131=Fout bij het aanvragen van het bestand.\n\n%1 + +; anders +144=Over ... +146=Download +147=Setup is nu het downloaden van extra bestanden naar uw computer. + +; etiket +160=Bestand: +161=Speed: +162=Status: +163=Verstreken tijd: +164=Resterende tijd: +165=Huidige File: +166=Algemeen Voortgang: +167=Annuleren +168=OK +169=gebruikersnaam en wachtwoord +170=Gebruikersnaam: +171=Wachtwoord: diff --git a/Greenshot/releases/innosetup/scripts/isxdl/english.ini b/Greenshot/releases/innosetup/scripts/isxdl/english.ini index 03176edde..0546ae49a 100644 --- a/Greenshot/releases/innosetup/scripts/isxdl/english.ini +++ b/Greenshot/releases/innosetup/scripts/isxdl/english.ini @@ -1,6 +1,6 @@ [strings] ; General -100=File Download +100=File download 101=Do you want to cancel the download? 102=%1 (%2 of %3) 103=%1 KB @@ -16,7 +16,7 @@ 116=Connecting to %1 ; Error messages -120=Error connecting to Internet.\n\n%1 +120=Error connecting to the internet.\n\n%1 121=Error opening %1.\n\nThe server returned status code %2. 122=Error reading URL.\n\n%1 123=Error writing file %1.\n\n%2 diff --git a/Greenshot/releases/innosetup/scripts/isxdl/french.ini b/Greenshot/releases/innosetup/scripts/isxdl/french.ini index db802535e..d44ea12d6 100644 --- a/Greenshot/releases/innosetup/scripts/isxdl/french.ini +++ b/Greenshot/releases/innosetup/scripts/isxdl/french.ini @@ -1,6 +1,6 @@ [strings] ; General -100=Tlchargement des fichiers... +100=Tlchargement des fichiers 101=Souhaitez-vous annuler le tlchargement ? 102=%1 (%2 / %3) 103=%1 Ko @@ -16,7 +16,7 @@ 116=Connexion %1 ; Messages d'erreur -120=Impossible de se connecter Internet.\n\n%1 +120=Impossible de se connecter internet.\n\n%1 121=Impossible d'ouvrir %1.\n\nLe serveur a renvoy le code d'erreur %2. 122=Impossible de lire l'adresse.\n\n%1 123=Impossible de crer le fichier %1.\n\n%2 diff --git a/Greenshot/releases/innosetup/scripts/isxdl/french2.ini b/Greenshot/releases/innosetup/scripts/isxdl/french2.ini index b850990fb..5b8bb04f0 100644 --- a/Greenshot/releases/innosetup/scripts/isxdl/french2.ini +++ b/Greenshot/releases/innosetup/scripts/isxdl/french2.ini @@ -3,8 +3,8 @@ 100=Tlchargement de fichier 101=Voulez vous annuler le tlchargement ? 102=%1 (%2 de %3) -103=%1 KB -104=%1 KB de %2 KB (%3%) +103=%1 Ko +104=%1 Ko de %2 Ko (%3%) ; Status information 110=Rception des informations du fichier... diff --git a/Greenshot/releases/innosetup/scripts/isxdl/german.ini b/Greenshot/releases/innosetup/scripts/isxdl/german.ini index 77f443966..447869c21 100644 --- a/Greenshot/releases/innosetup/scripts/isxdl/german.ini +++ b/Greenshot/releases/innosetup/scripts/isxdl/german.ini @@ -1,46 +1,49 @@ -;by E. Wrner [strings] ; General -100=Dateidownload -101=Mchten Sie den Download der Dateien abbrechen? +100=Datei herunterladen +101=Mchten Sie das Herunterladen der Datei abbrechen? 102=%1 (%2 von %3) 103=%1 KB 104=%1 KB von %2 KB (%3%) ; Status information -110=Empfang von Dateiinformationen... +110=Dateiinformationen werden ermittelt... 111=Weiterleitung zu %1 -112=Senden der Anfrage... +112=Anforderung wird gesendet... 113=Auflsen von %1 114=Verbunden mit %1 -115=Empfang... +115=Empfange... 116=Verbinden mit %1 ; Error messages -120=Fehler bei der Herstellung einer Verbindung ins Internet.\n\n%1 -121=Fehler beim ffnen von %1.\n\nDer Server sendete Code %2. +120=Fehler beim Verbinden mit dem Internet.\n\n%1 +121=Fehler beim ffnen von %1.\n\nDer Server meldet Statuscode %2. 122=Fehler beim Lesen der URL.\n\n%1 123=Fehler beim Schreiben der Datei %1.\n\n%2 124=Fehler beim ffnen der Datei %1.\n\n%2 125='%1' ist eine ungltige URL. 126=Fehler beim ffnen von %1.\n\n%2 -127=Fehler beim Senden der Anfrage.\n\n%1 -128=Nicht untersttztes Protokoll. FTP und HTTP sind die einzigen untersttzten Protokolle. -129=Fehler beim Verbinden mit %1.\n\n%2 -130=Fehler beim Auflsen des Statuscodes.\n\n%1 -131=Fehler beim Anfordern einer Datei.\n\n%1 +127=Fehler beim Senden der Anforderung.\n\n%1 +128=Protokoll wird nicht untersttzt. Nur HTTP und FTP werden untersttzt. +129=Verbindung zu %1 fehlgeschlagen.\n\n%2 +130=Fehler bei der Abfrage des Statuscodes.\n\n%1 +131=Fehler bei der Anforderung der Datei.\n\n%1 ; Other 144=ber... 146=Download -147=Setup ldt jetzt zustzliche Dateien fr das Setup. +147=Das Setup ldt nun zustzliche Dateien auf Ihren Computer. ; labels 160=Datei: 161=Geschwindigkeit: 162=Status: -163=Vergangene Zeit: +163=Bisherige Zeit: 164=Verbleibende Zeit: 165=Aktuelle Datei: -166=Gesamter Fortschritt: +166=Gesamter Vorgang: 167=Abbrechen +168=OK +169=Benutzername und Kennwort +170=Benutzername: +171=Kennwort: diff --git a/Greenshot/releases/innosetup/scripts/isxdl/isxdl.iss b/Greenshot/releases/innosetup/scripts/isxdl/isxdl.iss index 513ba5f85..3c25d6d58 100644 --- a/Greenshot/releases/innosetup/scripts/isxdl/isxdl.iss +++ b/Greenshot/releases/innosetup/scripts/isxdl/isxdl.iss @@ -2,13 +2,13 @@ Source: "scripts\isxdl\isxdl.dll"; Flags: dontcopy [Code] -//replace PAnsiChar with PChar on non-unicode Inno Setup procedure isxdl_AddFile(URL, Filename: PAnsiChar); external 'isxdl_AddFile@files:isxdl.dll stdcall'; function isxdl_DownloadFiles(hWnd: Integer): Integer; external 'isxdl_DownloadFiles@files:isxdl.dll stdcall'; -//replace PAnsiChar with PChar on non-unicode Inno Setup function isxdl_SetOption(Option, Value: PAnsiChar): Integer; external 'isxdl_SetOption@files:isxdl.dll stdcall'; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/isxdl/italian.ini b/Greenshot/releases/innosetup/scripts/isxdl/italian.ini new file mode 100644 index 000000000..7729f3ac4 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/isxdl/italian.ini @@ -0,0 +1,49 @@ +[strings] +; Generale +100=Download del file +101=Vuoi annullare il download? +102=%1 (%2 di %3) +103=%1 KB +104=%1 KB di %2 KB (%3%) + +; informazioni di stato +110=Ottenere informazioni sul file ... +111=reindirizzamento a %1 +112=Invio richiesta... +113=Risoluzione %1 +114=Connesso al %1 +115=Ricezione... +116=Collegamento a %1 + +; Messaggio di errore +120=Errore di connessione a Internet.\n\n%1 +121=Errore di apertura %1.\n\nIl server ha restituito codice di stato %2. +122=Errore di lettura del URL.\n\n%1 +123=Errore scrittura del file %1.\n\n%2 +124=Errore apertura del file %1.\n\n%2 +125='%1' è un URL non valido. +126=Errore d'apertura %1.\n\n%2 +127=Errore d'invio richiesta.\n\n%1 +128=Protocollo non supportato. Sono supportati solo i protocolli HTTP e FTP. +129=Connessione non riuscita a %1.\n\n%2 +130=Impossibile eseguire la query codice di stato.\n\n%1 +131=Errore file di richiedente.\n\n%1 + +; Altro +144=A proposito di ... +146=Download +147=L'installazione è ora scaricando i file aggiuntive al computer. + +; etichette +160=File: +161=Velocità: +162=Stato: +163=Tempo trascorso: +164=Tempo rimanente: +165=File corrente: +166=Avanzamento generale: +167=Annulla +168=OK +169=Nome utente e password +170=Nome Utente: +171=Password: diff --git a/Greenshot/releases/innosetup/scripts/isxdl/japanese.ini b/Greenshot/releases/innosetup/scripts/isxdl/japanese.ini new file mode 100644 index 000000000..6638d1f32 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/isxdl/japanese.ini @@ -0,0 +1,49 @@ +[strings] +; General +100=t@C_E[h +101=_E[hLZ܂H +102=%1 (%2 of %3) +103=%1 KB +104=%1 KB of %2 KB (%3%) + +; Status information +110=t@C擾... +111=_CNg %1 +112=NGXgM... +113= %1 +114=ڑ %1 +115=M... +116=ڑ %1 + +; Error messages +120=C^[lbgڑG[.\n\n%1 +121=JnG[ %1.\n\nT[o[̃Xe[^XR[h %2. +122=URLǂݎG[.\n\n%1 +123=t@C݃G[ %1.\n\n%2 +124=t@CI[vG[ %1.\n\n%2 +125='%1' ͕sURLł. +126=I[vG[ %1.\n\n%2 +127=NGXgMG[.\n\n%1 +128=T|[gĂȂvgRł. HTTPFTPvgRT|[gĂ܂. +129=ڑɎs܂ %1.\n\n%2 +130=Xe[^XR[h̖₢킹s.\n\n%1 +131=t@CNGXgG[.\n\n%1 + +; Other +144=About... +146=_E[h +147=ZbgAbv̓Rs[^[ɒlj̃t@C_E[hĂ܂. + +; labels +160=t@C: +161=x: +162=: +163=oߎ: +164=c莞: +165=݂̃t@C: +166=Ŝ̐i: +167=LZ +168=OK +169=[U[ƃpX[h +170=[U[: +171=pX[h: diff --git a/Greenshot/releases/innosetup/scripts/isxdl/korean.ini b/Greenshot/releases/innosetup/scripts/isxdl/korean.ini new file mode 100644 index 000000000..ba8e6cb61 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/isxdl/korean.ini @@ -0,0 +1,49 @@ +[strings] +; General +100= ٿε +101=ٿε带 Ͻðڽϱ? +102=%1 (%2 %3) +103=%1 KB +104=%1 KB %2 KB (%3%) + +; Status information +110= ް ֽϴ... +111=Redirecting to %1 +112=û ֽϴ... +113= %1 +114=%1() Ǿϴ. +115=޴... +116=%1() Դϴ. + +; Error messages +120=ͳ ߻߽ϴ.\n\n%1 +121=µ ַ ߻ %1.\n\n ޽ %2. +122=URL д ߻߽ϴ.\n\n%1 +123= ߻߽ϴ %1.\n\n%2 +124= ߻߽ϴ %1.\n\n%2 +125='%1' ߸ URLԴϴ. +126= ߻߽ϴ %1.\n\n%2 +127=û ߻߽ϴ\n\n%1 +128= ʴ Դϴ. HTTP FTP մϴ. +129=%1 Ͽϴ.\n\n%2 +130= ߽ϴ. ڵ ϴ.\n\n%1 +131= û ߻߽ϴ.\n\n%1 + +; Other +144=About... +146=ٿε +147= ġ α׷ ߰ ϵ ٿε ϰ ˴ϴ. + +; labels +160=: +161=ӵ: +162=: +163= ð: +164= ð: +165= : +166=ü ൵: +167= +168=Ȯ +169=ڸ н +170=ڸ: +171=н: diff --git a/Greenshot/releases/innosetup/scripts/isxdl/portuguese.ini b/Greenshot/releases/innosetup/scripts/isxdl/portuguese.ini index 84f9da483..d729484d6 100644 --- a/Greenshot/releases/innosetup/scripts/isxdl/portuguese.ini +++ b/Greenshot/releases/innosetup/scripts/isxdl/portuguese.ini @@ -4,8 +4,8 @@ 100=Download 101=Deseja cancelar o download? 102=%1 (%2 de %3) -103=%1 Kb -104=%1 Kb de %2 Kb (%3%) +103=%1 KB +104=%1 KB de %2 KB (%3%) ; Status information 110=A receber informao do ficheiro... diff --git a/Greenshot/releases/innosetup/scripts/products.iss b/Greenshot/releases/innosetup/scripts/products.iss index 6beaa2e62..f614f791a 100644 --- a/Greenshot/releases/innosetup/scripts/products.iss +++ b/Greenshot/releases/innosetup/scripts/products.iss @@ -5,34 +5,73 @@ DependenciesDir=MyProgramDependencies en.depdownload_msg=The following applications are required before setup can continue:%n%n%1%nDownload and install now? de.depdownload_msg=Die folgenden Programme werden bentigt bevor das Setup fortfahren kann:%n%n%1%nJetzt downloaden und installieren? +fr.depdownload_msg=Les applications suivantes sont ncessaires avant l'installation peut continuer:%n%n%1%nTlchargement et installer maintenant? +it.depdownload_msg=Le seguenti applicazioni sono necessari per continuare l'installazione:%n%n%1%nScarica ed installare ora? +nl.depdownload_msg=De volgende toepassingen zijn nodig vr de installatie kunt doorgaan:%n%n%1%nDownload en installeer nu? +pl.depdownload_msg=Ponisze aplikacje s wymagane przed instalacj aby mc kontynuowa:%n%n%1%nCzy pobra je i zainstalowa teraz? en.depdownload_memo_title=Download dependencies de.depdownload_memo_title=Abhngigkeiten downloaden +fr.depdownload_memo_title=Tlcharger les dpendances +it.depdownload_memo_title=Scarica le dipendenze +nl.depdownload_memo_title=Download afhankelijkheden +pl.depdownload_memo_title=Pobierz zalenoci en.depinstall_memo_title=Install dependencies de.depinstall_memo_title=Abhngigkeiten installieren +fr.depinstall_memo_title=Installez les dpendances +it.depinstall_memo_title=installare le dipendenze +nl.depinstall_memo_title=Installeer afhankelijkheden +pl.depinstall_memo_title=Zainstaluj zalenoci en.depinstall_title=Installing dependencies de.depinstall_title=Installiere Abhngigkeiten +fr.depinstall_title=Installation des dpendances +it.depinstall_title=installare le dipendenze +nl.depinstall_title=Installeer afhankelijkheden +pl.depinstall_title=Instalowanie zalenoci en.depinstall_description=Please wait while Setup installs dependencies on your computer. de.depinstall_description=Warten Sie bitte whrend Abhngigkeiten auf Ihrem Computer installiert wird. +fr.depinstall_description=S'il vous plat patienter pendant que le programme d'installation installe les dpendances sur votre ordinateur. +it.depinstall_description=Per favore attendi che viene installato sul computer dipendenze. +nl.depinstall_description=Een moment geduld aub Setup installeert afhankelijkheden op uw computer. +pl.depinstall_description=Instalator instaluje zalenoci na komputerze, czekaj. en.depinstall_status=Installing %1... de.depinstall_status=Installiere %1... +fr.depinstall_status=Installation %1... +it.depinstall_status=installazione %1... +nl.depinstall_status=Installeren %1... +pl.depinstall_status=Instalowanie %1.... en.depinstall_missing=%1 must be installed before setup can continue. Please install %1 and run Setup again. de.depinstall_missing=%1 muss installiert werden bevor das Setup fortfahren kann. Bitte installieren Sie %1 und starten Sie das Setup erneut. +fr.depinstall_missing=%1 doit tre install avant l'installation peut continuer. S'il vous plat installer %1 et excutez nouveau le programme d'installation. +it.depinstall_missing=%1 deve essere installato per continuare l'installazione. Si prega di installare %1 ed eseguire nuovamente l'installazione. +nl.depinstall_missing=%1 moet worden genstalleerd vr de installatie kan worden voortgezet. Installeer %1 en voer Setup opnieuw uit. +pl.depinstall_missing=%1 musi by zainstalowany przed instalacj, aby moga ona by kontynuowana. Zainstaluj %1 i ponownie uruchom program instalacyjny. en.depinstall_error=An error occured while installing the dependencies. Please restart the computer and run the setup again or install the following dependencies manually:%n de.depinstall_error=Ein Fehler ist whrend der Installation der Abghngigkeiten aufgetreten. Bitte starten Sie den Computer neu und fhren Sie das Setup erneut aus oder installieren Sie die folgenden Abhngigkeiten per Hand:%n +fr.depinstall_error=Une erreur est survenue lors de l'installation des dpendances . S'il vous plat redmarrer l'ordinateur et excuter nouveau le programme d'installation ou installer les dpendances suivantes manuellement:%n +it.depinstall_error= verificato un errore durante l'installazione le dipendenze . Si prega di riavviare il computer ed eseguire nuovamente la configurazione o installare le seguenti dipendenze manualmente:%n +nl.depinstall_error=Er is een fout opgetreden tijdens het installeren van de afhankelijkheden. Gelieve de computer opnieuw op en voer de installatie opnieuw uit of de volgende afhankelijkheden handmatig installeren:%n +pl.depinstall_error=Wystpi bd podczas instalowania zalenoci. Uruchom ponownie komputer, a nastpnie ponownie uruchom program instalacyjny lub rcznie zainstaluj nastpujce programy:%n en.isxdl_langfile= -de.isxdl_langfile=german2.ini - +de.isxdl_langfile=german.ini +fr.isxdl_langfile=french3.ini +it.isxdl_langfile=italian.ini +nl.isxdl_langfile=dutch.ini +pl.isxdl_langfile=polish.ini [Files] -Source: "scripts\isxdl\german2.ini"; Flags: dontcopy +Source: "scripts\isxdl\german.ini"; Flags: dontcopy +Source: "scripts\isxdl\french3.ini"; Flags: dontcopy +Source: "scripts\isxdl\italian.ini"; Flags: dontcopy +Source: "scripts\isxdl\dutch.ini"; Flags: dontcopy +Source: "scripts\isxdl\polish.ini"; Flags: dontcopy [Code] type @@ -40,6 +79,7 @@ type File: String; Title: String; Parameters: String; + ForceSuccess : boolean; InstallClean : boolean; MustRebootAfter : boolean; end; @@ -49,46 +89,49 @@ type var installMemo, downloadMemo, downloadMessage: string; products: array of TProduct; - delayedReboot: boolean; + delayedReboot, isForcedX86: boolean; DependencyPage: TOutputProgressWizardPage; -procedure AddProduct(FileName, Parameters, Title, Size, URL: string; InstallClean : boolean; MustRebootAfter : boolean); +procedure AddProduct(filename, parameters, title, size, url: string; forceSuccess, installClean, mustRebootAfter : boolean); var path: string; i: Integer; begin - installMemo := installMemo + '%1' + Title + #13; + installMemo := installMemo + '%1' + title + #13; - path := ExpandConstant('{src}{\}') + CustomMessage('DependenciesDir') + '\' + FileName; + path := ExpandConstant('{src}{\}') + CustomMessage('DependenciesDir') + '\' + filename; if not FileExists(path) then begin - path := ExpandConstant('{tmp}{\}') + FileName; + path := ExpandConstant('{tmp}{\}') + filename; - isxdl_AddFile(URL, path); + if not FileExists(path) then begin + isxdl_AddFile(url, path); - downloadMemo := downloadMemo + '%1' + Title + #13; - downloadMessage := downloadMessage + ' ' + Title + ' (' + Size + ')' + #13; + downloadMemo := downloadMemo + '%1' + title + #13; + downloadMessage := downloadMessage + ' ' + title + ' (' + size + ')' + #13; + end; end; i := GetArrayLength(products); SetArrayLength(products, i + 1); products[i].File := path; - products[i].Title := Title; - products[i].Parameters := Parameters; - products[i].InstallClean := InstallClean; - products[i].MustRebootAfter := MustRebootAfter; + products[i].Title := title; + products[i].Parameters := parameters; + products[i].ForceSuccess := forceSuccess; + products[i].InstallClean := installClean; + products[i].MustRebootAfter := mustRebootAfter; end; -function SmartExec(prod : TProduct; var ResultCode : Integer) : boolean; +function SmartExec(product : TProduct; var resultcode : Integer): boolean; begin - if (LowerCase(Copy(prod.File,Length(prod.File)-2,3)) = 'exe') then begin - Result := Exec(prod.File, prod.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); + if (LowerCase(Copy(product.File, Length(product.File) - 2, 3)) = 'exe') then begin + Result := Exec(product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); end else begin - Result := ShellExec('', prod.File, prod.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); + Result := ShellExec('', product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); end; end; -function PendingReboot : boolean; +function PendingReboot: boolean; var names: String; begin if (RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations', names)) then begin @@ -102,7 +145,7 @@ end; function InstallProducts: InstallResult; var - ResultCode, i, productCount, finishCount: Integer; + resultCode, i, productCount, finishCount: Integer; begin Result := InstallSuccessful; productCount := GetArrayLength(products); @@ -120,9 +163,8 @@ begin DependencyPage.SetText(FmtMessage(CustomMessage('depinstall_status'), [products[i].Title]), ''); DependencyPage.SetProgress(i, productCount); - if SmartExec(products[i], ResultCode) then begin - //setup executed; ResultCode contains the exit code - //MsgBox(products[i].Title + ' install executed. Result Code: ' + IntToStr(ResultCode), mbInformation, MB_OK); + if SmartExec(products[i], resultCode) then begin + //setup executed; resultCode contains the exit code if (products[i].MustRebootAfter) then begin //delay reboot after install if we installed the last dependency anyways if (i = productCount - 1) then begin @@ -131,10 +173,10 @@ begin Result := InstallRebootRequired; end; break; - end else if (ResultCode = 0) then begin + end else if (resultCode = 0) or (products[i].ForceSuccess) then begin finishCount := finishCount + 1; - end else if (ResultCode = 3010) then begin - //ResultCode 3010: A restart is required to complete the installation. This message indicates success. + end else if (resultCode = 3010) then begin + //Windows Installer resultCode 3010: ERROR_SUCCESS_REBOOT_REQUIRED delayedReboot := true; finishCount := finishCount + 1; end else begin @@ -142,7 +184,6 @@ begin break; end; end else begin - //MsgBox(products[i].Title + ' install failed. Result Code: ' + IntToStr(ResultCode), mbInformation, MB_OK); Result := InstallError; break; end; @@ -187,8 +228,7 @@ end; function NeedRestart : boolean; begin - if (delayedReboot) then - Result := true; + Result := delayedReboot; end; function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; @@ -231,17 +271,17 @@ end; function IsX86: boolean; begin - Result := (ProcessorArchitecture = paX86) or (ProcessorArchitecture = paUnknown); + Result := isForcedX86 or (ProcessorArchitecture = paX86) or (ProcessorArchitecture = paUnknown); end; function IsX64: boolean; begin - Result := Is64BitInstallMode and (ProcessorArchitecture = paX64); + Result := (not isForcedX86) and Is64BitInstallMode and (ProcessorArchitecture = paX64); end; function IsIA64: boolean; begin - Result := Is64BitInstallMode and (ProcessorArchitecture = paIA64); + Result := (not isForcedX86) and Is64BitInstallMode and (ProcessorArchitecture = paIA64); end; function GetString(x86, x64, ia64: String): String; @@ -264,4 +304,11 @@ begin end else begin Result := ''; end; -end; \ No newline at end of file +end; + +procedure SetForceX86(value: boolean); +begin + isForcedX86 := value; +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/directxruntime.iss b/Greenshot/releases/innosetup/scripts/products/directxruntime.iss new file mode 100644 index 000000000..7e8811283 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/directxruntime.iss @@ -0,0 +1,31 @@ +; requires Windows 7, Windows Server 2003 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008, Windows Vista, Windows XP Service Pack 2, Windows XP Service Pack 3 +; http://www.microsoft.com/en-US/download/details.aspx?id=35 + +[CustomMessages] +en.directxruntime_title=DirectX End-User Runtime +de.directxruntime_title=DirectX Endbenutzer Runtime + +en.directxruntime_size=1 MB - 95.6 MB +de.directxruntime_size=1 MB - 95,6 MB + +[Files] +;includes dxwebsetup.exe in setup executable so that we don't need to download it +Source: "src\dxwebsetup.exe"; Flags: dontcopy + +[Code] +const + directxruntime_url = 'http://download.microsoft.com/download/1/7/1/1718CCC4-6315-4D8E-9543-8E28A4E18C4C/dxwebsetup.exe'; + +procedure directxruntime(); +begin + ExtractTemporaryFile('dxwebsetup.exe'); + + AddProduct('dxwebsetup.exe', + '/Q', + CustomMessage('directxruntime_title'), + CustomMessage('directxruntime_size'), + directxruntime_url, + true, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx11.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx11.iss index 4f1fe7490..955469b6a 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx11.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx11.iss @@ -1,6 +1,6 @@ -// requires Windows 2000; Windows Server 2003 Service Pack 1 for Itanium-based Systems; Windows Server 2003 x64 editions; Windows Server 2008 Datacenter; Windows Server 2008 Enterprise; Windows Server 2008 for Itanium-based Systems; Windows Server 2008 Standard; Windows Vista Business; Windows Vista Enterprise; Windows Vista Home Basic; Windows Vista Home Premium; Windows Vista Starter; Windows Vista Ultimate; Windows XP; Windows XP Professional x64 Edition; Windows NT 4.0 Service Pack 6a -// requires internet explorer 5.0.1 or higher -// http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3 +; requires Windows 2000; Windows Server 2003 Service Pack 1 for Itanium-based Systems; Windows Server 2003 x64 editions; Windows Server 2008 Datacenter; Windows Server 2008 Enterprise; Windows Server 2008 for Itanium-based Systems; Windows Server 2008 Standard; Windows Vista Business; Windows Vista Enterprise; Windows Vista Home Basic; Windows Vista Home Premium; Windows Vista Starter; Windows Vista Ultimate; Windows XP; Windows XP Professional x64 Edition; Windows NT 4.0 Service Pack 6a +; requires internet explorer 5.0.1 or higher +; http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3 [CustomMessages] dotnetfx11_title=.NET Framework 1.1 @@ -8,7 +8,6 @@ dotnetfx11_title=.NET Framework 1.1 en.dotnetfx11_size=23.1 MB de.dotnetfx11_size=23,1 MB - [Code] const dotnetfx11_url = 'http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe'; @@ -21,5 +20,7 @@ begin CustomMessage('dotnetfx11_title'), CustomMessage('dotnetfx11_size'), dotnetfx11_url, - false, false); + false, false, false); end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx11lp.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx11lp.iss index 656e301be..a2415cfa2 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx11lp.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx11lp.iss @@ -8,7 +8,6 @@ de.dotnetfx11lp_lcid=1031 de.dotnetfx11lp_url=http://download.microsoft.com/download/6/8/2/6821e687-526a-4ef8-9a67-9a402ec5ac9e/langpack.exe - [Code] procedure dotnetfx11lp(); begin @@ -19,6 +18,8 @@ begin CustomMessage('dotnetfx11lp_title'), CustomMessage('dotnetfx11lp_size'), CustomMessage('dotnetfx11lp_url'), - false, false); + false, false, false); end; end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx11sp1.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx11sp1.iss index de8296247..f7197d67e 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx11sp1.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx11sp1.iss @@ -1,6 +1,6 @@ -// requires TabletPC, Windows 2000, Windows 2000 Advanced Server, Windows 2000 Professional Edition , Windows 2000 Server, Windows 2000 Service Pack 2, Windows 2000 Service Pack 3, Windows 2000 Service Pack 4, Windows Server 2003 Service Pack 1 for Itanium-based Systems, Windows Server 2003 x64 editions, Windows Server 2003, Datacenter Edition for 64-Bit Itanium-Based Systems, Windows Server 2003, Datacenter x64 Edition, Windows Server 2003, Enterprise Edition for Itanium-based Systems, Windows Server 2003, Enterprise x64 Edition, Windows Server 2003, Standard x64 Edition, Windows Server 2008 Datacenter, Windows Server 2008 Enterprise, Windows Server 2008 for Itanium-based Systems, Windows Server 2008 Standard, Windows Vista Business, Windows Vista Business 64-bit edition, Windows Vista Enterprise, Windows Vista Enterprise 64-bit edition, Windows Vista Home Basic, Windows Vista Home Basic 64-bit edition, Windows Vista Home Premium, Windows Vista Home Premium 64-bit edition, Windows Vista Starter, Windows Vista Ultimate, Windows Vista Ultimate 64-bit edition, Windows XP, Windows XP Home Edition , Windows XP Media Center Edition, Windows XP Professional Edition , Windows XP Professional x64 Edition , Windows XP Service Pack 1, Windows XP Service Pack 2 -// requires internet explorer 5.0.1 or higher -// http://www.microsoft.com/downloads/details.aspx?familyid=A8F5654F-088E-40B2-BBDB-A83353618B38 +; requires TabletPC, Windows 2000, Windows 2000 Advanced Server, Windows 2000 Professional Edition , Windows 2000 Server, Windows 2000 Service Pack 2, Windows 2000 Service Pack 3, Windows 2000 Service Pack 4, Windows Server 2003 Service Pack 1 for Itanium-based Systems, Windows Server 2003 x64 editions, Windows Server 2003, Datacenter Edition for 64-Bit Itanium-Based Systems, Windows Server 2003, Datacenter x64 Edition, Windows Server 2003, Enterprise Edition for Itanium-based Systems, Windows Server 2003, Enterprise x64 Edition, Windows Server 2003, Standard x64 Edition, Windows Server 2008 Datacenter, Windows Server 2008 Enterprise, Windows Server 2008 for Itanium-based Systems, Windows Server 2008 Standard, Windows Vista Business, Windows Vista Business 64-bit edition, Windows Vista Enterprise, Windows Vista Enterprise 64-bit edition, Windows Vista Home Basic, Windows Vista Home Basic 64-bit edition, Windows Vista Home Premium, Windows Vista Home Premium 64-bit edition, Windows Vista Starter, Windows Vista Ultimate, Windows Vista Ultimate 64-bit edition, Windows XP, Windows XP Home Edition , Windows XP Media Center Edition, Windows XP Professional Edition , Windows XP Professional x64 Edition , Windows XP Service Pack 1, Windows XP Service Pack 2 +; requires internet explorer 5.0.1 or higher +; http://www.microsoft.com/downloads/details.aspx?familyid=A8F5654F-088E-40B2-BBDB-A83353618B38 [CustomMessages] dotnetfx11sp1_title=.NET Framework 1.1 Service Pack 1 @@ -8,7 +8,6 @@ dotnetfx11sp1_title=.NET Framework 1.1 Service Pack 1 en.dotnetfx11sp1_size=10.5 MB de.dotnetfx11sp1_size=10,5 MB - [Code] const dotnetfx11sp1_url = 'http://download.microsoft.com/download/8/b/4/8b4addd8-e957-4dea-bdb8-c4e00af5b94b/NDP1.1sp1-KB867460-X86.exe'; @@ -21,5 +20,7 @@ begin CustomMessage('dotnetfx11sp1_title'), CustomMessage('dotnetfx11sp1_size'), dotnetfx11sp1_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx20.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx20.iss index d6deb7576..b87de5c9b 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx20.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx20.iss @@ -1,15 +1,14 @@ -// requires Windows 2000 Service Pack 3, Windows 98, Windows 98 Second Edition, Windows ME, Windows Server 2003, Windows XP Service Pack 2 -// requires internet explorer 5.0.1 or higher -// requires windows installer 2.0 on windows 98, ME -// requires Windows Installer 3.1 on windows 2000 or higher -// http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5 +; requires Windows 2000 Service Pack 3, Windows 98, Windows 98 Second Edition, Windows ME, Windows Server 2003, Windows XP Service Pack 2 +; requires internet explorer 5.0.1 or higher +; requires windows installer 2.0 on windows 98, ME +; requires Windows Installer 3.1 on windows 2000 or higher +; http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5 [CustomMessages] dotnetfx20_title=.NET Framework 2.0 dotnetfx20_size=23 MB - [Code] const dotnetfx20_url = 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe'; @@ -24,5 +23,7 @@ begin CustomMessage('dotnetfx20_title'), CustomMessage('dotnetfx20_size'), GetString(dotnetfx20_url, dotnetfx20_url_x64, dotnetfx20_url_ia64), - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx20lp.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx20lp.iss index a9b16ef9a..fb13e4103 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx20lp.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx20lp.iss @@ -1,4 +1,4 @@ -//http://www.microsoft.com/downloads/details.aspx?familyid=92E0E1CE-8693-4480-84FA-7D85EEF59016 +; http://www.microsoft.com/downloads/details.aspx?familyid=92E0E1CE-8693-4480-84FA-7D85EEF59016 [CustomMessages] de.dotnetfx20lp_title=.NET Framework 2.0 Sprachpaket: Deutsch @@ -12,7 +12,6 @@ de.dotnetfx20lp_url=http://download.microsoft.com/download/2/9/7/29768238-56c3-4 de.dotnetfx20lp_url_x64=http://download.microsoft.com/download/2/e/f/2ef250ba-a868-4074-a4c9-249004866f87/langpack.exe de.dotnetfx20lp_url_ia64=http://download.microsoft.com/download/8/9/8/898c5670-5e74-41c4-82fc-68dd837af627/langpack.exe - [Code] procedure dotnetfx20lp(); begin @@ -23,6 +22,8 @@ begin CustomMessage('dotnetfx20lp_title'), CustomMessage('dotnetfx20lp_size'), CustomMessage('dotnetfx20lp_url' + GetArchitectureString()), - false, false); + false, false, false); end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1.iss index 5140c7ce6..6ee4ef540 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1.iss @@ -1,6 +1,6 @@ -// requires Windows 2000 Service Pack 4, Windows Server 2003, Windows XP Service Pack 2 -// requires KB 835732 on Windows 2000 Service Pack 4 -// http://www.microsoft.com/downloads/details.aspx?FamilyID=79bc3b77-e02c-4ad3-aacf-a7633f706ba5 +; requires Windows 2000 Service Pack 4, Windows Server 2003, Windows XP Service Pack 2 +; requires KB 835732 on Windows 2000 Service Pack 4 +; http://www.microsoft.com/downloads/details.aspx?FamilyID=79bc3b77-e02c-4ad3-aacf-a7633f706ba5 [CustomMessages] dotnetfx20sp1_title=.NET Framework 2.0 Service Pack 1 @@ -8,7 +8,6 @@ dotnetfx20sp1_title=.NET Framework 2.0 Service Pack 1 en.dotnetfx20sp1_size=23.6 MB de.dotnetfx20sp1_size=23,6 MB - [Code] const dotnetfx20sp1_url = 'http://download.microsoft.com/download/0/8/c/08c19fa4-4c4f-4ffb-9d6c-150906578c9e/NetFx20SP1_x86.exe'; @@ -23,5 +22,7 @@ begin CustomMessage('dotnetfx20sp1_title'), CustomMessage('dotnetfx20sp1_size'), GetString(dotnetfx20sp1_url, dotnetfx20sp1_url_x64, dotnetfx20sp1_url_ia64), - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1lp.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1lp.iss index 3ba9ec92f..67111c59f 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1lp.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp1lp.iss @@ -1,4 +1,4 @@ -//http://www.microsoft.com/downloads/details.aspx?FamilyID=1cc39ffe-a2aa-4548-91b3-855a2de99304 +; http://www.microsoft.com/downloads/details.aspx?FamilyID=1cc39ffe-a2aa-4548-91b3-855a2de99304 [CustomMessages] de.dotnetfx20sp1lp_title=.NET Framework 2.0 SP1 Sprachpaket: Deutsch @@ -12,7 +12,6 @@ de.dotnetfx20sp1lp_url=http://download.microsoft.com/download/8/a/a/8aab7e6a-5e5 de.dotnetfx20sp1lp_url_x64=http://download.microsoft.com/download/1/4/2/1425872f-c564-4ab2-8c9e-344afdaecd44/NetFx20SP1_x64de.exe de.dotnetfx20sp1lp_url_ia64=http://download.microsoft.com/download/a/0/b/a0bef431-19d8-433c-9f42-6e2824a8cb90/NetFx20SP1_ia64de.exe - [Code] procedure dotnetfx20sp1lp(); begin @@ -23,6 +22,8 @@ begin CustomMessage('dotnetfx20sp1lp_title'), CustomMessage('dotnetfx20sp1lp_size'), CustomMessage('dotnetfx20sp1lp_url' + GetArchitectureString()), - false, false); + false, false, false); end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2.iss index 2d5b45dde..0a9e48e5a 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2.iss @@ -1,4 +1,4 @@ -//http://www.microsoft.com/downloads/details.aspx?familyid=5B2C0358-915B-4EB5-9B1D-10E506DA9D0F +; http://www.microsoft.com/downloads/details.aspx?familyid=5B2C0358-915B-4EB5-9B1D-10E506DA9D0F [CustomMessages] dotnetfx20sp2_title=.NET Framework 2.0 Service Pack 2 @@ -6,7 +6,6 @@ dotnetfx20sp2_title=.NET Framework 2.0 Service Pack 2 en.dotnetfx20sp2_size=24 MB - 52 MB de.dotnetfx20sp2_size=24 MB - 52 MB - [Code] const dotnetfx20sp2_url = 'http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe'; @@ -21,5 +20,7 @@ begin CustomMessage('dotnetfx20sp2_title'), CustomMessage('dotnetfx20sp2_size'), GetString(dotnetfx20sp2_url, dotnetfx20sp2_url_x64, dotnetfx20sp2_url_ia64), - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2lp.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2lp.iss index 86771bdca..b8aad1565 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2lp.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx20sp2lp.iss @@ -1,4 +1,4 @@ -//http://www.microsoft.com/downloads/details.aspx?FamilyID=c69789e0-a4fa-4b2e-a6b5-3b3695825992 +; http://www.microsoft.com/downloads/details.aspx?FamilyID=c69789e0-a4fa-4b2e-a6b5-3b3695825992 [CustomMessages] de.dotnetfx20sp2lp_title=.NET Framework 2.0 SP2 Sprachpaket: Deutsch @@ -12,7 +12,6 @@ de.dotnetfx20sp2lp_url=http://download.microsoft.com/download/0/b/1/0b175c8e-34b de.dotnetfx20sp2lp_url_x64=http://download.microsoft.com/download/4/e/c/4ec67a11-879d-4550-9c25-fd9ab4261b46/netfx20sp2_x64de.exe de.dotnetfx20sp2lp_url_ia64=http://download.microsoft.com/download/a/3/3/a3349a2d-36e4-4797-8297-4394e6fbd677/NetFx20SP2_ia64de.exe - [Code] procedure dotnetfx20sp2lp(); begin @@ -23,6 +22,8 @@ begin CustomMessage('dotnetfx20sp2lp_title'), CustomMessage('dotnetfx20sp2lp_size'), CustomMessage('dotnetfx20sp2lp_url' + GetArchitectureString()), - false, false); + false, false, false); end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx35.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx35.iss index ed757b2fd..0af1bb6e3 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx35.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx35.iss @@ -1,14 +1,13 @@ -// requires Windows Server 2003 Service Pack 1, Windows Server 2008, Windows Vista, Windows XP Service Pack 2 -// requires Windows Installer 3.1 -// WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below -// http://www.microsoft.com/downloads/details.aspx?FamilyId=333325FD-AE52-4E35-B531-508D977D32A6 +; requires Windows Server 2003 Service Pack 1, Windows Server 2008, Windows Vista, Windows XP Service Pack 2 +; requires Windows Installer 3.1 +; WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below +; http://www.microsoft.com/downloads/details.aspx?FamilyId=333325FD-AE52-4E35-B531-508D977D32A6 [CustomMessages] dotnetfx35_title=.NET Framework 3.5 dotnetfx35_size=3 MB - 197 MB - [Code] const dotnetfx35_url = 'http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe'; @@ -16,10 +15,12 @@ const procedure dotnetfx35(); begin if (netfxinstalled(NetFx35, '') = false) then - AddProduct('dotnetfx35' + GetArchitectureString() + '.exe', + AddProduct('dotnetfx35.exe', '/lang:enu /passive /norestart', CustomMessage('dotnetfx35_title'), CustomMessage('dotnetfx35_size'), dotnetfx35_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx35lp.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx35lp.iss index 38a036c54..818e7eebb 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx35lp.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx35lp.iss @@ -8,17 +8,18 @@ de.dotnetfx35lp_lcid=1031 de.dotnetfx35lp_url=http://download.microsoft.com/download/d/1/e/d1e617c3-c7f4-467e-a7de-af832450efd3/dotnetfx35langpack_x86de.exe - [Code] procedure dotnetfx35lp(); begin if (ActiveLanguage() <> 'en') then begin if (not netfxinstalled(NetFx35, CustomMessage('dotnetfx35lp_lcid'))) then - AddProduct('dotnetfx35' + GetArchitectureString() + '_' + ActiveLanguage() + '.exe', + AddProduct('dotnetfx35_' + ActiveLanguage() + '.exe', '/lang:enu /passive /norestart', CustomMessage('dotnetfx35lp_title'), CustomMessage('dotnetfx35lp_size'), CustomMessage('dotnetfx35lp_url'), - false, false); + false, false, false); end; end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1.iss index 3574d51c4..5eee9f7c7 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1.iss @@ -1,7 +1,7 @@ -// requires Windows Server 2003 Service Pack 1, Windows Server 2008, Windows Vista, Windows XP Service Pack 2 -// requires Windows Installer 3.1 -// WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below -// http://www.microsoft.com/downloads/details.aspx?FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7 +; requires Windows Server 2003 Service Pack 1, Windows Server 2008, Windows Vista, Windows XP Service Pack 2 +; requires Windows Installer 3.1 +; WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below +; http://www.microsoft.com/downloads/details.aspx?FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7 [CustomMessages] dotnetfx35sp1_title=.NET Framework 3.5 Service Pack 1 @@ -9,7 +9,6 @@ dotnetfx35sp1_title=.NET Framework 3.5 Service Pack 1 en.dotnetfx35sp1_size=3 MB - 232 MB de.dotnetfx35sp1_size=3 MB - 232 MB - [Code] const dotnetfx35sp1_url = 'http://download.microsoft.com/download/0/6/1/061f001c-8752-4600-a198-53214c69b51f/dotnetfx35setup.exe'; @@ -17,10 +16,12 @@ const procedure dotnetfx35sp1(); begin if (netfxspversion(NetFx35, '') < 1) then - AddProduct('dotnetfx35sp1' + GetArchitectureString() + '.exe', + AddProduct('dotnetfx35sp1.exe', '/lang:enu /passive /norestart', CustomMessage('dotnetfx35sp1_title'), CustomMessage('dotnetfx35sp1_size'), dotnetfx35sp1_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1lp.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1lp.iss index 518cd22ed..38319504e 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1lp.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx35sp1lp.iss @@ -8,17 +8,18 @@ de.dotnetfx35sp1lp_lcid=1031 de.dotnetfx35sp1lp_url=http://download.microsoft.com/download/d/7/2/d728b7b9-454b-4b57-8270-45dac441b0ec/dotnetfx35langpack_x86de.exe - [Code] procedure dotnetfx35sp1lp(); begin if (ActiveLanguage() <> 'en') then begin if (netfxspversion(NetFx35, CustomMessage('dotnetfx35sp1lp_lcid')) < 1) then - AddProduct('dotnetfx35sp1' + GetArchitectureString() + '_' + ActiveLanguage() + '.exe', + AddProduct('dotnetfx35sp1_' + ActiveLanguage() + '.exe', '/lang:enu /passive /norestart', CustomMessage('dotnetfx35sp1lp_title'), CustomMessage('dotnetfx35sp1lp_size'), CustomMessage('dotnetfx35sp1lp_url'), - false, false); + false, false, false); end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx40client.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx40client.iss index 05058a99e..db6441cb4 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx40client.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx40client.iss @@ -1,8 +1,8 @@ -// requires Windows 7, Windows 7 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008, Windows Server 2008 R2, Windows Server 2008 R2 SP1, Windows Vista Service Pack 1, Windows XP Service Pack 3 -// requires Windows Installer 3.1 -// requires Internet Explorer 5.01 -// WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below -// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab +; requires Windows 7, Windows 7 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008, Windows Server 2008 R2, Windows Server 2008 R2 SP1, Windows Vista Service Pack 1, Windows XP Service Pack 3 +; requires Windows Installer 3.1 +; requires Internet Explorer 5.01 +; WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below +; http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab [CustomMessages] dotnetfx40client_title=.NET Framework 4.0 Client @@ -10,9 +10,8 @@ dotnetfx40client_title=.NET Framework 4.0 Client dotnetfx40client_size=3 MB - 197 MB ;http://www.microsoft.com/globaldev/reference/lcid-all.mspx -en.dotnetfx40client_lcid='' -de.dotnetfx40client_lcid='/lcid 1031 ' - +en.dotnetfx40client_lcid= +de.dotnetfx40client_lcid=/lcid 1031 [Code] const @@ -22,9 +21,11 @@ procedure dotnetfx40client(); begin if (not netfxinstalled(NetFx40Client, '')) then AddProduct('dotNetFx40_Client_setup.exe', - CustomMessage('dotnetfx40client_lcid') + '/passive /norestart', + CustomMessage('dotnetfx40client_lcid') + ' /passive /norestart', CustomMessage('dotnetfx40client_title'), CustomMessage('dotnetfx40client_size'), dotnetfx40client_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx40full.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx40full.iss index c0d752812..917bc2c5b 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfx40full.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx40full.iss @@ -1,8 +1,8 @@ -// requires Windows 7, Windows 7 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008, Windows Server 2008 R2, Windows Server 2008 R2 SP1, Windows Vista Service Pack 1, Windows XP Service Pack 3 -// requires Windows Installer 3.1 -// requires Internet Explorer 5.01 -// WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below -// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992 +; requires Windows 7, Windows 7 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008, Windows Server 2008 R2, Windows Server 2008 R2 SP1, Windows Vista Service Pack 1, Windows XP Service Pack 3 +; requires Windows Installer 3.1 +; requires Internet Explorer 5.01 +; WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below +; http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992 [CustomMessages] dotnetfx40full_title=.NET Framework 4.0 Full @@ -10,9 +10,8 @@ dotnetfx40full_title=.NET Framework 4.0 Full dotnetfx40full_size=3 MB - 197 MB ;http://www.microsoft.com/globaldev/reference/lcid-all.mspx -en.dotnetfx40full_lcid='' -de.dotnetfx40full_lcid='/lcid 1031 ' - +en.dotnetfx40full_lcid= +de.dotnetfx40full_lcid=/lcid 1031 [Code] const @@ -22,9 +21,11 @@ procedure dotnetfx40full(); begin if (not netfxinstalled(NetFx40Full, '')) then AddProduct('dotNetFx40_Full_setup.exe', - CustomMessage('dotnetfx40full_lcid') + '/q /passive /norestart', + CustomMessage('dotnetfx40full_lcid') + ' /passive /norestart', CustomMessage('dotnetfx40full_title'), CustomMessage('dotnetfx40full_size'), dotnetfx40full_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfx46.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfx46.iss new file mode 100644 index 000000000..25ff2029a --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfx46.iss @@ -0,0 +1,29 @@ +; requires Windows 10, Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2 +; WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below +; https://www.microsoft.com/en-US/download/details.aspx?id=49982 + +[CustomMessages] +dotnetfx46_title=.NET Framework 4.6.1 + +dotnetfx46_size=1 MB - 65 MB + +;http://www.microsoft.com/globaldev/reference/lcid-all.mspx +en.dotnetfx46_lcid= +de.dotnetfx46_lcid=/lcid 1031 + +[Code] +const + dotnetfx461_url = 'http://download.microsoft.com/download/3/5/9/35980F81-60F4-4DE3-88FC-8F962B97253B/NDP461-KB3102438-Web.exe'; + +procedure dotnetfx46(minVersion: integer); +begin + if (not netfxinstalled(NetFx4x, '') or (netfxspversion(NetFx4x, '') < minVersion)) then + AddProduct('dotnetfx46.exe', + CustomMessage('dotnetfx46_lcid') + ' /passive /norestart', + CustomMessage('dotnetfx46_title'), + CustomMessage('dotnetfx46_size'), + dotnetfx461_url, + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/dotnetfxversion.iss b/Greenshot/releases/innosetup/scripts/products/dotnetfxversion.iss index 25c3433f6..613fdf19a 100644 --- a/Greenshot/releases/innosetup/scripts/products/dotnetfxversion.iss +++ b/Greenshot/releases/innosetup/scripts/products/dotnetfxversion.iss @@ -1,6 +1,6 @@ [Code] type - NetFXType = (NetFx10, NetFx11, NetFx20, NetFx30, NetFx35, NetFx40Client, NetFx40Full); + NetFXType = (NetFx10, NetFx11, NetFx20, NetFx30, NetFx35, NetFx40Client, NetFx40Full, NetFx4x); const netfx11plus_reg = 'Software\Microsoft\NET Framework Setup\NDP\'; @@ -30,6 +30,12 @@ begin RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Client' + lcid, 'Install', regVersion); NetFx40Full: RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Install', regVersion); + NetFx4x: + begin + RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Release', regVersion); + Result := (regVersion >= 378389); // 4.5.0+ + Exit; + end; end; Result := (regVersion <> 0); end; @@ -64,6 +70,25 @@ begin NetFx40Full: if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Servicing', regVersion)) then regVersion := -1; + NetFx4x: + if (RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Release', regVersion)) then begin + if (regVersion >= 394747) then + regVersion := 62 // 4.6.2+ + else if (regVersion >= 394254) then + regVersion := 61 // 4.6.1+ + else if (regVersion >= 393295) then + regVersion := 60 // 4.6+ + else if (regVersion >= 379893) then + regVersion := 52 // 4.5.2+ + else if (regVersion >= 378675) then + regVersion := 51 // 4.5.1+ + else if (regVersion >= 378389) then + regVersion := 50 // 4.5.0+ + else + regVersion := -1; + end; end; Result := regVersion; end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/fileversion.iss b/Greenshot/releases/innosetup/scripts/products/fileversion.iss index 672486237..66d5c912b 100644 --- a/Greenshot/releases/innosetup/scripts/products/fileversion.iss +++ b/Greenshot/releases/innosetup/scripts/products/fileversion.iss @@ -21,3 +21,5 @@ begin else Result := '0'; end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/ie6.iss b/Greenshot/releases/innosetup/scripts/products/ie6.iss index 99486c23e..954940b7e 100644 --- a/Greenshot/releases/innosetup/scripts/products/ie6.iss +++ b/Greenshot/releases/innosetup/scripts/products/ie6.iss @@ -1,6 +1,6 @@ -// requires Windows 2000; Windows 98; Windows ME; Windows NT; Windows XP Service Pack 1 -// WARNING: express setup (downloads and installs the components depending on your OS) -// http://www.microsoft.com/downloads/details.aspx?familyid=1E1550CB-5E5D-48F5-B02B-20B602228DE6 +; requires Windows 2000; Windows 98; Windows ME; Windows NT; Windows XP Service Pack 1 +; WARNING: express setup (downloads and installs the components depending on your OS) +; http://www.microsoft.com/downloads/details.aspx?familyid=1E1550CB-5E5D-48F5-B02B-20B602228DE6 [CustomMessages] ie6_title=Internet Explorer 6 @@ -8,21 +8,22 @@ ie6_title=Internet Explorer 6 en.ie6_size=1 MB - 77.5 MB de.ie6_size=1 MB - 77,5 MB - [Code] const ie6_url = 'http://download.microsoft.com/download/ie6sp1/finrel/6_sp1/W98NT42KMeXP/EN-US/ie6setup.exe'; -procedure ie6(MinVersion: string); +procedure ie6(minVersion: string); var version: string; begin RegQueryStringValue(HKLM, 'Software\Microsoft\Internet Explorer', 'Version', version); - if (compareversion(version, MinVersion) < 0) then + if (compareversion(version, minVersion) < 0) then AddProduct('ie6.exe', '/q:a /C:"setup /QNT"', CustomMessage('ie6_title'), CustomMessage('ie6_size'), ie6_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/iis.iss b/Greenshot/releases/innosetup/scripts/products/iis.iss index 6a8f973ae..0e4c31d47 100644 --- a/Greenshot/releases/innosetup/scripts/products/iis.iss +++ b/Greenshot/releases/innosetup/scripts/products/iis.iss @@ -1,7 +1,6 @@ [CustomMessages] iis_title=Internet Information Services (IIS) - [Code] function iis(): boolean; begin @@ -9,4 +8,6 @@ begin MsgBox(FmtMessage(CustomMessage('depinstall_missing'), [CustomMessage('iis_title')]), mbError, MB_OK) else Result := true; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/jet4sp8.iss b/Greenshot/releases/innosetup/scripts/products/jet4sp8.iss index 682a3d98b..5b76e5ab8 100644 --- a/Greenshot/releases/innosetup/scripts/products/jet4sp8.iss +++ b/Greenshot/releases/innosetup/scripts/products/jet4sp8.iss @@ -1,4 +1,4 @@ -// http://support.microsoft.com/kb/239114 +; http://support.microsoft.com/kb/239114 [CustomMessages] jet4sp8_title=Jet 4 @@ -6,19 +6,20 @@ jet4sp8_title=Jet 4 en.jet4sp8_size=3.7 MB de.jet4sp8_size=3,7 MB - [Code] const jet4sp8_url = 'http://download.microsoft.com/download/4/3/9/4393c9ac-e69e-458d-9f6d-2fe191c51469/Jet40SP8_9xNT.exe'; -procedure jet4sp8(MinVersion: string); +procedure jet4sp8(minVersion: string); begin //check for Jet4 Service Pack 8 installation - if (compareversion(fileversion(ExpandConstant('{sys}{\}msjet40.dll')), MinVersion) < 0) then + if (compareversion(fileversion(ExpandConstant('{sys}{\}msjet40.dll')), minVersion) < 0) then AddProduct('jet4sp8.exe', '/q:a /c:"install /qb /l"', CustomMessage('jet4sp8_title'), CustomMessage('jet4sp8_size'), jet4sp8_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/kb835732.iss b/Greenshot/releases/innosetup/scripts/products/kb835732.iss index af0ea162d..13a0a183d 100644 --- a/Greenshot/releases/innosetup/scripts/products/kb835732.iss +++ b/Greenshot/releases/innosetup/scripts/products/kb835732.iss @@ -1,6 +1,6 @@ -// required by .NET Framework 2.0 Service Pack 1 on Windows 2000 Service Pack 2-4 -// http://www.microsoft.com/technet/security/bulletin/ms04-011.mspx -// http://www.microsoft.com/downloads/details.aspx?FamilyId=0692C27E-F63A-414C-B3EB-D2342FBB6C00 +; required by .NET Framework 2.0 Service Pack 1 on Windows 2000 Service Pack 2-4 +; http://www.microsoft.com/technet/security/bulletin/ms04-011.mspx +; http://www.microsoft.com/downloads/details.aspx?FamilyId=0692C27E-F63A-414C-B3EB-D2342FBB6C00 [CustomMessages] en.kb835732_title=Windows 2000 Security Update (KB835732) @@ -9,7 +9,6 @@ de.kb835732_title=Windows 2000 Sicherheitsupdate (KB835732) en.kb835732_size=6.8 MB de.kb835732_size=6,8 MB - [Code] const kb835732_url = 'http://download.microsoft.com/download/f/a/a/faa796aa-399d-437a-9284-c3536e9f2e6e/Windows2000-KB835732-x86-ENU.EXE'; @@ -19,10 +18,12 @@ begin if (exactwinversion(5, 0) and (minwinspversion(5, 0, 2) and maxwinspversion(5, 0, 4))) then begin if (not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Updates\Windows 2000\SP5\KB835732\Filelist')) then AddProduct('kb835732.exe', - '/q:a /c:"install /q"', + '/passive /norestart', CustomMessage('kb835732_title'), CustomMessage('kb835732_size'), kb835732_url, - false, false); + false, false, false); end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/mdac28.iss b/Greenshot/releases/innosetup/scripts/products/mdac28.iss index dfd3191d9..63d5b88ba 100644 --- a/Greenshot/releases/innosetup/scripts/products/mdac28.iss +++ b/Greenshot/releases/innosetup/scripts/products/mdac28.iss @@ -4,22 +4,23 @@ mdac28_title=Microsoft Data Access Components 2.8 en.mdac28_size=5.4 MB de.mdac28_size=5,4 MB - [Code] const mdac28_url = 'http://download.microsoft.com/download/c/d/f/cdfd58f1-3973-4c51-8851-49ae3777586f/MDAC_TYP.EXE'; -procedure mdac28(MinVersion: string); +procedure mdac28(minVersion: string); var version: string; begin //check for MDAC installation RegQueryStringValue(HKLM, 'Software\Microsoft\DataAccess', 'FullInstallVer', version); - if (compareversion(version, MinVersion) < 0) then + if (compareversion(version, minVersion) < 0) then AddProduct('mdac28.exe', '/q:a /c:"install /qb /l"', CustomMessage('mdac28_title'), CustomMessage('mdac28_size'), mdac28_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/msi20.iss b/Greenshot/releases/innosetup/scripts/products/msi20.iss index a66965a65..e44f74b3d 100644 --- a/Greenshot/releases/innosetup/scripts/products/msi20.iss +++ b/Greenshot/releases/innosetup/scripts/products/msi20.iss @@ -4,19 +4,20 @@ msi20_title=Windows Installer 2.0 en.msi20_size=1.7 MB de.msi20_size=1,7 MB - [Code] const msi20_url = 'http://download.microsoft.com/download/WindowsInstaller/Install/2.0/W9XMe/EN-US/InstMsiA.exe'; -procedure msi20(MinVersion: string); +procedure msi20(minVersion: string); begin // Check for required Windows Installer 2.0 on Windows 98 and ME - if (IsX86() and maxwinversion(4, 9) and (compareversion(fileversion(ExpandConstant('{sys}{\}msi.dll')), MinVersion) < 0)) then + if (IsX86() and maxwinversion(4, 9) and (compareversion(fileversion(ExpandConstant('{sys}{\}msi.dll')), minVersion) < 0)) then AddProduct('msi20.exe', '/q:a /c:"msiinst /delayrebootq"', CustomMessage('msi20_title'), CustomMessage('msi20_size'), msi20_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/msi31.iss b/Greenshot/releases/innosetup/scripts/products/msi31.iss index 13efb89ec..0ea175dd9 100644 --- a/Greenshot/releases/innosetup/scripts/products/msi31.iss +++ b/Greenshot/releases/innosetup/scripts/products/msi31.iss @@ -4,19 +4,20 @@ msi31_title=Windows Installer 3.1 en.msi31_size=2.5 MB de.msi31_size=2,5 MB - [Code] const msi31_url = 'http://download.microsoft.com/download/1/4/7/147ded26-931c-4daf-9095-ec7baf996f46/WindowsInstaller-KB893803-v2-x86.exe'; -procedure msi31(MinVersion: string); +procedure msi31(minVersion: string); begin // Check for required Windows Installer 3.0 on Windows 2000 or higher - if (IsX86() and minwinversion(5, 0) and (compareversion(fileversion(ExpandConstant('{sys}{\}msi.dll')), MinVersion) < 0)) then + if (IsX86() and minwinversion(5, 0) and (compareversion(fileversion(ExpandConstant('{sys}{\}msi.dll')), minVersion) < 0)) then AddProduct('msi31.exe', '/passive /norestart', CustomMessage('msi31_title'), CustomMessage('msi31_size'), msi31_url, - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/msi45.iss b/Greenshot/releases/innosetup/scripts/products/msi45.iss index 8ed7932fb..e97de18a9 100644 --- a/Greenshot/releases/innosetup/scripts/products/msi45.iss +++ b/Greenshot/releases/innosetup/scripts/products/msi45.iss @@ -10,36 +10,37 @@ de.msi45win52_size=3,0 MB en.msi45win51_size=3.2 MB de.msi45win51_size=3,2 MB - [Code] const msi45win60_url = 'http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu'; msi45win52_url = 'http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x86.exe'; msi45win51_url = 'http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsXP-KB942288-v3-x86.exe'; -procedure msi45(MinVersion: string); +procedure msi45(minVersion: string); begin - if (IsX86() and (compareversion(fileversion(ExpandConstant('{sys}{\}msi.dll')), MinVersion) < 0)) then begin + if (IsX86() and (compareversion(fileversion(ExpandConstant('{sys}{\}msi.dll')), minVersion) < 0)) then begin if minwinversion(6, 0) then AddProduct('msi45_60.msu', '/quiet /norestart', CustomMessage('msi45_title'), CustomMessage('msi45win60_size'), msi45win60_url, - false, false) + false, false, false) else if minwinversion(5, 2) then AddProduct('msi45_52.exe', '/quiet /norestart', CustomMessage('msi45_title'), CustomMessage('msi45win52_size'), msi45win52_url, - false, false) + false, false, false) else if minwinversion(5, 1) then AddProduct('msi45_51.exe', '/quiet /norestart', CustomMessage('msi45_title'), CustomMessage('msi45win51_size'), msi45win51_url, - false, false); + false, false, false); end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/msiproduct.iss b/Greenshot/releases/innosetup/scripts/products/msiproduct.iss new file mode 100644 index 000000000..b5135c6fb --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/msiproduct.iss @@ -0,0 +1,25 @@ +[Code] +#IFDEF UNICODE + #DEFINE AW "W" +#ELSE + #DEFINE AW "A" +#ENDIF + +type + INSTALLSTATE = Longint; +const + INSTALLSTATE_INVALIDARG = -2; // An invalid parameter was passed to the function. + INSTALLSTATE_UNKNOWN = -1; // The product is neither advertised or installed. + INSTALLSTATE_ADVERTISED = 1; // The product is advertised but not installed. + INSTALLSTATE_ABSENT = 2; // The product is installed for a different user. + INSTALLSTATE_DEFAULT = 5; // The product is installed for the current user. + +function MsiQueryProductState(szProduct: string): INSTALLSTATE; +external 'MsiQueryProductState{#AW}@msi.dll stdcall'; + +function msiproduct(const ProductID: string): boolean; +begin + Result := MsiQueryProductState(ProductID) = INSTALLSTATE_DEFAULT; +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/sql2005express.iss b/Greenshot/releases/innosetup/scripts/products/sql2005express.iss index 9a6f626aa..626aebeca 100644 --- a/Greenshot/releases/innosetup/scripts/products/sql2005express.iss +++ b/Greenshot/releases/innosetup/scripts/products/sql2005express.iss @@ -1,7 +1,7 @@ -// SQL Server Express is supported on x64 and EMT64 systems in Windows On Windows (WOW). SQL Server Express is not supported on IA64 systems -// requires Microsoft .NET Framework 2.0 or later -// SQLEXPR32.EXE is a smaller package that can be used to install SQL Server Express on 32-bit operating systems only. The larger SQLEXPR.EXE package supports installing onto both 32-bit and 64-bit (WOW install) operating systems. There is no other difference between these packages. -// http://www.microsoft.com/download/en/details.aspx?id=15291 +; SQL Server Express is supported on x64 and EMT64 systems in Windows On Windows (WOW). SQL Server Express is not supported on IA64 systems +; requires Microsoft .NET Framework 2.0 or later +; SQLEXPR32.EXE is a smaller package that can be used to install SQL Server Express on 32-bit operating systems only. The larger SQLEXPR.EXE package supports installing onto both 32-bit and 64-bit (WOW install) operating systems. There is no other difference between these packages. +; http://www.microsoft.com/download/en/details.aspx?id=15291 [CustomMessages] sql2005express_title=SQL Server 2005 Express SP3 @@ -12,7 +12,6 @@ de.sql2005express_size=38,1 MB en.sql2005express_size_x64=58.1 MB de.sql2005express_size_x64=58,1 MB - [Code] const sql2005express_url = 'http://download.microsoft.com/download/4/B/E/4BED5810-C8C0-4697-BDC3-DBC114B8FF6D/SQLEXPR32_NLA.EXE'; @@ -26,17 +25,19 @@ begin //RTM: 9.00.1399.06 //Service Pack 1: 9.1.2047.00 //Service Pack 2: 9.2.3042.00 - // Newer detection method required for SP3 and x64 + // TODO: Newer detection method required for SP3 and x64 //Service Pack 3: 9.00.4035.00 //RegQueryDWordValue(HKLM, 'Software\Microsoft\Microsoft SQL Server\90\DTS\Setup', 'Install', version); RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\SQLEXPRESS\MSSQLServer\CurrentVersion', 'CurrentVersion', version); if (version < '9.00.4035') then begin - if (not isIA64()) then + if (not IsIA64()) then AddProduct('sql2005express' + GetArchitectureString() + '.exe', '/qb ADDLOCAL=ALL INSTANCENAME=SQLEXPRESS', CustomMessage('sql2005express_title'), CustomMessage('sql2005express_size' + GetArchitectureString()), GetString(sql2005express_url, sql2005express_url_x64, ''), - false, false); + false, false, false); end; end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/sql2008express.iss b/Greenshot/releases/innosetup/scripts/products/sql2008express.iss index 154d1fd5c..9e59b4a09 100644 --- a/Greenshot/releases/innosetup/scripts/products/sql2008express.iss +++ b/Greenshot/releases/innosetup/scripts/products/sql2008express.iss @@ -1,9 +1,9 @@ -// requires Windows 7, Windows Server 2003, Windows Server 2008, Windows Server 2008 R2, Windows Vista, Windows XP -// requires Microsoft .NET Framework 3.5 SP 1 or later -// requires Windows Installer 4.5 or later -// SQL Server Express is supported on x64 and EMT64 systems in Windows On Windows (WOW). SQL Server Express is not supported on IA64 systems -// SQLEXPR32.EXE is a smaller package that can be used to install SQL Server Express on 32-bit operating systems only. The larger SQLEXPR.EXE package supports installing onto both 32-bit and 64-bit (WOW install) operating systems. There is no other difference between these packages. -// http://www.microsoft.com/download/en/details.aspx?id=3743 +; requires Windows 7, Windows Server 2003, Windows Server 2008, Windows Server 2008 R2, Windows Vista, Windows XP +; requires Microsoft .NET Framework 3.5 SP 1 or later +; requires Windows Installer 4.5 or later +; SQL Server Express is supported on x64 and EMT64 systems in Windows On Windows (WOW). SQL Server Express is not supported on IA64 systems +; SQLEXPR32.EXE is a smaller package that can be used to install SQL Server Express on 32-bit operating systems only. The larger SQLEXPR.EXE package supports installing onto both 32-bit and 64-bit (WOW install) operating systems. There is no other difference between these packages. +; http://www.microsoft.com/download/en/details.aspx?id=3743 [CustomMessages] sql2008expressr2_title=SQL Server 2008 Express R2 @@ -14,7 +14,6 @@ de.sql2008expressr2_size=58,2 MB en.sql2008expressr2_size_x64=74.1 MB de.sql2008expressr2_size_x64=74,1 MB - [Code] const sql2008expressr2_url = 'http://download.microsoft.com/download/5/1/A/51A153F6-6B08-4F94-A7B2-BA1AD482BC75/SQLEXPR32_x86_ENU.exe'; @@ -28,12 +27,14 @@ begin // making Express unnecessary. RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\SQLEXPRESS\MSSQLServer\CurrentVersion', 'CurrentVersion', version); if (compareversion(version, '10.5') < 0) then begin - if (not isIA64()) then + if (not IsIA64()) then AddProduct('sql2008expressr2' + GetArchitectureString() + '.exe', - '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=Install /FEATURES=All /INSTANCENAME=SQLEXPRESS /SQLSVCACCOUNT="NT AUTHORITY\Network Service" /SQLSYSADMINACCOUNTS="builtin\administrators"', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=Install /FEATURES=All /INSTANCENAME=SQLEXPRESS /SQLSVCACCOUNT="NT AUTHORITY\Network Service" /SQLSYSADMINACCOUNTS="builtin\administrators"', CustomMessage('sql2008expressr2_title'), CustomMessage('sql2008expressr2_size' + GetArchitectureString()), GetString(sql2008expressr2_url, sql2008expressr2_url_x64, ''), - false, false); + false, false, false); end; end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/sqlcompact35sp2.iss b/Greenshot/releases/innosetup/scripts/products/sqlcompact35sp2.iss index 74762ae3a..b1b889def 100644 --- a/Greenshot/releases/innosetup/scripts/products/sqlcompact35sp2.iss +++ b/Greenshot/releases/innosetup/scripts/products/sqlcompact35sp2.iss @@ -4,7 +4,6 @@ sqlcompact35sp2_title=SQL Server Compact 3.5 Service Pack 2 en.sqlcompact35sp2_size=5.3 MB de.sqlcompact35sp2_size=5,3 MB - [Code] const sqlcompact35sp2_url = 'http://download.microsoft.com/download/E/C/1/EC1B2340-67A0-4B87-85F0-74D987A27160/SSCERuntime-ENU.exe'; @@ -17,5 +16,7 @@ begin CustomMessage('sqlcompact35sp2_title'), CustomMessage('sqlcompact35sp2_size'), sqlcompact35sp2_url, - false, false); + false, false, false); end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/stringversion.iss b/Greenshot/releases/innosetup/scripts/products/stringversion.iss index 7ee85821e..9379d1136 100644 --- a/Greenshot/releases/innosetup/scripts/products/stringversion.iss +++ b/Greenshot/releases/innosetup/scripts/products/stringversion.iss @@ -1,3 +1,4 @@ +[Code] function stringtoversion(var temp: String): Integer; var part: String; @@ -27,11 +28,18 @@ var begin num1 := stringtoversion(x); num2 := stringtoversion(y); - if (num1 = -1) or (num2 = -1) then begin + if (num1 = -1) and (num2 = -1) then begin Result := 0; Exit; end; + if (num1 < 0) then begin + num1 := 0; + end; + if (num2 < 0) then begin + num2 := 0; + end; + if (num1 < num2) then begin Result := -1; end else if (num1 > num2) then begin @@ -50,3 +58,5 @@ begin temp2 := versionB; Result := compareinnerversion(temp1, temp2); end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2005.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2005.iss new file mode 100644 index 000000000..0425d9777 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2005.iss @@ -0,0 +1,40 @@ +; requires Windows 2000 Service Pack 3, Windows 98, Windows 98 Second Edition, Windows ME, Windows Server 2003, Windows XP Service Pack 2 +; requires Windows Installer 3.0 +; http://www.microsoft.com/en-us/download/details.aspx?id=3387 + +[CustomMessages] +vcredist2005_title=Visual C++ 2005 Redistributable +vcredist2005_title_x64=Visual C++ 2005 64-Bit Redistributable +vcredist2005_title_ia64=Visual C++ 2005 Itanium Redistributable + +en.vcredist2005_size=2.6 MB +de.vcredist2005_size=2,6 MB + +en.vcredist2005_size_x64=4.1 MB +de.vcredist2005_size_x64=4,1 MB + +en.vcredist2005_size_ia64=8.8 MB +de.vcredist2005_size_ia64=8,8 MB + +[Code] +const + vcredist2005_url = 'http://download.microsoft.com/download/d/3/4/d342efa6-3266-4157-a2ec-5174867be706/vcredist_x86.exe'; + vcredist2005_url_x64 = 'http://download.microsoft.com/download/9/1/4/914851c6-9141-443b-bdb4-8bad3a57bea9/vcredist_x64.exe'; + vcredist2005_url_ia64 = 'http://download.microsoft.com/download/8/1/6/816129e4-7f2f-4ba6-b065-684223e2fe1e/vcredist_IA64.exe'; + + vcredist2005_productcode = '{A49F249F-0C91-497F-86DF-B2585E8E76B7}'; + vcredist2005_productcode_x64 = '{6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}'; + vcredist2005_productcode_ia64 = '{03ED71EA-F531-4927-AABD-1C31BCE8E187}'; + +procedure vcredist2005(); +begin + if (not msiproduct(GetString(vcredist2005_productcode, vcredist2005_productcode_x64, vcredist2005_productcode_ia64))) then + AddProduct('vcredist2005' + GetArchitectureString() + '.exe', + '/q:a /c:"install /qb /l', + CustomMessage('vcredist2005_title' + GetArchitectureString()), + CustomMessage('vcredist2005_size' + GetArchitectureString()), + GetString(vcredist2005_url, vcredist2005_url_x64, vcredist2005_url_ia64), + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2008.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2008.iss new file mode 100644 index 000000000..b29ba0b73 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2008.iss @@ -0,0 +1,40 @@ +; requires Windows 2000 Service Pack 4, Windows Server 2003, Windows Vista, Windows XP +; requires Windows Installer 3.0 +; http://www.microsoft.com/en-us/download/details.aspx?id=29 + +[CustomMessages] +vcredist2008_title=Visual C++ 2008 Redistributable +vcredist2008_title_x64=Visual C++ 2008 64-Bit Redistributable +vcredist2008_title_ia64=Visual C++ 2008 Itanium Redistributable + +en.vcredist2008_size=1.7 MB +de.vcredist2008_size=1,7 MB + +en.vcredist2008_size_x64=2.3 MB +de.vcredist2008_size_x64=2,3 MB + +en.vcredist2008_size_ia64=4.0 MB +de.vcredist2008_size_ia64=4,0 MB + +[Code] +const + vcredist2008_url = 'http://download.microsoft.com/download/1/1/1/1116b75a-9ec3-481a-a3c8-1777b5381140/vcredist_x86.exe'; + vcredist2008_url_x64 = 'http://download.microsoft.com/download/d/2/4/d242c3fb-da5a-4542-ad66-f9661d0a8d19/vcredist_x64.exe'; + vcredist2008_url_ia64 = 'http://download.microsoft.com/download/a/1/a/a1a4996b-ed78-4c2b-9589-8edd81b8df39/vcredist_IA64.exe'; + + vcredist2008_productcode = '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}'; + vcredist2008_productcode_x64 = '{350AA351-21FA-3270-8B7A-835434E766AD}'; + vcredist2008_productcode_ia64 = '{2B547B43-DB50-3139-9EBE-37D419E0F5FA}'; + +procedure vcredist2008(); +begin + if (not msiproduct(GetString(vcredist2008_productcode, vcredist2008_productcode_x64, vcredist2008_productcode_ia64))) then + AddProduct('vcredist2008' + GetArchitectureString() + '.exe', + '/q', + CustomMessage('vcredist2008_title' + GetArchitectureString()), + CustomMessage('vcredist2008_size' + GetArchitectureString()), + GetString(vcredist2008_url, vcredist2008_url_x64, vcredist2008_url_ia64), + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2010.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2010.iss index 5732fff76..3d7e58a7e 100644 --- a/Greenshot/releases/innosetup/scripts/products/vcredist2010.iss +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2010.iss @@ -1,10 +1,10 @@ -// requires Windows 7, Windows 7 Service Pack 1, Windows Server 2003 Service Pack 2, Windows Server 2008, Windows Server 2008 R2, Windows Server 2008 R2 SP1, Windows Vista Service Pack 1, Windows XP Service Pack 3 -// requires Windows Installer 3.1 or later -// requires Internet Explorer 5.01 or later -// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992 +; requires Windows 7, Windows Server 2003 R2 (32-Bit x86), Windows Server 2003 Service Pack 2, Windows Server 2008 R2, Windows Server 2008 Service Pack 2, Windows Vista Service Pack 2, Windows XP Service Pack 3 +; http://www.microsoft.com/en-us/download/details.aspx?id=5555 [CustomMessages] vcredist2010_title=Visual C++ 2010 Redistributable +vcredist2010_title_x64=Visual C++ 2010 64-Bit Redistributable +vcredist2010_title_ia64=Visual C++ 2010 Itanium Redistributable en.vcredist2010_size=4.8 MB de.vcredist2010_size=4,8 MB @@ -15,28 +15,25 @@ de.vcredist2010_size_x64=5,5 MB en.vcredist2010_size_ia64=2.2 MB de.vcredist2010_size_ia64=2,2 MB -;http://www.microsoft.com/globaldev/reference/lcid-all.mspx -en.vcredist2010_lcid='' -de.vcredist2010_lcid='/lcid 1031 ' - - [Code] const vcredist2010_url = 'http://download.microsoft.com/download/5/B/C/5BC5DBB3-652D-4DCE-B14A-475AB85EEF6E/vcredist_x86.exe'; vcredist2010_url_x64 = 'http://download.microsoft.com/download/3/2/2/3224B87F-CFA0-4E70-BDA3-3DE650EFEBA5/vcredist_x64.exe'; vcredist2010_url_ia64 = 'http://download.microsoft.com/download/3/3/A/33A75193-2CBC-424E-A886-287551FF1EB5/vcredist_IA64.exe'; -procedure vcredist2010(); -var - version: cardinal; -begin - RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\' + GetString('x86', 'x64', 'ia64'), 'Install', version); + vcredist2010_productcode = '{196BB40D-1578-3D01-B289-BEFC77A11A1E}'; + vcredist2010_productcode_x64 = '{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}'; + vcredist2010_productcode_ia64 = '{C1A35166-4301-38E9-BA67-02823AD72A1B}'; - if (version <> 1) then +procedure vcredist2010(); +begin + if (not msiproduct(GetString(vcredist2010_productcode, vcredist2010_productcode_x64, vcredist2010_productcode_ia64))) then AddProduct('vcredist2010' + GetArchitectureString() + '.exe', - CustomMessage('vcredist2010_lcid') + '/passive /norestart', - CustomMessage('vcredist2010_title'), + '/passive /norestart', + CustomMessage('vcredist2010_title' + GetArchitectureString()), CustomMessage('vcredist2010_size' + GetArchitectureString()), GetString(vcredist2010_url, vcredist2010_url_x64, vcredist2010_url_ia64), - false, false); -end; \ No newline at end of file + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2010sp1.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2010sp1.iss new file mode 100644 index 000000000..91dc8ed7e --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2010sp1.iss @@ -0,0 +1,41 @@ +; Requires Windows 7, Windows Server 2003 R2 (32-bit x86), Windows Server 2003 Service Pack 2, Windows Server 2008 R2, Windows Server 2008 Service Pack 2, Windows Vista Service Pack 2, Windows XP Service Pack 3 +; x86 download page: https://www.microsoft.com/en-us/download/details.aspx?id=8328 +; x64 download page: https://www.microsoft.com/en-us/download/details.aspx?id=13523 +; IA64 download page: https://www.microsoft.com/en-us/download/details.aspx?id=21051 + +[CustomMessages] +vcredist2010_title=Visual C++ 2010 SP1 Redistributable +vcredist2010_title_x64=Visual C++ 2010 SP1 64-Bit Redistributable +vcredist2010_title_ia64=Visual C++ 2010 SP1 Itanium Redistributable + +en.vcredist2010_size=4.8 MB +de.vcredist2010_size=4,8 MB + +en.vcredist2010_size_x64=5.4 MB +de.vcredist2010_size_x64=5,4 MB + +en.vcredist2010_size_ia64=2.2 MB +de.vcredist2010_size_ia64=2,2 MB + +[Code] +const + vcredist2010_url_x86 = 'http://download.microsoft.com/download/C/6/D/C6D0FD4E-9E53-4897-9B91-836EBA2AACD3/vcredist_x86.exe'; + vcredist2010_url_x64 = 'http://download.microsoft.com/download/A/8/0/A80747C3-41BD-45DF-B505-E9710D2744E0/vcredist_x64.exe'; + vcredist2010_url_ia64 = 'http://download.microsoft.com/download/7/7/3/77332C03-CC6C-45E5-A7B6-E02504B93847/vcredist_IA64.exe'; + + vcredist2010_productcode_x86 = '{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}'; + vcredist2010_productcode_x64 = '{1D8E6291-B0D5-35EC-8441-6616F567A0F7}'; + vcredist2010_productcode_ia64 = '{88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}'; + +procedure vcredist2010(); +begin + if (not msiproduct(GetString(vcredist2010_productcode_x86, vcredist2010_productcode_x64, vcredist2010_productcode_ia64))) then + AddProduct('vcredist2010' + GetArchitectureString() + '.exe', + '/passive /norestart', + CustomMessage('vcredist2010_title' + GetArchitectureString()), + CustomMessage('vcredist2010_size' + GetArchitectureString()), + GetString(vcredist2010_url_x86, vcredist2010_url_x64, vcredist2010_url_ia64), + false, false, false); +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2012.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2012.iss new file mode 100644 index 000000000..9f2ea00da --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2012.iss @@ -0,0 +1,35 @@ +; requires Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Vista Service Pack 2, Windows XP +; http://www.microsoft.com/en-us/download/details.aspx?id=30679 + +[CustomMessages] +vcredist2012_title=Visual C++ 2012 Redistributable +vcredist2012_title_x64=Visual C++ 2012 64-Bit Redistributable + +en.vcredist2012_size=6.3 MB +de.vcredist2012_size=6,3 MB + +en.vcredist2012_size_x64=6.4 MB +de.vcredist2012_size_x64=6,4 MB + +[Code] +const + vcredist2012_url = 'http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe'; + vcredist2012_url_x64 = 'http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe'; + + vcredist2012_productcode = '{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}'; + vcredist2012_productcode_x64 = '{CF2BEA3C-26EA-32F8-AA9B-331F7E34BA97}'; + +procedure vcredist2012(); +begin + if (not IsIA64()) then begin + if (not msiproduct(GetString(vcredist2012_productcode, vcredist2012_productcode_x64, ''))) then + AddProduct('vcredist2012' + GetArchitectureString() + '.exe', + '/passive /norestart', + CustomMessage('vcredist2012_title' + GetArchitectureString()), + CustomMessage('vcredist2012_size' + GetArchitectureString()), + GetString(vcredist2012_url, vcredist2012_url_x64, ''), + false, false, false); + end; +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2013.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2013.iss new file mode 100644 index 000000000..d55b3651b --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2013.iss @@ -0,0 +1,35 @@ +; requires Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2, Windows XP +; http://www.microsoft.com/en-US/download/details.aspx?id=40784 + +[CustomMessages] +vcredist2013_title=Visual C++ 2013 Redistributable +vcredist2013_title_x64=Visual C++ 2013 64-Bit Redistributable + +en.vcredist2013_size=6.2 MB +de.vcredist2013_size=6,2 MB + +en.vcredist2013_size_x64=6.9 MB +de.vcredist2013_size_x64=6,9 MB + +[Code] +const + vcredist2013_url = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe'; + vcredist2013_url_x64 = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe'; + + vcredist2013_productcode = '{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}'; + vcredist2013_productcode_x64 = '{A749D8E6-B613-3BE3-8F5F-045C84EBA29B}'; + +procedure vcredist2013(); +begin + if (not IsIA64()) then begin + if (not msiproduct(GetString(vcredist2013_productcode, vcredist2013_productcode_x64, ''))) then + AddProduct('vcredist2013' + GetArchitectureString() + '.exe', + '/passive /norestart', + CustomMessage('vcredist2013_title' + GetArchitectureString()), + CustomMessage('vcredist2013_size' + GetArchitectureString()), + GetString(vcredist2013_url, vcredist2013_url_x64, ''), + false, false, false); + end; +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/vcredist2015.iss b/Greenshot/releases/innosetup/scripts/products/vcredist2015.iss new file mode 100644 index 000000000..e98b268f6 --- /dev/null +++ b/Greenshot/releases/innosetup/scripts/products/vcredist2015.iss @@ -0,0 +1,35 @@ +; requires Windows 10, Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003 Service Pack 2, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Vista Service Pack 2, Windows XP Service Pack 3 +; http://www.microsoft.com/en-US/download/details.aspx?id=48145 + +[CustomMessages] +vcredist2015_title=Visual C++ 2015 Redistributable +vcredist2015_title_x64=Visual C++ 2015 64-Bit Redistributable + +en.vcredist2015_size=12.8 MB +de.vcredist2015_size=12,8 MB + +en.vcredist2015_size_x64=13.9 MB +de.vcredist2015_size_x64=13,9 MB + +[Code] +const + vcredist2015_url = 'http://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x86.exe'; + vcredist2015_url_x64 = 'http://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe'; + + vcredist2015_productcode = '{74D0E5DB-B326-4DAE-A6B2-445B9DE1836E}'; + vcredist2015_productcode_x64 = '{0D3E9E15-DE7A-300B-96F1-B4AF12B96488}'; + +procedure vcredist2015(); +begin + if (not IsIA64()) then begin + if (not msiproduct(GetString(vcredist2015_productcode, vcredist2015_productcode_x64, ''))) then + AddProduct('vcredist2015' + GetArchitectureString() + '.exe', + '/passive /norestart', + CustomMessage('vcredist2015_title' + GetArchitectureString()), + CustomMessage('vcredist2015_size' + GetArchitectureString()), + GetString(vcredist2015_url, vcredist2015_url_x64, ''), + false, false, false); + end; +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/wic.iss b/Greenshot/releases/innosetup/scripts/products/wic.iss index 7dd9ed060..bd1abb7d8 100644 --- a/Greenshot/releases/innosetup/scripts/products/wic.iss +++ b/Greenshot/releases/innosetup/scripts/products/wic.iss @@ -1,11 +1,10 @@ -//requires Windows Server 2003, Windows Server 2003 R2 Datacenter Edition (32-Bit x86), Windows Server 2003 R2 Enterprise Edition (32-Bit x86), Windows Server 2003 R2 Standard Edition (32-bit x86), Windows XP Service Pack 2 +; requires Windows Server 2003, Windows Server 2003 R2 Datacenter Edition (32-Bit x86), Windows Server 2003 R2 Enterprise Edition (32-Bit x86), Windows Server 2003 R2 Standard Edition (32-bit x86), Windows XP Service Pack 2 [CustomMessages] wic_title=Windows Imaging Component en.wic_size=1.2 MB de.wic_size=1,2 MB - [Code] const @@ -40,7 +39,7 @@ end; procedure wic(); begin - if (not isIA64()) then begin + if (not IsIA64()) then begin //only needed on Windows XP SP2 or Windows Server 2003 if ((exactwinversion(5, 1) and exactwinspversion(5, 1, 2)) or (exactwinversion(5, 2))) then begin if (not FileExists(GetEnv('windir') + '\system32\windowscodecs.dll')) then @@ -49,7 +48,9 @@ begin CustomMessage('wic_title'), CustomMessage('wic_size'), GetString(wic_url, wic_url_x64, '') + GetConvertedLanguageID() + '.exe', - false, false); + false, false, false); end; end; -end; \ No newline at end of file +end; + +[Setup] diff --git a/Greenshot/releases/innosetup/scripts/products/winversion.iss b/Greenshot/releases/innosetup/scripts/products/winversion.iss index 655f7f560..e1aff98b1 100644 --- a/Greenshot/releases/innosetup/scripts/products/winversion.iss +++ b/Greenshot/releases/innosetup/scripts/products/winversion.iss @@ -44,4 +44,6 @@ begin Result := WindowsVersion.ServicePackMajor <= SpVersion else Result := true; -end; \ No newline at end of file +end; + +[Setup] diff --git a/GreenshotJiraPlugin/Log4NetLogger.cs b/GreenshotJiraPlugin/Log4NetLogger.cs new file mode 100644 index 000000000..24cea3caf --- /dev/null +++ b/GreenshotJiraPlugin/Log4NetLogger.cs @@ -0,0 +1,120 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 Dapplo.Log.Facade; +using log4net; + +namespace GreenshotJiraPlugin +{ + /// + /// Used to make Dapplo.Log, used in Dapplo.Jira, write to Log4net + /// + public class Log4NetLogger : AbstractLogger + { + private ILog GetLogger(LogSource logSource) + { + return logSource.SourceType != null ? LogManager.GetLogger(logSource.SourceType) : LogManager.GetLogger(logSource.Source); + } + + /// + /// Write the supplied information to a log4net.ILog + /// + /// LogInfo + /// string + /// params object[] + public override void Write(LogInfo logInfo, string messageTemplate, params object[] propertyValues) + { + var log = GetLogger(logInfo.Source); + + switch (logInfo.LogLevel) + { + case LogLevels.Verbose: + case LogLevels.Debug: + if (propertyValues != null) + log.DebugFormat(messageTemplate, propertyValues); + else + log.Debug(messageTemplate); + break; + case LogLevels.Error: + if (propertyValues != null) + log.ErrorFormat(messageTemplate, propertyValues); + else + log.Error(messageTemplate); + break; + case LogLevels.Fatal: + if (propertyValues != null) + log.FatalFormat(messageTemplate, propertyValues); + else + log.Fatal(messageTemplate); + break; + case LogLevels.Info: + if (propertyValues != null) + log.InfoFormat(messageTemplate, propertyValues); + else + log.Info(messageTemplate); + break; + case LogLevels.Warn: + if (propertyValues != null) + log.WarnFormat(messageTemplate, propertyValues); + else + log.Warn(messageTemplate); + break; + } + } + + /// + /// Make sure there are no newlines passed + /// + /// + /// + /// + public override void WriteLine(LogInfo logInfo, string messageTemplate, params object[] logParameters) + { + Write(logInfo, messageTemplate, logParameters); + } + + /// + /// Test if a certain LogLevels enum is enabled + /// + /// LogLevels value + /// LogSource to check for + /// bool true if the LogLevels enum is enabled + public override bool IsLogLevelEnabled(LogLevels level, LogSource logSource = null) + { + var log = GetLogger(logSource); + switch (level) + { + case LogLevels.Verbose: + case LogLevels.Debug: + return log.IsDebugEnabled; + case LogLevels.Error: + return log.IsErrorEnabled; + case LogLevels.Fatal: + return log.IsFatalEnabled; + case LogLevels.Info: + return log.IsInfoEnabled; + case LogLevels.Warn: + return log.IsWarnEnabled; + } + return false; + } + } +} From 945fd1db463b988714299ead31dfc5cf1104ec66 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 14:37:00 +0200 Subject: [PATCH 093/170] Added missing files from pull-request and updated the readme.txt --- .../additional_files/readme.txt.template | 1 + .../releases/innosetup/setup.iss.template | 7 ++++- .../Forms/JiraForm.Designer.cs | 6 ++--- GreenshotJiraPlugin/Forms/JiraForm.cs | 26 +++++-------------- .../GreenshotJiraPlugin.csproj | 23 ++++++++++------ GreenshotJiraPlugin/JiraPlugin.cs | 12 +++------ GreenshotJiraPlugin/packages.config | 4 +-- 7 files changed, 38 insertions(+), 41 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 7d6b75922..641f96dc2 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -16,6 +16,7 @@ Fixed: * BUG-1887: hang on exit - hang time proportional to number of objects * BUG-1890: Slight cropping around window on Windows 10 * BUG-1892: Greenshot saves blank JPG file with reduce colors +* BUG-1896: Greenshot doesn't support the new Jira API, SOAP is deprecated. * BUG-1898: Specify GPLv3 in the license text * BUG-1910: Error occurs after adding 10+ text boxes with arrows * BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on and transparency is used diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 398410fbf..79d79d3b1 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -348,7 +348,7 @@ Name: "custom"; Description: "{code:CustomInstall}"; Flags: iscustom Name: "greenshot"; Description: "Greenshot"; Types: default full compact custom; Flags: fixed Name: "plugins\office"; Description: {cm:office}; Types: default full custom; Flags: disablenouninstallwarning Name: "plugins\ocr"; Description: {cm:ocr}; Types: default full custom; Flags: disablenouninstallwarning -Name: "plugins\jira"; Description: {cm:jira}; Types: full custom; Flags: disablenouninstallwarning +Name: "plugins\jira"; Description: {cm:jira}; Types: full custom; Flags: disablenouninstallwarning Check: hasDotNet45OrHigher() Name: "plugins\imgur"; Description: {cm:imgur}; Types: default full custom; Flags: disablenouninstallwarning Name: "plugins\confluence"; Description: {cm:confluence}; Types: full custom; Flags: disablenouninstallwarning; Check: hasDotNet35FullOrHigher() Name: "plugins\externalcommand"; Description: {cm:externalcommand}; Types: default full custom; Flags: disablenouninstallwarning @@ -582,6 +582,11 @@ begin Result := netfxinstalled(NetFX35, '') or netfxinstalled(NetFX40Full, ''); end; +function hasDotNet45OrHigher() : boolean; +begin + Result := netfxinstalled(NetFX4x, ''); +end; + function getNGENPath(argument: String) : String; var installPath: string; diff --git a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs index 18cc71047..65fe4ab92 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs @@ -67,7 +67,7 @@ namespace GreenshotJiraPlugin.Forms { this.jiraFilterBox.Name = "jiraFilterBox"; this.jiraFilterBox.Size = new System.Drawing.Size(604, 21); this.jiraFilterBox.TabIndex = 5; - this.jiraFilterBox.SelectedIndexChanged += new System.EventHandler(this.jiraFilterBox_SelectedIndexChanged); + this.jiraFilterBox.SelectedIndexChanged += new System.EventHandler(this.JiraFilterBox_SelectedIndexChanged); // // label_jirafilter // @@ -112,8 +112,8 @@ namespace GreenshotJiraPlugin.Forms { this.jiraListView.TabIndex = 4; this.jiraListView.UseCompatibleStateImageBehavior = false; this.jiraListView.View = System.Windows.Forms.View.Details; - this.jiraListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.jiraListView_ColumnClick); - this.jiraListView.SelectedIndexChanged += new System.EventHandler(this.jiraListView_SelectedIndexChanged); + this.jiraListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.JiraListView_ColumnClick); + this.jiraListView.SelectedIndexChanged += new System.EventHandler(this.JiraListView_SelectedIndexChanged); // // jiraFilenameBox // diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 56cf7a3e9..3b5b458e2 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -29,6 +29,7 @@ using GreenshotPlugin.Core; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Dapplo.Jira; namespace GreenshotJiraPlugin.Forms { public partial class JiraForm : Form { @@ -111,10 +112,6 @@ namespace GreenshotJiraPlugin.Forms { jiraFilenameBox.Text = filename; } - public void SetComment(string comment) { - jiraCommentBox.Text = comment; - } - public Issue GetJiraIssue() { return _selectedIssue; } @@ -133,13 +130,7 @@ namespace GreenshotJiraPlugin.Forms { } } - private void selectJiraToolStripMenuItem_Click(object sender, EventArgs e) { - ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; - _selectedIssue = (Issue)clickedItem.Tag; - jiraKey.Text = _selectedIssue.Key; - } - - private async void jiraFilterBox_SelectedIndexChanged(object sender, EventArgs e) { + private async void JiraFilterBox_SelectedIndexChanged(object sender, EventArgs e) { if (_jiraConnector.IsLoggedIn) { uploadButton.Enabled = false; @@ -150,7 +141,8 @@ namespace GreenshotJiraPlugin.Forms { IList issues = null; try { - var searchResult = await _jiraConnector.SearchAsync(filter.Jql); + JiraConfig.ExpandSearch = new[] { "*all" }; + var searchResult = await _jiraConnector.SearchAsync(filter.Jql, fields: new [] { "summary,reporter,assignee,created"}); issues = searchResult.Issues; } catch (Exception ex) @@ -187,7 +179,7 @@ namespace GreenshotJiraPlugin.Forms { } } - private void jiraListView_SelectedIndexChanged(object sender, EventArgs e) { + private void JiraListView_SelectedIndexChanged(object sender, EventArgs e) { if (jiraListView.SelectedItems.Count > 0) { _selectedIssue = (Issue)jiraListView.SelectedItems[0].Tag; jiraKey.Text = _selectedIssue.Key; @@ -197,15 +189,11 @@ namespace GreenshotJiraPlugin.Forms { } } - private void jiraListView_ColumnClick(object sender, ColumnClickEventArgs e) { + private void JiraListView_ColumnClick(object sender, ColumnClickEventArgs e) { // Determine if clicked column is already the column that is being sorted. if (e.Column == _columnSorter.SortColumn) { // Reverse the current sort direction for this column. - if (_columnSorter.Order == SortOrder.Ascending) { - _columnSorter.Order = SortOrder.Descending; - } else { - _columnSorter.Order = SortOrder.Ascending; - } + _columnSorter.Order = _columnSorter.Order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending; } else { // Set the column number that is to be sorted; default to ascending. _columnSorter.SortColumn = e.Column; diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index d70a3c9c4..2a8352d14 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -34,8 +34,8 @@ - - ..\packages\Dapplo.HttpExtensions.0.5.30\lib\net45\Dapplo.HttpExtensions.dll + + ..\packages\Dapplo.HttpExtensions.0.5.31\lib\net45\Dapplo.HttpExtensions.dll True @@ -46,10 +46,6 @@ ..\packages\Dapplo.Log.Facade.0.5.4\lib\net45\Dapplo.Log.Facade.dll True - - ..\packages\Dapplo.Utils.0.1.113\lib\net45\Dapplo.Utils.dll - True - ..\Greenshot\Lib\log4net.dll @@ -81,6 +77,7 @@ + Always @@ -108,9 +105,19 @@ mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +"$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +del /q /s "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)"\* + +if "$(ConfigurationName)" == "Release" ( + ..\..\..\packages\LibZ.Tool.1.2.0.0\tools\libz.exe inject-dll --assembly $(ProjectDir)bin\$(Configuration)\$(TargetFileName) --include $(ProjectDir)bin\$(Configuration)\dapplo*.dll --move +) copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" -copy "$(ProjectDir)bin\$(Configuration)\Dapplo.*" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" -copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" + +if "$(ConfigurationName)" == "Debug" ( + copy "$(ProjectDir)bin\$(Configuration)\Dapplo.*" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" + copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" +) + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)" copy "$(ProjectDir)\Languages\*.xml" "$(SolutionDir)Greenshot\bin\$(Configuration)\Languages\Plugins\$(ProjectName)\" diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 3f2cdc969..af210db7b 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -24,6 +24,8 @@ using Greenshot.IniFile; using Greenshot.Plugin; using System; using System.Threading.Tasks; +using Dapplo.HttpExtensions.ContentConverter; +using Dapplo.Log.Facade; using GreenshotJiraPlugin.Forms; namespace GreenshotJiraPlugin { @@ -67,14 +69,7 @@ namespace GreenshotJiraPlugin { //Needed for a fail-fast public JiraConnector CurrentJiraConnector => _jiraConnector; - public JiraConnector JiraConnector { - get { - if (_jiraConnector == null) { - _jiraConnector = new JiraConnector(); - } - return _jiraConnector; - } - } + public JiraConnector JiraConnector => _jiraConnector ?? (_jiraConnector = new JiraConnector()); /// /// Implementation of the IGreenshotPlugin.Initialize @@ -85,6 +80,7 @@ namespace GreenshotJiraPlugin { public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { // Register configuration (don't need the configuration itself) _config = IniConfig.GetIniSection(); + LogSettings.RegisterDefaultLogger(); return true; } diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 9baf9d660..3a2206f53 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,7 +1,7 @@  - + - + \ No newline at end of file From 1294036a568ad5e3f3a22da1b42c73daae35a4a8 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 14:38:41 +0200 Subject: [PATCH 094/170] Fixed copyright for this year. --- Greenshot/AssemblyInfo.cs | 2 +- Greenshot/Configuration/EditorConfiguration.cs | 2 +- Greenshot/Configuration/LanguageKeys.cs | 2 +- Greenshot/Controls/BindableToolStripButton.cs | 2 +- Greenshot/Controls/BindableToolStripComboBox.cs | 2 +- Greenshot/Controls/BindableToolStripDropDownButton.cs | 2 +- Greenshot/Controls/ColorButton.cs | 2 +- .../Controls/ContextMenuToolStripProfessionalRenderer.cs | 2 +- Greenshot/Controls/CustomToolStripProfessionalRenderer.cs | 2 +- Greenshot/Controls/FontFamilyComboBox.cs | 2 +- Greenshot/Controls/MenuStripEx.cs | 2 +- Greenshot/Controls/NonJumpingPanel.cs | 2 +- Greenshot/Controls/Pipette.cs | 2 +- Greenshot/Controls/ToolStripColorButton.cs | 2 +- Greenshot/Controls/ToolStripEx.cs | 2 +- Greenshot/Controls/ToolStripNumericUpDown.cs | 2 +- Greenshot/Destinations/ClipboardDestination.cs | 2 +- Greenshot/Destinations/EditorDestination.cs | 2 +- Greenshot/Destinations/EmailDestination.cs | 2 +- Greenshot/Destinations/FileDestination.cs | 2 +- Greenshot/Destinations/FileWithDialogDestination.cs | 2 +- Greenshot/Destinations/PickerDestination.cs | 2 +- Greenshot/Destinations/PrinterDestination.cs | 2 +- Greenshot/Drawing/Adorners/AbstractAdorner.cs | 2 +- Greenshot/Drawing/Adorners/MoveAdorner.cs | 2 +- Greenshot/Drawing/Adorners/ResizeAdorner.cs | 2 +- Greenshot/Drawing/Adorners/TargetAdorner.cs | 2 +- Greenshot/Drawing/ArrowContainer.cs | 2 +- Greenshot/Drawing/CropContainer.cs | 2 +- Greenshot/Drawing/CursorContainer.cs | 2 +- Greenshot/Drawing/DrawableContainer.cs | 2 +- Greenshot/Drawing/DrawableContainerList.cs | 2 +- Greenshot/Drawing/EllipseContainer.cs | 2 +- Greenshot/Drawing/Fields/AbstractFieldHolder.cs | 2 +- Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs | 2 +- Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs | 2 +- Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs | 2 +- .../Fields/Binding/DecimalDoublePercentageConverter.cs | 2 +- Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs | 2 +- Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs | 2 +- Greenshot/Drawing/Fields/Binding/IBindingConverter.cs | 2 +- Greenshot/Drawing/Fields/Binding/IBindingValidator.cs | 2 +- Greenshot/Drawing/Fields/Binding/NotNullValidator.cs | 2 +- Greenshot/Drawing/Fields/Field.cs | 2 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 +- Greenshot/Drawing/Fields/FieldType.cs | 2 +- Greenshot/Drawing/FilterContainer.cs | 2 +- Greenshot/Drawing/Filters/AbstractFilter.cs | 2 +- Greenshot/Drawing/Filters/BlurFilter.cs | 2 +- Greenshot/Drawing/Filters/BrightnessFilter.cs | 2 +- Greenshot/Drawing/Filters/GrayscaleFilter.cs | 2 +- Greenshot/Drawing/Filters/HighlightFilter.cs | 2 +- Greenshot/Drawing/Filters/IFilter.cs | 2 +- Greenshot/Drawing/Filters/MagnifierFilter.cs | 2 +- Greenshot/Drawing/Filters/PixelizationFilter.cs | 2 +- Greenshot/Drawing/FreehandContainer.cs | 2 +- Greenshot/Drawing/HighlightContainer.cs | 2 +- Greenshot/Drawing/IconContainer.cs | 2 +- Greenshot/Drawing/ImageContainer.cs | 2 +- Greenshot/Drawing/LineContainer.cs | 2 +- Greenshot/Drawing/ObfuscateContainer.cs | 2 +- Greenshot/Drawing/Positions.cs | 2 +- Greenshot/Drawing/RectangleContainer.cs | 2 +- Greenshot/Drawing/RoundedRectangle.cs | 2 +- Greenshot/Drawing/Surface.cs | 2 +- Greenshot/Drawing/TextContainer.cs | 2 +- Greenshot/Forms/AboutForm.Designer.cs | 2 +- Greenshot/Forms/AboutForm.cs | 2 +- Greenshot/Forms/AnimatingBaseForm.cs | 2 +- Greenshot/Forms/BaseForm.cs | 2 +- Greenshot/Forms/BugReportForm.Designer.cs | 2 +- Greenshot/Forms/BugReportForm.cs | 2 +- Greenshot/Forms/CaptureForm.Designer.cs | 2 +- Greenshot/Forms/CaptureForm.cs | 2 +- Greenshot/Forms/ColorDialog.Designer.cs | 2 +- Greenshot/Forms/ColorDialog.cs | 2 +- Greenshot/Forms/DropShadowSettingsForm.Designer.cs | 2 +- Greenshot/Forms/DropShadowSettingsForm.cs | 2 +- Greenshot/Forms/ImageEditorForm.Designer.cs | 2 +- Greenshot/Forms/ImageEditorForm.cs | 2 +- Greenshot/Forms/LanguageDialog.Designer.cs | 2 +- Greenshot/Forms/LanguageDialog.cs | 2 +- Greenshot/Forms/MainForm.Designer.cs | 2 +- Greenshot/Forms/MainForm.cs | 2 +- Greenshot/Forms/MovableShowColorForm.cs | 2 +- Greenshot/Forms/PrintOptionsDialog.Designer.cs | 2 +- Greenshot/Forms/PrintOptionsDialog.cs | 2 +- Greenshot/Forms/ResizeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/ResizeSettingsForm.cs | 2 +- Greenshot/Forms/SettingsForm.Designer.cs | 2 +- Greenshot/Forms/SettingsForm.cs | 2 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 2 +- Greenshot/Forms/TornEdgeSettingsForm.Designer.cs | 2 +- Greenshot/Forms/TornEdgeSettingsForm.cs | 2 +- Greenshot/GreenshotMain.cs | 2 +- Greenshot/Help/HelpFileLoader.cs | 2 +- Greenshot/Helpers/CaptureHelper.cs | 2 +- Greenshot/Helpers/Colors.cs | 2 +- Greenshot/Helpers/CopyData.cs | 2 +- Greenshot/Helpers/DestinationHelper.cs | 2 +- Greenshot/Helpers/EnvironmentInfo.cs | 2 +- Greenshot/Helpers/GeometryHelper.cs | 2 +- Greenshot/Helpers/GuiRectangle.cs | 2 +- Greenshot/Helpers/IECaptureHelper.cs | 2 +- Greenshot/Helpers/IEInterop/IEContainer.cs | 2 +- Greenshot/Helpers/MailHelper.cs | 2 +- Greenshot/Helpers/PluginHelper.cs | 2 +- Greenshot/Helpers/PrintHelper.cs | 2 +- Greenshot/Helpers/ProcessorHelper.cs | 2 +- Greenshot/Helpers/ScaleHelper.cs | 2 +- Greenshot/Helpers/SoundHelper.cs | 2 +- Greenshot/Helpers/StartupHelper.cs | 2 +- Greenshot/Helpers/ToolStripItemEndisabler.cs | 2 +- Greenshot/Helpers/UpdateHelper.cs | 2 +- Greenshot/Helpers/WindowWrapper.cs | 2 +- Greenshot/Languages/language-cs-CZ.xml | 2 +- Greenshot/Languages/language-de-DE.xml | 2 +- Greenshot/Languages/language-el-GR.xml | 2 +- Greenshot/Languages/language-en-US.xml | 2 +- Greenshot/Languages/language-es-ES.xml | 2 +- Greenshot/Languages/language-fi-FI.xml | 2 +- Greenshot/Languages/language-fr-FR.xml | 2 +- Greenshot/Languages/language-he-IL.xml | 2 +- Greenshot/Languages/language-it-IT.xml | 2 +- Greenshot/Languages/language-ja-JP.xml | 2 +- Greenshot/Languages/language-nl-NL.xml | 2 +- Greenshot/Languages/language-pl-PL.xml | 2 +- Greenshot/Languages/language-pt-BR.xml | 2 +- Greenshot/Languages/language-pt-PT.xml | 2 +- Greenshot/Languages/language-sk-SK.xml | 2 +- Greenshot/Languages/language-sv-SE.xml | 2 +- Greenshot/Languages/language-tr-TR.xml | 2 +- Greenshot/Languages/language-uk-UA.xml | 2 +- Greenshot/Languages/language-zh-TW.xml | 2 +- Greenshot/Memento/AddElementMemento.cs | 2 +- Greenshot/Memento/AddElementsMemento.cs | 2 +- Greenshot/Memento/ChangeFieldHolderMemento.cs | 2 +- Greenshot/Memento/DeleteElementMemento.cs | 2 +- Greenshot/Memento/DeleteElementsMemento.cs | 2 +- Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs | 2 +- Greenshot/Memento/SurfaceBackgroundChangeMemento.cs | 2 +- Greenshot/Memento/TextChangeMemento.cs | 2 +- Greenshot/Processors/TitleFixProcessor.cs | 2 +- GreenshotBoxPlugin/BoxConfiguration.cs | 2 +- GreenshotBoxPlugin/BoxCredentials.cs | 2 +- GreenshotBoxPlugin/BoxDestination.cs | 2 +- GreenshotBoxPlugin/BoxEntities.cs | 2 +- GreenshotBoxPlugin/BoxPlugin.cs | 2 +- GreenshotBoxPlugin/BoxUtils.cs | 2 +- GreenshotBoxPlugin/Forms/BoxForm.cs | 2 +- GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs | 2 +- GreenshotBoxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotBoxPlugin/LanguageKeys.cs | 2 +- GreenshotBoxPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotConfluencePlugin/Confluence.cs | 2 +- GreenshotConfluencePlugin/ConfluenceConfiguration.cs | 2 +- GreenshotConfluencePlugin/ConfluenceDestination.cs | 2 +- GreenshotConfluencePlugin/ConfluencePlugin.cs | 2 +- GreenshotConfluencePlugin/ConfluenceUtils.cs | 2 +- GreenshotConfluencePlugin/EnumDisplayer.cs | 2 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 2 +- GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs | 2 +- GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs | 2 +- GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs | 2 +- GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs | 2 +- GreenshotConfluencePlugin/LanguageKeys.cs | 2 +- GreenshotConfluencePlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotDropboxPlugin/DropBoxCredentials.cs | 2 +- GreenshotDropboxPlugin/DropboxDestination.cs | 2 +- GreenshotDropboxPlugin/DropboxPlugin.cs | 2 +- GreenshotDropboxPlugin/DropboxPluginConfiguration.cs | 2 +- GreenshotDropboxPlugin/DropboxUtils.cs | 2 +- GreenshotDropboxPlugin/Forms/DropboxForm.cs | 2 +- GreenshotDropboxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotDropboxPlugin/LanguageKeys.cs | 2 +- GreenshotDropboxPlugin/Properties/AssemblyInfo.cs | 2 +- .../ExternalCommandConfiguration.cs | 2 +- GreenshotExternalCommandPlugin/ExternalCommandDestination.cs | 2 +- GreenshotExternalCommandPlugin/ExternalCommandForm.cs | 2 +- GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs | 2 +- GreenshotExternalCommandPlugin/IconCache.cs | 2 +- GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotExternalCommandPlugin/SettingsForm.Designer.cs | 2 +- GreenshotExternalCommandPlugin/SettingsForm.cs | 2 +- GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs | 2 +- GreenshotExternalCommandPlugin/SettingsFormDetail.cs | 2 +- GreenshotFlickrPlugin/FlickrConfiguration.cs | 2 +- GreenshotFlickrPlugin/FlickrCredentials.cs | 2 +- GreenshotFlickrPlugin/FlickrDestination.cs | 2 +- GreenshotFlickrPlugin/FlickrPlugin.cs | 2 +- GreenshotFlickrPlugin/FlickrUtils.cs | 2 +- GreenshotFlickrPlugin/Forms/FlickrForm.cs | 2 +- GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs | 2 +- GreenshotFlickrPlugin/Forms/SettingsForm.cs | 2 +- GreenshotFlickrPlugin/LanguageKeys.cs | 2 +- GreenshotFlickrPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurForm.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/ImgurHistory.cs | 2 +- GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs | 2 +- GreenshotImgurPlugin/Forms/SettingsForm.cs | 2 +- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 +- GreenshotImgurPlugin/ImgurCredentials.cs | 2 +- GreenshotImgurPlugin/ImgurDestination.cs | 2 +- GreenshotImgurPlugin/ImgurInfo.cs | 2 +- GreenshotImgurPlugin/ImgurPlugin.cs | 2 +- GreenshotImgurPlugin/ImgurUtils.cs | 2 +- GreenshotImgurPlugin/LanguageKeys.cs | 2 +- GreenshotImgurPlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotJiraPlugin/Forms/JiraForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/JiraForm.cs | 2 +- GreenshotJiraPlugin/Forms/JiraFormBase.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs | 2 +- GreenshotJiraPlugin/Forms/SettingsForm.cs | 2 +- GreenshotJiraPlugin/JiraConfiguration.cs | 2 +- GreenshotJiraPlugin/JiraConnector.cs | 2 +- GreenshotJiraPlugin/JiraDestination.cs | 2 +- GreenshotJiraPlugin/JiraPlugin.cs | 2 +- GreenshotJiraPlugin/JiraUtils.cs | 2 +- GreenshotJiraPlugin/LanguageKeys.cs | 2 +- GreenshotJiraPlugin/Log4NetLogger.cs | 2 +- GreenshotJiraPlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotOCRCommand/COMWrapper.cs | 2 +- GreenshotOCRCommand/ComProgIdAttribute.cs | 2 +- GreenshotOCRCommand/ModiInterop.cs | 2 +- GreenshotOCRCommand/Properties/AssemblyInfo.cs | 2 +- GreenshotOCRPlugin/OCRConfiguration.cs | 2 +- GreenshotOCRPlugin/OCRDestination.cs | 2 +- GreenshotOCRPlugin/OCRForm.cs | 2 +- GreenshotOCRPlugin/OCRPlugin.cs | 2 +- GreenshotOCRPlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotOCRPlugin/SettingsForm.Designer.cs | 2 +- GreenshotOCRPlugin/SettingsForm.cs | 2 +- GreenshotOfficePlugin/Destinations/ExcelDestination.cs | 2 +- GreenshotOfficePlugin/Destinations/OneNoteDestination.cs | 2 +- GreenshotOfficePlugin/Destinations/OutlookDestination.cs | 2 +- GreenshotOfficePlugin/Destinations/PowerpointDestination.cs | 2 +- GreenshotOfficePlugin/Destinations/WordDestination.cs | 2 +- GreenshotOfficePlugin/OfficeConfiguration.cs | 2 +- GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs | 2 +- GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs | 2 +- GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs | 2 +- GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs | 2 +- GreenshotOfficePlugin/OfficeExport/WordExporter.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs | 2 +- GreenshotOfficePlugin/OfficeInterop/WordInterop.cs | 2 +- GreenshotOfficePlugin/OfficePlugin.cs | 2 +- GreenshotOfficePlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs | 2 +- GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs | 2 +- GreenshotPhotobucketPlugin/Forms/SettingsForm.cs | 2 +- GreenshotPhotobucketPlugin/LanguageKeys.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketCredentials.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketDestination.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketInfo.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketPlugin.cs | 2 +- GreenshotPhotobucketPlugin/PhotobucketUtils.cs | 2 +- GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotPicasaPlugin/PicasaCredentials.cs | 2 +- GreenshotPicasaPlugin/Properties/AssemblyInfo.cs | 2 +- GreenshotPlugin/Controls/AnimatingForm.cs | 2 +- GreenshotPlugin/Controls/BackgroundForm.Designer.cs | 2 +- GreenshotPlugin/Controls/BackgroundForm.cs | 2 +- GreenshotPlugin/Controls/ExtendedWebBrowser.cs | 2 +- GreenshotPlugin/Controls/FormWithoutActivation.cs | 2 +- GreenshotPlugin/Controls/GreenshotButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotCheckBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotColumnSorter.cs | 2 +- GreenshotPlugin/Controls/GreenshotComboBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotForm.cs | 2 +- GreenshotPlugin/Controls/GreenshotGroupBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotLabel.cs | 2 +- GreenshotPlugin/Controls/GreenshotRadioButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotTabPage.cs | 2 +- GreenshotPlugin/Controls/GreenshotTextBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotToolStripButton.cs | 2 +- GreenshotPlugin/Controls/GreenshotToolStripLabel.cs | 2 +- GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs | 2 +- GreenshotPlugin/Controls/HotkeyControl.cs | 2 +- GreenshotPlugin/Controls/IGreenshotConfigBindable.cs | 2 +- GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs | 2 +- GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs | 2 +- GreenshotPlugin/Controls/OAuthLoginForm.cs | 2 +- GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs | 2 +- GreenshotPlugin/Controls/PleaseWaitForm.cs | 2 +- GreenshotPlugin/Controls/QualityDialog.Designer.cs | 2 +- GreenshotPlugin/Controls/QualityDialog.cs | 2 +- GreenshotPlugin/Controls/SaveImageFileDialog.cs | 2 +- GreenshotPlugin/Controls/ThumbnailForm.cs | 2 +- GreenshotPlugin/Core/AbstractDestination.cs | 2 +- GreenshotPlugin/Core/AbstractProcessor.cs | 2 +- GreenshotPlugin/Core/AccessibleHelper.cs | 2 +- GreenshotPlugin/Core/AnimationHelpers.cs | 2 +- GreenshotPlugin/Core/BinaryStructHelper.cs | 2 +- GreenshotPlugin/Core/Cache.cs | 2 +- GreenshotPlugin/Core/CaptureHandler.cs | 2 +- GreenshotPlugin/Core/ClipboardHelper.cs | 2 +- GreenshotPlugin/Core/CoreConfiguration.cs | 2 +- GreenshotPlugin/Core/CredentialsHelper.cs | 2 +- GreenshotPlugin/Core/DisplayKeyAttribute.cs | 2 +- GreenshotPlugin/Core/Effects.cs | 2 +- GreenshotPlugin/Core/EmailConfigHelper.cs | 2 +- GreenshotPlugin/Core/EnumExtensions.cs | 2 +- GreenshotPlugin/Core/EventDelay.cs | 2 +- GreenshotPlugin/Core/ExtensionAttribute.cs | 2 +- GreenshotPlugin/Core/FastBitmap.cs | 2 +- GreenshotPlugin/Core/FilenameHelper.cs | 2 +- GreenshotPlugin/Core/GreenshotResources.cs | 2 +- GreenshotPlugin/Core/IEHelper.cs | 2 +- GreenshotPlugin/Core/ImageHelper.cs | 2 +- GreenshotPlugin/Core/ImageOutput.cs | 2 +- GreenshotPlugin/Core/InterfaceUtils.cs | 2 +- GreenshotPlugin/Core/Language.cs | 2 +- GreenshotPlugin/Core/LogHelper.cs | 2 +- GreenshotPlugin/Core/NetworkHelper.cs | 2 +- GreenshotPlugin/Core/OAuthHelper.cs | 2 +- GreenshotPlugin/Core/Objects.cs | 2 +- GreenshotPlugin/Core/PluginUtils.cs | 2 +- GreenshotPlugin/Core/QuantizerHelper.cs | 2 +- GreenshotPlugin/Core/RssHelper.cs | 2 +- GreenshotPlugin/Core/StringExtensions.cs | 2 +- GreenshotPlugin/Core/WindowCapture.cs | 2 +- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLBodyElement.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument4.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLDocument5.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElement2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLElementCollection.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLFrameBase.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLRect.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLScreen2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLStyle.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLTxtRange.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow2.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow3.cs | 2 +- GreenshotPlugin/IEInterop/IHTMLWindow4.cs | 2 +- GreenshotPlugin/IEInterop/IWebBrowser2.cs | 2 +- GreenshotPlugin/IniFile/IniAttributes.cs | 2 +- GreenshotPlugin/IniFile/IniConfig.cs | 2 +- GreenshotPlugin/IniFile/IniReader.cs | 2 +- GreenshotPlugin/IniFile/IniSection.cs | 2 +- GreenshotPlugin/IniFile/IniValue.cs | 2 +- GreenshotPlugin/Interfaces/Capture.cs | 2 +- GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs | 2 +- GreenshotPlugin/Interfaces/Drawing/Container.cs | 2 +- GreenshotPlugin/Interfaces/Drawing/IField.cs | 2 +- GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs | 2 +- GreenshotPlugin/Interfaces/Drawing/IMemento.cs | 2 +- GreenshotPlugin/Interfaces/Forms/ImageEditor.cs | 2 +- GreenshotPlugin/Interfaces/Generic.cs | 2 +- GreenshotPlugin/Interfaces/IDestination.cs | 2 +- GreenshotPlugin/Interfaces/IProcessor.cs | 2 +- GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs | 2 +- GreenshotPlugin/Interop/COMWrapper.cs | 2 +- GreenshotPlugin/Interop/ComProgIdAttribute.cs | 2 +- GreenshotPlugin/Interop/IAppVisibility.cs | 2 +- GreenshotPlugin/Interop/IDispatch.cs | 2 +- GreenshotPlugin/Interop/IOleCommandTarget.cs | 2 +- GreenshotPlugin/Interop/IOleWindow.cs | 2 +- GreenshotPlugin/Interop/IServiceProvider.cs | 2 +- GreenshotPlugin/Interop/IUnknown.cs | 2 +- GreenshotPlugin/Properties/AssemblyInfo.cs | 4 ++-- GreenshotPlugin/UnmanagedHelpers/DWM.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Enumerations.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/GDIplus.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Kernel32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/PsAPI.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/User32.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs | 2 +- GreenshotPlugin/UnmanagedHelpers/WinMM.cs | 2 +- 389 files changed, 397 insertions(+), 397 deletions(-) diff --git a/Greenshot/AssemblyInfo.cs b/Greenshot/AssemblyInfo.cs index 584345572..efd0f77c8 100644 --- a/Greenshot/AssemblyInfo.cs +++ b/Greenshot/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index 1d1fe2df3..f019b44af 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs index a6c75441a..c2280f2f4 100644 --- a/Greenshot/Configuration/LanguageKeys.cs +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index e0edd9389..29387610c 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs index 8af03e193..639bb9637 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs index b0489f846..05df712b6 100644 --- a/Greenshot/Controls/BindableToolStripDropDownButton.cs +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index a0b988ab5..92f4c7d8b 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index 5970b115b..f3e110bb2 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs index 8f7e454af..bbf59f368 100644 --- a/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/CustomToolStripProfessionalRenderer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs index 18d2743c2..7b1e4183b 100644 --- a/Greenshot/Controls/FontFamilyComboBox.cs +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/MenuStripEx.cs b/Greenshot/Controls/MenuStripEx.cs index d2db0388c..b2b1d0fc1 100644 --- a/Greenshot/Controls/MenuStripEx.cs +++ b/Greenshot/Controls/MenuStripEx.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/NonJumpingPanel.cs b/Greenshot/Controls/NonJumpingPanel.cs index 3cc10d44b..8a4747adf 100644 --- a/Greenshot/Controls/NonJumpingPanel.cs +++ b/Greenshot/Controls/NonJumpingPanel.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index cf91299ad..f59b898f9 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index 5f29db4aa..c4d5d3808 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/ToolStripEx.cs b/Greenshot/Controls/ToolStripEx.cs index d8d319fc3..c93e51653 100644 --- a/Greenshot/Controls/ToolStripEx.cs +++ b/Greenshot/Controls/ToolStripEx.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Controls/ToolStripNumericUpDown.cs b/Greenshot/Controls/ToolStripNumericUpDown.cs index 35916c909..f368f8409 100644 --- a/Greenshot/Controls/ToolStripNumericUpDown.cs +++ b/Greenshot/Controls/ToolStripNumericUpDown.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/ClipboardDestination.cs b/Greenshot/Destinations/ClipboardDestination.cs index d6ec85b9b..147571e78 100644 --- a/Greenshot/Destinations/ClipboardDestination.cs +++ b/Greenshot/Destinations/ClipboardDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/EditorDestination.cs b/Greenshot/Destinations/EditorDestination.cs index e44373aa9..ac300f386 100644 --- a/Greenshot/Destinations/EditorDestination.cs +++ b/Greenshot/Destinations/EditorDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index 3d0cd7655..01593fded 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 8a8275274..0a70073cd 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/FileWithDialogDestination.cs b/Greenshot/Destinations/FileWithDialogDestination.cs index a12194788..a33332cca 100644 --- a/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/Greenshot/Destinations/FileWithDialogDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/PickerDestination.cs b/Greenshot/Destinations/PickerDestination.cs index cd3c68273..b185d112c 100644 --- a/Greenshot/Destinations/PickerDestination.cs +++ b/Greenshot/Destinations/PickerDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index 29698a70d..846d2bd99 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Adorners/AbstractAdorner.cs b/Greenshot/Drawing/Adorners/AbstractAdorner.cs index 03648a784..886abf937 100644 --- a/Greenshot/Drawing/Adorners/AbstractAdorner.cs +++ b/Greenshot/Drawing/Adorners/AbstractAdorner.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/Greenshot/Drawing/Adorners/MoveAdorner.cs b/Greenshot/Drawing/Adorners/MoveAdorner.cs index 998192a12..0cc39bb33 100644 --- a/Greenshot/Drawing/Adorners/MoveAdorner.cs +++ b/Greenshot/Drawing/Adorners/MoveAdorner.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/Greenshot/Drawing/Adorners/ResizeAdorner.cs b/Greenshot/Drawing/Adorners/ResizeAdorner.cs index 325d6de9d..ea6ab3843 100644 --- a/Greenshot/Drawing/Adorners/ResizeAdorner.cs +++ b/Greenshot/Drawing/Adorners/ResizeAdorner.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/Greenshot/Drawing/Adorners/TargetAdorner.cs b/Greenshot/Drawing/Adorners/TargetAdorner.cs index 27e499bac..cbb80e63a 100644 --- a/Greenshot/Drawing/Adorners/TargetAdorner.cs +++ b/Greenshot/Drawing/Adorners/TargetAdorner.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/Greenshot/Drawing/ArrowContainer.cs b/Greenshot/Drawing/ArrowContainer.cs index 93c05f5d5..e79475c6d 100644 --- a/Greenshot/Drawing/ArrowContainer.cs +++ b/Greenshot/Drawing/ArrowContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/CropContainer.cs b/Greenshot/Drawing/CropContainer.cs index 93464f18f..1eb22d151 100644 --- a/Greenshot/Drawing/CropContainer.cs +++ b/Greenshot/Drawing/CropContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/CursorContainer.cs b/Greenshot/Drawing/CursorContainer.cs index 58901cbf3..b1f67fd24 100644 --- a/Greenshot/Drawing/CursorContainer.cs +++ b/Greenshot/Drawing/CursorContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 73c59713a..7cdd62b61 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 35df2644b..8758c4885 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/EllipseContainer.cs b/Greenshot/Drawing/EllipseContainer.cs index 5389de37e..a2bc4b6ee 100644 --- a/Greenshot/Drawing/EllipseContainer.cs +++ b/Greenshot/Drawing/EllipseContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 203f590c3..3a8fd54bc 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index a4e5986ee..21922cc1b 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs index 6ec6bfd55..fd86f07b1 100644 --- a/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/AbstractBindingConverter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs index 2b7bb5fd9..3a3833d4b 100644 --- a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs index 9a0495f56..d7d8da778 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalDoublePercentageConverter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs index c2f58fd9d..1a9ce5de4 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalFloatConverter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs index 4507f0495..07b131088 100644 --- a/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/DecimalIntConverter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs index c791fe9b1..0811d9550 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingConverter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs index acc9808d6..ad0ac6215 100644 --- a/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/IBindingValidator.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs index c7e917aa4..971ae7b20 100644 --- a/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs +++ b/Greenshot/Drawing/Fields/Binding/NotNullValidator.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs index cee59f0c6..cf6c1b81b 100644 --- a/Greenshot/Drawing/Fields/Field.cs +++ b/Greenshot/Drawing/Fields/Field.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 748cf8576..e9ba4b282 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index 3090e3e51..1ed3b84fa 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/FilterContainer.cs b/Greenshot/Drawing/FilterContainer.cs index 13bf98888..b69af0a53 100644 --- a/Greenshot/Drawing/FilterContainer.cs +++ b/Greenshot/Drawing/FilterContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index e33aa0291..e648c4291 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/BlurFilter.cs b/Greenshot/Drawing/Filters/BlurFilter.cs index 92602695a..c45ac850e 100644 --- a/Greenshot/Drawing/Filters/BlurFilter.cs +++ b/Greenshot/Drawing/Filters/BlurFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/BrightnessFilter.cs b/Greenshot/Drawing/Filters/BrightnessFilter.cs index 3e8b0541a..b5154f783 100644 --- a/Greenshot/Drawing/Filters/BrightnessFilter.cs +++ b/Greenshot/Drawing/Filters/BrightnessFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/GrayscaleFilter.cs b/Greenshot/Drawing/Filters/GrayscaleFilter.cs index d89cd7ec0..c6318dc22 100644 --- a/Greenshot/Drawing/Filters/GrayscaleFilter.cs +++ b/Greenshot/Drawing/Filters/GrayscaleFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/HighlightFilter.cs b/Greenshot/Drawing/Filters/HighlightFilter.cs index a9cc5a5a8..41248b01f 100644 --- a/Greenshot/Drawing/Filters/HighlightFilter.cs +++ b/Greenshot/Drawing/Filters/HighlightFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/IFilter.cs b/Greenshot/Drawing/Filters/IFilter.cs index 87e713cb5..74895d582 100644 --- a/Greenshot/Drawing/Filters/IFilter.cs +++ b/Greenshot/Drawing/Filters/IFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/MagnifierFilter.cs b/Greenshot/Drawing/Filters/MagnifierFilter.cs index 79165133b..e0b69c263 100644 --- a/Greenshot/Drawing/Filters/MagnifierFilter.cs +++ b/Greenshot/Drawing/Filters/MagnifierFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Filters/PixelizationFilter.cs b/Greenshot/Drawing/Filters/PixelizationFilter.cs index 87e684884..5e4727af8 100644 --- a/Greenshot/Drawing/Filters/PixelizationFilter.cs +++ b/Greenshot/Drawing/Filters/PixelizationFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index eb97544e7..2f672a4ff 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index 8f5ce953c..2f77fc158 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index 0ef03b688..8e5647a08 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index 188588cc8..b9f08c28f 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/LineContainer.cs b/Greenshot/Drawing/LineContainer.cs index d8e458206..c443f64fc 100644 --- a/Greenshot/Drawing/LineContainer.cs +++ b/Greenshot/Drawing/LineContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index 57a2e5bd0..19782afab 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Positions.cs b/Greenshot/Drawing/Positions.cs index 63d7cb759..8ed2611bf 100644 --- a/Greenshot/Drawing/Positions.cs +++ b/Greenshot/Drawing/Positions.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index de06c9b78..d7e2cb37e 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs index 08b85632d..751cc9ea1 100644 --- a/Greenshot/Drawing/RoundedRectangle.cs +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 65d4adb35..7a4b368a9 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 2fe2e2425..002587b17 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/AboutForm.Designer.cs b/Greenshot/Forms/AboutForm.Designer.cs index 552a28af1..db85114e8 100644 --- a/Greenshot/Forms/AboutForm.Designer.cs +++ b/Greenshot/Forms/AboutForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index 05f4dbca1..8bca7f2eb 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool -* Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom +* Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/AnimatingBaseForm.cs b/Greenshot/Forms/AnimatingBaseForm.cs index a04532165..c97780417 100644 --- a/Greenshot/Forms/AnimatingBaseForm.cs +++ b/Greenshot/Forms/AnimatingBaseForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/BaseForm.cs b/Greenshot/Forms/BaseForm.cs index a230a6615..532f42bc9 100644 --- a/Greenshot/Forms/BaseForm.cs +++ b/Greenshot/Forms/BaseForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/BugReportForm.Designer.cs b/Greenshot/Forms/BugReportForm.Designer.cs index 6debe66ec..48d06fdc1 100644 --- a/Greenshot/Forms/BugReportForm.Designer.cs +++ b/Greenshot/Forms/BugReportForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/BugReportForm.cs b/Greenshot/Forms/BugReportForm.cs index 9683d3243..08c28c5ef 100644 --- a/Greenshot/Forms/BugReportForm.cs +++ b/Greenshot/Forms/BugReportForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/CaptureForm.Designer.cs b/Greenshot/Forms/CaptureForm.Designer.cs index 02f5780f8..5ec1d8903 100644 --- a/Greenshot/Forms/CaptureForm.Designer.cs +++ b/Greenshot/Forms/CaptureForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 566f1cd70..c77327948 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ColorDialog.Designer.cs b/Greenshot/Forms/ColorDialog.Designer.cs index bcc813c4b..ae06c722d 100644 --- a/Greenshot/Forms/ColorDialog.Designer.cs +++ b/Greenshot/Forms/ColorDialog.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index 889b38f7f..4c2bcbe9f 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs index 576162caf..687a20be1 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.Designer.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/DropShadowSettingsForm.cs b/Greenshot/Forms/DropShadowSettingsForm.cs index 3fe2c3450..78bb54864 100644 --- a/Greenshot/Forms/DropShadowSettingsForm.cs +++ b/Greenshot/Forms/DropShadowSettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index 3d5946ec2..5aaf34ab2 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index cd88ec793..df8120a6f 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/LanguageDialog.Designer.cs b/Greenshot/Forms/LanguageDialog.Designer.cs index 0c6bdbb97..20d61cbc3 100644 --- a/Greenshot/Forms/LanguageDialog.Designer.cs +++ b/Greenshot/Forms/LanguageDialog.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/LanguageDialog.cs b/Greenshot/Forms/LanguageDialog.cs index 0963b3d7f..ed77a1c8a 100644 --- a/Greenshot/Forms/LanguageDialog.cs +++ b/Greenshot/Forms/LanguageDialog.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/MainForm.Designer.cs b/Greenshot/Forms/MainForm.Designer.cs index f51b3bf87..0415a8070 100644 --- a/Greenshot/Forms/MainForm.Designer.cs +++ b/Greenshot/Forms/MainForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index b8a20ddc6..2bacaecce 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/MovableShowColorForm.cs b/Greenshot/Forms/MovableShowColorForm.cs index 325e37e1d..7547a04d0 100644 --- a/Greenshot/Forms/MovableShowColorForm.cs +++ b/Greenshot/Forms/MovableShowColorForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/PrintOptionsDialog.Designer.cs b/Greenshot/Forms/PrintOptionsDialog.Designer.cs index 0f087f50b..57071d867 100644 --- a/Greenshot/Forms/PrintOptionsDialog.Designer.cs +++ b/Greenshot/Forms/PrintOptionsDialog.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/PrintOptionsDialog.cs b/Greenshot/Forms/PrintOptionsDialog.cs index 36793fdc7..18313498e 100644 --- a/Greenshot/Forms/PrintOptionsDialog.cs +++ b/Greenshot/Forms/PrintOptionsDialog.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ResizeSettingsForm.Designer.cs b/Greenshot/Forms/ResizeSettingsForm.Designer.cs index d7003d606..6061844ff 100644 --- a/Greenshot/Forms/ResizeSettingsForm.Designer.cs +++ b/Greenshot/Forms/ResizeSettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ResizeSettingsForm.cs b/Greenshot/Forms/ResizeSettingsForm.cs index 379f7fc55..2b5489ff6 100644 --- a/Greenshot/Forms/ResizeSettingsForm.cs +++ b/Greenshot/Forms/ResizeSettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/SettingsForm.Designer.cs b/Greenshot/Forms/SettingsForm.Designer.cs index 9a76a3a7a..254209fb4 100644 --- a/Greenshot/Forms/SettingsForm.Designer.cs +++ b/Greenshot/Forms/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index c881960a0..9e7fd5ad4 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index ab6ddb071..88546a6bc 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs index 12e1817b1..fc966f257 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index 388ef2426..3b0bda4d3 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/GreenshotMain.cs b/Greenshot/GreenshotMain.cs index 9d018be16..849b01b1a 100644 --- a/Greenshot/GreenshotMain.cs +++ b/Greenshot/GreenshotMain.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Help/HelpFileLoader.cs b/Greenshot/Help/HelpFileLoader.cs index a8a2365df..a2ebf9331 100644 --- a/Greenshot/Help/HelpFileLoader.cs +++ b/Greenshot/Help/HelpFileLoader.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 9142cb0df..1247b825e 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/Colors.cs b/Greenshot/Helpers/Colors.cs index 6f072cd60..31ade9946 100644 --- a/Greenshot/Helpers/Colors.cs +++ b/Greenshot/Helpers/Colors.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/CopyData.cs b/Greenshot/Helpers/CopyData.cs index 0237b4744..1d489fd68 100644 --- a/Greenshot/Helpers/CopyData.cs +++ b/Greenshot/Helpers/CopyData.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index fd13e3d38..94402e936 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index 79e3a3bba..f772444a8 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/GeometryHelper.cs b/Greenshot/Helpers/GeometryHelper.cs index 1487fecf0..3818e7efd 100644 --- a/Greenshot/Helpers/GeometryHelper.cs +++ b/Greenshot/Helpers/GeometryHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/GuiRectangle.cs b/Greenshot/Helpers/GuiRectangle.cs index 6587ec452..b7af60ec0 100644 --- a/Greenshot/Helpers/GuiRectangle.cs +++ b/Greenshot/Helpers/GuiRectangle.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index 0511cb05c..6780190b2 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/IEInterop/IEContainer.cs b/Greenshot/Helpers/IEInterop/IEContainer.cs index 80f36413d..de77597a0 100644 --- a/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index f8cb29ae6..c639b2f8c 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/PluginHelper.cs b/Greenshot/Helpers/PluginHelper.cs index 0387a18f8..0143aa50f 100644 --- a/Greenshot/Helpers/PluginHelper.cs +++ b/Greenshot/Helpers/PluginHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index d84e2fb70..65c32e939 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/ProcessorHelper.cs b/Greenshot/Helpers/ProcessorHelper.cs index 70ffdd5de..dcd1a74e9 100644 --- a/Greenshot/Helpers/ProcessorHelper.cs +++ b/Greenshot/Helpers/ProcessorHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/ScaleHelper.cs b/Greenshot/Helpers/ScaleHelper.cs index fc01d8ba5..a946c012c 100644 --- a/Greenshot/Helpers/ScaleHelper.cs +++ b/Greenshot/Helpers/ScaleHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index 1f3d6b8ec..d1355d30c 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/StartupHelper.cs b/Greenshot/Helpers/StartupHelper.cs index b9aa52cce..8b9147edf 100644 --- a/Greenshot/Helpers/StartupHelper.cs +++ b/Greenshot/Helpers/StartupHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/ToolStripItemEndisabler.cs b/Greenshot/Helpers/ToolStripItemEndisabler.cs index 54a2e3418..f074f5e44 100644 --- a/Greenshot/Helpers/ToolStripItemEndisabler.cs +++ b/Greenshot/Helpers/ToolStripItemEndisabler.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/UpdateHelper.cs b/Greenshot/Helpers/UpdateHelper.cs index afb09df91..1d2231c39 100644 --- a/Greenshot/Helpers/UpdateHelper.cs +++ b/Greenshot/Helpers/UpdateHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Helpers/WindowWrapper.cs b/Greenshot/Helpers/WindowWrapper.cs index 0df6384c8..a1d7e74be 100644 --- a/Greenshot/Helpers/WindowWrapper.cs +++ b/Greenshot/Helpers/WindowWrapper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Languages/language-cs-CZ.xml b/Greenshot/Languages/language-cs-CZ.xml index e6d4abf9b..8b6b9a19f 100644 --- a/Greenshot/Languages/language-cs-CZ.xml +++ b/Greenshot/Languages/language-cs-CZ.xml @@ -5,7 +5,7 @@ Pokud se vám Greenshot líbí, uvítáme Vaší podporu Greenshot je hostován na GitHub Ikony pochází ze sady Yusuke Kamiyamane's Fugue (licence Creative Commons Attribution 3.0) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ABSOLUTNĚ BEZ ZÁRUKY. Toto je svobodný software, můžete jej dále šířit za určitých podmínek. Podrobnosti o GNU General Public License: O programu Greenshot diff --git a/Greenshot/Languages/language-de-DE.xml b/Greenshot/Languages/language-de-DE.xml index aba76288a..931cd2d5e 100644 --- a/Greenshot/Languages/language-de-DE.xml +++ b/Greenshot/Languages/language-de-DE.xml @@ -5,7 +5,7 @@ Wenn Sie Greenshot mögen, können Sie uns gerne unterstützen: Greenshot wird von GitHub gehostet unter Icons aus Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Für Greenshot besteht KEINERLEI GARANTIE. Greenshot ist freie Software, die Sie unter bestimmten Bedingungen weitergeben dürfen. Detaillierte Informationen zur GNU General Public License: Über Greenshot diff --git a/Greenshot/Languages/language-el-GR.xml b/Greenshot/Languages/language-el-GR.xml index ef7c74c5c..e248a55f3 100644 --- a/Greenshot/Languages/language-el-GR.xml +++ b/Greenshot/Languages/language-el-GR.xml @@ -5,7 +5,7 @@ Αν σας αρέσει το Greenshot, είστε ευπρόσδεκτοι να μας υποστηρίξετε: Το Greenshot φιλοξενείται από τη GitHub: Εικονίδια από Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Δεν παρέχεται ΚΑΜΙΑ ΕΓΓΥΗΣΗ για το Greenshot. Είναι ελεύθερο λογισμικό. Είστε ελεύθεροι να το αναδιανείμετε κάτω από ορισμένες συνθήκες. Λεπτομέρειες σχετικά με την GNU General Public License: Πληροφορίες για το Greenshot diff --git a/Greenshot/Languages/language-en-US.xml b/Greenshot/Languages/language-en-US.xml index 6d5d3dca3..5ee1945d9 100644 --- a/Greenshot/Languages/language-en-US.xml +++ b/Greenshot/Languages/language-en-US.xml @@ -5,7 +5,7 @@ If you like Greenshot, you are welcome to support us: Greenshot is hosted by GitHub at Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Details about the GNU General Public License: About Greenshot diff --git a/Greenshot/Languages/language-es-ES.xml b/Greenshot/Languages/language-es-ES.xml index f7b22990d..2a8dffc7d 100644 --- a/Greenshot/Languages/language-es-ES.xml +++ b/Greenshot/Languages/language-es-ES.xml @@ -5,7 +5,7 @@ Si te gusta Greenshot, te agradeceremos que nos ayudes: Greenshot está alojado en GitHub en Iconos del conjunto de iconos Fugue de Yusuke Kamiyamane(Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene ABSOLUTAMENTE SIN GARANTIA. Este es software gratuito, y eres bienvenido a redistribuirlo bajo ciertas condiciones. Detalles acerca de la Licencia General Publica GNU: Acerca de Greenshot diff --git a/Greenshot/Languages/language-fi-FI.xml b/Greenshot/Languages/language-fi-FI.xml index 5a4b02808..88384f60e 100644 --- a/Greenshot/Languages/language-fi-FI.xml +++ b/Greenshot/Languages/language-fi-FI.xml @@ -5,7 +5,7 @@ Jos pidät Greenshotista niin toivottavasti tuet meitä: Greenshot is hosted by GitHub at Ikonit ovat Yusuke Kamiyamane:n Fugue ikonisarjasta (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Details about the GNU General Public License: Tietoja Greenshotista diff --git a/Greenshot/Languages/language-fr-FR.xml b/Greenshot/Languages/language-fr-FR.xml index ab5849d65..c5e578993 100644 --- a/Greenshot/Languages/language-fr-FR.xml +++ b/Greenshot/Languages/language-fr-FR.xml @@ -5,7 +5,7 @@ Si vous aimez Greenshot, vous pouvez nous soutenir : Greenshot est hébergé par GitHub à Icônes provenant du lot d'icônes Fugue de Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license) - Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright © 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot vous est fourni SANS AUCUNE GARANTIE. C'est un logiciel gratuit que vous êtes libres de redistribuer sous certaines conditions. Détails de la GNU General Public License : À propos de Greenshot diff --git a/Greenshot/Languages/language-he-IL.xml b/Greenshot/Languages/language-he-IL.xml index 287f83946..b8e219bf0 100644 --- a/Greenshot/Languages/language-he-IL.xml +++ b/Greenshot/Languages/language-he-IL.xml @@ -5,7 +5,7 @@ :אם את\ה נהנה\ית משימוש בתוכנה, את\ה מוזמן לתרום לנו Greenshot is hosted by GitHub at Icons from Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Details about the GNU General Public License: Greenshot אודות התוכנה diff --git a/Greenshot/Languages/language-it-IT.xml b/Greenshot/Languages/language-it-IT.xml index 41a8b6a66..30aca7bfa 100644 --- a/Greenshot/Languages/language-it-IT.xml +++ b/Greenshot/Languages/language-it-IT.xml @@ -5,7 +5,7 @@ Se gradisci Greenshot, puoi darci il tuo aiuto su: Greenshot è disponibile su GitHub a Icone prese da Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot viene fornito SENZA ALCUNA GARANZIA. Questo è "free software", e potete ri-distribuirlo secondo certe condizioni. Dettagli sulla General Public License GNU: Notizie su Greenshot diff --git a/Greenshot/Languages/language-ja-JP.xml b/Greenshot/Languages/language-ja-JP.xml index 88eb4b242..bacd10fda 100644 --- a/Greenshot/Languages/language-ja-JP.xml +++ b/Greenshot/Languages/language-ja-JP.xml @@ -5,7 +5,7 @@ Greenshot がお気に召したなら、是非支援をお願いします : Greenshot は GitHub によって運営されています : 上山根 祐輔氏の Fugue Icons を使用しています (Creative Commons Attribution 3.0 license) : - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot には一切の保障がありません。GNU General Public License に定められた条件下で再配布をおこなうことができます。: Greenshot について Greenshot - the revolutionary screenshot utility diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index 709c30615..1d56f151f 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -5,7 +5,7 @@ Als U Greenshot goed vindt kunt U ons ondersteunen: Greenshot word gehost door GitHub op Iconen van de icon set van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot komt zonder enige garantie! Dit is gratis software, en U kunt het distribueren onder bepaalde voorwaarden. Details over de GNU General Public License: Over Greenshot diff --git a/Greenshot/Languages/language-pl-PL.xml b/Greenshot/Languages/language-pl-PL.xml index b9dc55886..356332bd4 100644 --- a/Greenshot/Languages/language-pl-PL.xml +++ b/Greenshot/Languages/language-pl-PL.xml @@ -5,7 +5,7 @@ Jeśli podoba Ci się Greenshot, chętnie przyjmiemy Twoje wsparcie: Greenshot jest utrzymywany przez GitHub pod adresem: Ikony z zestawu Fugue od Yusuke Kamiyamane (licencja Creative Commons Attribution 3.0): - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot nie jest objęty JAKĄKOLWIEK GWARANCJĄ. Jako wolne oprogramowanie może być rozpowszechniany na określonych warunkach. Szczegóły na temat Powszechnej Licencji Publicznej GNU: O Greenshot diff --git a/Greenshot/Languages/language-pt-BR.xml b/Greenshot/Languages/language-pt-BR.xml index e53dc2ca8..dea43a9b8 100644 --- a/Greenshot/Languages/language-pt-BR.xml +++ b/Greenshot/Languages/language-pt-BR.xml @@ -5,7 +5,7 @@ Se você gostou do Greenshot, por favor contribua: O Greenshot está armazenado no GitHub em Ícones de Yusuke Kamiyamane (Biblioteca Fugue, licença "Creative Commons Attribution 3.0") - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuido sob algumas condições. Detalhes sobre a licença GNU: Sobre o Greenshot diff --git a/Greenshot/Languages/language-pt-PT.xml b/Greenshot/Languages/language-pt-PT.xml index a39bdc7b4..8792f399f 100644 --- a/Greenshot/Languages/language-pt-PT.xml +++ b/Greenshot/Languages/language-pt-PT.xml @@ -5,7 +5,7 @@ Se gostou do Greenshot, por favor contribua: O Greenshot está armazenado no GitHub em Ícones da colecção Fugue de Yusuke Kamiyamane (Licença "Creative Commons Attribution 3.0") - Direitos de Autor (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Direitos de Autor (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom O Greenshot não tem NENHUMA GARANTIA. Este software gratuito pode ser redistribuído sob algumas condições. Detalhes sobre a licença GNU: Acerca do Greenshot diff --git a/Greenshot/Languages/language-sk-SK.xml b/Greenshot/Languages/language-sk-SK.xml index 9691b3d67..53e0e8a9f 100644 --- a/Greenshot/Languages/language-sk-SK.xml +++ b/Greenshot/Languages/language-sk-SK.xml @@ -5,7 +5,7 @@ Ak se vám Greenshot páči, uvítame vašu podporu: Greenshot je na GitHub Ikony z Yusuke Kamiyamane's Fugue icon set (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot je ÚPLNE BEZ ZÁRUKY. Toto je FREE software, a môžete ho distribuovať za určitých podmienok. Podrobnosti o GNU General Public License: O Greenshote diff --git a/Greenshot/Languages/language-sv-SE.xml b/Greenshot/Languages/language-sv-SE.xml index be5687fc3..f0ae0679c 100644 --- a/Greenshot/Languages/language-sv-SE.xml +++ b/Greenshot/Languages/language-sv-SE.xml @@ -5,7 +5,7 @@ Om du gillar Greenshot, så är du välkommen att stödja oss: Greenshots hemsida tillhandahålls av GitHub på Ikoner från "Yusuke Kamiyamane's Fugue icon set" (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot lämnar ABSOLUT INGA GARANTIER. Detta är ett gratisprogram, och du får vidaredistribuera programmet under vissa villkor. Detaljer om "GNU General Public License": Om Greenshot diff --git a/Greenshot/Languages/language-tr-TR.xml b/Greenshot/Languages/language-tr-TR.xml index a0c8783c3..6cbee3f0c 100644 --- a/Greenshot/Languages/language-tr-TR.xml +++ b/Greenshot/Languages/language-tr-TR.xml @@ -5,7 +5,7 @@ Greenshot'ı sevdiyseniz, bizi destekleyin: Greenshot GitHub üzerinde şu adreste barındırılmaktadır: Simgeler Yusuke Kamiyamane'nin Fugue simge setidir (Creative Commons Attribution 3.0 lisansı) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot HİÇ BİR GARANTİ vermez. Serbest bir yazılımdır ve belirli koşullar altında dağıtmakta serbestsiniz. GNU Genel Kamu Lisanslı hakkında daha fazla bilgi için: Greenshot Hakkında diff --git a/Greenshot/Languages/language-uk-UA.xml b/Greenshot/Languages/language-uk-UA.xml index 30ca49fe5..f238d536c 100644 --- a/Greenshot/Languages/language-uk-UA.xml +++ b/Greenshot/Languages/language-uk-UA.xml @@ -5,7 +5,7 @@ Якщо Вам подобається Greenshot, то можете підтримати нас: Greenshot is розташовується на GitHub Набір іконок Fugue від Yusuke Kamiyamane (ліцензія Creative Commons Attribution 3.0) - Авторство © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Авторство © 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot постачається АБСОЛЮТНО БЕЗ ҐАРАНТІЇ. Це вільне програмне забезпечення, Ви можете розповсюджувати його за певних умов. Подробиці Загальної Публічної Ліцензії GNU: Про Greenshot diff --git a/Greenshot/Languages/language-zh-TW.xml b/Greenshot/Languages/language-zh-TW.xml index ded5485cb..26b25065b 100644 --- a/Greenshot/Languages/language-zh-TW.xml +++ b/Greenshot/Languages/language-zh-TW.xml @@ -5,7 +5,7 @@ 如果您喜歡 Greenshot,歡迎您支持我們: Greenshot 的主機在 GitHub 網址是 圖片來源: Yusuke Kamiyamane's Fugue 圖示集 (Creative Commons Attribution 3.0 授權) - Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom Greenshot 不對這個程式做任何擔保。 這個程式是自由軟體,您可以在 GNU General Public License 下任意散佈本軟體。 關於GNU General Public License 詳細資料: 關於 Greenshot diff --git a/Greenshot/Memento/AddElementMemento.cs b/Greenshot/Memento/AddElementMemento.cs index 873408071..ff7aac4d1 100644 --- a/Greenshot/Memento/AddElementMemento.cs +++ b/Greenshot/Memento/AddElementMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/AddElementsMemento.cs b/Greenshot/Memento/AddElementsMemento.cs index ce566c3c2..5b3885f30 100644 --- a/Greenshot/Memento/AddElementsMemento.cs +++ b/Greenshot/Memento/AddElementsMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index 7314f097a..688baf81a 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/DeleteElementMemento.cs b/Greenshot/Memento/DeleteElementMemento.cs index e73700901..818d28264 100644 --- a/Greenshot/Memento/DeleteElementMemento.cs +++ b/Greenshot/Memento/DeleteElementMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/DeleteElementsMemento.cs b/Greenshot/Memento/DeleteElementsMemento.cs index d01bc3089..a42e06b36 100644 --- a/Greenshot/Memento/DeleteElementsMemento.cs +++ b/Greenshot/Memento/DeleteElementsMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index 123d260f0..48b94e91c 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs index ae5c2e07f..ea0752c68 100644 --- a/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs +++ b/Greenshot/Memento/SurfaceBackgroundChangeMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Memento/TextChangeMemento.cs b/Greenshot/Memento/TextChangeMemento.cs index dab958704..04d467716 100644 --- a/Greenshot/Memento/TextChangeMemento.cs +++ b/Greenshot/Memento/TextChangeMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/Greenshot/Processors/TitleFixProcessor.cs b/Greenshot/Processors/TitleFixProcessor.cs index f75d6c5d7..25495901e 100644 --- a/Greenshot/Processors/TitleFixProcessor.cs +++ b/Greenshot/Processors/TitleFixProcessor.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/BoxConfiguration.cs b/GreenshotBoxPlugin/BoxConfiguration.cs index 1707b1080..4745f2baa 100644 --- a/GreenshotBoxPlugin/BoxConfiguration.cs +++ b/GreenshotBoxPlugin/BoxConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/BoxCredentials.cs b/GreenshotBoxPlugin/BoxCredentials.cs index 47a221609..c2c625889 100644 --- a/GreenshotBoxPlugin/BoxCredentials.cs +++ b/GreenshotBoxPlugin/BoxCredentials.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/BoxDestination.cs b/GreenshotBoxPlugin/BoxDestination.cs index 2d4492fa9..f76a8bf96 100644 --- a/GreenshotBoxPlugin/BoxDestination.cs +++ b/GreenshotBoxPlugin/BoxDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/BoxEntities.cs b/GreenshotBoxPlugin/BoxEntities.cs index 99b51fe7a..b07282adf 100644 --- a/GreenshotBoxPlugin/BoxEntities.cs +++ b/GreenshotBoxPlugin/BoxEntities.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/BoxPlugin.cs b/GreenshotBoxPlugin/BoxPlugin.cs index 2e8a40719..314d2a0d8 100644 --- a/GreenshotBoxPlugin/BoxPlugin.cs +++ b/GreenshotBoxPlugin/BoxPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/BoxUtils.cs b/GreenshotBoxPlugin/BoxUtils.cs index 6737d1c28..b7910d0f7 100644 --- a/GreenshotBoxPlugin/BoxUtils.cs +++ b/GreenshotBoxPlugin/BoxUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/Forms/BoxForm.cs b/GreenshotBoxPlugin/Forms/BoxForm.cs index 42de01744..51473ad06 100644 --- a/GreenshotBoxPlugin/Forms/BoxForm.cs +++ b/GreenshotBoxPlugin/Forms/BoxForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs index 88c97a400..2eaf2b790 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.cs b/GreenshotBoxPlugin/Forms/SettingsForm.cs index 5cc5b4a3c..973620771 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/LanguageKeys.cs b/GreenshotBoxPlugin/LanguageKeys.cs index cade07532..a6e170688 100644 --- a/GreenshotBoxPlugin/LanguageKeys.cs +++ b/GreenshotBoxPlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs index b80f0bc86..2eda350e4 100644 --- a/GreenshotBoxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotBoxPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 128e30e01..1711970d1 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs index a57c52591..a64fbe8fd 100644 --- a/GreenshotConfluencePlugin/ConfluenceConfiguration.cs +++ b/GreenshotConfluencePlugin/ConfluenceConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index 18612c525..ea2594b29 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/ConfluencePlugin.cs b/GreenshotConfluencePlugin/ConfluencePlugin.cs index 4f1c7224e..4ba405800 100644 --- a/GreenshotConfluencePlugin/ConfluencePlugin.cs +++ b/GreenshotConfluencePlugin/ConfluencePlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index 6f699e8f1..b7fac032b 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index 8287d7c3b..1888030a1 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index a76402c79..deee806a0 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index 5eb08f4eb..cbaa66438 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index 01b6e0526..f1bf0d34a 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index 36d32ec7d..066f40334 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index 026990847..8308dfe43 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/LanguageKeys.cs b/GreenshotConfluencePlugin/LanguageKeys.cs index dd199103d..5f4213764 100644 --- a/GreenshotConfluencePlugin/LanguageKeys.cs +++ b/GreenshotConfluencePlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs index e3889aea4..17d53dec2 100644 --- a/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotConfluencePlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -32,7 +32,7 @@ using System.Security; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("Confluence Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotDropboxPlugin/DropBoxCredentials.cs b/GreenshotDropboxPlugin/DropBoxCredentials.cs index 51f497b7d..c02e848ca 100644 --- a/GreenshotDropboxPlugin/DropBoxCredentials.cs +++ b/GreenshotDropboxPlugin/DropBoxCredentials.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index c7437e703..5a96a3260 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index 2f22c0b4e..d6f9ab083 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs index 57199fc17..a484deb7b 100644 --- a/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs +++ b/GreenshotDropboxPlugin/DropboxPluginConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/DropboxUtils.cs b/GreenshotDropboxPlugin/DropboxUtils.cs index f85a5481b..49237374f 100644 --- a/GreenshotDropboxPlugin/DropboxUtils.cs +++ b/GreenshotDropboxPlugin/DropboxUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/Forms/DropboxForm.cs b/GreenshotDropboxPlugin/Forms/DropboxForm.cs index 4cc3c4e8c..c526d67d1 100644 --- a/GreenshotDropboxPlugin/Forms/DropboxForm.cs +++ b/GreenshotDropboxPlugin/Forms/DropboxForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.cs index 489df2fca..62e6bf25f 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/LanguageKeys.cs b/GreenshotDropboxPlugin/LanguageKeys.cs index de9325019..0cc9c5204 100644 --- a/GreenshotDropboxPlugin/LanguageKeys.cs +++ b/GreenshotDropboxPlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs index 367a86de3..44f4a108a 100644 --- a/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotDropboxPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index af223ebde..ea845fb6e 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index 526e4759f..a115815ca 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs index c8d5f0a89..b7971baaa 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandForm.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index c74ebd15d..51d637a12 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/IconCache.cs b/GreenshotExternalCommandPlugin/IconCache.cs index d7eac4410..1e931634d 100644 --- a/GreenshotExternalCommandPlugin/IconCache.cs +++ b/GreenshotExternalCommandPlugin/IconCache.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs index 2b3276214..61259677a 100644 --- a/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotExternalCommandPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -31,7 +31,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("External command Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs index 28ad2552a..7119086ff 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 9f4923f81..4d626e4f7 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs index d655815e0..2a34a4cf0 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index ed940646a..a5e794524 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/FlickrConfiguration.cs b/GreenshotFlickrPlugin/FlickrConfiguration.cs index e0751739b..3a5a53433 100644 --- a/GreenshotFlickrPlugin/FlickrConfiguration.cs +++ b/GreenshotFlickrPlugin/FlickrConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/FlickrCredentials.cs b/GreenshotFlickrPlugin/FlickrCredentials.cs index 74f57c320..2eb6aea2a 100644 --- a/GreenshotFlickrPlugin/FlickrCredentials.cs +++ b/GreenshotFlickrPlugin/FlickrCredentials.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/FlickrDestination.cs b/GreenshotFlickrPlugin/FlickrDestination.cs index c8eecb182..9edd0befe 100644 --- a/GreenshotFlickrPlugin/FlickrDestination.cs +++ b/GreenshotFlickrPlugin/FlickrDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/FlickrPlugin.cs b/GreenshotFlickrPlugin/FlickrPlugin.cs index 6a67d285f..ea6866ead 100644 --- a/GreenshotFlickrPlugin/FlickrPlugin.cs +++ b/GreenshotFlickrPlugin/FlickrPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/FlickrUtils.cs b/GreenshotFlickrPlugin/FlickrUtils.cs index bc3583f97..0cf84a58e 100644 --- a/GreenshotFlickrPlugin/FlickrUtils.cs +++ b/GreenshotFlickrPlugin/FlickrUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/Forms/FlickrForm.cs b/GreenshotFlickrPlugin/Forms/FlickrForm.cs index 09c8c5960..be50a03ca 100644 --- a/GreenshotFlickrPlugin/Forms/FlickrForm.cs +++ b/GreenshotFlickrPlugin/Forms/FlickrForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs index 7da57baf1..f87792173 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.cs index eeee6e223..874617db3 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/LanguageKeys.cs b/GreenshotFlickrPlugin/LanguageKeys.cs index 52c96b7f1..77590dc7c 100644 --- a/GreenshotFlickrPlugin/LanguageKeys.cs +++ b/GreenshotFlickrPlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs index 3ab4d632e..e507ea606 100644 --- a/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotFlickrPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/Forms/ImgurForm.cs b/GreenshotImgurPlugin/Forms/ImgurForm.cs index 2a8ce0956..f74815e2b 100644 --- a/GreenshotImgurPlugin/Forms/ImgurForm.cs +++ b/GreenshotImgurPlugin/Forms/ImgurForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs index 78350ec53..b9945c0a3 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index c086f5594..18a732fc0 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs index 59c12786a..6f867efc8 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index ca4fd4b9f..b2d678478 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 440c993d2..2c010adb7 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/ImgurCredentials.cs b/GreenshotImgurPlugin/ImgurCredentials.cs index 8d268154d..159a4e08a 100644 --- a/GreenshotImgurPlugin/ImgurCredentials.cs +++ b/GreenshotImgurPlugin/ImgurCredentials.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index 58d5ed38e..78177fd6e 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index 40dd8c029..c8e66cb35 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index d26083f35..895c482fd 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index ad314d05a..ed430bb99 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/LanguageKeys.cs b/GreenshotImgurPlugin/LanguageKeys.cs index bfc73e7ec..fbee74ad7 100644 --- a/GreenshotImgurPlugin/LanguageKeys.cs +++ b/GreenshotImgurPlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs index 2080d0fcb..f0234c49c 100644 --- a/GreenshotImgurPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotImgurPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -31,7 +31,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("Imgur Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs index 65fe4ab92..c19bf181d 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 3b5b458e2..2e6dd01ce 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/Forms/JiraFormBase.cs b/GreenshotJiraPlugin/Forms/JiraFormBase.cs index cd114513e..503304e66 100644 --- a/GreenshotJiraPlugin/Forms/JiraFormBase.cs +++ b/GreenshotJiraPlugin/Forms/JiraFormBase.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs index 98893e04b..10e184dc4 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/Forms/SettingsForm.cs b/GreenshotJiraPlugin/Forms/SettingsForm.cs index 673d4f4ea..7d128ea8a 100644 --- a/GreenshotJiraPlugin/Forms/SettingsForm.cs +++ b/GreenshotJiraPlugin/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 869f9129a..1f8e0bc31 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index cc4e980de..ba772e735 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -1,7 +1,7 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index 8326e320c..6a30f4fd7 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index af210db7b..d3bf3fbc2 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index 30e5df7d6..dba6ba1e5 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/LanguageKeys.cs b/GreenshotJiraPlugin/LanguageKeys.cs index a3204ae3e..8cbab218b 100644 --- a/GreenshotJiraPlugin/LanguageKeys.cs +++ b/GreenshotJiraPlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/Log4NetLogger.cs b/GreenshotJiraPlugin/Log4NetLogger.cs index 24cea3caf..1b7ce2661 100644 --- a/GreenshotJiraPlugin/Log4NetLogger.cs +++ b/GreenshotJiraPlugin/Log4NetLogger.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs index dc12030a2..5065d542c 100644 --- a/GreenshotJiraPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotJiraPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -31,7 +31,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("Jira Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index c1f6b8dc5..5b3624460 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 8a5004793..9f806c679 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRCommand/ModiInterop.cs b/GreenshotOCRCommand/ModiInterop.cs index 3f52c2127..be861b808 100644 --- a/GreenshotOCRCommand/ModiInterop.cs +++ b/GreenshotOCRCommand/ModiInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRCommand/Properties/AssemblyInfo.cs b/GreenshotOCRCommand/Properties/AssemblyInfo.cs index 80eb49a54..00eb68097 100644 --- a/GreenshotOCRCommand/Properties/AssemblyInfo.cs +++ b/GreenshotOCRCommand/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRPlugin/OCRConfiguration.cs b/GreenshotOCRPlugin/OCRConfiguration.cs index 64ee9ac37..75ccf0c14 100644 --- a/GreenshotOCRPlugin/OCRConfiguration.cs +++ b/GreenshotOCRPlugin/OCRConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRPlugin/OCRDestination.cs b/GreenshotOCRPlugin/OCRDestination.cs index 61242866b..d5388ee84 100644 --- a/GreenshotOCRPlugin/OCRDestination.cs +++ b/GreenshotOCRPlugin/OCRDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRPlugin/OCRForm.cs b/GreenshotOCRPlugin/OCRForm.cs index 26cb9b274..9be31a48e 100644 --- a/GreenshotOCRPlugin/OCRForm.cs +++ b/GreenshotOCRPlugin/OCRForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 93b7bffb4..745003da4 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs index f33072941..d895fbe59 100644 --- a/GreenshotOCRPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOCRPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -31,7 +31,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("OCR Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotOCRPlugin/SettingsForm.Designer.cs b/GreenshotOCRPlugin/SettingsForm.Designer.cs index 533315915..23506ad8b 100644 --- a/GreenshotOCRPlugin/SettingsForm.Designer.cs +++ b/GreenshotOCRPlugin/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index 438f6a1fb..a9782d256 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs index ef9637701..2da9e79fc 100644 --- a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs +++ b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs index 50ed481ba..a6656c3f3 100644 --- a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs index 7e65d3758..6c8c81848 100644 --- a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs index 1cacc070a..9adeb0a2c 100644 --- a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs +++ b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/Destinations/WordDestination.cs b/GreenshotOfficePlugin/Destinations/WordDestination.cs index 2c602caed..68cbacf79 100644 --- a/GreenshotOfficePlugin/Destinations/WordDestination.cs +++ b/GreenshotOfficePlugin/Destinations/WordDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeConfiguration.cs b/GreenshotOfficePlugin/OfficeConfiguration.cs index 52f277ae4..4f943c7c3 100644 --- a/GreenshotOfficePlugin/OfficeConfiguration.cs +++ b/GreenshotOfficePlugin/OfficeConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 34656850d..7bcd88497 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs index a2458b13b..aed3eea01 100644 --- a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index bd2ddd6cc..11768666b 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs index 8474e1c4a..713a73c90 100644 --- a/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/PowerpointExporter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index 30906e681..ba362f3cd 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs index 4c5b3b201..9e6292fae 100644 --- a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs index 3090c9591..6887d4374 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OfficeInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs index 2d1ecd0e7..ed00cfdb5 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OneNoteInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs index 1b3e90f2e..ee22eb68c 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs index 92481e605..4a5f64b71 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs index 681053801..be2aaa86a 100644 --- a/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/PowerpointInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs index 99433ebb3..2c2162cbf 100644 --- a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/OfficePlugin.cs b/GreenshotOfficePlugin/OfficePlugin.cs index 9536f93b4..76f661367 100644 --- a/GreenshotOfficePlugin/OfficePlugin.cs +++ b/GreenshotOfficePlugin/OfficePlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs index a9843cee7..034162b0e 100644 --- a/GreenshotOfficePlugin/Properties/AssemblyInfo.cs +++ b/GreenshotOfficePlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -31,7 +31,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("Office Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs index c58aa8d20..9997c273c 100644 --- a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs index 3f8530ed5..93cab0688 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs index ffb5209b9..d2a59e4e4 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/LanguageKeys.cs b/GreenshotPhotobucketPlugin/LanguageKeys.cs index d240fb14b..d8c6e1a3d 100644 --- a/GreenshotPhotobucketPlugin/LanguageKeys.cs +++ b/GreenshotPhotobucketPlugin/LanguageKeys.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs index bfb800cd7..5b284689b 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs index 1f95aeda1..2b4cee804 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketCredentials.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs index d822ef44e..fd35a3fca 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs index c23d4a351..2fa2883a2 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index b424a4d3e..531681a35 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs index c57946119..69613eb3d 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs index 036555ce1..6bfbb5a0d 100644 --- a/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPhotobucketPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -32,7 +32,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("Photobucket Plugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The PluginAttribute describes the "entryType" and if the plugin is configurable diff --git a/GreenshotPicasaPlugin/PicasaCredentials.cs b/GreenshotPicasaPlugin/PicasaCredentials.cs index 670ef7182..4389bed86 100644 --- a/GreenshotPicasaPlugin/PicasaCredentials.cs +++ b/GreenshotPicasaPlugin/PicasaCredentials.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs index 6eff2da00..350c36fe0 100644 --- a/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPicasaPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index 394866ec8..f3765e9c9 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs index 690420195..382b469ac 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.Designer.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index a34e443c9..5994f4f2d 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index a864d2974..8b8b886ad 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/FormWithoutActivation.cs b/GreenshotPlugin/Controls/FormWithoutActivation.cs index d0f13a6f0..86e1eac91 100644 --- a/GreenshotPlugin/Controls/FormWithoutActivation.cs +++ b/GreenshotPlugin/Controls/FormWithoutActivation.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotButton.cs b/GreenshotPlugin/Controls/GreenshotButton.cs index ad6920c91..223bd68c4 100644 --- a/GreenshotPlugin/Controls/GreenshotButton.cs +++ b/GreenshotPlugin/Controls/GreenshotButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotCheckBox.cs b/GreenshotPlugin/Controls/GreenshotCheckBox.cs index 5d6e7e1dd..58f61787c 100644 --- a/GreenshotPlugin/Controls/GreenshotCheckBox.cs +++ b/GreenshotPlugin/Controls/GreenshotCheckBox.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs index 98ccc1f10..4ebf2f521 100644 --- a/GreenshotPlugin/Controls/GreenshotColumnSorter.cs +++ b/GreenshotPlugin/Controls/GreenshotColumnSorter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotComboBox.cs b/GreenshotPlugin/Controls/GreenshotComboBox.cs index 565dd53fe..139ecac5e 100644 --- a/GreenshotPlugin/Controls/GreenshotComboBox.cs +++ b/GreenshotPlugin/Controls/GreenshotComboBox.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotForm.cs b/GreenshotPlugin/Controls/GreenshotForm.cs index 694f94233..f26605e83 100644 --- a/GreenshotPlugin/Controls/GreenshotForm.cs +++ b/GreenshotPlugin/Controls/GreenshotForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotGroupBox.cs b/GreenshotPlugin/Controls/GreenshotGroupBox.cs index e19bce5b9..33bb86073 100644 --- a/GreenshotPlugin/Controls/GreenshotGroupBox.cs +++ b/GreenshotPlugin/Controls/GreenshotGroupBox.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotLabel.cs b/GreenshotPlugin/Controls/GreenshotLabel.cs index bcc9b168a..94620faf3 100644 --- a/GreenshotPlugin/Controls/GreenshotLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotLabel.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotRadioButton.cs b/GreenshotPlugin/Controls/GreenshotRadioButton.cs index abeb80e0f..90ca3a531 100644 --- a/GreenshotPlugin/Controls/GreenshotRadioButton.cs +++ b/GreenshotPlugin/Controls/GreenshotRadioButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotTabPage.cs b/GreenshotPlugin/Controls/GreenshotTabPage.cs index 29ebf2908..09081cc0c 100644 --- a/GreenshotPlugin/Controls/GreenshotTabPage.cs +++ b/GreenshotPlugin/Controls/GreenshotTabPage.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotTextBox.cs b/GreenshotPlugin/Controls/GreenshotTextBox.cs index 411a595ba..85e52492d 100644 --- a/GreenshotPlugin/Controls/GreenshotTextBox.cs +++ b/GreenshotPlugin/Controls/GreenshotTextBox.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs index a9dd482aa..d333e2a65 100644 --- a/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolDropDownButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs index bfd5471a7..696f7eb4e 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripButton.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripButton.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs index 1ae92b903..32c0e6238 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripLabel.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs index 1dee4013a..c780a4ef3 100644 --- a/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs +++ b/GreenshotPlugin/Controls/GreenshotToolStripMenuItem.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 1fb7683d0..ac9becaab 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs index 462d4b74b..237ebd8d9 100644 --- a/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotConfigBindable.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs index 7a4b0f93f..134d381a7 100644 --- a/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs +++ b/GreenshotPlugin/Controls/IGreenshotLanguageBindable.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs index a46972a0d..9e5596e37 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index 6e5bdd46d..9c9bcf68d 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs index a66a66e30..cb8a3a705 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index cd2e6b0ba..2146a6247 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/QualityDialog.Designer.cs b/GreenshotPlugin/Controls/QualityDialog.Designer.cs index 23734de5f..cce46080a 100644 --- a/GreenshotPlugin/Controls/QualityDialog.Designer.cs +++ b/GreenshotPlugin/Controls/QualityDialog.Designer.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/QualityDialog.cs b/GreenshotPlugin/Controls/QualityDialog.cs index c636ecbfd..dc8a75f99 100644 --- a/GreenshotPlugin/Controls/QualityDialog.cs +++ b/GreenshotPlugin/Controls/QualityDialog.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/SaveImageFileDialog.cs b/GreenshotPlugin/Controls/SaveImageFileDialog.cs index 855ff2a04..10621c323 100644 --- a/GreenshotPlugin/Controls/SaveImageFileDialog.cs +++ b/GreenshotPlugin/Controls/SaveImageFileDialog.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index 846545ba6..72152185a 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index 256f7f042..42dbf812c 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/AbstractProcessor.cs b/GreenshotPlugin/Core/AbstractProcessor.cs index 667bce3f7..69b9a9298 100644 --- a/GreenshotPlugin/Core/AbstractProcessor.cs +++ b/GreenshotPlugin/Core/AbstractProcessor.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index 978e8f9b2..ed3422f4a 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/AnimationHelpers.cs b/GreenshotPlugin/Core/AnimationHelpers.cs index 401e72d1d..b63412632 100644 --- a/GreenshotPlugin/Core/AnimationHelpers.cs +++ b/GreenshotPlugin/Core/AnimationHelpers.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/BinaryStructHelper.cs b/GreenshotPlugin/Core/BinaryStructHelper.cs index 297bebf1b..390d029e0 100644 --- a/GreenshotPlugin/Core/BinaryStructHelper.cs +++ b/GreenshotPlugin/Core/BinaryStructHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index 3c815fcbd..0c5c09a78 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/CaptureHandler.cs b/GreenshotPlugin/Core/CaptureHandler.cs index da4dfa7ed..0f52bfe38 100644 --- a/GreenshotPlugin/Core/CaptureHandler.cs +++ b/GreenshotPlugin/Core/CaptureHandler.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 7765a57b6..ece141ab8 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index 70e0d4a16..a667fa349 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index ddff6d907..5f9eaa8ab 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/DisplayKeyAttribute.cs b/GreenshotPlugin/Core/DisplayKeyAttribute.cs index e66d7acff..fffd72c36 100644 --- a/GreenshotPlugin/Core/DisplayKeyAttribute.cs +++ b/GreenshotPlugin/Core/DisplayKeyAttribute.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs index 8cbf6862f..30924a9a2 100644 --- a/GreenshotPlugin/Core/Effects.cs +++ b/GreenshotPlugin/Core/Effects.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/EmailConfigHelper.cs b/GreenshotPlugin/Core/EmailConfigHelper.cs index 673b1a9b6..c5ce92d0b 100644 --- a/GreenshotPlugin/Core/EmailConfigHelper.cs +++ b/GreenshotPlugin/Core/EmailConfigHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/EnumExtensions.cs b/GreenshotPlugin/Core/EnumExtensions.cs index 3f4e605c0..26d8e0c16 100644 --- a/GreenshotPlugin/Core/EnumExtensions.cs +++ b/GreenshotPlugin/Core/EnumExtensions.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/EventDelay.cs b/GreenshotPlugin/Core/EventDelay.cs index 9c7d03368..b02d4317b 100644 --- a/GreenshotPlugin/Core/EventDelay.cs +++ b/GreenshotPlugin/Core/EventDelay.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/ExtensionAttribute.cs b/GreenshotPlugin/Core/ExtensionAttribute.cs index 69916ac74..147e9a007 100644 --- a/GreenshotPlugin/Core/ExtensionAttribute.cs +++ b/GreenshotPlugin/Core/ExtensionAttribute.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index e86f28d72..564a4e4d4 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index d927178f9..9e890ce76 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/GreenshotResources.cs b/GreenshotPlugin/Core/GreenshotResources.cs index 5528b788d..a4e2dae85 100644 --- a/GreenshotPlugin/Core/GreenshotResources.cs +++ b/GreenshotPlugin/Core/GreenshotResources.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/IEHelper.cs b/GreenshotPlugin/Core/IEHelper.cs index 43bffff57..2f3a2ea2f 100644 --- a/GreenshotPlugin/Core/IEHelper.cs +++ b/GreenshotPlugin/Core/IEHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index ae402090c..2918a6f4b 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index c4419814e..354db0e57 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/InterfaceUtils.cs b/GreenshotPlugin/Core/InterfaceUtils.cs index 2e993a57d..ef5fec356 100644 --- a/GreenshotPlugin/Core/InterfaceUtils.cs +++ b/GreenshotPlugin/Core/InterfaceUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 18d718620..53f11b6cd 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index b1091f47a..306d4cbf0 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 993e63927..776fb9f5d 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index ad8241009..9cf5d8876 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/Objects.cs b/GreenshotPlugin/Core/Objects.cs index 3727d4ef9..8a56ea73c 100644 --- a/GreenshotPlugin/Core/Objects.cs +++ b/GreenshotPlugin/Core/Objects.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index b946b37aa..0758215a8 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index 09fd91560..09b1ee0d2 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/RssHelper.cs b/GreenshotPlugin/Core/RssHelper.cs index f2293b6dd..d4480b877 100644 --- a/GreenshotPlugin/Core/RssHelper.cs +++ b/GreenshotPlugin/Core/RssHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index f2d5097b0..832acb07b 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index 199eb7333..48f0e31ad 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 5a63b299c..34ddd8d94 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs index e5954ddda..e92e1507d 100644 --- a/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs +++ b/GreenshotPlugin/Core/WmInputLangChangeRequestFilter.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs index 6121c851b..4fccbc924 100644 --- a/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLBodyElement.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs index d7e631f37..eaeda59bf 100644 --- a/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLCurrentStyle.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument.cs b/GreenshotPlugin/IEInterop/IHTMLDocument.cs index eb6e2f1c4..d78705978 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs index 6712f82ba..b0992091d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument2.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs index 1b510a80e..92c4a349d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument3.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs index 76c895dce..1637e5f21 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument4.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs index e8e3a3171..1406fa82f 100644 --- a/GreenshotPlugin/IEInterop/IHTMLDocument5.cs +++ b/GreenshotPlugin/IEInterop/IHTMLDocument5.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLElement.cs b/GreenshotPlugin/IEInterop/IHTMLElement.cs index 77deef016..dce6a7e30 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLElement2.cs b/GreenshotPlugin/IEInterop/IHTMLElement2.cs index 8b564d09c..336d454e2 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElement2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElement2.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs index 00eb7d376..405e4da6d 100644 --- a/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs +++ b/GreenshotPlugin/IEInterop/IHTMLElementCollection.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs index 796e37a15..d2971c433 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFrameBase.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs index 46cdfb3f4..d3aadf864 100644 --- a/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLFramesCollection2.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLRect.cs b/GreenshotPlugin/IEInterop/IHTMLRect.cs index 6d7907850..7fecba3c6 100644 --- a/GreenshotPlugin/IEInterop/IHTMLRect.cs +++ b/GreenshotPlugin/IEInterop/IHTMLRect.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen.cs b/GreenshotPlugin/IEInterop/IHTMLScreen.cs index 2f07c0891..2f3438448 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs index 949a5fe03..90c09aee2 100644 --- a/GreenshotPlugin/IEInterop/IHTMLScreen2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLScreen2.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs index 7de9cc819..f1ca0a053 100644 --- a/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs +++ b/GreenshotPlugin/IEInterop/IHTMLSelectionObject.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLStyle.cs b/GreenshotPlugin/IEInterop/IHTMLStyle.cs index 7bef90a83..6d2cc6c10 100644 --- a/GreenshotPlugin/IEInterop/IHTMLStyle.cs +++ b/GreenshotPlugin/IEInterop/IHTMLStyle.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs index 147a2cde0..f51c1e9d5 100644 --- a/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs +++ b/GreenshotPlugin/IEInterop/IHTMLTxtRange.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs index a8baece76..d9511e1fa 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow2.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow2.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs index 9247a710f..9d07da6f6 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow3.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow3.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs index fd853646a..aa59f41b1 100644 --- a/GreenshotPlugin/IEInterop/IHTMLWindow4.cs +++ b/GreenshotPlugin/IEInterop/IHTMLWindow4.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IEInterop/IWebBrowser2.cs b/GreenshotPlugin/IEInterop/IWebBrowser2.cs index 659a899ba..63548a244 100644 --- a/GreenshotPlugin/IEInterop/IWebBrowser2.cs +++ b/GreenshotPlugin/IEInterop/IWebBrowser2.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IniFile/IniAttributes.cs b/GreenshotPlugin/IniFile/IniAttributes.cs index 01b119404..801d42994 100644 --- a/GreenshotPlugin/IniFile/IniAttributes.cs +++ b/GreenshotPlugin/IniFile/IniAttributes.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index 2841faf61..2ada973d9 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IniFile/IniReader.cs b/GreenshotPlugin/IniFile/IniReader.cs index 75c683617..23346f605 100644 --- a/GreenshotPlugin/IniFile/IniReader.cs +++ b/GreenshotPlugin/IniFile/IniReader.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IniFile/IniSection.cs b/GreenshotPlugin/IniFile/IniSection.cs index 0c5c1bbf6..74b9c7cf8 100644 --- a/GreenshotPlugin/IniFile/IniSection.cs +++ b/GreenshotPlugin/IniFile/IniSection.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index 5be58f928..227ec0c3a 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Capture.cs b/GreenshotPlugin/Interfaces/Capture.cs index c8170ceb9..0f6cf7ee8 100644 --- a/GreenshotPlugin/Interfaces/Capture.cs +++ b/GreenshotPlugin/Interfaces/Capture.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs b/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs index 27f825de4..2879ade61 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Adorners/IAdorner.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 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/ diff --git a/GreenshotPlugin/Interfaces/Drawing/Container.cs b/GreenshotPlugin/Interfaces/Drawing/Container.cs index 02e52cd65..3a5630710 100644 --- a/GreenshotPlugin/Interfaces/Drawing/Container.cs +++ b/GreenshotPlugin/Interfaces/Drawing/Container.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Drawing/IField.cs b/GreenshotPlugin/Interfaces/Drawing/IField.cs index 515c8b107..5a8f0a673 100644 --- a/GreenshotPlugin/Interfaces/Drawing/IField.cs +++ b/GreenshotPlugin/Interfaces/Drawing/IField.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs b/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs index 5e6f9e15b..735b4717e 100644 --- a/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs +++ b/GreenshotPlugin/Interfaces/Drawing/IFieldholder.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Drawing/IMemento.cs b/GreenshotPlugin/Interfaces/Drawing/IMemento.cs index 5e3588e20..40ab2452f 100644 --- a/GreenshotPlugin/Interfaces/Drawing/IMemento.cs +++ b/GreenshotPlugin/Interfaces/Drawing/IMemento.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs index 242827792..db12e66c9 100644 --- a/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs +++ b/GreenshotPlugin/Interfaces/Forms/ImageEditor.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 5d7b83b5d..a72142006 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index 8abae8940..08fc85f57 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/IProcessor.cs b/GreenshotPlugin/Interfaces/IProcessor.cs index e74989c9e..dd21899cd 100644 --- a/GreenshotPlugin/Interfaces/IProcessor.cs +++ b/GreenshotPlugin/Interfaces/IProcessor.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index 5e632ca71..c0956a359 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 2c723440c..ff9693a8e 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/ComProgIdAttribute.cs b/GreenshotPlugin/Interop/ComProgIdAttribute.cs index a3d39a52b..620ad8e0d 100644 --- a/GreenshotPlugin/Interop/ComProgIdAttribute.cs +++ b/GreenshotPlugin/Interop/ComProgIdAttribute.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/IAppVisibility.cs b/GreenshotPlugin/Interop/IAppVisibility.cs index f06c452d5..4b898562d 100644 --- a/GreenshotPlugin/Interop/IAppVisibility.cs +++ b/GreenshotPlugin/Interop/IAppVisibility.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/IDispatch.cs b/GreenshotPlugin/Interop/IDispatch.cs index bd3b5aabf..5ff24a865 100644 --- a/GreenshotPlugin/Interop/IDispatch.cs +++ b/GreenshotPlugin/Interop/IDispatch.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/IOleCommandTarget.cs b/GreenshotPlugin/Interop/IOleCommandTarget.cs index 8a2f7d45f..4c297a7d4 100644 --- a/GreenshotPlugin/Interop/IOleCommandTarget.cs +++ b/GreenshotPlugin/Interop/IOleCommandTarget.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/IOleWindow.cs b/GreenshotPlugin/Interop/IOleWindow.cs index ba2105f17..28100d193 100644 --- a/GreenshotPlugin/Interop/IOleWindow.cs +++ b/GreenshotPlugin/Interop/IOleWindow.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/IServiceProvider.cs b/GreenshotPlugin/Interop/IServiceProvider.cs index 207d02d55..1c0e69777 100644 --- a/GreenshotPlugin/Interop/IServiceProvider.cs +++ b/GreenshotPlugin/Interop/IServiceProvider.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Interop/IUnknown.cs b/GreenshotPlugin/Interop/IUnknown.cs index a13d15287..a5781e647 100644 --- a/GreenshotPlugin/Interop/IUnknown.cs +++ b/GreenshotPlugin/Interop/IUnknown.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/Properties/AssemblyInfo.cs b/GreenshotPlugin/Properties/AssemblyInfo.cs index 789d9f703..6d91d5373 100644 --- a/GreenshotPlugin/Properties/AssemblyInfo.cs +++ b/GreenshotPlugin/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -30,7 +30,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("GreenshotPlugin")] -[assembly: AssemblyCopyright("Copyright (C) 2007-2015")] +[assembly: AssemblyCopyright("Copyright (C) 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/GreenshotPlugin/UnmanagedHelpers/DWM.cs b/GreenshotPlugin/UnmanagedHelpers/DWM.cs index 22b9c4486..3a809713a 100644 --- a/GreenshotPlugin/UnmanagedHelpers/DWM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/DWM.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index a2139906d..c5bcb7daa 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index 30ab46857..036bc33a2 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs index 171c12f31..fa62f1224 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs index a0b097a65..bdae3c043 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Kernel32.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs index 9e0bdba0b..fa5b832e0 100644 --- a/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs +++ b/GreenshotPlugin/UnmanagedHelpers/PsAPI.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index 037e3d40e..b78b22ed1 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index e3d06d1fa..ea9abc1fd 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index ea14a6674..5d26374a7 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index 6c9b802d4..25480d7eb 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot diff --git a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs index be2451c21..7050e6007 100644 --- a/GreenshotPlugin/UnmanagedHelpers/WinMM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/WinMM.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot From 253e53b8fc8327a2ab93f6fe5c5412d505d137c4 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 14:44:58 +0200 Subject: [PATCH 095/170] Removed unneeded languages. --- .../releases/innosetup/scripts/products.iss | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/Greenshot/releases/innosetup/scripts/products.iss b/Greenshot/releases/innosetup/scripts/products.iss index f614f791a..b7b12d6a3 100644 --- a/Greenshot/releases/innosetup/scripts/products.iss +++ b/Greenshot/releases/innosetup/scripts/products.iss @@ -6,72 +6,52 @@ DependenciesDir=MyProgramDependencies en.depdownload_msg=The following applications are required before setup can continue:%n%n%1%nDownload and install now? de.depdownload_msg=Die folgenden Programme werden bentigt bevor das Setup fortfahren kann:%n%n%1%nJetzt downloaden und installieren? fr.depdownload_msg=Les applications suivantes sont ncessaires avant l'installation peut continuer:%n%n%1%nTlchargement et installer maintenant? -it.depdownload_msg=Le seguenti applicazioni sono necessari per continuare l'installazione:%n%n%1%nScarica ed installare ora? nl.depdownload_msg=De volgende toepassingen zijn nodig vr de installatie kunt doorgaan:%n%n%1%nDownload en installeer nu? -pl.depdownload_msg=Ponisze aplikacje s wymagane przed instalacj aby mc kontynuowa:%n%n%1%nCzy pobra je i zainstalowa teraz? en.depdownload_memo_title=Download dependencies de.depdownload_memo_title=Abhngigkeiten downloaden fr.depdownload_memo_title=Tlcharger les dpendances -it.depdownload_memo_title=Scarica le dipendenze nl.depdownload_memo_title=Download afhankelijkheden -pl.depdownload_memo_title=Pobierz zalenoci en.depinstall_memo_title=Install dependencies de.depinstall_memo_title=Abhngigkeiten installieren fr.depinstall_memo_title=Installez les dpendances -it.depinstall_memo_title=installare le dipendenze nl.depinstall_memo_title=Installeer afhankelijkheden -pl.depinstall_memo_title=Zainstaluj zalenoci en.depinstall_title=Installing dependencies de.depinstall_title=Installiere Abhngigkeiten fr.depinstall_title=Installation des dpendances -it.depinstall_title=installare le dipendenze nl.depinstall_title=Installeer afhankelijkheden -pl.depinstall_title=Instalowanie zalenoci en.depinstall_description=Please wait while Setup installs dependencies on your computer. de.depinstall_description=Warten Sie bitte whrend Abhngigkeiten auf Ihrem Computer installiert wird. fr.depinstall_description=S'il vous plat patienter pendant que le programme d'installation installe les dpendances sur votre ordinateur. -it.depinstall_description=Per favore attendi che viene installato sul computer dipendenze. nl.depinstall_description=Een moment geduld aub Setup installeert afhankelijkheden op uw computer. -pl.depinstall_description=Instalator instaluje zalenoci na komputerze, czekaj. en.depinstall_status=Installing %1... de.depinstall_status=Installiere %1... fr.depinstall_status=Installation %1... -it.depinstall_status=installazione %1... nl.depinstall_status=Installeren %1... -pl.depinstall_status=Instalowanie %1.... en.depinstall_missing=%1 must be installed before setup can continue. Please install %1 and run Setup again. de.depinstall_missing=%1 muss installiert werden bevor das Setup fortfahren kann. Bitte installieren Sie %1 und starten Sie das Setup erneut. fr.depinstall_missing=%1 doit tre install avant l'installation peut continuer. S'il vous plat installer %1 et excutez nouveau le programme d'installation. -it.depinstall_missing=%1 deve essere installato per continuare l'installazione. Si prega di installare %1 ed eseguire nuovamente l'installazione. nl.depinstall_missing=%1 moet worden genstalleerd vr de installatie kan worden voortgezet. Installeer %1 en voer Setup opnieuw uit. -pl.depinstall_missing=%1 musi by zainstalowany przed instalacj, aby moga ona by kontynuowana. Zainstaluj %1 i ponownie uruchom program instalacyjny. en.depinstall_error=An error occured while installing the dependencies. Please restart the computer and run the setup again or install the following dependencies manually:%n de.depinstall_error=Ein Fehler ist whrend der Installation der Abghngigkeiten aufgetreten. Bitte starten Sie den Computer neu und fhren Sie das Setup erneut aus oder installieren Sie die folgenden Abhngigkeiten per Hand:%n fr.depinstall_error=Une erreur est survenue lors de l'installation des dpendances . S'il vous plat redmarrer l'ordinateur et excuter nouveau le programme d'installation ou installer les dpendances suivantes manuellement:%n -it.depinstall_error= verificato un errore durante l'installazione le dipendenze . Si prega di riavviare il computer ed eseguire nuovamente la configurazione o installare le seguenti dipendenze manualmente:%n nl.depinstall_error=Er is een fout opgetreden tijdens het installeren van de afhankelijkheden. Gelieve de computer opnieuw op en voer de installatie opnieuw uit of de volgende afhankelijkheden handmatig installeren:%n -pl.depinstall_error=Wystpi bd podczas instalowania zalenoci. Uruchom ponownie komputer, a nastpnie ponownie uruchom program instalacyjny lub rcznie zainstaluj nastpujce programy:%n en.isxdl_langfile= de.isxdl_langfile=german.ini fr.isxdl_langfile=french3.ini -it.isxdl_langfile=italian.ini nl.isxdl_langfile=dutch.ini -pl.isxdl_langfile=polish.ini [Files] Source: "scripts\isxdl\german.ini"; Flags: dontcopy Source: "scripts\isxdl\french3.ini"; Flags: dontcopy -Source: "scripts\isxdl\italian.ini"; Flags: dontcopy Source: "scripts\isxdl\dutch.ini"; Flags: dontcopy -Source: "scripts\isxdl\polish.ini"; Flags: dontcopy [Code] type From 4ff244a84a41c5f99f2f49bfebefe14e4b76bd44 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 14:47:41 +0200 Subject: [PATCH 096/170] Fix for typo in installer script template --- Greenshot/releases/innosetup/setup.iss.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 79d79d3b1..479f94f5c 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -348,7 +348,7 @@ Name: "custom"; Description: "{code:CustomInstall}"; Flags: iscustom Name: "greenshot"; Description: "Greenshot"; Types: default full compact custom; Flags: fixed Name: "plugins\office"; Description: {cm:office}; Types: default full custom; Flags: disablenouninstallwarning Name: "plugins\ocr"; Description: {cm:ocr}; Types: default full custom; Flags: disablenouninstallwarning -Name: "plugins\jira"; Description: {cm:jira}; Types: full custom; Flags: disablenouninstallwarning Check: hasDotNet45OrHigher() +Name: "plugins\jira"; Description: {cm:jira}; Types: full custom; Flags: disablenouninstallwarning; Check: hasDotNet45OrHigher() Name: "plugins\imgur"; Description: {cm:imgur}; Types: default full custom; Flags: disablenouninstallwarning Name: "plugins\confluence"; Description: {cm:confluence}; Types: full custom; Flags: disablenouninstallwarning; Check: hasDotNet35FullOrHigher() Name: "plugins\externalcommand"; Description: {cm:externalcommand}; Types: default full custom; Flags: disablenouninstallwarning From 34899c2f0cb59ab12e56f436d9f29c8fbc332c7d Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 14:55:35 +0200 Subject: [PATCH 097/170] Fixed last minute error in the Jira plugin. --- GreenshotJiraPlugin/Forms/JiraForm.cs | 1 - GreenshotJiraPlugin/GreenshotJiraPlugin.csproj | 4 ++-- GreenshotJiraPlugin/packages.config | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 2e6dd01ce..109d4d110 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -141,7 +141,6 @@ namespace GreenshotJiraPlugin.Forms { IList issues = null; try { - JiraConfig.ExpandSearch = new[] { "*all" }; var searchResult = await _jiraConnector.SearchAsync(filter.Jql, fields: new [] { "summary,reporter,assignee,created"}); issues = searchResult.Issues; } diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 2a8352d14..78ffaad6b 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -38,8 +38,8 @@ ..\packages\Dapplo.HttpExtensions.0.5.31\lib\net45\Dapplo.HttpExtensions.dll True - - ..\packages\Dapplo.Jira.0.1.56\lib\net45\Dapplo.Jira.dll + + ..\packages\Dapplo.Jira.0.1.57\lib\net45\Dapplo.Jira.dll True diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 3a2206f53..16bfb9d03 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,7 +1,7 @@  - + \ No newline at end of file From 3b58f61a0dfb72771264744565b20be15010b2da Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 17 Aug 2016 15:09:51 +0200 Subject: [PATCH 098/170] Fixed wrong Jira field selection. --- GreenshotJiraPlugin/Forms/JiraForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 109d4d110..b4c99e49b 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -141,7 +141,7 @@ namespace GreenshotJiraPlugin.Forms { IList issues = null; try { - var searchResult = await _jiraConnector.SearchAsync(filter.Jql, fields: new [] { "summary,reporter,assignee,created"}); + var searchResult = await _jiraConnector.SearchAsync(filter.Jql, fields: new [] { "summary", "reporter", "assignee", "created" }); issues = searchResult.Issues; } catch (Exception ex) From e18951569dbe009212c2049caa2c2c2e32043106 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 18 Aug 2016 09:28:08 +0200 Subject: [PATCH 099/170] BUG-1762, FEATURE-964, FEATURE-860: Add right click on drop-shadow or torn-edge brings up the settings, left-click or the hotkey (Ctrl + Q for Dropshadow, Ctrl + T for Torn-Edge) will apply directly with the previous/default settings. --- Greenshot/Forms/ImageEditorForm.Designer.cs | 4 +- Greenshot/Forms/ImageEditorForm.cs | 64 +++++++++++++------ .../additional_files/readme.txt.template | 1 + 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index 5aaf34ab2..bad17280b 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -464,13 +464,13 @@ namespace Greenshot { // this.addDropshadowToolStripMenuItem.LanguageKey = "editor_image_shadow"; this.addDropshadowToolStripMenuItem.Name = "addDropshadowToolStripMenuItem"; - this.addDropshadowToolStripMenuItem.Click += new System.EventHandler(this.AddDropshadowToolStripMenuItemClick); + this.addDropshadowToolStripMenuItem.MouseUp += AddDropshadowToolStripMenuItemMouseUp; // // tornEdgesToolStripMenuItem // this.tornEdgesToolStripMenuItem.LanguageKey = "editor_torn_edge"; this.tornEdgesToolStripMenuItem.Name = "tornEdgesToolStripMenuItem"; - this.tornEdgesToolStripMenuItem.Click += new System.EventHandler(this.TornEdgesToolStripMenuItemClick); + this.tornEdgesToolStripMenuItem.MouseUp += TornEdgesToolStripMenuItemMouseUp; // // grayscaleToolStripMenuItem // diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index df8120a6f..cfa1ee0b2 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -839,13 +839,13 @@ namespace Greenshot { RedoToolStripMenuItemClick(sender, e); break; case Keys.Q: // Dropshadow Ctrl + Q - AddDropshadowToolStripMenuItemClick(sender, e); + AddDropshadowToolStripMenuItemMouseUp(sender, new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0)); break; case Keys.B: // Border Ctrl + B AddBorderToolStripMenuItemClick(sender, e); break; case Keys.T: // Torn edge Ctrl + T - TornEdgesToolStripMenuItemClick(sender, e); + TornEdgesToolStripMenuItemMouseUp(sender, new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0)); break; case Keys.I: // Invert Ctrl + I InvertToolStripMenuItemClick(sender, e); @@ -1345,26 +1345,40 @@ namespace Greenshot { /// This is used when the dropshadow button is used /// /// - /// - private void AddDropshadowToolStripMenuItemClick(object sender, EventArgs e) { - DropShadowEffect dropShadowEffect = EditorConfiguration.DropShadowEffectSettings; - // TODO: Use the dropshadow settings form to make it possible to change the default values - DialogResult result = new DropShadowSettingsForm(dropShadowEffect).ShowDialog(this); - if (result == DialogResult.OK) { + /// MouseEventArgs + private void AddDropshadowToolStripMenuItemMouseUp(object sender, MouseEventArgs e) + { + var dropShadowEffect = EditorConfiguration.DropShadowEffectSettings; + bool apply; + switch (e.Button) + { + case MouseButtons.Left: + apply = true; + break; + case MouseButtons.Right: + var result = new DropShadowSettingsForm(dropShadowEffect).ShowDialog(this); + apply = result == DialogResult.OK; + break; + default: + return; + } + + if (apply) + { _surface.ApplyBitmapEffect(dropShadowEffect); UpdateUndoRedoSurfaceDependencies(); } } + /// /// Open the resize settings from, and resize if ok was pressed /// /// /// private void BtnResizeClick(object sender, EventArgs e) { - ResizeEffect resizeEffect = new ResizeEffect(_surface.Image.Width, _surface.Image.Height, true); - // TODO: Use the Resize SettingsForm to make it possible to change the default values - DialogResult result = new ResizeSettingsForm(resizeEffect).ShowDialog(this); + var resizeEffect = new ResizeEffect(_surface.Image.Width, _surface.Image.Height, true); + var result = new ResizeSettingsForm(resizeEffect).ShowDialog(this); if (result == DialogResult.OK) { _surface.ApplyBitmapEffect(resizeEffect); UpdateUndoRedoSurfaceDependencies(); @@ -1372,15 +1386,29 @@ namespace Greenshot { } /// - /// Call the torn edge effect + /// This is used when the torn-edge button is used /// /// - /// - private void TornEdgesToolStripMenuItemClick(object sender, EventArgs e) { - TornEdgeEffect tornEdgeEffect = EditorConfiguration.TornEdgeEffectSettings; - // TODO: Use the dropshadow settings form to make it possible to change the default values - DialogResult result = new TornEdgeSettingsForm(tornEdgeEffect).ShowDialog(this); - if (result == DialogResult.OK) { + /// MouseEventArgs + private void TornEdgesToolStripMenuItemMouseUp(object sender, MouseEventArgs e) + { + var tornEdgeEffect = EditorConfiguration.TornEdgeEffectSettings; + bool apply; + switch (e.Button) + { + case MouseButtons.Left: + apply = true; + break; + case MouseButtons.Right: + var result = new TornEdgeSettingsForm(tornEdgeEffect).ShowDialog(this); + apply = result == DialogResult.OK; + break; + default: + return; + } + + if (apply) + { _surface.ApplyBitmapEffect(tornEdgeEffect); UpdateUndoRedoSurfaceDependencies(); } diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 641f96dc2..69f59e9ed 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -10,6 +10,7 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ Fixed: +* BUG-1762: Dropshadow & tornedge prompts for settings every time (now left mouse applies, right shows settings) * BUG-1812: Opening the editor after removing a monitor shows it outside the visible screen. * BUG-1876: Already running message, multi user environment * BUG-1884: OCR has trailing blank spaces From f88672b5f66721864a86a0a15f689d8f22100eed Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 18 Aug 2016 11:46:38 +0200 Subject: [PATCH 100/170] BUG-1811: Improved the Jira destination "sub" icons, by showing the issue types. --- GreenshotJiraPlugin/AsyncMemoryCache.cs | 246 ++++++++++++++++++ GreenshotJiraPlugin/Forms/JiraForm.cs | 13 +- .../GreenshotJiraPlugin.csproj | 7 +- GreenshotJiraPlugin/IssueTypeBitmapCache.cs | 50 ++++ GreenshotJiraPlugin/JiraConnector.cs | 95 ++++++- GreenshotJiraPlugin/JiraDestination.cs | 44 ++-- GreenshotJiraPlugin/packages.config | 2 +- GreenshotPlugin/Core/NetworkHelper.cs | 20 +- 8 files changed, 423 insertions(+), 54 deletions(-) create mode 100644 GreenshotJiraPlugin/AsyncMemoryCache.cs create mode 100644 GreenshotJiraPlugin/IssueTypeBitmapCache.cs diff --git a/GreenshotJiraPlugin/AsyncMemoryCache.cs b/GreenshotJiraPlugin/AsyncMemoryCache.cs new file mode 100644 index 000000000..f7d029750 --- /dev/null +++ b/GreenshotJiraPlugin/AsyncMemoryCache.cs @@ -0,0 +1,246 @@ +#region Dapplo 2016 - GNU Lesser General Public License + +// Dapplo - building blocks for .NET applications +// Copyright (C) 2016 Dapplo +// +// For more information see: http://dapplo.net/ +// Dapplo repositories are hosted on GitHub: https://github.com/dapplo +// +// This file is part of Dapplo.Utils +// +// Dapplo.Utils is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Dapplo.Utils 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 Lesser General Public License for more details. +// +// You should have a copy of the GNU Lesser General Public License +// along with Dapplo.Utils. If not, see . + +#endregion + +#region Usings + +using System; +using System.Runtime.Caching; +using System.Threading; +using System.Threading.Tasks; +using Dapplo.Log.Facade; + +#endregion + + +namespace GreenshotJiraPlugin +{ + /// + /// This abstract class builds a base for a simple async memory cache. + /// + /// Type for the key + /// Type for the stored value + public abstract class AsyncMemoryCache where TResult : class + { + private static readonly Task EmptyValueTask = Task.FromResult(null); + private readonly SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(1, 1); + private readonly MemoryCache _cache = new MemoryCache(Guid.NewGuid().ToString()); + private readonly LogSource _log = new LogSource(); + + /// + /// Set the timespan for items to expire. + /// + public TimeSpan? ExpireTimeSpan { get; set; } + + /// + /// Set the timespan for items to slide. + /// + public TimeSpan? SlidingTimeSpan { get; set; } + + /// + /// Specifies if the RemovedCallback needs to be called + /// If this is active, ActivateUpdateCallback should be false + /// + protected bool ActivateRemovedCallback { get; set; } = true; + + /// + /// Specifies if the UpdateCallback needs to be called. + /// If this is active, ActivateRemovedCallback should be false + /// + protected bool ActivateUpdateCallback { get; set; } = false; + + /// + /// Implement this method, it should create an instance of TResult via the supplied TKey. + /// + /// TKey + /// CancellationToken + /// TResult + protected abstract Task CreateAsync(TKey key, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Creates a key under which the object is stored or retrieved, default is a toString on the object. + /// + /// TKey + /// string + protected virtual string CreateKey(TKey keyObject) + { + return keyObject.ToString(); + } + + /// + /// Get an element from the cache, if this is not available call the create function. + /// + /// object for the key + /// CancellationToken + /// TResult + public async Task DeleteAsync(TKey keyObject, CancellationToken cancellationToken = default(CancellationToken)) + { + var key = CreateKey(keyObject); + await _semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + _cache.Remove(key); + } + finally + { + _semaphoreSlim.Release(); + } + } + + /// + /// Get a task element from the cache, if this is not available return null. + /// You probably want to call GetOrCreateAsync + /// + /// object for the key + /// Task with TResult, null if no value + public Task GetAsync(TKey keyObject) + { + var key = CreateKey(keyObject); + return _cache.Get(key) as Task ?? EmptyValueTask; + } + + /// + /// Get a task element from the cache, if this is not available call the create function. + /// + /// object for the key + /// CancellationToken + /// Task with TResult + public Task GetOrCreateAsync(TKey keyObject, CancellationToken cancellationToken = default(CancellationToken)) + { + var key = CreateKey(keyObject); + return _cache.Get(key) as Task ?? GetOrCreateInternalAsync(keyObject, null, cancellationToken); + } + + /// + /// Get a task element from the cache, if this is not available call the create function. + /// + /// object for the key + /// CacheItemPolicy for when you want more control over the item + /// CancellationToken + /// Task with TResult + public Task GetOrCreateAsync(TKey keyObject, CacheItemPolicy cacheItemPolicy, CancellationToken cancellationToken = default(CancellationToken)) + { + var key = CreateKey(keyObject); + return _cache.Get(key) as Task ?? GetOrCreateInternalAsync(keyObject, cacheItemPolicy, cancellationToken); + } + + /// + /// This takes care of the real async part of the code. + /// + /// + /// CacheItemPolicy for when you want more control over the item + /// CancellationToken + /// TResult + private async Task GetOrCreateInternalAsync(TKey keyObject, CacheItemPolicy cacheItemPolicy = null, CancellationToken cancellationToken = default(CancellationToken)) + { + var key = CreateKey(keyObject); + var completionSource = new TaskCompletionSource(); + + if (cacheItemPolicy == null) + { + cacheItemPolicy = new CacheItemPolicy + { + AbsoluteExpiration = ExpireTimeSpan.HasValue ? DateTimeOffset.Now.Add(ExpireTimeSpan.Value) : ObjectCache.InfiniteAbsoluteExpiration, + SlidingExpiration = SlidingTimeSpan ?? ObjectCache.NoSlidingExpiration + }; + if (ActivateUpdateCallback) + { + cacheItemPolicy.UpdateCallback = UpdateCallback; + } + if (ActivateRemovedCallback) + { + cacheItemPolicy.RemovedCallback = RemovedCallback; + } + } + + var result = _cache.AddOrGetExisting(key, completionSource.Task, cacheItemPolicy) as Task; + // Test if we got an existing object or our own + if (result != null && !completionSource.Task.Equals(result)) + { + return await result.ConfigureAwait(false); + } + + await _semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + result = _cache.AddOrGetExisting(key, completionSource.Task, cacheItemPolicy) as Task; + if (result != null && !completionSource.Task.Equals(result)) + { + return await result.ConfigureAwait(false); + } + + // Now, start the background task, which will set the completionSource with the correct response + // ReSharper disable once MethodSupportsCancellation + // ReSharper disable once UnusedVariable + var ignoreBackgroundTask = Task.Run(async () => + { + try + { + var backgroundResult = await CreateAsync(keyObject, cancellationToken).ConfigureAwait(false); + completionSource.TrySetResult(backgroundResult); + } + catch (TaskCanceledException) + { + completionSource.TrySetCanceled(); + } + catch (Exception ex) + { + completionSource.TrySetException(ex); + } + }); + } + finally + { + _semaphoreSlim.Release(); + } + + return await completionSource.Task.ConfigureAwait(false); + } + + /// + /// Override to know when an item is removed, make sure to configure ActivateUpdateCallback / ActivateRemovedCallback + /// + /// CacheEntryRemovedArguments + protected virtual void RemovedCallback(CacheEntryRemovedArguments cacheEntryRemovedArguments) + { + _log.Verbose().WriteLine("Item {0} removed due to {1}.", cacheEntryRemovedArguments.CacheItem.Key, cacheEntryRemovedArguments.RemovedReason); + var disposable = cacheEntryRemovedArguments.CacheItem.Value as IDisposable; + if (disposable != null) + { + _log.Debug().WriteLine("Disposed cached item."); + disposable.Dispose(); + } + } + + /// + /// Override to modify the cache behaviour when an item is about to be removed, make sure to configure + /// ActivateUpdateCallback / ActivateRemovedCallback + /// + /// CacheEntryUpdateArguments + protected virtual void UpdateCallback(CacheEntryUpdateArguments cacheEntryUpdateArguments) + { + _log.Verbose().WriteLine("Update request for {0} due to {1}.", cacheEntryUpdateArguments.Key, cacheEntryUpdateArguments.RemovedReason); + } + } +} diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index b4c99e49b..19c8f3edd 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -118,13 +118,9 @@ namespace GreenshotJiraPlugin.Forms { public async Task UploadAsync(IBinaryContainer attachment) { _config.LastUsedJira = _selectedIssue.Key; - using (var memoryStream = new MemoryStream()) - { - attachment.WriteToStream(memoryStream); - memoryStream.Seek(0, SeekOrigin.Begin); - await _jiraConnector.AttachAsync(_selectedIssue.Key, memoryStream, jiraFilenameBox.Text, attachment.ContentType); - } - + attachment.Filename = jiraFilenameBox.Text; + await _jiraConnector.AttachAsync(_selectedIssue.Key, attachment); + if (!string.IsNullOrEmpty(jiraCommentBox.Text)) { await _jiraConnector.AddCommentAsync(_selectedIssue.Key, jiraCommentBox.Text); } @@ -141,8 +137,7 @@ namespace GreenshotJiraPlugin.Forms { IList issues = null; try { - var searchResult = await _jiraConnector.SearchAsync(filter.Jql, fields: new [] { "summary", "reporter", "assignee", "created" }); - issues = searchResult.Issues; + issues = await _jiraConnector.SearchAsync(filter); } catch (Exception ex) { diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 78ffaad6b..10f91ea8e 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -38,8 +38,8 @@ ..\packages\Dapplo.HttpExtensions.0.5.31\lib\net45\Dapplo.HttpExtensions.dll True - - ..\packages\Dapplo.Jira.0.1.57\lib\net45\Dapplo.Jira.dll + + ..\packages\Dapplo.Jira.0.1.58\lib\net45\Dapplo.Jira.dll True @@ -51,11 +51,13 @@ + + Form @@ -71,6 +73,7 @@ SettingsForm.cs + diff --git a/GreenshotJiraPlugin/IssueTypeBitmapCache.cs b/GreenshotJiraPlugin/IssueTypeBitmapCache.cs new file mode 100644 index 000000000..019468944 --- /dev/null +++ b/GreenshotJiraPlugin/IssueTypeBitmapCache.cs @@ -0,0 +1,50 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Threading; +using System.Threading.Tasks; +using Dapplo.Jira; +using Dapplo.Jira.Entities; + +namespace GreenshotJiraPlugin +{ + /// + /// This is the bach for the IssueType bitmaps + /// + public class IssueTypeBitmapCache : AsyncMemoryCache + { + private readonly JiraApi _jiraApi; + + public IssueTypeBitmapCache(JiraApi jiraApi) + { + _jiraApi = jiraApi; + // Set the expire timeout to an hour + ExpireTimeSpan = TimeSpan.FromHours(1); + } + + protected override async Task CreateAsync(Issue issue, CancellationToken cancellationToken = new CancellationToken()) + { + return await _jiraApi.GetUriContentAsync(issue.Fields.IssueType.IconUri, cancellationToken).ConfigureAwait(false); + } + } +} diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index ba772e735..197d65996 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -22,6 +22,8 @@ using System; using System.Collections.Generic; +using System.Drawing; +using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -31,15 +33,21 @@ using Greenshot.IniFile; using GreenshotPlugin.Core; namespace GreenshotJiraPlugin { + /// + /// This encapsulates the JiraApi to make it possible to change as less old Greenshot code as needed + /// public class JiraConnector : IDisposable { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraConnector)); private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); + // Used to remove the wsdl information from the old SOAP Uri public const string DefaultPostfix = "/rpc/soap/jirasoapservice-v2?wsdl"; - private DateTime _loggedInTime = DateTime.Now; + private DateTimeOffset _loggedInTime = DateTimeOffset.MinValue; private bool _loggedIn; private readonly int _timeout; + private readonly object _lock = new object(); private string _url; private JiraApi _jiraApi; + private IssueTypeBitmapCache _issueTypeBitmapCache; public void Dispose() { if (_jiraApi != null) @@ -51,7 +59,6 @@ namespace GreenshotJiraPlugin { public JiraConnector() { _url = Config.Url.Replace(DefaultPostfix, ""); _timeout = Config.Timeout; - _jiraApi = new JiraApi(new Uri(_url)); } /// @@ -60,11 +67,18 @@ namespace GreenshotJiraPlugin { /// true if login was done sucessfully private async Task DoLogin(string user, string password) { - if (_url.EndsWith("wsdl")) + lock (_lock) { - _url = _url.Replace(DefaultPostfix, ""); - // recreate the service with the new url - _jiraApi = new JiraApi(new Uri(_url)); + if (_url.EndsWith("wsdl")) + { + _url = _url.Replace(DefaultPostfix, ""); + } + if (_jiraApi == null) + { + // recreate the service with the new url + _jiraApi = new JiraApi(new Uri(_url)); + _issueTypeBitmapCache = new IssueTypeBitmapCache(_jiraApi); + } } LoginInfo loginInfo; @@ -118,14 +132,22 @@ namespace GreenshotJiraPlugin { } + /// + /// End the session, if there was one + /// public async Task Logout() { - if (_jiraApi != null) + if (_jiraApi != null && _loggedIn) { await _jiraApi.EndSessionAsync(); _loggedIn = false; } } + /// + /// check the login credentials, to prevent timeouts of the session, or makes a login + /// Do not use ConfigureAwait to call this, as it will move await from the UI thread. + /// + /// private async Task CheckCredentials() { if (_loggedIn) { if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) { @@ -137,32 +159,81 @@ namespace GreenshotJiraPlugin { } } + /// + /// Get the favourite filters + /// + /// List with filters public async Task> GetFavoriteFiltersAsync() { await CheckCredentials(); return await _jiraApi.GetFavoriteFiltersAsync().ConfigureAwait(false); } + /// + /// Get the issue for a key + /// + /// Jira issue key + /// Issue public async Task GetIssueAsync(string issueKey) { await CheckCredentials(); return await _jiraApi.GetIssueAsync(issueKey).ConfigureAwait(false); } - public async Task AttachAsync(string issueKey, TContent content, string filename, string contentType = null, CancellationToken cancellationToken = default(CancellationToken)) where TContent : class + + /// + /// Attach the content to the jira + /// + /// + /// IBinaryContainer + /// + /// + /// + public async Task AttachAsync(string issueKey, IBinaryContainer content, CancellationToken cancellationToken = default(CancellationToken)) { - await CheckCredentials().ConfigureAwait(false); - return await _jiraApi.AttachAsync(issueKey, content, filename, contentType, cancellationToken).ConfigureAwait(false); + await CheckCredentials(); + using (var memoryStream = new MemoryStream()) + { + content.WriteToStream(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + await _jiraApi.AttachAsync(issueKey, memoryStream, content.Filename, content.ContentType, cancellationToken).ConfigureAwait(false); + } } + /// + /// Add a comment to the supplied issue + /// + /// Jira issue key + /// text + /// the visibility role + /// CancellationToken public async Task AddCommentAsync(string issueKey, string body, string visibility = null, CancellationToken cancellationToken = default(CancellationToken)) { await CheckCredentials(); await _jiraApi.AddCommentAsync(issueKey, body, visibility, cancellationToken).ConfigureAwait(false); } - public async Task SearchAsync(string jql, int maxResults = 20, IList fields = null, CancellationToken cancellationToken = default(CancellationToken)) + + /// + /// Get the search results for the specified filter + /// + /// Filter + /// + /// + public async Task> SearchAsync(Filter filter, CancellationToken cancellationToken = default(CancellationToken)) { await CheckCredentials(); - return await _jiraApi.SearchAsync(jql, maxResults, fields, cancellationToken).ConfigureAwait(false); + var searchResult = await _jiraApi.SearchAsync(filter.Jql, 20, new[] { "summary", "reporter", "assignee", "created" }, cancellationToken).ConfigureAwait(false); + return searchResult.Issues; + } + + /// + /// Get the bitmap representing the issue type of an issue, from cache. + /// + /// Issue + /// CancellationToken + /// Bitmap + public async Task GetIssueTypeBitmapAsync(Issue issue, CancellationToken cancellationToken = default(CancellationToken)) + { + return await _issueTypeBitmapCache.GetOrCreateAsync(issue, cancellationToken).ConfigureAwait(false); } public Uri JiraBaseUri => _jiraApi.JiraBaseUri; diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index 6a30f4fd7..6d472535a 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -41,30 +41,27 @@ namespace GreenshotJiraPlugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraDestination)); private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); private readonly JiraPlugin _jiraPlugin; - private readonly Issue _jira; + private readonly Issue _jiraIssue; public JiraDestination(JiraPlugin jiraPlugin) { _jiraPlugin = jiraPlugin; } - public JiraDestination(JiraPlugin jiraPlugin, Issue jira) { + public JiraDestination(JiraPlugin jiraPlugin, Issue jiraIssue) { _jiraPlugin = jiraPlugin; - _jira = jira; + _jiraIssue = jiraIssue; } public override string Designation => "Jira"; - private string FormatUpload(Issue jira) { - return Designation + " - " + jira.Key + ": " + jira.Fields.Summary.Substring(0, Math.Min(20, jira.Fields.Summary.Length)); - } - public override string Description { get { - if (_jira == null) { + if (_jiraIssue?.Fields?.Summary == null) { return Language.GetString("jira", LangKey.upload_menu_item); } - return FormatUpload(_jira); + // Format the title of this destination + return Designation + " - " + _jiraIssue.Key + ": " + _jiraIssue.Fields.Summary.Substring(0, Math.Min(20, _jiraIssue.Fields.Summary.Length)); } } @@ -73,9 +70,19 @@ namespace GreenshotJiraPlugin { public override bool isDynamic => true; public override Image DisplayIcon { - get { - var resources = new ComponentResourceManager(typeof(JiraPlugin)); - return (Image)resources.GetObject("Jira"); + get + { + Image displayIcon = null; + if (_jiraIssue != null && JiraPlugin.Instance.CurrentJiraConnector != null) + { + displayIcon = JiraPlugin.Instance.CurrentJiraConnector.GetIssueTypeBitmapAsync(_jiraIssue).Result; + } + if (displayIcon == null) + { + var resources = new ComponentResourceManager(typeof(JiraPlugin)); + displayIcon = (Image)resources.GetObject("Jira"); + } + return displayIcon; } } @@ -95,23 +102,18 @@ namespace GreenshotJiraPlugin { ExportInformation exportInformation = new ExportInformation(Designation, Description); string filename = Path.GetFileName(FilenameHelper.GetFilename(Config.UploadFormat, captureDetails)); SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(Config.UploadFormat, Config.UploadJpegQuality, Config.UploadReduceColors); - if (_jira != null) { + if (_jiraIssue != null) { try { // Run upload in the background new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), async () => { var surfaceContainer = new SurfaceContainer(surfaceToUpload, outputSettings, filename); - using (var memoryStream = new MemoryStream()) - { - surfaceContainer.WriteToStream(memoryStream); - memoryStream.Seek(0, SeekOrigin.Begin); - await _jiraPlugin.JiraConnector.AttachAsync(_jira.Key, memoryStream, filename, surfaceContainer.ContentType); - } - surfaceToUpload.UploadURL = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", _jira.Key).AbsoluteUri; + await _jiraPlugin.JiraConnector.AttachAsync(_jiraIssue.Key, surfaceContainer); + surfaceToUpload.UploadURL = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", _jiraIssue.Key).AbsoluteUri; } ); - Log.DebugFormat("Uploaded to Jira {0}", _jira.Key); + Log.DebugFormat("Uploaded to Jira {0}", _jiraIssue.Key); exportInformation.ExportMade = true; exportInformation.Uri = surfaceToUpload.UploadURL; } catch (Exception e) { diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 16bfb9d03..2ac586eeb 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,7 +1,7 @@  - + \ No newline at end of file diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 776fb9f5d..e1d90c7fc 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -557,6 +557,7 @@ namespace GreenshotPlugin.Core { void Upload(HttpWebRequest webRequest); string ContentType { get; } + string Filename { get; set; } } /// @@ -564,7 +565,6 @@ namespace GreenshotPlugin.Core { /// public class ByteContainer : IBinaryContainer { private readonly byte[] _file; - private readonly string _fileName; private readonly string _contentType; private readonly int _fileSize; public ByteContainer(byte[] file) : this(file, null) { @@ -575,7 +575,7 @@ namespace GreenshotPlugin.Core { } public ByteContainer(byte[] file, string filename, string contenttype, int filesize) { _file = file; - _fileName = filename; + Filename = filename; _contentType = contenttype; _fileSize = filesize == 0 ? file.Length : filesize; } @@ -607,7 +607,7 @@ namespace GreenshotPlugin.Core { string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", boundary, name, - _fileName ?? name, + Filename ?? name, _contentType ?? "application/octet-stream"); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); @@ -638,6 +638,7 @@ namespace GreenshotPlugin.Core { } public string ContentType => _contentType; + public string Filename { get; set; } } /// @@ -646,12 +647,11 @@ namespace GreenshotPlugin.Core { public class BitmapContainer : IBinaryContainer { private readonly Bitmap _bitmap; private readonly SurfaceOutputSettings _outputSettings; - private readonly string _fileName; public BitmapContainer(Bitmap bitmap, SurfaceOutputSettings outputSettings, string filename) { _bitmap = bitmap; _outputSettings = outputSettings; - _fileName = filename; + Filename = filename; } /// @@ -689,7 +689,7 @@ namespace GreenshotPlugin.Core { string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", boundary, name, - _fileName ?? name, + Filename ?? name, ContentType); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); @@ -717,6 +717,8 @@ namespace GreenshotPlugin.Core { } public string ContentType => "image/" + _outputSettings.Format; + + public string Filename { get; set; } } /// @@ -725,12 +727,11 @@ namespace GreenshotPlugin.Core { public class SurfaceContainer : IBinaryContainer { private readonly ISurface _surface; private readonly SurfaceOutputSettings _outputSettings; - private readonly string _fileName; public SurfaceContainer(ISurface surface, SurfaceOutputSettings outputSettings, string filename) { _surface = surface; _outputSettings = outputSettings; - _fileName = filename; + Filename = filename; } /// @@ -768,7 +769,7 @@ namespace GreenshotPlugin.Core { string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", boundary, name, - _fileName ?? name, + Filename ?? name, ContentType); formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); @@ -796,5 +797,6 @@ namespace GreenshotPlugin.Core { } public string ContentType => "image/" + _outputSettings.Format; + public string Filename { get; set; } } } From d40461ec475859971a79182cd5c5b7d00abadd89 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 20 Aug 2016 10:52:59 +0200 Subject: [PATCH 101/170] BUG-2013 : This might fix the NRE as the events might not be in line with the cleaning up... --- Greenshot/Drawing/TextContainer.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 002587b17..18a3e66f6 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -205,6 +205,10 @@ namespace Greenshot.Drawing void TextContainer_FieldChanged(object sender, FieldChangedEventArgs e) { + if (_textBox == null) + { + return; + } if (_textBox.Visible) { _textBox.Invalidate(); @@ -225,7 +229,7 @@ namespace Greenshot.Drawing } UpdateTextBoxFormat(); - if (_textBox != null && _textBox.Visible) + if (_textBox.Visible) { _textBox.Invalidate(); } @@ -360,6 +364,10 @@ namespace Greenshot.Drawing /// protected void UpdateFormat() { + if (_textBox == null) + { + return; + } string fontFamily = GetFieldValueAsString(FieldType.FONT_FAMILY); bool fontBold = GetFieldValueAsBool(FieldType.FONT_BOLD); bool fontItalic = GetFieldValueAsBool(FieldType.FONT_ITALIC); @@ -441,7 +449,7 @@ namespace Greenshot.Drawing { return; } - StringAlignment alignment = (StringAlignment)GetFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); + var alignment = (StringAlignment)GetFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); switch (alignment) { case StringAlignment.Near: @@ -455,7 +463,7 @@ namespace Greenshot.Drawing break; } - Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + var lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); _textBox.ForeColor = lineColor; } From ada50c429a229c800a8fc61f7fc1e72c3ee4e371 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 31 Aug 2016 22:29:10 +0200 Subject: [PATCH 102/170] BUG-2014: Fixed end session issue. --- GreenshotJiraPlugin/GreenshotJiraPlugin.csproj | 8 ++++---- GreenshotJiraPlugin/packages.config | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 10f91ea8e..d9823ccb0 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -34,12 +34,12 @@ - - ..\packages\Dapplo.HttpExtensions.0.5.31\lib\net45\Dapplo.HttpExtensions.dll + + ..\packages\Dapplo.HttpExtensions.0.5.32\lib\net45\Dapplo.HttpExtensions.dll True - - ..\packages\Dapplo.Jira.0.1.58\lib\net45\Dapplo.Jira.dll + + ..\packages\Dapplo.Jira.0.1.59\lib\net45\Dapplo.Jira.dll True diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 2ac586eeb..62f3442fd 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,7 +1,7 @@  - - + + \ No newline at end of file From 4dd67df1ddb40dbc6673bf9b5d3a168c6fd60f07 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 31 Aug 2016 22:30:00 +0200 Subject: [PATCH 103/170] Misc small changes for code quality. --- GreenshotConfluencePlugin/ConfluenceUtils.cs | 2 +- GreenshotConfluencePlugin/EnumDisplayer.cs | 5 +++-- GreenshotDropboxPlugin/DropboxDestination.cs | 8 ++++---- GreenshotExternalCommandPlugin/SettingsForm.cs | 2 +- GreenshotImgurPlugin/ImgurDestination.cs | 6 +++--- GreenshotPicasaPlugin/PicasaDestination.cs | 6 +++--- GreenshotPlugin/Core/AccessibleHelper.cs | 2 +- GreenshotPlugin/Core/JSONHelper.cs | 3 +-- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index b7fac032b..eef3501a3 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -37,7 +37,7 @@ namespace GreenshotConfluencePlugin { Regex pageIdRegex = new Regex(@"pageId=(\d+)"); Regex spacePageRegex = new Regex(@"\/display\/([^\/]+)\/([^#]+)"); foreach(string browserurl in GetBrowserUrls()) { - string url = null; + string url; try { url = Uri.UnescapeDataString(browserurl).Replace("+", " "); } catch { diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index 1888030a1..9c31f2972 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -66,10 +66,11 @@ namespace GreenshotConfluencePlugin { string displayKey = GetDisplayKeyValue(a); object enumValue = field.GetValue(null); - string displayString = null; + string displayString; if (displayKey != null && Language.hasKey(displayKey)) { displayString = Language.GetString(displayKey); - } if (displayKey != null) { + } + if (displayKey != null) { displayString = displayKey; } else { displayString = enumValue.ToString(); diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index 5a96a3260..004b20334 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -54,13 +54,13 @@ namespace GreenshotDropboxPlugin { public override ExportInformation ExportCapture(bool manually, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string uploadURL = null; - bool uploaded = plugin.Upload(captureDetails, surface, out uploadURL); + string uploadUrl; + bool uploaded = plugin.Upload(captureDetails, surface, out uploadUrl); if (uploaded) { - exportInformation.Uri = uploadURL; + exportInformation.Uri = uploadUrl; exportInformation.ExportMade = true; if (config.AfterUploadLinkToClipBoard) { - ClipboardHelper.SetClipboardData(uploadURL); + ClipboardHelper.SetClipboardData(uploadUrl); } } ProcessExport(exportInformation, surface); diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 4d626e4f7..2bb6a9331 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -71,7 +71,7 @@ namespace ExternalCommand { listView1.SmallImageList = imageList; int imageNr = 0; foreach(string commando in config.Commands) { - ListViewItem item = null; + ListViewItem item; Image iconForExe = IconCache.IconForCommand(commando); if(iconForExe != null) { imageList.Images.Add(iconForExe); diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index 78177fd6e..f41425c76 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -58,9 +58,9 @@ namespace GreenshotImgurPlugin { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string uploadURL = null; - exportInformation.ExportMade = plugin.Upload(captureDetails, surface, out uploadURL); - exportInformation.Uri = uploadURL; + string uploadUrl; + exportInformation.ExportMade = plugin.Upload(captureDetails, surface, out uploadUrl); + exportInformation.Uri = uploadUrl; ProcessExport(exportInformation, surface); return exportInformation; } diff --git a/GreenshotPicasaPlugin/PicasaDestination.cs b/GreenshotPicasaPlugin/PicasaDestination.cs index 2a245716a..aaced6491 100644 --- a/GreenshotPicasaPlugin/PicasaDestination.cs +++ b/GreenshotPicasaPlugin/PicasaDestination.cs @@ -54,11 +54,11 @@ namespace GreenshotPicasaPlugin { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string uploadURL = null; - bool uploaded = plugin.Upload(captureDetails, surface, out uploadURL); + string uploadUrl; + bool uploaded = plugin.Upload(captureDetails, surface, out uploadUrl); if (uploaded) { exportInformation.ExportMade = true; - exportInformation.Uri = uploadURL; + exportInformation.Uri = uploadUrl; } ProcessExport(exportInformation, surface); return exportInformation; diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index ed3422f4a..db890c16e 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -62,7 +62,7 @@ namespace GreenshotPlugin.Core { private readonly IAccessible accessible; private Accessible[] Children { get { - int num = 0; + int num; object[] res = GetAccessibleChildren(accessible, out num); if (res == null) { return new Accessible[0]; diff --git a/GreenshotPlugin/Core/JSONHelper.cs b/GreenshotPlugin/Core/JSONHelper.cs index 1770e5657..5e44585b7 100644 --- a/GreenshotPlugin/Core/JSONHelper.cs +++ b/GreenshotPlugin/Core/JSONHelper.cs @@ -62,9 +62,8 @@ namespace GreenshotPlugin.Core { int index = 0; IDictionary value = ParseValue(charArray, ref index, ref success) as IDictionary; return value; - } else { - return null; } + return null; } protected static IDictionary ParseObject(char[] json, ref int index, ref bool success) { From 745a56291c15949d7700a7fb61020874f70af9b2 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 2 Sep 2016 10:48:01 +0200 Subject: [PATCH 104/170] BUG-2016: Added SVG support for the jira plugin, need to decide if it's worth the extra KB's... --- GreenshotJiraPlugin/Forms/JiraForm.cs | 56 +++++--- .../GreenshotJiraPlugin.csproj | 13 +- GreenshotJiraPlugin/IssueTypeBitmapCache.cs | 11 +- GreenshotJiraPlugin/JiraConnector.cs | 48 +++++-- GreenshotJiraPlugin/JiraPlugin.cs | 1 - GreenshotJiraPlugin/JiraUtils.cs | 5 + GreenshotJiraPlugin/LanguageKeys.cs | 5 +- .../SvgBitmapHttpContentConverter.cs | 129 ++++++++++++++++++ GreenshotJiraPlugin/packages.config | 1 + GreenshotPlugin/Core/Language.cs | 13 ++ 10 files changed, 248 insertions(+), 34 deletions(-) create mode 100644 GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index 19c8f3edd..e6fbf6717 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -37,7 +37,8 @@ namespace GreenshotJiraPlugin.Forms { private readonly JiraConnector _jiraConnector; private Issue _selectedIssue; private readonly GreenshotColumnSorter _columnSorter; - private readonly JiraConfiguration _config = IniConfig.GetIniSection(); + private static readonly JiraConfiguration JiraConfig = IniConfig.GetIniSection(); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); public JiraForm(JiraConnector jiraConnector) { InitializeComponent(); @@ -83,12 +84,12 @@ namespace GreenshotJiraPlugin.Forms { jiraFilterBox.SelectedIndex = 0; } ChangeModus(true); - if (_config.LastUsedJira != null) + if (JiraConfig.LastUsedJira != null) { - _selectedIssue = await _jiraConnector.GetIssueAsync(_config.LastUsedJira); + _selectedIssue = await _jiraConnector.GetIssueAsync(JiraConfig.LastUsedJira); if (_selectedIssue != null) { - jiraKey.Text = _config.LastUsedJira; + jiraKey.Text = JiraConfig.LastUsedJira; uploadButton.Enabled = true; } } @@ -117,7 +118,7 @@ namespace GreenshotJiraPlugin.Forms { } public async Task UploadAsync(IBinaryContainer attachment) { - _config.LastUsedJira = _selectedIssue.Key; + JiraConfig.LastUsedJira = _selectedIssue.Key; attachment.Filename = jiraFilenameBox.Text; await _jiraConnector.AttachAsync(_selectedIssue.Key, attachment); @@ -145,31 +146,50 @@ namespace GreenshotJiraPlugin.Forms { MessageBox.Show(this, ex.Message, "Error in filter", MessageBoxButtons.OK, MessageBoxIcon.Error); } - jiraListView.BeginUpdate(); jiraListView.Items.Clear(); if (issues?.Count > 0) { jiraListView.Columns.Clear(); - LangKey[] columns = { LangKey.column_id, LangKey.column_created, LangKey.column_assignee, LangKey.column_reporter, LangKey.column_summary }; - foreach (LangKey column in columns) { - jiraListView.Columns.Add(Language.GetString("jira", column)); - } - foreach (var issue in issues) { - var item = new ListViewItem(issue.Key) + LangKey[] columns = { LangKey.column_issueType, LangKey.column_id, LangKey.column_created, LangKey.column_assignee, LangKey.column_reporter, LangKey.column_summary }; + foreach (LangKey column in columns) + { + string translation; + if (!Language.TryGetString("jira", column, out translation)) { - Tag = issue + translation = ""; + } + jiraListView.Columns.Add(translation); + } + var imageList = new ImageList { + ImageSize = CoreConfig.IconSize + }; + jiraListView.SmallImageList = imageList; + jiraListView.LargeImageList = imageList; + + foreach (var issue in issues) { + var issueIcon = await _jiraConnector.GetIssueTypeBitmapAsync(issue); + imageList.Images.Add(issueIcon); + + var item = new ListViewItem + { + Tag = issue, + ImageIndex = imageList.Images.Count - 1 }; + item.SubItems.Add(issue.Key); item.SubItems.Add(issue.Fields.Created.ToString("d", DateTimeFormatInfo.InvariantInfo)); item.SubItems.Add(issue.Fields.Assignee?.DisplayName); item.SubItems.Add(issue.Fields.Reporter?.DisplayName); item.SubItems.Add(issue.Fields.Summary); jiraListView.Items.Add(item); + for (int i = 0; i < columns.Length; i++) + { + jiraListView.AutoResizeColumn(i, ColumnHeaderAutoResizeStyle.ColumnContent); + } + jiraListView.Invalidate(); + jiraListView.Update(); } - for (int i = 0; i < columns.Length; i++) { - jiraListView.AutoResizeColumn(i, ColumnHeaderAutoResizeStyle.ColumnContent); - } + + jiraListView.Refresh(); } - jiraListView.EndUpdate(); - jiraListView.Refresh(); } } diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index d9823ccb0..2c02694f4 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -49,8 +49,13 @@ ..\Greenshot\Lib\log4net.dll + + ..\packages\Svg.2.2.1\lib\net35\Svg.dll + True + + @@ -82,6 +87,7 @@ + Always @@ -105,6 +111,10 @@ {5B924697-4DCD-4F98-85F1-105CB84B7341} GreenshotPlugin + + {CD642BF4-D815-4D67-A0B5-C69F0B8231AF} + Greenshot + mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" @@ -112,12 +122,13 @@ del /q /s "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)"\* if "$(ConfigurationName)" == "Release" ( - ..\..\..\packages\LibZ.Tool.1.2.0.0\tools\libz.exe inject-dll --assembly $(ProjectDir)bin\$(Configuration)\$(TargetFileName) --include $(ProjectDir)bin\$(Configuration)\dapplo*.dll --move + ..\..\..\packages\LibZ.Tool.1.2.0.0\tools\libz.exe inject-dll --assembly $(ProjectDir)bin\$(Configuration)\$(TargetFileName) --include $(ProjectDir)bin\$(Configuration)\dapplo*.dll --include $(ProjectDir)bin\$(Configuration)\svg.dll --move ) copy "$(ProjectDir)bin\$(Configuration)\$(TargetFileName)" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" if "$(ConfigurationName)" == "Debug" ( copy "$(ProjectDir)bin\$(Configuration)\Dapplo.*" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" + copy "$(ProjectDir)bin\$(Configuration)\Svg.dll" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" ) diff --git a/GreenshotJiraPlugin/IssueTypeBitmapCache.cs b/GreenshotJiraPlugin/IssueTypeBitmapCache.cs index 019468944..162b41b13 100644 --- a/GreenshotJiraPlugin/IssueTypeBitmapCache.cs +++ b/GreenshotJiraPlugin/IssueTypeBitmapCache.cs @@ -31,7 +31,7 @@ namespace GreenshotJiraPlugin /// /// This is the bach for the IssueType bitmaps /// - public class IssueTypeBitmapCache : AsyncMemoryCache + public class IssueTypeBitmapCache : AsyncMemoryCache { private readonly JiraApi _jiraApi; @@ -42,9 +42,14 @@ namespace GreenshotJiraPlugin ExpireTimeSpan = TimeSpan.FromHours(1); } - protected override async Task CreateAsync(Issue issue, CancellationToken cancellationToken = new CancellationToken()) + protected override string CreateKey(IssueType keyObject) { - return await _jiraApi.GetUriContentAsync(issue.Fields.IssueType.IconUri, cancellationToken).ConfigureAwait(false); + return keyObject.Name; + } + + protected override async Task CreateAsync(IssueType issueType, CancellationToken cancellationToken = new CancellationToken()) + { + return await _jiraApi.GetUriContentAsync(issueType.IconUri, cancellationToken).ConfigureAwait(false); } } } diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index 197d65996..65f2baa66 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -24,9 +24,11 @@ using System; using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using Dapplo.HttpExtensions; using Dapplo.Jira; using Dapplo.Jira.Entities; using Greenshot.IniFile; @@ -38,7 +40,8 @@ namespace GreenshotJiraPlugin { /// public class JiraConnector : IDisposable { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraConnector)); - private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); + private static readonly JiraConfiguration JiraConfig = IniConfig.GetIniSection(); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); // Used to remove the wsdl information from the old SOAP Uri public const string DefaultPostfix = "/rpc/soap/jirasoapservice-v2?wsdl"; private DateTimeOffset _loggedInTime = DateTimeOffset.MinValue; @@ -48,6 +51,26 @@ namespace GreenshotJiraPlugin { private string _url; private JiraApi _jiraApi; private IssueTypeBitmapCache _issueTypeBitmapCache; + private static readonly SvgBitmapHttpContentConverter SvgBitmapHttpContentConverterInstance = new SvgBitmapHttpContentConverter(); + + static JiraConnector() + { + if (HttpExtensionsGlobals.HttpContentConverters.All(x => x.GetType() != typeof(SvgBitmapHttpContentConverter))) + { + HttpExtensionsGlobals.HttpContentConverters.Add(SvgBitmapHttpContentConverterInstance); + } + SvgBitmapHttpContentConverterInstance.Width = CoreConfig.IconSize.Width; + SvgBitmapHttpContentConverterInstance.Height = CoreConfig.IconSize.Height; + CoreConfig.PropertyChanged += (sender, args) => + { + if (args.PropertyName == nameof(CoreConfig.IconSize)) + { + SvgBitmapHttpContentConverterInstance.Width = CoreConfig.IconSize.Width; + SvgBitmapHttpContentConverterInstance.Height = CoreConfig.IconSize.Height; + } + }; + + } public void Dispose() { if (_jiraApi != null) @@ -56,9 +79,10 @@ namespace GreenshotJiraPlugin { } } - public JiraConnector() { - _url = Config.Url.Replace(DefaultPostfix, ""); - _timeout = Config.Timeout; + public JiraConnector() + { + _url = JiraConfig.Url.Replace(DefaultPostfix, ""); + _timeout = JiraConfig.Timeout; } /// @@ -86,7 +110,7 @@ namespace GreenshotJiraPlugin { { loginInfo = await _jiraApi.StartSessionAsync(user, password); // Worked, store the url in the configuration - Config.Url = _url; + JiraConfig.Url = _url; IniConfig.Save(); } catch (Exception) @@ -177,7 +201,14 @@ namespace GreenshotJiraPlugin { public async Task GetIssueAsync(string issueKey) { await CheckCredentials(); - return await _jiraApi.GetIssueAsync(issueKey).ConfigureAwait(false); + try + { + return await _jiraApi.GetIssueAsync(issueKey).ConfigureAwait(false); + } + catch + { + return null; + } } /// @@ -185,7 +216,6 @@ namespace GreenshotJiraPlugin { /// /// /// IBinaryContainer - /// /// /// public async Task AttachAsync(string issueKey, IBinaryContainer content, CancellationToken cancellationToken = default(CancellationToken)) @@ -221,7 +251,7 @@ namespace GreenshotJiraPlugin { public async Task> SearchAsync(Filter filter, CancellationToken cancellationToken = default(CancellationToken)) { await CheckCredentials(); - var searchResult = await _jiraApi.SearchAsync(filter.Jql, 20, new[] { "summary", "reporter", "assignee", "created" }, cancellationToken).ConfigureAwait(false); + var searchResult = await _jiraApi.SearchAsync(filter.Jql, 20, new[] { "summary", "reporter", "assignee", "created", "issuetype" }, cancellationToken).ConfigureAwait(false); return searchResult.Issues; } @@ -233,7 +263,7 @@ namespace GreenshotJiraPlugin { /// Bitmap public async Task GetIssueTypeBitmapAsync(Issue issue, CancellationToken cancellationToken = default(CancellationToken)) { - return await _issueTypeBitmapCache.GetOrCreateAsync(issue, cancellationToken).ConfigureAwait(false); + return await _issueTypeBitmapCache.GetOrCreateAsync(issue.Fields.IssueType, cancellationToken).ConfigureAwait(false); } public Uri JiraBaseUri => _jiraApi.JiraBaseUri; diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index d3bf3fbc2..6f9e499e9 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -24,7 +24,6 @@ using Greenshot.IniFile; using Greenshot.Plugin; using System; using System.Threading.Tasks; -using Dapplo.HttpExtensions.ContentConverter; using Dapplo.Log.Facade; using GreenshotJiraPlugin.Forms; diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs index dba6ba1e5..94984f555 100644 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ b/GreenshotJiraPlugin/JiraUtils.cs @@ -66,6 +66,11 @@ namespace GreenshotJiraPlugin { catch (Exception ex) { Log.Error(ex); + // Remove issue from the last used jira config, as it caused an issue (probably not there) + if (Config.LastUsedJira == jiraKey) + { + Config.LastUsedJira = null; + } } } if (jiraIssues.Count > 0) { diff --git a/GreenshotJiraPlugin/LanguageKeys.cs b/GreenshotJiraPlugin/LanguageKeys.cs index 8cbab218b..0ef41c755 100644 --- a/GreenshotJiraPlugin/LanguageKeys.cs +++ b/GreenshotJiraPlugin/LanguageKeys.cs @@ -20,10 +20,11 @@ */ namespace GreenshotJiraPlugin { - public enum LangKey { + public enum LangKey { upload_menu_item, column_assignee, column_created, + column_issueType, column_id, column_reporter, column_summary, @@ -41,5 +42,5 @@ namespace GreenshotJiraPlugin { upload_success, upload_failure, communication_wait, - } + } } diff --git a/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs b/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs new file mode 100644 index 000000000..f8d995d99 --- /dev/null +++ b/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs @@ -0,0 +1,129 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Threading; +using System.Threading.Tasks; +using Dapplo.HttpExtensions; +using Dapplo.HttpExtensions.ContentConverter; +using Dapplo.HttpExtensions.Extensions; +using Dapplo.HttpExtensions.Support; +using Dapplo.Log.Facade; +using System.Net.Http; +using System.Net.Http.Headers; +using GreenshotPlugin.Core; +using Svg; + +namespace GreenshotJiraPlugin +{ + /// + /// This adds SVG image support for the Jira Plugin + /// + public class SvgBitmapHttpContentConverter : IHttpContentConverter + { + private static readonly LogSource Log = new LogSource(); + private static readonly IList SupportedContentTypes = new List(); + + static SvgBitmapHttpContentConverter() + { + SupportedContentTypes.Add(MediaTypes.Svg.EnumValueOf()); + } + + /// + public int Order => 0; + + public int Width { get; set; } + + public int Height { get; set; } + + /// + /// This checks if the HttpContent can be converted to a Bitmap and is assignable to the specified Type + /// + /// This should be something we can assign Bitmap to + /// HttpContent to process + /// true if it can convert + public bool CanConvertFromHttpContent(Type typeToConvertTo, HttpContent httpContent) + { + if (typeToConvertTo == typeof(object) || !typeToConvertTo.IsAssignableFrom(typeof(Bitmap))) + { + return false; + } + var httpBehaviour = HttpBehaviour.Current; + return !httpBehaviour.ValidateResponseContentType || SupportedContentTypes.Contains(httpContent.GetContentType()); + } + + /// + public async Task ConvertFromHttpContentAsync(Type resultType, HttpContent httpContent, CancellationToken cancellationToken = default(CancellationToken)) + { + if (!CanConvertFromHttpContent(resultType, httpContent)) + { + var exMessage = "CanConvertFromHttpContent resulted in false, ConvertFromHttpContentAsync is not supposed to be called."; + Log.Error().WriteLine(exMessage); + throw new NotSupportedException(exMessage); + } + using (var memoryStream = (MemoryStream) await StreamHttpContentConverter.Instance.ConvertFromHttpContentAsync(typeof(MemoryStream), httpContent, cancellationToken).ConfigureAwait(false)) + { + Log.Debug().WriteLine("Creating a Bitmap from the SVG."); + var bitmap = ImageHelper.CreateEmpty(Width, Height, PixelFormat.Format32bppArgb, Color.Transparent, 96, 96); + var svgDoc = SvgDocument.Open(memoryStream); + svgDoc.Width = Width; + svgDoc.Height = Height; + svgDoc.Draw(bitmap); + return bitmap; + } + } + + /// + public bool CanConvertToHttpContent(Type typeToConvert, object content) + { + return false; + } + + /// + public HttpContent ConvertToHttpContent(Type typeToConvert, object content) + { + return null; + } + + /// + public void AddAcceptHeadersForType(Type resultType, HttpRequestMessage httpRequestMessage) + { + if (resultType == null) + { + throw new ArgumentNullException(nameof(resultType)); + } + if (httpRequestMessage == null) + { + throw new ArgumentNullException(nameof(httpRequestMessage)); + } + if (resultType == typeof(object) || !resultType.IsAssignableFrom(typeof(Bitmap))) + { + return; + } + httpRequestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypes.Svg.EnumValueOf())); + Log.Debug().WriteLine("Modified the header(s) of the HttpRequestMessage: Accept: {0}", httpRequestMessage.Headers.Accept); + } + } +} diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 62f3442fd..6fb907484 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 53f11b6cd..3a86237a6 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -532,6 +532,19 @@ namespace GreenshotPlugin.Core { return resources.TryGetValue(prefix + "." + key, out languageString); } + /// + /// TryGet method which combines hasKey & GetString + /// + /// string with prefix + /// Enum with key + /// out string + /// + public static bool TryGetString(string prefix, Enum key, out string languageString) + { + return resources.TryGetValue(prefix + "." + key, out languageString); + } + + public static string Translate(object key) { string typename = key.GetType().Name; string enumKey = typename + "." + key; From 1d0bdf23c1cf081c4bd2e5eb46ad473fa55142a0 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 3 Sep 2016 23:32:24 +0200 Subject: [PATCH 105/170] FEATURE-731: Backport of the title detection code --- Greenshot/Forms/SettingsForm.cs | 14 +- GreenshotJiraPlugin/Forms/JiraForm.cs | 2 +- .../GreenshotJiraPlugin.csproj | 9 +- .../Hooking/TitleChangeEventArgs.cs | 50 ++ .../Hooking/TitleChangeEventDelegate.cs | 29 ++ .../Hooking/WindowsEventHook.cs | 152 ++++++ .../Hooking/WindowsTitleMonitor.cs | 139 ++++++ GreenshotJiraPlugin/JiraConnector.cs | 84 ++-- GreenshotJiraPlugin/JiraDestination.cs | 16 +- GreenshotJiraPlugin/JiraDetails.cs | 71 +++ GreenshotJiraPlugin/JiraEventArgs.cs | 40 ++ GreenshotJiraPlugin/JiraEventTypes.cs | 29 ++ GreenshotJiraPlugin/JiraMonitor.cs | 225 +++++++++ GreenshotJiraPlugin/JiraPlugin.cs | 37 +- GreenshotJiraPlugin/JiraUtils.cs | 83 ---- GreenshotPlugin/Core/CredentialsHelper.cs | 113 ++--- .../UnmanagedHelpers/Enumerations.cs | 434 +++++++++--------- 17 files changed, 1080 insertions(+), 447 deletions(-) create mode 100644 GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs create mode 100644 GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs create mode 100644 GreenshotJiraPlugin/Hooking/WindowsEventHook.cs create mode 100644 GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs create mode 100644 GreenshotJiraPlugin/JiraDetails.cs create mode 100644 GreenshotJiraPlugin/JiraEventArgs.cs create mode 100644 GreenshotJiraPlugin/JiraEventTypes.cs create mode 100644 GreenshotJiraPlugin/JiraMonitor.cs delete mode 100644 GreenshotJiraPlugin/JiraUtils.cs diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 9e7fd5ad4..00588bdee 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -295,7 +295,7 @@ namespace Greenshot { private void UpdateClipboardFormatDescriptions() { foreach(ListViewItem item in listview_clipboardformats.Items) { ClipboardFormat cf = (ClipboardFormat) item.Tag; - item.Text = Language.Translate(cf); + item.Text = Language.Translate(cf); } } @@ -592,12 +592,12 @@ namespace Greenshot { CheckDestinationSettings(); } - protected override void OnFieldsFilled() { - // the color radio button is not actually bound to a setting, but checked when monochrome/grayscale are not checked - if(!radioBtnGrayScale.Checked && !radioBtnMonochrome.Checked) { - radioBtnColorPrint.Checked = true; - } - } + protected override void OnFieldsFilled() { + // the color radio button is not actually bound to a setting, but checked when monochrome/grayscale are not checked + if(!radioBtnGrayScale.Checked && !radioBtnMonochrome.Checked) { + radioBtnColorPrint.Checked = true; + } + } /// /// Set the enable state of the expert settings diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index e6fbf6717..efee62973 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -65,7 +65,7 @@ namespace GreenshotJiraPlugin.Forms { { if (!_jiraConnector.IsLoggedIn) { - await _jiraConnector.Login(); + await _jiraConnector.LoginAsync(); } } catch (Exception e) diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 2c02694f4..850aafdbf 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -78,12 +78,19 @@ SettingsForm.cs + + + + + + + + - diff --git a/GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs b/GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs new file mode 100644 index 000000000..6ec8878fd --- /dev/null +++ b/GreenshotJiraPlugin/Hooking/TitleChangeEventArgs.cs @@ -0,0 +1,50 @@ +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * 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 GreenshotJiraPlugin.Hooking +{ + /// + /// Event arguments for the TitleChangeEvent + /// + public class TitleChangeEventArgs : EventArgs + { + /// + /// HWnd of the window which has a changed title + /// + public IntPtr HWnd + { + get; + set; + } + + /// + /// Title which is changed + /// + public string Title + { + get; + set; + } + } + +} diff --git a/GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs b/GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs new file mode 100644 index 000000000..29847a1e5 --- /dev/null +++ b/GreenshotJiraPlugin/Hooking/TitleChangeEventDelegate.cs @@ -0,0 +1,29 @@ +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * 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 GreenshotJiraPlugin.Hooking +{ + /// + /// Delegate for the title change event + /// + /// + public delegate void TitleChangeEventDelegate(TitleChangeEventArgs eventArgs); +} \ No newline at end of file diff --git a/GreenshotJiraPlugin/Hooking/WindowsEventHook.cs b/GreenshotJiraPlugin/Hooking/WindowsEventHook.cs new file mode 100644 index 000000000..e2be9d0b0 --- /dev/null +++ b/GreenshotJiraPlugin/Hooking/WindowsEventHook.cs @@ -0,0 +1,152 @@ +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * 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.Runtime.InteropServices; +using GreenshotPlugin.UnmanagedHelpers; + +namespace GreenshotJiraPlugin.Hooking +{ + /// + /// The WinEventHook can register handlers to become important windows events + /// This makes it possible to know a.o. when a window is created, moved, updated and closed. + /// + public class WindowsEventHook : IDisposable + { + private readonly WinEventDelegate _winEventHandler; + private GCHandle _gcHandle; + + /// + /// Used with Register hook + /// + /// + /// + /// + /// + /// + /// + public delegate void WinEventHandler(WinEvent eventType, IntPtr hwnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); + + /// + /// Create a WindowsEventHook object + /// + public WindowsEventHook() + { + _winEventHandler = WinEventDelegateHandler; + _gcHandle = GCHandle.Alloc(_winEventHandler); + } + + #region native code + [DllImport("user32", SetLastError = true)] + private static extern bool UnhookWinEvent(IntPtr hWinEventHook); + [DllImport("user32", SetLastError = true)] + private static extern IntPtr SetWinEventHook(WinEvent eventMin, WinEvent eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, int idProcess, int idThread, WinEventHookFlags dwFlags); + + /// + /// Used with SetWinEventHook + /// + /// + /// + /// + /// + /// + /// + /// + private delegate void WinEventDelegate(IntPtr hWinEventHook, WinEvent eventType, IntPtr hwnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); + #endregion + + private readonly IDictionary _winEventHandlers = new Dictionary(); + + /// + /// Are hooks active? + /// + public bool IsHooked => _winEventHandlers.Count > 0; + + /// + /// Hook a WinEvent + /// + /// + /// + /// true if success + public void Hook(WinEvent winEvent, WinEventHandler winEventHandler) + { + Hook(winEvent, winEvent, winEventHandler); + } + + /// + /// Hook a WinEvent + /// + /// + /// + /// + public void Hook(WinEvent winEventStart, WinEvent winEventEnd, WinEventHandler winEventHandler) + { + var hookPtr = SetWinEventHook(winEventStart, winEventEnd, IntPtr.Zero, _winEventHandler, 0, 0, WinEventHookFlags.WINEVENT_SKIPOWNPROCESS | WinEventHookFlags.WINEVENT_OUTOFCONTEXT); + _winEventHandlers.Add(hookPtr, winEventHandler); + } + + /// + /// Remove all hooks + /// + private void Unhook() + { + foreach (var hookPtr in _winEventHandlers.Keys) + { + if (hookPtr != IntPtr.Zero) + { + UnhookWinEvent(hookPtr); + } + } + _winEventHandlers.Clear(); + _gcHandle.Free(); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Unhook(); + } + + /// + /// Call the WinEventHandler for this event + /// + /// + /// + /// + /// + /// + /// + /// + private void WinEventDelegateHandler(IntPtr hWinEventHook, WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) + { + WinEventHandler handler; + if (_winEventHandlers.TryGetValue(hWinEventHook, out handler)) + { + handler(eventType, hWnd, idObject, idChild, dwEventThread, dwmsEventTime); + } + } + + } + +} diff --git a/GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs b/GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs new file mode 100644 index 000000000..5e0a05cf7 --- /dev/null +++ b/GreenshotJiraPlugin/Hooking/WindowsTitleMonitor.cs @@ -0,0 +1,139 @@ +/* + * dapplo - building blocks for desktop applications + * Copyright (C) Dapplo 2015-2016 + * + * For more information see: http://dapplo.net/ + * dapplo repositories are hosted on GitHub: https://github.com/dapplo + * + * 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 GreenshotPlugin.Core; +using GreenshotPlugin.UnmanagedHelpers; + +namespace GreenshotJiraPlugin.Hooking +{ + /// + /// Monitor all title changes + /// + public sealed class WindowsTitleMonitor : IDisposable + { + private WindowsEventHook _hook; + private readonly object _lockObject = new object(); + // ReSharper disable once InconsistentNaming + private event TitleChangeEventDelegate _titleChangeEvent; + + /// + /// Add / remove event handler to the title monitor + /// + public event TitleChangeEventDelegate TitleChangeEvent + { + add + { + lock (_lockObject) + { + if (_hook == null) + { + _hook = new WindowsEventHook(); + _hook.Hook(WinEvent.EVENT_OBJECT_NAMECHANGE, WinEventHandler); + } + _titleChangeEvent += value; + } + } + remove + { + lock (_lockObject) + { + _titleChangeEvent -= value; + if (_titleChangeEvent == null || _titleChangeEvent.GetInvocationList().Length == 0) + { + if (_hook != null) + { + _hook.Dispose(); + _hook = null; + } + } + } + } + } + + /// + /// WinEventDelegate for the creation & destruction + /// + /// + /// + /// + /// + /// + /// + private void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) + { + if (hWnd == IntPtr.Zero || idObject != EventObjects.OBJID_WINDOW) + { + return; + } + if (eventType == WinEvent.EVENT_OBJECT_NAMECHANGE) + { + if (_titleChangeEvent != null) + { + string newTitle = new WindowDetails(hWnd).Text; + _titleChangeEvent(new TitleChangeEventArgs { HWnd = hWnd, Title = newTitle }); + } + } + } + + #region IDisposable Support + + private bool _disposedValue; // To detect redundant calls + + /// + /// Dispose the underlying hook + /// + public void Dispose(bool disposing) + { + if (_disposedValue) + { + return; + } + lock (_lockObject) + { + _hook?.Dispose(); + } + _disposedValue = true; + } + + /// + /// Make sure the finalizer disposes the underlying hook + /// + ~WindowsTitleMonitor() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(false); + } + + /// + /// Dispose the underlying hook + /// + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + } + +} diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index 65f2baa66..d3ded2449 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -47,12 +47,13 @@ namespace GreenshotJiraPlugin { private DateTimeOffset _loggedInTime = DateTimeOffset.MinValue; private bool _loggedIn; private readonly int _timeout; - private readonly object _lock = new object(); - private string _url; private JiraApi _jiraApi; private IssueTypeBitmapCache _issueTypeBitmapCache; private static readonly SvgBitmapHttpContentConverter SvgBitmapHttpContentConverterInstance = new SvgBitmapHttpContentConverter(); + /// + /// Initialize some basic stuff, in the case the SVG to bitmap converter + /// static JiraConnector() { if (HttpExtensionsGlobals.HttpContentConverters.All(x => x.GetType() != typeof(SvgBitmapHttpContentConverter))) @@ -72,46 +73,48 @@ namespace GreenshotJiraPlugin { } + /// + /// Dispose, logout the users + /// public void Dispose() { if (_jiraApi != null) { - Task.Run(async () => await Logout()).Wait(); + Task.Run(async () => await LogoutAsync()).Wait(); } } + /// + /// Constructor + /// public JiraConnector() { - _url = JiraConfig.Url.Replace(DefaultPostfix, ""); + JiraConfig.Url = JiraConfig.Url.Replace(DefaultPostfix, ""); _timeout = JiraConfig.Timeout; } + /// + /// Access the jira monitor + /// + public JiraMonitor Monitor { get; private set; } + /// /// Internal login which catches the exceptions /// /// true if login was done sucessfully - private async Task DoLogin(string user, string password) + private async Task DoLoginAsync(string user, string password) { - lock (_lock) + if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password)) { - if (_url.EndsWith("wsdl")) - { - _url = _url.Replace(DefaultPostfix, ""); - } - if (_jiraApi == null) - { - // recreate the service with the new url - _jiraApi = new JiraApi(new Uri(_url)); - _issueTypeBitmapCache = new IssueTypeBitmapCache(_jiraApi); - } + return false; } - + _jiraApi = new JiraApi(new Uri(JiraConfig.Url)); + _issueTypeBitmapCache = new IssueTypeBitmapCache(_jiraApi); + Monitor = new JiraMonitor(); + await Monitor.AddJiraInstanceAsync(_jiraApi); LoginInfo loginInfo; try { loginInfo = await _jiraApi.StartSessionAsync(user, password); - // Worked, store the url in the configuration - JiraConfig.Url = _url; - IniConfig.Save(); } catch (Exception) { @@ -120,17 +123,21 @@ namespace GreenshotJiraPlugin { return loginInfo != null; } - public async Task Login() { - await Logout(); + /// + /// Use the credentials dialog, this will show if there are not correct credentials. + /// If there are credentials, call the real login. + /// + /// Task + public async Task LoginAsync() { + await LogoutAsync(); try { // Get the system name, so the user knows where to login to - string systemName = _url.Replace(DefaultPostfix,""); - var credentialsDialog = new CredentialsDialog(systemName) + var credentialsDialog = new CredentialsDialog(JiraConfig.Url) { Name = null }; while (credentialsDialog.Show(credentialsDialog.Name) == DialogResult.OK) { - if (await DoLogin(credentialsDialog.Name, credentialsDialog.Password)) { + if (await DoLoginAsync(credentialsDialog.Name, credentialsDialog.Password)) { if (credentialsDialog.SaveChecked) { credentialsDialog.Confirm(true); } @@ -159,9 +166,10 @@ namespace GreenshotJiraPlugin { /// /// End the session, if there was one /// - public async Task Logout() { + public async Task LogoutAsync() { if (_jiraApi != null && _loggedIn) { + Monitor.Dispose(); await _jiraApi.EndSessionAsync(); _loggedIn = false; } @@ -172,14 +180,14 @@ namespace GreenshotJiraPlugin { /// Do not use ConfigureAwait to call this, as it will move await from the UI thread. /// /// - private async Task CheckCredentials() { + private async Task CheckCredentialsAsync() { if (_loggedIn) { if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) { - await Logout(); - await Login(); + await LogoutAsync(); + await LoginAsync(); } } else { - await Login(); + await LoginAsync(); } } @@ -189,7 +197,7 @@ namespace GreenshotJiraPlugin { /// List with filters public async Task> GetFavoriteFiltersAsync() { - await CheckCredentials(); + await CheckCredentialsAsync(); return await _jiraApi.GetFavoriteFiltersAsync().ConfigureAwait(false); } @@ -200,7 +208,7 @@ namespace GreenshotJiraPlugin { /// Issue public async Task GetIssueAsync(string issueKey) { - await CheckCredentials(); + await CheckCredentialsAsync(); try { return await _jiraApi.GetIssueAsync(issueKey).ConfigureAwait(false); @@ -220,7 +228,7 @@ namespace GreenshotJiraPlugin { /// public async Task AttachAsync(string issueKey, IBinaryContainer content, CancellationToken cancellationToken = default(CancellationToken)) { - await CheckCredentials(); + await CheckCredentialsAsync(); using (var memoryStream = new MemoryStream()) { content.WriteToStream(memoryStream); @@ -238,7 +246,7 @@ namespace GreenshotJiraPlugin { /// CancellationToken public async Task AddCommentAsync(string issueKey, string body, string visibility = null, CancellationToken cancellationToken = default(CancellationToken)) { - await CheckCredentials(); + await CheckCredentialsAsync(); await _jiraApi.AddCommentAsync(issueKey, body, visibility, cancellationToken).ConfigureAwait(false); } @@ -250,7 +258,7 @@ namespace GreenshotJiraPlugin { /// public async Task> SearchAsync(Filter filter, CancellationToken cancellationToken = default(CancellationToken)) { - await CheckCredentials(); + await CheckCredentialsAsync(); var searchResult = await _jiraApi.SearchAsync(filter.Jql, 20, new[] { "summary", "reporter", "assignee", "created", "issuetype" }, cancellationToken).ConfigureAwait(false); return searchResult.Issues; } @@ -266,8 +274,14 @@ namespace GreenshotJiraPlugin { return await _issueTypeBitmapCache.GetOrCreateAsync(issue.Fields.IssueType, cancellationToken).ConfigureAwait(false); } + /// + /// Get the base uri + /// public Uri JiraBaseUri => _jiraApi.JiraBaseUri; + /// + /// Is the user "logged in? + /// public bool IsLoggedIn => _loggedIn; } } \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index 6d472535a..d221ba996 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -61,7 +61,7 @@ namespace GreenshotJiraPlugin { return Language.GetString("jira", LangKey.upload_menu_item); } // Format the title of this destination - return Designation + " - " + _jiraIssue.Key + ": " + _jiraIssue.Fields.Summary.Substring(0, Math.Min(20, _jiraIssue.Fields.Summary.Length)); + return _jiraIssue.Key + ": " + _jiraIssue.Fields.Summary.Substring(0, Math.Min(20, _jiraIssue.Fields.Summary.Length)); } } @@ -86,15 +86,15 @@ namespace GreenshotJiraPlugin { } } - public override IEnumerable DynamicDestinations() { - if (JiraPlugin.Instance.CurrentJiraConnector == null || !JiraPlugin.Instance.CurrentJiraConnector.IsLoggedIn) { + public override IEnumerable DynamicDestinations() + { + var jiraConnector = JiraPlugin.Instance.CurrentJiraConnector; + if (jiraConnector == null || !jiraConnector.IsLoggedIn) { yield break; } - var issues = JiraUtils.GetCurrentJirasAsync().Result; - if (issues != null) { - foreach(var jiraIssue in issues) { - yield return new JiraDestination(_jiraPlugin, jiraIssue); - } + foreach(var jiraDetails in jiraConnector.Monitor.RecentJiras) + { + yield return new JiraDestination(_jiraPlugin,jiraDetails.JiraIssue); } } diff --git a/GreenshotJiraPlugin/JiraDetails.cs b/GreenshotJiraPlugin/JiraDetails.cs new file mode 100644 index 000000000..e03172873 --- /dev/null +++ b/GreenshotJiraPlugin/JiraDetails.cs @@ -0,0 +1,71 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub: https://github.com/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 Dapplo.Jira.Entities; + +namespace GreenshotJiraPlugin +{ + public class JiraDetails : IComparable + { + public JiraDetails() + { + FirstSeenAt = SeenAt = DateTimeOffset.Now; + } + + public string ProjectKey + { + get; + set; + } + + public string Id + { + get; + set; + } + + public string JiraKey => ProjectKey + "-" + Id; + + public Issue JiraIssue + { + get; + set; + } + + public DateTimeOffset FirstSeenAt + { + get; + private set; + } + + public DateTimeOffset SeenAt + { + get; + set; + } + + public int CompareTo(JiraDetails other) + { + return SeenAt.CompareTo(other.SeenAt); + } + } +} \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraEventArgs.cs b/GreenshotJiraPlugin/JiraEventArgs.cs new file mode 100644 index 000000000..cbe7caa0d --- /dev/null +++ b/GreenshotJiraPlugin/JiraEventArgs.cs @@ -0,0 +1,40 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub: https://github.com/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 GreenshotJiraPlugin +{ + public class JiraEventArgs : EventArgs + { + public JiraEventTypes EventType + { + get; + set; + } + + public JiraDetails Details + { + get; + set; + } + } +} diff --git a/GreenshotJiraPlugin/JiraEventTypes.cs b/GreenshotJiraPlugin/JiraEventTypes.cs new file mode 100644 index 000000000..06b95db22 --- /dev/null +++ b/GreenshotJiraPlugin/JiraEventTypes.cs @@ -0,0 +1,29 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub: https://github.com/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 GreenshotJiraPlugin +{ + public enum JiraEventTypes + { + OrderChanged, + DetectedNewJiraIssue + } +} \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraMonitor.cs b/GreenshotJiraPlugin/JiraMonitor.cs new file mode 100644 index 000000000..1d3784fd0 --- /dev/null +++ b/GreenshotJiraPlugin/JiraMonitor.cs @@ -0,0 +1,225 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub: https://github.com/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.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Dapplo.Jira; +using Dapplo.Log.Facade; +using GreenshotJiraPlugin.Hooking; + +namespace GreenshotJiraPlugin +{ + + /// + /// This class will monitor all _jira activity by registering for title changes + /// It keeps a list of the last "accessed" jiras, and makes it easy to upload to one. + /// Make sure this is instanciated on the UI thread! + /// + public class JiraMonitor : IDisposable + { + private static readonly LogSource Log = new LogSource(); + private readonly Regex _jiraKeyPattern = new Regex(@"[A-Z][A-Z0-9]+\-[0-9]+"); + private readonly WindowsTitleMonitor _monitor; + private readonly IList _jiraInstances = new List(); + private readonly IDictionary _projectJiraApiMap = new Dictionary(); + private readonly int _maxEntries; + private IDictionary _recentJiras = new Dictionary(); + + /// + /// Register to this event to get events when new jira issues are detected + /// + public event EventHandler JiraEvent; + + public JiraMonitor(int maxEntries = 40) + { + _maxEntries = maxEntries; + _monitor = new WindowsTitleMonitor(); + _monitor.TitleChangeEvent += MonitorTitleChangeEvent; + } + + #region Dispose + + /// + /// Dispose + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose all managed resources + /// + /// when true is passed all managed resources are disposed. + protected void Dispose(bool disposing) + { + if (!disposing) + { + return; + } + // free managed resources + _monitor.TitleChangeEvent -= MonitorTitleChangeEvent; + _monitor.Dispose(); + // free native resources if there are any. + } + + #endregion + + /// + /// Retrieve the API belonging to a JiraDetails + /// + /// + /// JiraAPI + public JiraApi GetJiraApiForKey(JiraDetails jiraDetails) + { + return _projectJiraApiMap[jiraDetails.ProjectKey]; + } + + /// + /// Get the "list" of recently seen Jiras + /// + public IEnumerable RecentJiras => + (from jiraDetails in _recentJiras.Values + orderby jiraDetails.SeenAt descending + select jiraDetails); + + /// + /// Check if this monitor has active instances + /// + public bool HasJiraInstances => _jiraInstances.Count > 0; + + /// + /// Add an instance of a JIRA system + /// + /// + /// + public async Task AddJiraInstanceAsync(JiraApi jiraInstance, CancellationToken token = default(CancellationToken)) + { + _jiraInstances.Add(jiraInstance); + var projects = await jiraInstance.GetProjectsAsync(token).ConfigureAwait(false); + if (projects != null) + { + foreach (var project in projects) + { + if (!_projectJiraApiMap.ContainsKey(project.Key)) + { + _projectJiraApiMap.Add(project.Key, jiraInstance); + } + } + } + } + + /// + /// This method will update details, like the title, and send an event to registed listeners of the JiraEvent + /// + /// Contains the jira key to retrieve the title (XYZ-1234) + /// Task + private async Task DetectedNewJiraIssueAsync(JiraDetails jiraDetails) + { + try + { + JiraApi jiraApi; + if (_projectJiraApiMap.TryGetValue(jiraDetails.ProjectKey, out jiraApi)) + { + var issue = await jiraApi.GetIssueAsync(jiraDetails.JiraKey).ConfigureAwait(false); + jiraDetails.JiraIssue = issue; + } + // Send event + JiraEvent?.Invoke(this, new JiraEventArgs { Details = jiraDetails, EventType = JiraEventTypes.DetectedNewJiraIssue }); + } + catch (Exception ex) + { + Log.Warn().WriteLine("Couldn't retrieve JIRA title: {0}", ex.Message); + } + } + + /// + /// Handle title changes, check for JIRA + /// + /// + private void MonitorTitleChangeEvent(TitleChangeEventArgs eventArgs) + { + string windowTitle = eventArgs.Title; + if (string.IsNullOrEmpty(windowTitle)) + { + return; + } + var jiraKeyMatch = _jiraKeyPattern.Match(windowTitle); + if (!jiraKeyMatch.Success) + { + return; + } + // Found a possible JIRA title + var jiraKey = jiraKeyMatch.Value; + var jiraKeyParts = jiraKey.Split('-'); + var projectKey = jiraKeyParts[0]; + var jiraId = jiraKeyParts[1]; + + JiraApi jiraApi; + // Check if we have a JIRA instance with a project for this key + if (_projectJiraApiMap.TryGetValue(projectKey, out jiraApi)) + { + // We have found a project for this _jira key, so it must be a valid & known JIRA + JiraDetails currentJiraDetails; + if (_recentJiras.TryGetValue(jiraKey, out currentJiraDetails)) + { + // update + currentJiraDetails.SeenAt = DateTimeOffset.Now; + + // Notify the order change + JiraEvent?.Invoke(this, new JiraEventArgs { Details = currentJiraDetails, EventType = JiraEventTypes.OrderChanged }); + // Nothing else to do + + return; + } + // We detected an unknown JIRA, so add it to our list + currentJiraDetails = new JiraDetails() + { + Id = jiraId, + ProjectKey = projectKey + }; + _recentJiras.Add(currentJiraDetails.JiraKey, currentJiraDetails); + + // Make sure we don't collect _jira's until the memory is full + if (_recentJiras.Count > _maxEntries) + { + // Add it to the list of recent Jiras + IList clonedList = new List(_recentJiras.Values); + _recentJiras = (from jiraDetails in clonedList + orderby jiraDetails.SeenAt descending + select jiraDetails).Take(_maxEntries).ToDictionary(jd => jd.JiraKey, jd => jd); + } + // Now we can get the title from JIRA itself + // ReSharper disable once UnusedVariable + var updateTitleTask = DetectedNewJiraIssueAsync(currentJiraDetails); + } + else + { + Log.Info().WriteLine("Couldn't match possible JIRA key {0} to projects in a configured JIRA instance, ignoring", projectKey); + } + } + } +} \ No newline at end of file diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 6f9e499e9..009ac9ce3 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -33,9 +33,9 @@ namespace GreenshotJiraPlugin { /// public class JiraPlugin : IGreenshotPlugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraPlugin)); - private JiraConnector _jiraConnector; private JiraConfiguration _config; private static JiraPlugin _instance; + private JiraConnector _jiraConnector; public void Dispose() { Dispose(true); @@ -44,9 +44,9 @@ namespace GreenshotJiraPlugin { protected void Dispose(bool disposing) { if (disposing) { - if (_jiraConnector != null) { - _jiraConnector.Dispose(); - _jiraConnector = null; + if (JiraConnector != null) { + JiraConnector.Dispose(); + JiraConnector = null; } } } @@ -66,9 +66,23 @@ namespace GreenshotJiraPlugin { } //Needed for a fail-fast - public JiraConnector CurrentJiraConnector => _jiraConnector; + public JiraConnector CurrentJiraConnector => JiraConnector; - public JiraConnector JiraConnector => _jiraConnector ?? (_jiraConnector = new JiraConnector()); + public JiraConnector JiraConnector + { + get + { + lock (_instance) + { + if (_jiraConnector == null) + { + JiraConnector = new JiraConnector(); + } + } + return _jiraConnector; + } + private set { _jiraConnector = value; } + } /// /// Implementation of the IGreenshotPlugin.Initialize @@ -80,14 +94,15 @@ namespace GreenshotJiraPlugin { // Register configuration (don't need the configuration itself) _config = IniConfig.GetIniSection(); LogSettings.RegisterDefaultLogger(); + return true; } public void Shutdown() { Log.Debug("Jira Plugin shutdown."); - if (_jiraConnector != null) + if (JiraConnector != null) { - Task.Run(async () => await _jiraConnector.Logout()); + Task.Run(async () => await JiraConnector.LogoutAsync()); } } @@ -98,12 +113,12 @@ namespace GreenshotJiraPlugin { string url = _config.Url; if (ShowConfigDialog()) { // check for re-login - if (_jiraConnector != null && _jiraConnector.IsLoggedIn && !string.IsNullOrEmpty(url)) { + if (JiraConnector != null && JiraConnector.IsLoggedIn && !string.IsNullOrEmpty(url)) { if (!url.Equals(_config.Url)) { Task.Run(async () => { - await _jiraConnector.Logout(); - await _jiraConnector.Login(); + await JiraConnector.LogoutAsync(); + await JiraConnector.LoginAsync(); }); } } diff --git a/GreenshotJiraPlugin/JiraUtils.cs b/GreenshotJiraPlugin/JiraUtils.cs deleted file mode 100644 index 94984f555..000000000 --- a/GreenshotJiraPlugin/JiraUtils.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Text.RegularExpressions; -using System.Threading.Tasks; -using Dapplo.Jira.Entities; -using Greenshot.IniFile; -using GreenshotPlugin.Core; - -namespace GreenshotJiraPlugin { - /// - /// Description of JiraUtils. - /// - public static class JiraUtils { - private static readonly Regex JiraKeyRegex = new Regex(@"/browse/([A-Z0-9]+\-[0-9]+)"); - private static readonly JiraConfiguration Config = IniConfig.GetIniSection(); - private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraUtils)); - - public static async Task> GetCurrentJirasAsync() { - // Make sure we suppress the login - var jirakeys = new List(); - foreach(string url in IEHelper.GetIEUrls()) { - if (url == null) { - continue; - } - var jiraKeyMatch = JiraKeyRegex.Matches(url); - if (jiraKeyMatch.Count > 0) { - string jiraKey = jiraKeyMatch[0].Groups[1].Value; - jirakeys.Add(jiraKey); - } - } - if (!string.IsNullOrEmpty(Config.LastUsedJira) && !jirakeys.Contains(Config.LastUsedJira)) { - jirakeys.Add(Config.LastUsedJira); - } - if (jirakeys.Count > 0) { - var jiraIssues = new List(); - foreach(string jiraKey in jirakeys) { - try - { - var issue = await JiraPlugin.Instance.JiraConnector.GetIssueAsync(jiraKey).ConfigureAwait(false); - if (issue != null) - { - jiraIssues.Add(issue); - } - } - catch (Exception ex) - { - Log.Error(ex); - // Remove issue from the last used jira config, as it caused an issue (probably not there) - if (Config.LastUsedJira == jiraKey) - { - Config.LastUsedJira = null; - } - } - } - if (jiraIssues.Count > 0) { - return jiraIssues; - } - } - return null; - } - } -} diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 5f9eaa8ab..6aa8d2bff 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -59,10 +59,10 @@ namespace GreenshotPlugin.Core { /// Encapsulates dialog functionality from the Credential Management API. public sealed class CredentialsDialog { [DllImport("gdi32.dll", SetLastError=true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool DeleteObject(IntPtr hObject); + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteObject(IntPtr hObject); - /// The only valid bitmap height (in pixels) of a user-defined banner. + /// The only valid bitmap height (in pixels) of a user-defined banner. private const int ValidBannerHeight = 60; /// The only valid bitmap width (in pixels) of a user-defined banner. @@ -102,65 +102,25 @@ namespace GreenshotPlugin.Core { Banner = banner; } - private bool _alwaysDisplay; /// /// Gets or sets if the dialog will be shown even if the credentials /// can be returned from an existing credential in the credential manager. /// - public bool AlwaysDisplay { - get { - return _alwaysDisplay; - } - set { - _alwaysDisplay = value; - } - } + public bool AlwaysDisplay { get; set; } - private bool _excludeCertificates = true; /// Gets or sets if the dialog is populated with name/password only. - public bool ExcludeCertificates { - get { - return _excludeCertificates; - } - set { - _excludeCertificates = value; - } - } + public bool ExcludeCertificates { get; set; } = true; - private bool _persist = true; /// Gets or sets if the credentials are to be persisted in the credential manager. - public bool Persist { - get { - return _persist; - } - set { - _persist = value; - } - } + public bool Persist { get; set; } = true; - private bool _incorrectPassword; /// Gets or sets if the incorrect password balloontip needs to be shown. Introduced AFTER Windows XPGets> - public bool IncorrectPassword { - get { - return _incorrectPassword; - } - set { - _incorrectPassword = value; - } - } + public bool IncorrectPassword { get; set; } - private bool _keepName; /// Gets or sets if the name is read-only. - public bool KeepName { - get { - return _keepName; - } - set { - _keepName = value; - } - } + public bool KeepName { get; set; } - private string _name = String.Empty; + private string _name = string.Empty; /// Gets or sets the name for the credentials. public string Name { get { @@ -169,18 +129,18 @@ namespace GreenshotPlugin.Core { set { if (value != null) { if (value.Length > CREDUI.MAX_USERNAME_LENGTH) { - string message = String.Format( + string message = string.Format( Thread.CurrentThread.CurrentUICulture, "The name has a maximum length of {0} characters.", CREDUI.MAX_USERNAME_LENGTH); - throw new ArgumentException(message, "Name"); + throw new ArgumentException(message, nameof(Name)); } } _name = value; } } - private string _password = String.Empty; + private string _password = string.Empty; /// Gets or sets the password for the credentials. public string Password { get { @@ -189,41 +149,25 @@ namespace GreenshotPlugin.Core { set { if (value != null) { if (value.Length > CREDUI.MAX_PASSWORD_LENGTH) { - string message = String.Format( + string message = string.Format( Thread.CurrentThread.CurrentUICulture, "The password has a maximum length of {0} characters.", CREDUI.MAX_PASSWORD_LENGTH); - throw new ArgumentException(message, "Password"); + throw new ArgumentException(message, nameof(Password)); } } _password = value; } } - private bool _saveChecked; /// Gets or sets if the save checkbox status. - public bool SaveChecked { - get { - return _saveChecked; - } - set { - _saveChecked = value; - } - } + public bool SaveChecked { get; set; } - private bool _saveDisplayed = true; /// Gets or sets if the save checkbox is displayed. /// This value only has effect if Persist is true. - public bool SaveDisplayed { - get { - return _saveDisplayed; - } - set { - _saveDisplayed = value; - } - } + public bool SaveDisplayed { get; set; } = true; - private string _target = String.Empty; + private string _target = string.Empty; /// Gets or sets the name of the target for the credentials, typically a server name. public string Target { get { @@ -232,18 +176,19 @@ namespace GreenshotPlugin.Core { set { if (value == null) { throw new ArgumentException("The target cannot be a null value.", "Target"); - } else if (value.Length > CREDUI.MAX_GENERIC_TARGET_LENGTH) { - string message = String.Format( + } + if (value.Length > CREDUI.MAX_GENERIC_TARGET_LENGTH) { + string message = string.Format( Thread.CurrentThread.CurrentUICulture, "The target has a maximum length of {0} characters.", CREDUI.MAX_GENERIC_TARGET_LENGTH); - throw new ArgumentException(message, "Target"); + throw new ArgumentException(message, nameof(Target)); } _target = value; } } - private string _caption = String.Empty; + private string _caption = string.Empty; /// Gets or sets the caption of the dialog. /// A null value will cause a system default caption to be used. public string Caption { @@ -253,18 +198,18 @@ namespace GreenshotPlugin.Core { set { if (value != null) { if (value.Length > CREDUI.MAX_CAPTION_LENGTH) { - string message = String.Format( + string message = string.Format( Thread.CurrentThread.CurrentUICulture, "The caption has a maximum length of {0} characters.", CREDUI.MAX_CAPTION_LENGTH); - throw new ArgumentException(message, "Caption"); + throw new ArgumentException(message, nameof(Caption)); } } _caption = value; } } - private string _message = String.Empty; + private string _message = string.Empty; /// Gets or sets the message of the dialog. /// A null value will cause a system default message to be used. public string Message { @@ -274,11 +219,11 @@ namespace GreenshotPlugin.Core { set { if (value != null) { if (value.Length > CREDUI.MAX_MESSAGE_LENGTH) { - string message = String.Format( + string message = string.Format( Thread.CurrentThread.CurrentUICulture, "The message has a maximum length of {0} characters.", CREDUI.MAX_MESSAGE_LENGTH); - throw new ArgumentException(message, "Message"); + throw new ArgumentException(message, nameof(Message)); } } _message = value; @@ -295,10 +240,10 @@ namespace GreenshotPlugin.Core { set { if (value != null) { if (value.Width != ValidBannerWidth) { - throw new ArgumentException("The banner image width must be 320 pixels.", "Banner"); + throw new ArgumentException("The banner image width must be 320 pixels.", nameof(Banner)); } if (value.Height != ValidBannerHeight) { - throw new ArgumentException("The banner image height must be 60 pixels.", "Banner"); + throw new ArgumentException("The banner image height must be 60 pixels.", nameof(Banner)); } } _banner = value; diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index c5bcb7daa..0d73ebeef 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -112,7 +112,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring WS_EX_COMPOSITED = 0x02000000, WS_EX_NOACTIVATE = 0x08000000 - } + } [Flags] [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -202,38 +202,38 @@ namespace GreenshotPlugin.UnmanagedHelpers { [SuppressMessage("ReSharper", "InconsistentNaming")] public enum SYSCOLOR { - SCROLLBAR = 0, - BACKGROUND = 1, - DESKTOP = 1, - ACTIVECAPTION = 2, - INACTIVECAPTION = 3, - MENU = 4, - WINDOW = 5, - WINDOWFRAME = 6, - MENUTEXT = 7, - WINDOWTEXT = 8, - CAPTIONTEXT = 9, - ACTIVEBORDER = 10, - INACTIVEBORDER = 11, - APPWORKSPACE = 12, - HIGHLIGHT = 13, - HIGHLIGHTTEXT = 14, - BTNFACE = 15, - THREEDFACE = 15, - BTNSHADOW = 16, - THREEDSHADOW = 16, - GRAYTEXT = 17, - BTNTEXT = 18, - INACTIVECAPTIONTEXT = 19, - BTNHIGHLIGHT = 20, - TREEDHIGHLIGHT = 20, - THREEDHILIGHT = 20, - BTNHILIGHT = 20, - THREEDDKSHADOW = 21, - THREEDLIGHT = 22, - INFOTEXT = 23, - INFOBK = 24 - } + SCROLLBAR = 0, + BACKGROUND = 1, + DESKTOP = 1, + ACTIVECAPTION = 2, + INACTIVECAPTION = 3, + MENU = 4, + WINDOW = 5, + WINDOWFRAME = 6, + MENUTEXT = 7, + WINDOWTEXT = 8, + CAPTIONTEXT = 9, + ACTIVEBORDER = 10, + INACTIVEBORDER = 11, + APPWORKSPACE = 12, + HIGHLIGHT = 13, + HIGHLIGHTTEXT = 14, + BTNFACE = 15, + THREEDFACE = 15, + BTNSHADOW = 16, + THREEDSHADOW = 16, + GRAYTEXT = 17, + BTNTEXT = 18, + INACTIVECAPTIONTEXT = 19, + BTNHIGHLIGHT = 20, + TREEDHIGHLIGHT = 20, + THREEDHILIGHT = 20, + BTNHILIGHT = 20, + THREEDDKSHADOW = 21, + THREEDLIGHT = 22, + INFOTEXT = 23, + INFOBK = 24 + } /// /// Flags used with the Windows API (User32.dll):GetSystemMetrics(SystemMetric smIndex) /// @@ -642,12 +642,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { DWMWA_FORCE_ICONIC_REPRESENTATION, DWMWA_FLIP3D_POLICY, DWMWA_EXTENDED_FRAME_BOUNDS, // This is the one we need for retrieving the Window size since Windows Vista - DWMWA_HAS_ICONIC_BITMAP, // Since Windows 7 - DWMWA_DISALLOW_PEEK, // Since Windows 7 - DWMWA_EXCLUDED_FROM_PEEK, // Since Windows 7 - DWMWA_CLOAK, // Since Windows 8 - DWMWA_CLOAKED, // Since Windows 8 - DWMWA_FREEZE_REPRESENTATION, // Since Windows 8 + DWMWA_HAS_ICONIC_BITMAP, // Since Windows 7 + DWMWA_DISALLOW_PEEK, // Since Windows 7 + DWMWA_EXCLUDED_FROM_PEEK, // Since Windows 7 + DWMWA_CLOAK, // Since Windows 8 + DWMWA_CLOAKED, // Since Windows 8 + DWMWA_FREEZE_REPRESENTATION, // Since Windows 8 DWMWA_LAST } @@ -987,199 +987,199 @@ namespace GreenshotPlugin.UnmanagedHelpers { Synchronize = 0x00100000 } - /// - /// See: http://msdn.microsoft.com/en-us/library/aa909766.aspx - /// - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum SoundFlags - { - SND_SYNC = 0x0000, // play synchronously (default) - SND_ASYNC = 0x0001, // play asynchronously - SND_NODEFAULT = 0x0002, // silence (!default) if sound not found - SND_MEMORY = 0x0004, // pszSound points to a memory file - SND_LOOP = 0x0008, // loop the sound until next sndPlaySound - SND_NOSTOP = 0x0010, // don't stop any currently playing sound - SND_NOWAIT = 0x00002000, // don't wait if the driver is busy - SND_ALIAS = 0x00010000, // name is a registry alias - SND_ALIAS_ID = 0x00110000, // alias is a predefined id - SND_FILENAME = 0x00020000, // name is file name - } - + /// + /// See: http://msdn.microsoft.com/en-us/library/aa909766.aspx + /// + [Flags] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public enum SoundFlags + { + SND_SYNC = 0x0000, // play synchronously (default) + SND_ASYNC = 0x0001, // play asynchronously + SND_NODEFAULT = 0x0002, // silence (!default) if sound not found + SND_MEMORY = 0x0004, // pszSound points to a memory file + SND_LOOP = 0x0008, // loop the sound until next sndPlaySound + SND_NOSTOP = 0x0010, // don't stop any currently playing sound + SND_NOWAIT = 0x00002000, // don't wait if the driver is busy + SND_ALIAS = 0x00010000, // name is a registry alias + SND_ALIAS_ID = 0x00110000, // alias is a predefined id + SND_FILENAME = 0x00020000, // name is file name + } + /// /// Used by GDI32.GetDeviceCaps /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877%28v=vs.85%29.aspx /// [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DeviceCaps { - /// - /// Device driver version - /// - DRIVERVERSION = 0, - /// - /// Device classification - /// - TECHNOLOGY = 2, - /// - /// Horizontal size in millimeters - /// - HORZSIZE = 4, - /// - /// Vertical size in millimeters - /// - VERTSIZE = 6, - /// - /// Horizontal width in pixels - /// - HORZRES = 8, - /// - /// Vertical height in pixels - /// - VERTRES = 10, - /// - /// Number of bits per pixel - /// - BITSPIXEL = 12, - /// - /// Number of planes - /// - PLANES = 14, - /// - /// Number of brushes the device has - /// - NUMBRUSHES = 16, - /// - /// Number of pens the device has - /// - NUMPENS = 18, - /// - /// Number of markers the device has - /// - NUMMARKERS = 20, - /// - /// Number of fonts the device has - /// - NUMFONTS = 22, - /// - /// Number of colors the device supports - /// - NUMCOLORS = 24, - /// - /// Size required for device descriptor - /// - PDEVICESIZE = 26, - /// - /// Curve capabilities - /// - CURVECAPS = 28, - /// - /// Line capabilities - /// - LINECAPS = 30, - /// - /// Polygonal capabilities - /// - POLYGONALCAPS = 32, - /// - /// Text capabilities - /// - TEXTCAPS = 34, - /// - /// Clipping capabilities - /// - CLIPCAPS = 36, - /// - /// Bitblt capabilities - /// - RASTERCAPS = 38, - /// - /// Length of the X leg - /// - ASPECTX = 40, - /// - /// Length of the Y leg - /// - ASPECTY = 42, - /// - /// Length of the hypotenuse - /// - ASPECTXY = 44, - /// - /// Shading and Blending caps - /// - SHADEBLENDCAPS = 45, + /// + /// Device driver version + /// + DRIVERVERSION = 0, + /// + /// Device classification + /// + TECHNOLOGY = 2, + /// + /// Horizontal size in millimeters + /// + HORZSIZE = 4, + /// + /// Vertical size in millimeters + /// + VERTSIZE = 6, + /// + /// Horizontal width in pixels + /// + HORZRES = 8, + /// + /// Vertical height in pixels + /// + VERTRES = 10, + /// + /// Number of bits per pixel + /// + BITSPIXEL = 12, + /// + /// Number of planes + /// + PLANES = 14, + /// + /// Number of brushes the device has + /// + NUMBRUSHES = 16, + /// + /// Number of pens the device has + /// + NUMPENS = 18, + /// + /// Number of markers the device has + /// + NUMMARKERS = 20, + /// + /// Number of fonts the device has + /// + NUMFONTS = 22, + /// + /// Number of colors the device supports + /// + NUMCOLORS = 24, + /// + /// Size required for device descriptor + /// + PDEVICESIZE = 26, + /// + /// Curve capabilities + /// + CURVECAPS = 28, + /// + /// Line capabilities + /// + LINECAPS = 30, + /// + /// Polygonal capabilities + /// + POLYGONALCAPS = 32, + /// + /// Text capabilities + /// + TEXTCAPS = 34, + /// + /// Clipping capabilities + /// + CLIPCAPS = 36, + /// + /// Bitblt capabilities + /// + RASTERCAPS = 38, + /// + /// Length of the X leg + /// + ASPECTX = 40, + /// + /// Length of the Y leg + /// + ASPECTY = 42, + /// + /// Length of the hypotenuse + /// + ASPECTXY = 44, + /// + /// Shading and Blending caps + /// + SHADEBLENDCAPS = 45, - /// - /// Logical pixels inch in X - /// - LOGPIXELSX = 88, - /// - /// Logical pixels inch in Y - /// - LOGPIXELSY = 90, + /// + /// Logical pixels inch in X + /// + LOGPIXELSX = 88, + /// + /// Logical pixels inch in Y + /// + LOGPIXELSY = 90, - /// - /// Number of entries in physical palette - /// - SIZEPALETTE = 104, - /// - /// Number of reserved entries in palette - /// - NUMRESERVED = 106, - /// - /// Actual color resolution - /// - COLORRES = 108, + /// + /// Number of entries in physical palette + /// + SIZEPALETTE = 104, + /// + /// Number of reserved entries in palette + /// + NUMRESERVED = 106, + /// + /// Actual color resolution + /// + COLORRES = 108, - // Printing related DeviceCaps. These replace the appropriate Escapes - /// - /// Physical Width in device units - /// - PHYSICALWIDTH = 110, - /// - /// Physical Height in device units - /// - PHYSICALHEIGHT = 111, - /// - /// Physical Printable Area x margin - /// - PHYSICALOFFSETX = 112, - /// - /// Physical Printable Area y margin - /// - PHYSICALOFFSETY = 113, - /// - /// Scaling factor x - /// - SCALINGFACTORX = 114, - /// - /// Scaling factor y - /// - SCALINGFACTORY = 115, + // Printing related DeviceCaps. These replace the appropriate Escapes + /// + /// Physical Width in device units + /// + PHYSICALWIDTH = 110, + /// + /// Physical Height in device units + /// + PHYSICALHEIGHT = 111, + /// + /// Physical Printable Area x margin + /// + PHYSICALOFFSETX = 112, + /// + /// Physical Printable Area y margin + /// + PHYSICALOFFSETY = 113, + /// + /// Scaling factor x + /// + SCALINGFACTORX = 114, + /// + /// Scaling factor y + /// + SCALINGFACTORY = 115, - /// - /// Current vertical refresh rate of the display device (for displays only) in Hz - /// - VREFRESH = 116, - /// - /// Horizontal width of entire desktop in pixels - /// - DESKTOPVERTRES = 117, - /// - /// Vertical height of entire desktop in pixels - /// - DESKTOPHORZRES = 118, - /// - /// Preferred blt alignment - /// - BLTALIGNMENT = 119 - } + /// + /// Current vertical refresh rate of the display device (for displays only) in Hz + /// + VREFRESH = 116, + /// + /// Horizontal width of entire desktop in pixels + /// + DESKTOPVERTRES = 117, + /// + /// Vertical height of entire desktop in pixels + /// + DESKTOPHORZRES = 118, + /// + /// Preferred blt alignment + /// + BLTALIGNMENT = 119 + } /// /// Used for User32.SetWinEventHook /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dd373640%28v=vs.85%29.aspx /// - [SuppressMessage("ReSharper", "InconsistentNaming")] + [SuppressMessage("ReSharper", "InconsistentNaming"), Flags] public enum WinEventHookFlags { WINEVENT_SKIPOWNTHREAD = 1, From 099813b5b656f2c1f9a67a3c58c947480e666f04 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 3 Sep 2016 23:42:04 +0200 Subject: [PATCH 106/170] FEATURE-731: reducing some of the logic, the upload form automatically takes the most recent. --- GreenshotJiraPlugin/Forms/JiraForm.cs | 15 +++++---------- GreenshotJiraPlugin/IssueTypeBitmapCache.cs | 2 +- GreenshotJiraPlugin/JiraConfiguration.cs | 5 ++--- GreenshotJiraPlugin/JiraMonitor.cs | 2 +- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/GreenshotJiraPlugin/Forms/JiraForm.cs b/GreenshotJiraPlugin/Forms/JiraForm.cs index efee62973..cfd5183e6 100644 --- a/GreenshotJiraPlugin/Forms/JiraForm.cs +++ b/GreenshotJiraPlugin/Forms/JiraForm.cs @@ -27,9 +27,8 @@ using Greenshot.IniFile; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; using System.Collections.Generic; -using System.IO; +using System.Linq; using System.Threading.Tasks; -using Dapplo.Jira; namespace GreenshotJiraPlugin.Forms { public partial class JiraForm : Form { @@ -84,14 +83,11 @@ namespace GreenshotJiraPlugin.Forms { jiraFilterBox.SelectedIndex = 0; } ChangeModus(true); - if (JiraConfig.LastUsedJira != null) + if (_jiraConnector.Monitor.RecentJiras.Any()) { - _selectedIssue = await _jiraConnector.GetIssueAsync(JiraConfig.LastUsedJira); - if (_selectedIssue != null) - { - jiraKey.Text = JiraConfig.LastUsedJira; - uploadButton.Enabled = true; - } + _selectedIssue = _jiraConnector.Monitor.RecentJiras.First().JiraIssue; + jiraKey.Text = _selectedIssue.Key; + uploadButton.Enabled = true; } } } @@ -118,7 +114,6 @@ namespace GreenshotJiraPlugin.Forms { } public async Task UploadAsync(IBinaryContainer attachment) { - JiraConfig.LastUsedJira = _selectedIssue.Key; attachment.Filename = jiraFilenameBox.Text; await _jiraConnector.AttachAsync(_selectedIssue.Key, attachment); diff --git a/GreenshotJiraPlugin/IssueTypeBitmapCache.cs b/GreenshotJiraPlugin/IssueTypeBitmapCache.cs index 162b41b13..b48173e8f 100644 --- a/GreenshotJiraPlugin/IssueTypeBitmapCache.cs +++ b/GreenshotJiraPlugin/IssueTypeBitmapCache.cs @@ -39,7 +39,7 @@ namespace GreenshotJiraPlugin { _jiraApi = jiraApi; // Set the expire timeout to an hour - ExpireTimeSpan = TimeSpan.FromHours(1); + ExpireTimeSpan = TimeSpan.FromHours(4); } protected override string CreateKey(IssueType keyObject) diff --git a/GreenshotJiraPlugin/JiraConfiguration.cs b/GreenshotJiraPlugin/JiraConfiguration.cs index 1f8e0bc31..8674aeaa4 100644 --- a/GreenshotJiraPlugin/JiraConfiguration.cs +++ b/GreenshotJiraPlugin/JiraConfiguration.cs @@ -37,13 +37,12 @@ namespace GreenshotJiraPlugin { [IniProperty("Timeout", Description="Session timeout in minutes", DefaultValue="30")] public int Timeout { get; set; } - [IniProperty("LastUsedJira", Description="Last used Jira")] - public string LastUsedJira { get; set; } - [IniProperty("UploadFormat", Description="What file type to use for uploading", DefaultValue="png")] public OutputFormat UploadFormat { get; set; } + [IniProperty("UploadJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] public int UploadJpegQuality { get; set; } + [IniProperty("UploadReduceColors", Description="Reduce color amount of the uploaded image to 256", DefaultValue="False")] public bool UploadReduceColors { get; set; } } diff --git a/GreenshotJiraPlugin/JiraMonitor.cs b/GreenshotJiraPlugin/JiraMonitor.cs index 1d3784fd0..81605bddf 100644 --- a/GreenshotJiraPlugin/JiraMonitor.cs +++ b/GreenshotJiraPlugin/JiraMonitor.cs @@ -196,7 +196,7 @@ namespace GreenshotJiraPlugin return; } // We detected an unknown JIRA, so add it to our list - currentJiraDetails = new JiraDetails() + currentJiraDetails = new JiraDetails { Id = jiraId, ProjectKey = projectKey From d446127e19fb65c798a5f9bcd91798d98c50751f Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 4 Sep 2016 16:42:02 +0200 Subject: [PATCH 107/170] Optimizing the windows logic, as far as was possible without LINQ. Added a check to try to fix BUG-2017. --- Greenshot/Forms/MainForm.cs | 37 +- Greenshot/Helpers/CaptureHelper.cs | 2 +- Greenshot/Helpers/MailHelper.cs | 8 +- GreenshotPlugin/Core/WindowsHelper.cs | 567 +++++++++--------- .../UnmanagedHelpers/Enumerations.cs | 17 +- 5 files changed, 316 insertions(+), 315 deletions(-) diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 2bacaecce..355fb4396 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -488,7 +488,7 @@ namespace Greenshot { { return; } - base.WndProc(ref m); + base.WndProc(ref m); } #region hotkeys @@ -726,7 +726,7 @@ namespace Greenshot { var now = DateTime.Now; if ((now.Month == 12 && now.Day > 19 && now.Day < 27) || // christmas - (now.Month == 3 && now.Day > 13 && now.Day < 21)) { // birthday + (now.Month == 3 && now.Day > 13 && now.Day < 21)) { // birthday var resources = new ComponentResourceManager(typeof(MainForm)); contextmenu_donate.Image = (Image)resources.GetObject("contextmenu_present.Image"); } @@ -814,7 +814,7 @@ namespace Greenshot { } else if(screen.Bounds.Left != allScreensBounds.Left && screen.Bounds.Right == allScreensBounds.Right) { deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_right); } - captureScreenItem = new ToolStripMenuItem(deviceAlignment); + captureScreenItem = new ToolStripMenuItem(deviceAlignment); captureScreenItem.Click += delegate { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureRegion(false, screenToCapture.Bounds); @@ -879,8 +879,7 @@ namespace Greenshot { // check if thumbnailPreview is enabled and DWM is enabled bool thumbnailPreview = _conf.ThumnailPreview && DWM.IsDwmEnabled(); - List windows = WindowDetails.GetTopLevelWindows(); - foreach(WindowDetails window in windows) { + foreach(WindowDetails window in WindowDetails.GetTopLevelWindows()) { string title = window.Text; if (title != null) { @@ -1203,7 +1202,7 @@ namespace Greenshot { LOG.Error("Exception caught in the UnhandledException handler."); LOG.Error(exceptionText); if (exceptionText != null && exceptionText.Contains("InputLanguageChangedEventArgs")) - { + { // Ignore for BUG-1809 return; } @@ -1214,7 +1213,7 @@ namespace Greenshot { Exception exceptionToLog = e.Exception; string exceptionText = EnvironmentInfo.BuildReport(exceptionToLog); LOG.Error("Exception caught in the ThreadException handler."); - LOG.Error(exceptionText); + LOG.Error(exceptionText); if (exceptionText != null && exceptionText.Contains("InputLanguageChangedEventArgs")) { // Ignore for BUG-1809 @@ -1275,18 +1274,18 @@ namespace Greenshot { switch (clickAction) { case ClickActions.OPEN_LAST_IN_EXPLORER: string path = null; - if (!string.IsNullOrEmpty(_conf.OutputFileAsFullpath)) { - string lastFilePath = Path.GetDirectoryName(_conf.OutputFileAsFullpath); - if (!string.IsNullOrEmpty(lastFilePath) && Directory.Exists(lastFilePath)) { - path = lastFilePath; - } - } - if (path == null) { - string configPath = FilenameHelper.FillVariables(_conf.OutputFilePath, false); - if (Directory.Exists(configPath)) { - path = configPath; - } - } + if (!string.IsNullOrEmpty(_conf.OutputFileAsFullpath)) { + string lastFilePath = Path.GetDirectoryName(_conf.OutputFileAsFullpath); + if (!string.IsNullOrEmpty(lastFilePath) && Directory.Exists(lastFilePath)) { + path = lastFilePath; + } + } + if (path == null) { + string configPath = FilenameHelper.FillVariables(_conf.OutputFilePath, false); + if (Directory.Exists(configPath)) { + path = configPath; + } + } if (path != null) { try { diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 1247b825e..6888d1777 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -471,7 +471,7 @@ namespace Greenshot.Helpers { private void RetrieveWindowDetails() { LOG.Debug("start RetrieveWindowDetails"); // Start Enumeration of "active" windows - List allWindows = WindowDetails.GetMetroApps(); + List allWindows = new List(WindowDetails.GetMetroApps()); allWindows.AddRange(WindowDetails.GetAllWindows()); foreach (WindowDetails window in allWindows) { // Window should be visible and not ourselves diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index c639b2f8c..efda5cb30 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -71,19 +71,19 @@ namespace Greenshot.Helpers { /// /// Helper Method for creating an Email with Image Attachment /// - /// The image to send + /// The image to send /// ICaptureDetails public static void SendImage(ISurface surface, ICaptureDetails captureDetails) { string tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings()); if (tmpFile != null) { // Store the list of currently active windows, so we can make sure we show the email window later! - List windowsBefore = WindowDetails.GetVisibleWindows(); - bool isEmailSend = false; + var windowsBefore = WindowDetails.GetVisibleWindows(); + //bool isEmailSend = false; //if (EmailConfigHelper.HasOutlook() && (conf.OutputEMailFormat == EmailFormat.OUTLOOK_HTML || conf.OutputEMailFormat == EmailFormat.OUTLOOK_TXT)) { // isEmailSend = OutlookExporter.ExportToOutlook(tmpFile, captureDetails); //} - if (!isEmailSend && EmailConfigHelper.HasMAPI()) { + if (/*!isEmailSend &&*/ EmailConfigHelper.HasMAPI()) { // Fallback to MAPI // Send the email SendImage(tmpFile, captureDetails.Title); diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 34ddd8d94..37bd7a40c 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -40,19 +40,10 @@ namespace GreenshotPlugin.Core { /// EnumWindows wrapper for .NET /// public class WindowsEnumerator { - #region Member Variables - private List items; - #endregion - /// - /// Returns the collection of windows returned by - /// GetWindows + /// Returns the collection of windows returned by GetWindows /// - public List Items { - get { - return items; - } - } + public IList Items { get; private set; } /// /// Gets all top level windows on the system. @@ -66,34 +57,31 @@ namespace GreenshotPlugin.Core { /// Gets all child windows of the specified window /// /// Window Handle to get children for - public WindowsEnumerator GetWindows(WindowDetails parent) { - if (parent != null) { - GetWindows(parent.Handle, null); - } else { - GetWindows(IntPtr.Zero, null); - } + public WindowsEnumerator GetWindows(WindowDetails parent) + { + GetWindows(parent?.Handle ?? IntPtr.Zero, null); return this; } - + /// /// Gets all child windows of the specified window /// /// Window Handle to get children for /// Window Classname to copy, use null to copy all public WindowsEnumerator GetWindows(IntPtr hWndParent, string classname) { - items = new List(); - List windows = new List(); + Items = new List(); + IList windows = new List(); User32.EnumChildWindows(hWndParent, WindowEnum, IntPtr.Zero); bool hasParent = !IntPtr.Zero.Equals(hWndParent); string parentText = null; if (hasParent) { - StringBuilder title = new StringBuilder(260, 260); + var title = new StringBuilder(260, 260); User32.GetWindowText(hWndParent, title, title.Capacity); parentText = title.ToString(); } - foreach (WindowDetails window in items) { + foreach (var window in Items) { if (hasParent) { window.Text = parentText; window.ParentHandle = hWndParent; @@ -102,7 +90,7 @@ namespace GreenshotPlugin.Core { windows.Add(window); } } - items = windows; + Items = windows; return this; } @@ -113,13 +101,14 @@ namespace GreenshotPlugin.Core { /// Window Handle /// Application defined value /// 1 to continue enumeration, 0 to stop - private int WindowEnum(IntPtr hWnd, int lParam) { + private int WindowEnum(IntPtr hWnd, int lParam) + { if (OnWindowEnum(hWnd)) { return 1; - } else { - return 0; } + return 0; } + #endregion /// @@ -134,16 +123,10 @@ namespace GreenshotPlugin.Core { /// True to continue enumeration, False to stop protected virtual bool OnWindowEnum(IntPtr hWnd) { if (!WindowDetails.IsIgnoreHandle(hWnd)) { - items.Add(new WindowDetails(hWnd)); + Items.Add(new WindowDetails(hWnd)); } return true; } - - #region Constructor, Dispose - public WindowsEnumerator() { - // nothing to do - } - #endregion } #endregion EnumWindows @@ -157,14 +140,15 @@ namespace GreenshotPlugin.Core { /// Provides details about a Window returned by the enumeration /// public class WindowDetails : IEquatable{ - private const string METRO_WINDOWS_CLASS = "Windows.UI.Core.CoreWindow"; // Windows 10 uses ApplicationFrameWindow - private const string METRO_APPLAUNCHER_CLASS = "ImmersiveLauncher"; - private const string METRO_GUTTER_CLASS = "ImmersiveGutter"; - - private static readonly ILog LOG = LogManager.GetLogger(typeof(WindowDetails)); + private const string MetroWindowsClass = "Windows.UI.Core.CoreWindow"; // Windows 10 uses ApplicationFrameWindow + private const string MetroApplauncherClass = "ImmersiveLauncher"; + private const string MetroGutterClass = "ImmersiveGutter"; + private static readonly IList IgnoreClasses = new List(new[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" + + private static readonly ILog Log = LogManager.GetLogger(typeof(WindowDetails)); private static readonly CoreConfiguration Conf = IniConfig.GetIniSection(); - private static readonly List IgnoreHandles = new List(); - private static readonly List ExcludeProcessesFromFreeze = new List(); + private static readonly IList IgnoreHandles = new List(); + private static readonly IList ExcludeProcessesFromFreeze = new List(); private static readonly IAppVisibility AppVisibility; static WindowDetails() { @@ -178,7 +162,7 @@ namespace GreenshotPlugin.Core { } catch (Exception ex) { - LOG.WarnFormat("Couldn't create instance of IAppVisibility: {0}", ex.Message); + Log.WarnFormat("Couldn't create instance of IAppVisibility: {0}", ex.Message); } } @@ -192,7 +176,7 @@ namespace GreenshotPlugin.Core { return IgnoreHandles.Contains(handle); } - private List _childWindows; + private IList _childWindows; private IntPtr _parentHandle = IntPtr.Zero; private WindowDetails _parent; private bool _frozen; @@ -201,37 +185,22 @@ namespace GreenshotPlugin.Core { /// This checks if the window is a Windows 8 App /// For Windows 10 most normal code works, as it's hosted inside "ApplicationFrameWindow" /// - public bool IsApp { - get { - return METRO_WINDOWS_CLASS.Equals(ClassName); - } - } - - public bool IsGutter { - get { - return METRO_GUTTER_CLASS.Equals(ClassName); - } - } - - public bool IsAppLauncher { - get { - return METRO_APPLAUNCHER_CLASS.Equals(ClassName); - } - } + public bool IsApp => MetroWindowsClass.Equals(ClassName); + + /// + /// Check if the window is the metro gutter (sizeable separator) + /// + public bool IsGutter => MetroGutterClass.Equals(ClassName); + + /// + /// Test if this window is for the App-Launcher + /// + public bool IsAppLauncher => MetroApplauncherClass.Equals(ClassName); /// /// Check if this window is the window of a metro app /// - public bool IsMetroApp { - get { - return IsAppLauncher || IsApp; - } - } - - /// - /// The window handle. - /// - private readonly IntPtr _hWnd = IntPtr.Zero; + public bool IsMetroApp => IsAppLauncher || IsApp; /// /// To allow items to be compared, the hash code @@ -247,6 +216,11 @@ namespace GreenshotPlugin.Core { return Equals(right as WindowDetails); } + /// + /// Compare two windows details + /// + /// + /// public bool Equals(WindowDetails other) { if (ReferenceEquals(other, null)) { return false; @@ -262,19 +236,28 @@ namespace GreenshotPlugin.Core { return other.Handle == Handle; } - public bool HasChildren { - get { - return (_childWindows != null) && (_childWindows.Count > 0); - } - } - + /// + /// Check if the window has children + /// + public bool HasChildren => (_childWindows != null) && (_childWindows.Count > 0); + + /// + /// Freeze information updates + /// public void FreezeDetails() { _frozen = true; } + + /// + /// Make the information update again. + /// public void UnfreezeDetails() { _frozen = false; } + /// + /// Get the file path to the exe for the process which owns this window + /// public string ProcessPath { get { if (Handle == IntPtr.Zero) { @@ -295,14 +278,14 @@ namespace GreenshotPlugin.Core { public Image DisplayIcon { get { try { - using (Icon appIcon = GetAppIcon(Handle)) { + using (var appIcon = GetAppIcon(Handle)) { if (appIcon != null) { return appIcon.ToBitmap(); } } } catch (Exception ex) { - LOG.WarnFormat("Couldn't get icon for window {0} due to: {1}", Text, ex.Message); - LOG.Warn(ex); + Log.WarnFormat("Couldn't get icon for window {0} due to: {1}", Text, ex.Message); + Log.Warn(ex); } if (IsMetroApp) { // No method yet to get the metro icon @@ -311,8 +294,8 @@ namespace GreenshotPlugin.Core { try { return PluginUtils.GetCachedExeIcon(ProcessPath, 0); } catch (Exception ex) { - LOG.WarnFormat("Couldn't get icon for window {0} due to: {1}", Text, ex.Message); - LOG.Warn(ex); + Log.WarnFormat("Couldn't get icon for window {0} due to: {1}", Text, ex.Message); + Log.Warn(ex); } return null; } @@ -324,27 +307,27 @@ namespace GreenshotPlugin.Core { /// /// private static Icon GetAppIcon(IntPtr hwnd) { - IntPtr ICON_SMALL = IntPtr.Zero; - IntPtr ICON_BIG = new IntPtr(1); - IntPtr ICON_SMALL2 = new IntPtr(2); + IntPtr iconSmall = IntPtr.Zero; + IntPtr iconBig = new IntPtr(1); + IntPtr iconSmall2 = new IntPtr(2); IntPtr iconHandle; if (Conf.UseLargeIcons) { - iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, ICON_BIG, IntPtr.Zero); + iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, iconBig, IntPtr.Zero); if (iconHandle == IntPtr.Zero) { iconHandle = User32.GetClassLongWrapper(hwnd, (int)ClassLongIndex.GCL_HICON); } } else { - iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, ICON_SMALL2, IntPtr.Zero); + iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, iconSmall2, IntPtr.Zero); } if (iconHandle == IntPtr.Zero) { - iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, ICON_SMALL, IntPtr.Zero); + iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, iconSmall, IntPtr.Zero); } if (iconHandle == IntPtr.Zero) { iconHandle = User32.GetClassLongWrapper(hwnd, (int)ClassLongIndex.GCL_HICONSM); } if (iconHandle == IntPtr.Zero) { - iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, ICON_BIG, IntPtr.Zero); + iconHandle = User32.SendMessage(hwnd, (int)WindowsMessages.WM_GETICON, iconBig, IntPtr.Zero); } if (iconHandle == IntPtr.Zero) { iconHandle = User32.GetClassLongWrapper(hwnd, (int)ClassLongIndex.GCL_HICON); @@ -375,7 +358,7 @@ namespace GreenshotPlugin.Core { IgnoreHandles.Remove(ignoreHandle); } - public List Children { + public IList Children { get { if (_childWindows == null) { GetChildren(); @@ -391,8 +374,7 @@ namespace GreenshotPlugin.Core { /// The regexp to look for in the title /// The regexp to look for in the classname /// List WindowDetails with all the found windows - private static List FindWindow(List windows, string titlePattern, string classnamePattern) { - List foundWindows = new List(); + private static IEnumerable FindWindow(IList windows, string titlePattern, string classnamePattern) { Regex titleRegexp = null; Regex classnameRegexp = null; @@ -405,12 +387,11 @@ namespace GreenshotPlugin.Core { foreach(WindowDetails window in windows) { if (titleRegexp != null && titleRegexp.IsMatch(window.Text)) { - foundWindows.Add(window); + yield return window; } else if (classnameRegexp != null && classnameRegexp.IsMatch(window.ClassName)) { - foundWindows.Add(window); + yield return window; } } - return foundWindows; } /// @@ -471,7 +452,7 @@ namespace GreenshotPlugin.Core { /// Retrieve all the children, this only stores the children internally. /// One should normally use the getter "Children" /// - public List GetChildren() { + public IList GetChildren() { if (_childWindows == null) { return GetChildren(0); } @@ -482,14 +463,15 @@ namespace GreenshotPlugin.Core { /// Retrieve all the children, this only stores the children internally, use the "Children" property for the value /// /// Specify how many levels we go in - public List GetChildren(int levelsToGo) { - if (_childWindows == null) { - _childWindows = new List(); - foreach(WindowDetails childWindow in new WindowsEnumerator().GetWindows(_hWnd, null).Items) { - _childWindows.Add(childWindow); - if (levelsToGo > 0) { - childWindow.GetChildren(levelsToGo-1); - } + public IList GetChildren(int levelsToGo) { + if (_childWindows != null) + { + return _childWindows; + } + _childWindows = new WindowsEnumerator().GetWindows(Handle, null).Items; + foreach(var childWindow in _childWindows) { + if (levelsToGo > 0) { + childWindow.GetChildren(levelsToGo-1); } } return _childWindows; @@ -501,7 +483,7 @@ namespace GreenshotPlugin.Core { /// The regexp to look for in the title /// The regexp to look for in the classname /// List WindowDetails with all the found windows, or an empty list - public List FindChildren(string titlePattern, string classnamePattern) { + public IEnumerable FindChildren(string titlePattern, string classnamePattern) { return FindWindow(Children, titlePattern, classnamePattern); } @@ -511,22 +493,23 @@ namespace GreenshotPlugin.Core { /// List string with classnames /// The index in the list to look for /// WindowDetails if a match was found - private WindowDetails FindPath(List classnames, int index) { - WindowDetails resultWindow = null; - List foundWindows = FindChildren(null, classnames[index]); + private WindowDetails FindPath(IList classnames, int index) { if (index == classnames.Count - 1) { - if (foundWindows.Count > 0) { - resultWindow = foundWindows[0]; + foreach (var foundWindow in FindChildren(null, classnames[index])) + { + return foundWindow; } } else { - foreach(WindowDetails foundWindow in foundWindows) { - resultWindow = foundWindow.FindPath(classnames, index+1); - if (resultWindow != null) { - break; + foreach(var foundWindow in FindChildren(null, classnames[index])) + { + var resultWindow = foundWindow.FindPath(classnames, index+1); + if (resultWindow != null) + { + return resultWindow; } } } - return resultWindow; + return null; } /// @@ -536,9 +519,9 @@ namespace GreenshotPlugin.Core { /// List of string with classname "path" /// true allows the search to skip a classname of the path /// WindowDetails if found - public WindowDetails FindPath(List classnames, bool allowSkip) { + public WindowDetails FindPath(IList classnames, bool allowSkip) { int index = 0; - WindowDetails resultWindow = FindPath(classnames, index++); + var resultWindow = FindPath(classnames, index++); if (resultWindow == null && allowSkip) { while(resultWindow == null && index < classnames.Count) { resultWindow = FindPath(classnames, index); @@ -558,14 +541,14 @@ namespace GreenshotPlugin.Core { return windowDetails; } // First loop through this level - foreach(WindowDetails child in windowDetails.Children) { + foreach(var child in windowDetails.Children) { if (classnamePattern.IsMatch(child.ClassName)) { return child; } } // Go into all children - foreach(WindowDetails child in windowDetails.Children) { - WindowDetails deepWindow = DeepScan(child, classnamePattern); + foreach(var child in windowDetails.Children) { + var deepWindow = DeepScan(child, classnamePattern); if (deepWindow != null) { return deepWindow; } @@ -579,23 +562,21 @@ namespace GreenshotPlugin.Core { /// The GetWindowCommand to use /// null if nothing found, otherwise the WindowDetails instance of the "child" public WindowDetails GetWindow(GetWindowCommand gwCommand) { - IntPtr tmphWnd = User32.GetWindow(Handle, gwCommand); + var tmphWnd = User32.GetWindow(Handle, gwCommand); if (IntPtr.Zero == tmphWnd) { return null; } - WindowDetails windowDetails = new WindowDetails(tmphWnd); - windowDetails._parent = this; + var windowDetails = new WindowDetails(tmphWnd) + { + _parent = this + }; return windowDetails; } /// /// Gets the window's handle /// - public IntPtr Handle { - get { - return _hWnd; - } - } + public IntPtr Handle { get; } private string _text; /// @@ -607,8 +588,8 @@ namespace GreenshotPlugin.Core { } get { if (_text == null) { - StringBuilder title = new StringBuilder(260, 260); - User32.GetWindowText(_hWnd, title, title.Capacity); + var title = new StringBuilder(260, 260); + User32.GetWindowText(Handle, title, title.Capacity); _text = title.ToString(); } return _text; @@ -619,14 +600,7 @@ namespace GreenshotPlugin.Core { /// /// Gets the window's class name. /// - public string ClassName { - get { - if (_className == null) { - _className = GetClassName(_hWnd); - } - return _className; - } - } + public string ClassName => _className ?? (_className = GetClassName(Handle)); /// /// Gets/Sets whether the window is iconic (mimimized) or not. @@ -636,13 +610,13 @@ namespace GreenshotPlugin.Core { if (IsMetroApp) { return !Visible; } - return User32.IsIconic(_hWnd) || Location.X <= -32000; + return User32.IsIconic(Handle) || Location.X <= -32000; } set { if (value) { - User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); + User32.SendMessage(Handle, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); } else { - User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); + User32.SendMessage(Handle, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); } } } @@ -656,7 +630,7 @@ namespace GreenshotPlugin.Core { { if (Visible) { Rectangle windowRectangle = WindowRectangle; - foreach (Screen screen in Screen.AllScreens) { + foreach (var screen in Screen.AllScreens) { if (screen.Bounds.Contains(windowRectangle)) { if (windowRectangle.Equals(screen.Bounds)) { return true; @@ -666,13 +640,13 @@ namespace GreenshotPlugin.Core { } return false; } - return User32.IsZoomed(_hWnd); + return User32.IsZoomed(Handle); } set { if (value) { - User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MAXIMIZE, IntPtr.Zero); + User32.SendMessage(Handle, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MAXIMIZE, IntPtr.Zero); } else { - User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); + User32.SendMessage(Handle, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_MINIMIZE, IntPtr.Zero); } } } @@ -722,7 +696,7 @@ namespace GreenshotPlugin.Core { if (IsAppLauncher) { return IsAppLauncherVisible; } - return User32.IsWindowVisible(_hWnd); + return User32.IsWindowVisible(Handle); } } @@ -746,12 +720,9 @@ namespace GreenshotPlugin.Core { try { int processId; User32.GetWindowThreadProcessId(Handle, out processId); - Process process = Process.GetProcessById(processId); - if (process != null) { - return process; - } + return Process.GetProcessById(processId); } catch (Exception ex) { - LOG.Warn(ex); + Log.Warn(ex); } return null; } @@ -805,7 +776,7 @@ namespace GreenshotPlugin.Core { if (GetWindowRect(out windowRect)) { Win32Error error = Win32.GetLastErrorCode(); - LOG.WarnFormat("Couldn't retrieve the windows rectangle: {0}", Win32.GetMessage(error)); + Log.WarnFormat("Couldn't retrieve the windows rectangle: {0}", Win32.GetMessage(error)); } } @@ -860,7 +831,7 @@ namespace GreenshotPlugin.Core { if (GetClientRect(out clientRect)) { Win32Error error = Win32.GetLastErrorCode(); - LOG.WarnFormat("Couldn't retrieve the client rectangle for {0}, error: {1}", Text, Win32.GetMessage(error)); + Log.WarnFormat("Couldn't retrieve the client rectangle for {0}, error: {1}", Text, Win32.GetMessage(error)); } return clientRect; } @@ -881,11 +852,12 @@ namespace GreenshotPlugin.Core { /// public void Restore() { if (Iconic) { - User32.SendMessage(_hWnd, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); + User32.SendMessage(Handle, (int)WindowsMessages.WM_SYSCOMMAND, (IntPtr)User32.SC_RESTORE, IntPtr.Zero); } - User32.BringWindowToTop(_hWnd); - User32.SetForegroundWindow(_hWnd); + User32.BringWindowToTop(Handle); + User32.SetForegroundWindow(Handle); // Make sure windows has time to perform the action + // TODO: this is BAD practice! while(Iconic) { Application.DoEvents(); } @@ -896,10 +868,10 @@ namespace GreenshotPlugin.Core { /// public WindowStyleFlags WindowStyle { get { - return (WindowStyleFlags)User32.GetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_STYLE); + return (WindowStyleFlags)User32.GetWindowLongWrapper(Handle, (int)WindowLongIndex.GWL_STYLE); } set { - User32.SetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_STYLE, new IntPtr((long)value)); + User32.SetWindowLongWrapper(Handle, (int)WindowLongIndex.GWL_STYLE, new IntPtr((long)value)); } } @@ -908,7 +880,7 @@ namespace GreenshotPlugin.Core { /// public WindowPlacement WindowPlacement { get { - WindowPlacement placement = WindowPlacement.Default; + var placement = WindowPlacement.Default; User32.GetWindowPlacement(Handle, ref placement); return placement; } @@ -922,10 +894,10 @@ namespace GreenshotPlugin.Core { /// public ExtendedWindowStyleFlags ExtendedWindowStyle { get { - return (ExtendedWindowStyleFlags)User32.GetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_EXSTYLE); + return (ExtendedWindowStyleFlags)User32.GetWindowLongWrapper(Handle, (int)WindowLongIndex.GWL_EXSTYLE); } set { - User32.SetWindowLongWrapper(_hWnd, (int)WindowLongIndex.GWL_EXSTYLE, new IntPtr((uint)value)); + User32.SetWindowLongWrapper(Handle, (int)WindowLongIndex.GWL_EXSTYLE, new IntPtr((uint)value)); } } @@ -1084,7 +1056,7 @@ namespace GreenshotPlugin.Core { } } } catch (Exception e) { - LOG.Debug("Exception: ", e); + Log.Debug("Exception: ", e); // Some problem occurred, cleanup and make a normal capture if (capturedBitmap != null) { capturedBitmap.Dispose(); @@ -1121,7 +1093,7 @@ namespace GreenshotPlugin.Core { if (Conf.WindowCaptureRemoveCorners && !Maximised && (ExtendedWindowStyle & ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW) == 0) { // Remove corners if (!Image.IsAlphaPixelFormat(capturedBitmap.PixelFormat)) { - LOG.Debug("Changing pixelformat to Alpha for the RemoveCorners"); + Log.Debug("Changing pixelformat to Alpha for the RemoveCorners"); Bitmap tmpBitmap = ImageHelper.Clone(capturedBitmap, PixelFormat.Format32bppArgb); capturedBitmap.Dispose(); capturedBitmap = tmpBitmap; @@ -1192,20 +1164,21 @@ namespace GreenshotPlugin.Core { Color c0 = blackBuffer.GetColorAt(x, y); Color c1 = whiteBuffer.GetColorAt(x, y); // Calculate alpha as double in range 0-1 - double alpha = (c0.R - c1.R + 255) / 255d; - if (alpha == 1) { - // Alpha == 1 means no change! + int alpha = c0.R - c1.R + 255; + if (alpha == 255) { + // Alpha == 255 means no change! targetBuffer.SetColorAt(x, y, c0); } else if (alpha == 0) { // Complete transparency, use transparent pixel targetBuffer.SetColorAt(x, y, Color.Transparent); } else { // Calculate original color - byte originalAlpha = (byte)Math.Min(255, alpha * 255); + byte originalAlpha = (byte)Math.Min(255, alpha); + var alphaFactor = alpha/255d; //LOG.DebugFormat("Alpha {0} & c0 {1} & c1 {2}", alpha, c0, c1); - byte originalRed = (byte)Math.Min(255, c0.R / alpha); - byte originalGreen = (byte)Math.Min(255, c0.G / alpha); - byte originalBlue = (byte)Math.Min(255, c0.B / alpha); + byte originalRed = (byte)Math.Min(255, c0.R / alphaFactor); + byte originalGreen = (byte)Math.Min(255, c0.G / alphaFactor); + byte originalBlue = (byte)Math.Min(255, c0.B / alphaFactor); Color originalColor = Color.FromArgb(originalAlpha, originalRed, originalGreen, originalBlue); //Color originalColor = Color.FromArgb(originalAlpha, originalRed, c0.G, c0.B); targetBuffer.SetColorAt(x, y, originalColor); @@ -1240,14 +1213,10 @@ namespace GreenshotPlugin.Core { /// out Rectangle /// bool true if it worked private bool GetClientRect(out Rectangle rectangle) { - WindowInfo windowInfo = new WindowInfo(); + var windowInfo = new WindowInfo(); // Get the Window Info for this window bool result = User32.GetWindowInfo(Handle, ref windowInfo); - if (result) { - rectangle = windowInfo.rcClient.ToRectangle(); - } else { - rectangle = Rectangle.Empty; - } + rectangle = result ? windowInfo.rcClient.ToRectangle() : Rectangle.Empty; return result; } @@ -1257,14 +1226,10 @@ namespace GreenshotPlugin.Core { /// out Rectangle /// bool true if it worked private bool GetWindowRect(out Rectangle rectangle) { - WindowInfo windowInfo = new WindowInfo(); + var windowInfo = new WindowInfo(); // Get the Window Info for this window bool result = User32.GetWindowInfo(Handle, ref windowInfo); - if (result) { - rectangle = windowInfo.rcWindow.ToRectangle(); - } else { - rectangle = Rectangle.Empty; - } + rectangle = result ? windowInfo.rcWindow.ToRectangle() : Rectangle.Empty; return result; } @@ -1274,14 +1239,10 @@ namespace GreenshotPlugin.Core { /// out Size /// bool true if it worked private bool GetBorderSize(out Size size) { - WindowInfo windowInfo = new WindowInfo(); + var windowInfo = new WindowInfo(); // Get the Window Info for this window bool result = User32.GetWindowInfo(Handle, ref windowInfo); - if (result) { - size = new Size((int)windowInfo.cxWindowBorders, (int)windowInfo.cyWindowBorders); - } else { - size = Size.Empty; - } + size = result ? new Size((int)windowInfo.cxWindowBorders, (int)windowInfo.cyWindowBorders) : Size.Empty; return result; } @@ -1339,14 +1300,14 @@ namespace GreenshotPlugin.Core { using (Process proc = Process.GetProcessById(ProcessId)) { string processName = proc.ProcessName; if (!CanFreezeOrUnfreeze(processName)) { - LOG.DebugFormat("Not freezing {0}", processName); + Log.DebugFormat("Not freezing {0}", processName); return false; } if (!CanFreezeOrUnfreeze(Text)) { - LOG.DebugFormat("Not freezing {0}", processName); + Log.DebugFormat("Not freezing {0}", processName); return false; } - LOG.DebugFormat("Freezing process: {0}", processName); + Log.DebugFormat("Freezing process: {0}", processName); foreach (ProcessThread pT in proc.Threads) { @@ -1370,14 +1331,14 @@ namespace GreenshotPlugin.Core { using (Process proc = Process.GetProcessById(ProcessId)) { string processName = proc.ProcessName; if (!CanFreezeOrUnfreeze(processName)) { - LOG.DebugFormat("Not unfreezing {0}", processName); + Log.DebugFormat("Not unfreezing {0}", processName); return; } if (!CanFreezeOrUnfreeze(Text)) { - LOG.DebugFormat("Not unfreezing {0}", processName); + Log.DebugFormat("Not unfreezing {0}", processName); return; } - LOG.DebugFormat("Unfreezing process: {0}", processName); + Log.DebugFormat("Unfreezing process: {0}", processName); foreach (ProcessThread pT in proc.Threads) { IntPtr pOpenThread = Kernel32.OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id); @@ -1408,8 +1369,8 @@ namespace GreenshotPlugin.Core { } returnImage = new Bitmap(windowRect.Width, windowRect.Height, pixelFormat); using (Graphics graphics = Graphics.FromImage(returnImage)) { - using (SafeDeviceContextHandle graphicsDC = graphics.GetSafeDeviceContext()) { - bool printSucceeded = User32.PrintWindow(Handle, graphicsDC.DangerousGetHandle(), 0x0); + using (SafeDeviceContextHandle graphicsDc = graphics.GetSafeDeviceContext()) { + bool printSucceeded = User32.PrintWindow(Handle, graphicsDc.DangerousGetHandle(), 0x0); if (!printSucceeded) { // something went wrong, most likely a "0x80004005" (Acess Denied) when using UAC exceptionOccured = User32.CreateWin32Exception("PrintWindow"); @@ -1428,15 +1389,13 @@ namespace GreenshotPlugin.Core { // Return null if error if (exceptionOccured != null) { - LOG.ErrorFormat("Error calling print window: {0}", exceptionOccured.Message); - if (returnImage != null) { - returnImage.Dispose(); - } + Log.ErrorFormat("Error calling print window: {0}", exceptionOccured.Message); + returnImage.Dispose(); return null; } if (!HasParent && Maximised) { - LOG.Debug("Correcting for maximalization"); - Size borderSize = Size.Empty; + Log.Debug("Correcting for maximalization"); + Size borderSize; GetBorderSize(out borderSize); Rectangle borderRectangle = new Rectangle(borderSize.Width, borderSize.Height, windowRect.Width - (2 * borderSize.Width), windowRect.Height - (2 * borderSize.Height)); ImageHelper.Crop(ref returnImage, ref borderRectangle); @@ -1450,7 +1409,7 @@ namespace GreenshotPlugin.Core { /// /// The Window Handle public WindowDetails(IntPtr hWnd) { - _hWnd = hWnd; + Handle = hWnd; } /// @@ -1486,7 +1445,7 @@ namespace GreenshotPlugin.Core { } } } catch (Exception ex) { - LOG.Warn(ex); + Log.Warn(ex); } return false; } @@ -1504,7 +1463,7 @@ namespace GreenshotPlugin.Core { /// Get all the top level windows /// /// List of WindowDetails with all the top level windows - public static List GetAllWindows() { + public static IList GetAllWindows() { return GetAllWindows(null); } @@ -1512,7 +1471,7 @@ namespace GreenshotPlugin.Core { /// Get all the top level windows, with matching classname /// /// List WindowDetails with all the top level windows - public static List GetAllWindows(string classname) { + public static IList GetAllWindows(string classname) { return new WindowsEnumerator().GetWindows(IntPtr.Zero, classname).Items; } @@ -1525,7 +1484,7 @@ namespace GreenshotPlugin.Core { if (!Contains(point)) { return null; } - foreach(WindowDetails childWindow in Children) { + foreach(var childWindow in Children) { if (childWindow.Contains(point)) { return childWindow.FindChildUnderPoint(point); } @@ -1539,43 +1498,62 @@ namespace GreenshotPlugin.Core { /// IntPtr with the windows handle /// String with ClassName public static string GetClassName(IntPtr hWnd) { - StringBuilder classNameBuilder = new StringBuilder(260, 260); + var classNameBuilder = new StringBuilder(260, 260); User32.GetClassName(hWnd, classNameBuilder, classNameBuilder.Capacity); return classNameBuilder.ToString(); } + /// + /// Helper method to decide if a top level window is visible + /// + /// + /// + /// + private static bool IsVisibleTopLevel(WindowDetails window, Rectangle screenBounds) + { + // Ignore windows without title + if (window.Text.Length == 0) + { + return false; + } + // Ignore invisible + if (!window.Visible) + { + return false; + } + if (IgnoreClasses.Contains(window.ClassName)) + { + return false; + } + // Windows without size + Rectangle windowRect = window.WindowRectangle; + windowRect.Intersect(screenBounds); + if (windowRect.Size.IsEmpty) + { + return false; + } + return true; + } + /// /// Get all the visible top level windows /// /// List WindowDetails with all the visible top level windows - public static List GetVisibleWindows() { - List windows = new List(); + public static IEnumerable GetVisibleWindows() { Rectangle screenBounds = WindowCapture.GetScreenBounds(); - List allWindows = GetMetroApps(); - allWindows.AddRange(GetAllWindows()); - foreach(WindowDetails window in allWindows) { - // Ignore windows without title - if (window.Text.Length == 0) { - continue; + foreach(var window in GetMetroApps()) { + if (IsVisibleTopLevel(window, screenBounds)) + { + yield return window; + } + } + foreach (var window in GetAllWindows()) + { + if (IsVisibleTopLevel(window, screenBounds)) + { + yield return window; } - // Ignore invisible - if (!window.Visible) { - continue; - } - // Ignore some classes - List ignoreClasses = new List(new[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" - if (ignoreClasses.Contains(window.ClassName)) { - continue; - } - // Windows without size - Rectangle windowRect = window.WindowRectangle; - windowRect.Intersect(screenBounds); - if (windowRect.Size.IsEmpty) { - continue; - } - windows.Add(window); } - return windows; } /// @@ -1583,11 +1561,11 @@ namespace GreenshotPlugin.Core { /// These are all Windows with Classname "Windows.UI.Core.CoreWindow" /// /// List WindowDetails with visible metro apps - public static List GetMetroApps() { - List metroApps = new List(); + public static IEnumerable GetMetroApps() { // if the appVisibility != null we have Windows 8. - if (AppVisibility == null) { - return metroApps; + if (AppVisibility == null) + { + yield break; } //string[] wcs = {"ImmersiveGutter", "Snapped Desktop", "ImmersiveBackgroundWindow","ImmersiveLauncher","Windows.UI.Core.CoreWindow","ApplicationManager_ImmersiveShellWindow","SearchPane","MetroGhostWindow","EdgeUiInputWndClass", "NativeHWNDHost", "Shell_CharmWindow"}; //List specials = new List(); @@ -1602,61 +1580,83 @@ namespace GreenshotPlugin.Core { // wcHandle = User32.FindWindowEx(IntPtr.Zero, wcHandle, null, null); // }; //} - IntPtr nextHandle = User32.FindWindow(METRO_WINDOWS_CLASS, null); + IntPtr nextHandle = User32.FindWindow(MetroWindowsClass, null); while (nextHandle != IntPtr.Zero) { - WindowDetails metroApp = new WindowDetails(nextHandle); - metroApps.Add(metroApp); + var metroApp = new WindowDetails(nextHandle); + yield return metroApp; // Check if we have a gutter! if (metroApp.Visible && !metroApp.Maximised) { - IntPtr gutterHandle = User32.FindWindow(METRO_GUTTER_CLASS, null); + var gutterHandle = User32.FindWindow(MetroGutterClass, null); if (gutterHandle != IntPtr.Zero) { - metroApps.Add(new WindowDetails(gutterHandle)); + yield return new WindowDetails(gutterHandle); } } - nextHandle = User32.FindWindowEx(IntPtr.Zero, nextHandle, METRO_WINDOWS_CLASS, null); - }; - - return metroApps; + nextHandle = User32.FindWindowEx(IntPtr.Zero, nextHandle, MetroWindowsClass, null); + } } + /// + /// Check if the window is a top level + /// + /// WindowDetails + /// bool + private static bool IsTopLevel(WindowDetails window) + { + // Ignore windows without title + if (window.Text.Length == 0) + { + return false; + } + if (IgnoreClasses.Contains(window.ClassName)) + { + return false; + } + // Windows without size + if (window.WindowRectangle.Size.IsEmpty) + { + return false; + } + if (window.HasParent) + { + return false; + } + var exWindowStyle = window.ExtendedWindowStyle; + if ((exWindowStyle & ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW) != 0) + { + return false; + } + // Skip everything which is not rendered normally. + if (!window.IsApp && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) + { + return false; + } + // Skip preview windows, like the one from Firefox + if ((window.WindowStyle & WindowStyleFlags.WS_VISIBLE) == 0) + { + return false; + } + return window.Visible || window.Iconic; + } /// /// Get all the top level windows /// /// List WindowDetails with all the top level windows - public static List GetTopLevelWindows() { - List windows = new List(); - var possibleTopLevelWindows = GetMetroApps(); - possibleTopLevelWindows.AddRange(GetAllWindows()); - foreach (WindowDetails window in possibleTopLevelWindows) { - // Ignore windows without title - if (window.Text.Length == 0) { - continue; + public static IEnumerable GetTopLevelWindows() { + foreach (var possibleTopLevel in GetMetroApps()) + { + if (IsTopLevel(possibleTopLevel)) + { + yield return possibleTopLevel; + } + } + + foreach (var possibleTopLevel in GetAllWindows()) + { + if (IsTopLevel(possibleTopLevel)) + { + yield return possibleTopLevel; } - // Ignore some classes - List ignoreClasses = new List(new[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" - if (ignoreClasses.Contains(window.ClassName)) { - continue; - } - // Windows without size - if (window.WindowRectangle.Size.IsEmpty) { - continue; - } - if (window.HasParent) { - continue; - } - if ((window.ExtendedWindowStyle & ExtendedWindowStyleFlags.WS_EX_TOOLWINDOW) != 0) { - continue; - } - // Skip preview windows, like the one from Firefox - if ((window.WindowStyle & WindowStyleFlags.WS_VISIBLE) == 0) { - continue; - } - if (!window.Visible && !window.Iconic) { - continue; - } - windows.Add(window); } - return windows; } /// @@ -1666,7 +1666,7 @@ namespace GreenshotPlugin.Core { /// public static WindowDetails GetLinkedWindow(WindowDetails windowToLinkTo) { int processIdSelectedWindow = windowToLinkTo.ProcessId; - foreach(WindowDetails window in GetAllWindows()) { + foreach(var window in GetAllWindows()) { // Ignore windows without title if (window.Text.Length == 0) { continue; @@ -1689,7 +1689,7 @@ namespace GreenshotPlugin.Core { } if (window.ProcessId == processIdSelectedWindow) { - LOG.InfoFormat("Found window {0} belonging to same process as the window {1}", window.Text, windowToLinkTo.Text); + Log.InfoFormat("Found window {0} belonging to same process as the window {1}", window.Text, windowToLinkTo.Text); return window; } } @@ -1701,10 +1701,11 @@ namespace GreenshotPlugin.Core { /// One should preferably call "GetVisibleWindows" for the oldWindows. /// /// List WindowDetails with old windows - public static void ActiveNewerWindows(List oldWindows) { - List windowsAfter = GetVisibleWindows(); - foreach(WindowDetails window in windowsAfter) { - if (!oldWindows.Contains(window)) { + public static void ActiveNewerWindows(IEnumerable oldWindows) + { + var oldWindowsList = new List(oldWindows); + foreach(var window in GetVisibleWindows()) { + if (!oldWindowsList.Contains(window)) { window.ToForeground(); } } @@ -1719,7 +1720,7 @@ namespace GreenshotPlugin.Core { if (AppVisibility == null) { return null; } - IntPtr appLauncher = User32.FindWindow(METRO_APPLAUNCHER_CLASS, null); + IntPtr appLauncher = User32.FindWindow(MetroApplauncherClass, null); if (appLauncher != IntPtr.Zero) { return new WindowDetails (appLauncher); } diff --git a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs index 0d73ebeef..ff2dfa325 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Enumerations.cs @@ -82,19 +82,19 @@ namespace GreenshotPlugin.UnmanagedHelpers { public enum ExtendedWindowStyleFlags : uint { WS_EX_DLGMODALFRAME = 0x00000001, WS_EX_NOPARENTNOTIFY = 0x00000004, - WS_EX_TOPMOST = 0x00000008, + WS_EX_TOPMOST = 0x00000008, WS_EX_ACCEPTFILES = 0x00000010, WS_EX_TRANSPARENT = 0x00000020, //#if(WINVER >= 0x0400) - WS_EX_MDICHILD = 0x00000040, + WS_EX_MDICHILD = 0x00000040, WS_EX_TOOLWINDOW = 0x00000080, WS_EX_WINDOWEDGE = 0x00000100, WS_EX_CLIENTEDGE = 0x00000200, WS_EX_CONTEXTHELP = 0x00000400, - WS_EX_RIGHT = 0x00001000, - WS_EX_LEFT = 0x00000000, + WS_EX_RIGHT = 0x00001000, + WS_EX_LEFT = 0x00000000, WS_EX_RTLREADING = 0x00002000, WS_EX_LTRREADING = 0x00000000, WS_EX_LEFTSCROLLBAR = 0x00004000, @@ -102,16 +102,17 @@ namespace GreenshotPlugin.UnmanagedHelpers { WS_EX_CONTROLPARENT = 0x00010000, WS_EX_STATICEDGE = 0x00020000, - WS_EX_APPWINDOW = 0x00040000, + WS_EX_APPWINDOW = 0x00040000, //WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE), //WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST), - WS_EX_LAYERED = 0x00080000, + WS_EX_LAYERED = 0x00080000, WS_EX_NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children - WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring + WS_EX_NOREDIRECTIONBITMAP = 0x00200000, //The window does not render to a redirection surface. This is for windows that do not have visible content or that use mechanisms other than surfaces to provide their visual. + WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring WS_EX_COMPOSITED = 0x02000000, - WS_EX_NOACTIVATE = 0x08000000 + WS_EX_NOACTIVATE = 0x08000000 // A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window. } [Flags] From 71aa131f788428cbdde1f4b096456b1de4c6cc33 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 4 Sep 2016 20:10:33 +0200 Subject: [PATCH 108/170] Added some debug information for BUG-2017, this shows when D is pressed. --- Greenshot/Forms/CaptureForm.cs | 56 ++++++++++++++++----------- GreenshotPlugin/Core/WindowsHelper.cs | 3 +- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index c77327948..6adc7f00c 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -40,7 +40,7 @@ namespace Greenshot.Forms { /// /// The capture form is used to select a part of the capture /// - public partial class CaptureForm : AnimatingForm { + public sealed partial class CaptureForm : AnimatingForm { private enum FixMode {None, Initiated, Horizontal, Vertical}; private static readonly ILog LOG = LogManager.GetLogger(typeof(CaptureForm)); @@ -74,6 +74,7 @@ namespace Greenshot.Forms { private RectangleAnimator _zoomAnimator; private readonly bool _isZoomerTransparent = Conf.ZoomerOpacity < 1; private bool _isCtrlPressed; + private bool _showDebugInfo; /// /// Property to access the selected capture rectangle @@ -108,9 +109,9 @@ namespace Greenshot.Forms { protected override CreateParams CreateParams { [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] get { - CreateParams cp = base.CreateParams; - cp.ExStyle |= 0x02000000; - return cp; + CreateParams createParams = base.CreateParams; + createParams.ExStyle |= 0x02000000; + return createParams; } } @@ -263,6 +264,14 @@ namespace Greenshot.Forms { Invalidate(); } break; + case Keys.D: + if (_captureMode == CaptureMode.Window) + { + // Toggle debug + _showDebugInfo = !_showDebugInfo; + Invalidate(); + } + break; case Keys.Space: // Toggle capture mode switch (_captureMode) { @@ -394,7 +403,7 @@ namespace Greenshot.Forms { /// /// /// - bool isAnimating(IAnimator animator) { + private bool IsAnimating(IAnimator animator) { if (animator == null) { return false; } @@ -408,7 +417,7 @@ namespace Greenshot.Forms { Point lastPos = _cursorPos; _cursorPos = _mouseMovePos; - if (_selectedCaptureWindow != null && lastPos.Equals(_cursorPos) && !isAnimating(_zoomAnimator) && !isAnimating(_windowAnimator)) { + if (_selectedCaptureWindow != null && lastPos.Equals(_cursorPos) && !IsAnimating(_zoomAnimator) && !IsAnimating(_windowAnimator)) { return; } @@ -515,8 +524,8 @@ namespace Greenshot.Forms { // always animate the Window area through to the last frame, so we see the fade-in/out untill the end // Using a safety "offset" to make sure the text is invalidated too const int safetySize = 30; - // Check if the - if (isAnimating(_windowAnimator)) { + // Check if the animation needs to be drawn + if (IsAnimating(_windowAnimator)) { invalidateRectangle = _windowAnimator.Current; invalidateRectangle.Inflate(safetySize, safetySize); Invalidate(invalidateRectangle); @@ -524,12 +533,12 @@ namespace Greenshot.Forms { invalidateRectangle.Inflate(safetySize, safetySize); Invalidate(invalidateRectangle); // Check if this was the last of the windows animations in the normal region capture. - if (_captureMode != CaptureMode.Window && !isAnimating(_windowAnimator)) { + if (_captureMode != CaptureMode.Window && !IsAnimating(_windowAnimator)) { Invalidate(); } } - if (_zoomAnimator != null && (isAnimating(_zoomAnimator) || _captureMode != CaptureMode.Window)) { + if (_zoomAnimator != null && (IsAnimating(_zoomAnimator) || _captureMode != CaptureMode.Window)) { // Make sure we invalidate the old zoom area invalidateRectangle = _zoomAnimator.Current; invalidateRectangle.Offset(lastPos); @@ -540,11 +549,7 @@ namespace Greenshot.Forms { } // The following logic is not needed, next always returns the current if there are no frames left // but it makes more sense if we want to change something in the logic - if (isAnimating(_zoomAnimator)) { - invalidateRectangle = _zoomAnimator.Next(); - } else { - invalidateRectangle = _zoomAnimator.Current; - } + invalidateRectangle = IsAnimating(_zoomAnimator) ? _zoomAnimator.Next() : _zoomAnimator.Current; invalidateRectangle.Offset(_cursorPos); Invalidate(invalidateRectangle); } @@ -709,12 +714,12 @@ namespace Greenshot.Forms { graphics.DrawIcon(_capture.Cursor, _capture.CursorLocation.X, _capture.CursorLocation.Y); } - if (_mouseDown || _captureMode == CaptureMode.Window || isAnimating(_windowAnimator)) { + if (_mouseDown || _captureMode == CaptureMode.Window || IsAnimating(_windowAnimator)) { _captureRect.Intersect(new Rectangle(Point.Empty, _capture.ScreenBounds.Size)); // crop what is outside the screen Rectangle fixedRect; //if (captureMode == CaptureMode.Window) { - if (isAnimating(_windowAnimator)) { + if (IsAnimating(_windowAnimator)) { // Use the animator fixedRect = _windowAnimator.Current; } else { @@ -725,7 +730,7 @@ namespace Greenshot.Forms { //if (capture.CaptureDetails.CaptureMode == CaptureMode.Video) { // graphics.FillRectangle(RedOverlayBrush, fixedRect); //} else { - graphics.FillRectangle(GreenOverlayBrush, fixedRect); + graphics.FillRectangle(GreenOverlayBrush, fixedRect); //} graphics.DrawRectangle(OverlayPen, fixedRect); @@ -796,12 +801,12 @@ namespace Greenshot.Forms { // When capturing a Region we need to add 1 to the height/width for correction string sizeText; if (_captureMode == CaptureMode.Region) { - // correct the GUI width to real width for the shown size - sizeText = _captureRect.Width + 1 + " x " + (_captureRect.Height + 1); + // 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); @@ -818,6 +823,13 @@ namespace Greenshot.Forms { using (Font newSizeFont = new Font(FontFamily.GenericSansSerif, newSize, FontStyle.Bold)) { PointF sizeLocation = new PointF(fixedRect.X + _captureRect.Width / 2 - extent.Width / 2, fixedRect.Y + _captureRect.Height / 2 - newSizeFont.GetHeight() / 2); graphics.DrawString(sizeText, newSizeFont, Brushes.LightSeaGreen, sizeLocation); + + if (_showDebugInfo && _selectedCaptureWindow != null) + { + string title = string.Format("#{0:X}{1}{2}", _selectedCaptureWindow.Handle.ToInt64(), _selectedCaptureWindow.Text.Length > 0 ? " - ": "", _selectedCaptureWindow.Text); + PointF debugLocation = new PointF(fixedRect.X, fixedRect.Y); + graphics.DrawString(title, sizeFont, Brushes.DarkOrange, debugLocation); + } } } } @@ -848,7 +860,7 @@ namespace Greenshot.Forms { } // Zoom - if (_zoomAnimator != null && (isAnimating(_zoomAnimator) || _captureMode != CaptureMode.Window)) { + if (_zoomAnimator != null && (IsAnimating(_zoomAnimator) || _captureMode != CaptureMode.Window)) { const int zoomSourceWidth = 25; const int zoomSourceHeight = 25; diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 37bd7a40c..2cd6c4ba3 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -1625,7 +1625,7 @@ namespace GreenshotPlugin.Core { { return false; } - // Skip everything which is not rendered normally. + // Skip everything which is not rendered "normally", trying to fix if (!window.IsApp && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) { return false; @@ -1637,6 +1637,7 @@ namespace GreenshotPlugin.Core { } return window.Visible || window.Iconic; } + /// /// Get all the top level windows /// From c0d18c952c2e221fde24634a443937ef8f22dc0a Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 4 Sep 2016 22:23:42 +0200 Subject: [PATCH 109/170] Some more changes for BUG-2017, this simplified some of the code and adds different logic for Windows 10 apps. --- Greenshot/Forms/CaptureForm.cs | 2 +- Greenshot/Helpers/CaptureHelper.cs | 24 ++++--------- GreenshotPlugin/Core/WindowsHelper.cs | 51 +++++++++++++++++++-------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 6adc7f00c..d4a9f0512 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -826,7 +826,7 @@ namespace Greenshot.Forms { if (_showDebugInfo && _selectedCaptureWindow != null) { - string title = string.Format("#{0:X}{1}{2}", _selectedCaptureWindow.Handle.ToInt64(), _selectedCaptureWindow.Text.Length > 0 ? " - ": "", _selectedCaptureWindow.Text); + string title = string.Format("#{0:X} - {1}", _selectedCaptureWindow.Handle.ToInt64(), _selectedCaptureWindow.Text.Length > 0 ? _selectedCaptureWindow.Text : _selectedCaptureWindow.Process.ProcessName); PointF debugLocation = new PointF(fixedRect.X, fixedRect.Y); graphics.DrawString(title, sizeFont, Brushes.DarkOrange, debugLocation); } diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 6888d1777..f31c1e81e 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -461,9 +461,11 @@ namespace Greenshot.Helpers { return null; } - Thread getWindowDetailsThread = new Thread(RetrieveWindowDetails); - getWindowDetailsThread.Name = "Retrieve window details"; - getWindowDetailsThread.IsBackground = true; + Thread getWindowDetailsThread = new Thread(RetrieveWindowDetails) + { + Name = "Retrieve window details", + IsBackground = true + }; getWindowDetailsThread.Start(); return getWindowDetailsThread; } @@ -471,21 +473,7 @@ namespace Greenshot.Helpers { private void RetrieveWindowDetails() { LOG.Debug("start RetrieveWindowDetails"); // Start Enumeration of "active" windows - List allWindows = new List(WindowDetails.GetMetroApps()); - allWindows.AddRange(WindowDetails.GetAllWindows()); - foreach (WindowDetails window in allWindows) { - // Window should be visible and not ourselves - if (!window.Visible) { - continue; - } - - // Skip empty - Rectangle windowRectangle = window.WindowRectangle; - Size windowSize = windowRectangle.Size; - if (windowSize.Width == 0 || windowSize.Height == 0) { - continue; - } - + foreach (var window in WindowDetails.GetVisibleWindows()) { // Make sure the details are retrieved once window.FreezeDetails(); diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 2cd6c4ba3..71db3675f 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -140,10 +140,11 @@ namespace GreenshotPlugin.Core { /// Provides details about a Window returned by the enumeration /// public class WindowDetails : IEquatable{ - private const string MetroWindowsClass = "Windows.UI.Core.CoreWindow"; // Windows 10 uses ApplicationFrameWindow + private const string MetroWindowsClass = "Windows.UI.Core.CoreWindow"; //Used for Windows 8(.1) + private const string FramedAppClass = "ApplicationFrameWindow"; // Windows 10 uses ApplicationFrameWindow private const string MetroApplauncherClass = "ImmersiveLauncher"; private const string MetroGutterClass = "ImmersiveGutter"; - private static readonly IList IgnoreClasses = new List(new[] { "Progman", "XLMAIN", "Button", "Dwm" }); //"MS-SDIa" + private static readonly IList IgnoreClasses = new List(new[] { "Progman", "Button", "Dwm" }); //"MS-SDIa" private static readonly ILog Log = LogManager.GetLogger(typeof(WindowDetails)); private static readonly CoreConfiguration Conf = IniConfig.GetIniSection(); @@ -187,6 +188,12 @@ namespace GreenshotPlugin.Core { /// public bool IsApp => MetroWindowsClass.Equals(ClassName); + /// + /// This checks if the window is a Windows 10 App + /// For Windows 10 apps are hosted inside "ApplicationFrameWindow" + /// + public bool IsWin10App => FramedAppClass.Equals(ClassName); + /// /// Check if the window is the metro gutter (sizeable separator) /// @@ -843,7 +850,7 @@ namespace GreenshotPlugin.Core { /// Point with the coordinates to check /// true if the point lies within public bool Contains(Point p) { - return WindowRectangle.Contains(Cursor.Position); + return WindowRectangle.Contains(p); } /// @@ -1484,6 +1491,13 @@ namespace GreenshotPlugin.Core { if (!Contains(point)) { return null; } + var rect = WindowRectangle; + // If the mouse it at the edge, take the whole window + if (rect.X == point.X || rect.Y == point.Y || rect.Right == point.X || rect.Bottom == point.Y) + { + return this; + } + // Look into the child windows foreach(var childWindow in Children) { if (childWindow.Contains(point)) { return childWindow.FindChildUnderPoint(point); @@ -1509,15 +1523,15 @@ namespace GreenshotPlugin.Core { /// /// /// - private static bool IsVisibleTopLevel(WindowDetails window, Rectangle screenBounds) + private static bool IsVisible(WindowDetails window, Rectangle screenBounds) { - // Ignore windows without title - if (window.Text.Length == 0) + // Ignore invisible + if (!window.Visible) { return false; } - // Ignore invisible - if (!window.Visible) + // Ignore minizied + if (window.Iconic) { return false; } @@ -1525,13 +1539,20 @@ namespace GreenshotPlugin.Core { { return false; } - // Windows without size - Rectangle windowRect = window.WindowRectangle; + // On windows which are visible on the screen + var windowRect = window.WindowRectangle; windowRect.Intersect(screenBounds); - if (windowRect.Size.IsEmpty) + if (windowRect.IsEmpty) { return false; } + // Skip everything which is not rendered "normally", trying to fix BUG-2017 + var exWindowStyle = window.ExtendedWindowStyle; + if (!window.IsApp && !window.IsWin10App && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) + { + return false; + } + return true; } @@ -1542,14 +1563,14 @@ namespace GreenshotPlugin.Core { public static IEnumerable GetVisibleWindows() { Rectangle screenBounds = WindowCapture.GetScreenBounds(); foreach(var window in GetMetroApps()) { - if (IsVisibleTopLevel(window, screenBounds)) + if (IsVisible(window, screenBounds)) { yield return window; } } foreach (var window in GetAllWindows()) { - if (IsVisibleTopLevel(window, screenBounds)) + if (IsVisible(window, screenBounds)) { yield return window; } @@ -1625,8 +1646,8 @@ namespace GreenshotPlugin.Core { { return false; } - // Skip everything which is not rendered "normally", trying to fix - if (!window.IsApp && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) + // Skip everything which is not rendered "normally", trying to fix BUG-2017 + if (!window.IsApp && !window.IsWin10App && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) { return false; } From 8b5708e86225990444ee3d9253253e1b00ef41cd Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 5 Sep 2016 10:33:53 +0200 Subject: [PATCH 110/170] BUG-2016: Fix for not retrieving the available projects. --- GreenshotJiraPlugin/JiraConnector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index d3ded2449..ca697a21c 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -109,12 +109,12 @@ namespace GreenshotJiraPlugin { } _jiraApi = new JiraApi(new Uri(JiraConfig.Url)); _issueTypeBitmapCache = new IssueTypeBitmapCache(_jiraApi); - Monitor = new JiraMonitor(); - await Monitor.AddJiraInstanceAsync(_jiraApi); LoginInfo loginInfo; try { loginInfo = await _jiraApi.StartSessionAsync(user, password); + Monitor = new JiraMonitor(); + await Monitor.AddJiraInstanceAsync(_jiraApi); } catch (Exception) { From 9bf9c0e4e6aab284e3ca45199d3b6fb54989ccc2 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 5 Sep 2016 11:12:33 +0200 Subject: [PATCH 111/170] BUG-2016: Added favicon support. --- GreenshotJiraPlugin/GreenshotJiraPlugin.csproj | 4 ++-- GreenshotJiraPlugin/JiraConnector.cs | 14 ++++++++++++++ GreenshotJiraPlugin/JiraDestination.cs | 12 ++++++++++-- GreenshotJiraPlugin/packages.config | 2 +- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 850aafdbf..935db3188 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -34,8 +34,8 @@ - - ..\packages\Dapplo.HttpExtensions.0.5.32\lib\net45\Dapplo.HttpExtensions.dll + + ..\packages\Dapplo.HttpExtensions.0.5.33\lib\net45\Dapplo.HttpExtensions.dll True diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index ca697a21c..16f96e027 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -81,6 +81,7 @@ namespace GreenshotJiraPlugin { { Task.Run(async () => await LogoutAsync()).Wait(); } + FavIcon?.Dispose(); } /// @@ -97,6 +98,8 @@ namespace GreenshotJiraPlugin { /// public JiraMonitor Monitor { get; private set; } + public Bitmap FavIcon { get; private set; } + /// /// Internal login which catches the exceptions /// @@ -115,6 +118,17 @@ namespace GreenshotJiraPlugin { loginInfo = await _jiraApi.StartSessionAsync(user, password); Monitor = new JiraMonitor(); await Monitor.AddJiraInstanceAsync(_jiraApi); + + var favIconUri = _jiraApi.JiraBaseUri.AppendSegments("favicon.ico"); + try + { + FavIcon = await _jiraApi.GetUriContentAsync(favIconUri); + } + catch (Exception ex) + { + Log.WarnFormat("Couldn't load favicon from {0}", favIconUri); + Log.Warn("Exception details: ", ex); + } } catch (Exception) { diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index d221ba996..455fcd061 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -73,9 +73,17 @@ namespace GreenshotJiraPlugin { get { Image displayIcon = null; - if (_jiraIssue != null && JiraPlugin.Instance.CurrentJiraConnector != null) + var jiraConnector = JiraPlugin.Instance.CurrentJiraConnector; + if (jiraConnector != null) { - displayIcon = JiraPlugin.Instance.CurrentJiraConnector.GetIssueTypeBitmapAsync(_jiraIssue).Result; + if (_jiraIssue != null) + { + displayIcon = jiraConnector.GetIssueTypeBitmapAsync(_jiraIssue).Result; + } + else + { + displayIcon = jiraConnector.FavIcon; + } } if (displayIcon == null) { diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 6fb907484..58ee11d6b 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,6 +1,6 @@  - + From fc192827f17a2f832e9ccdaaa15bc85d67256545 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 5 Sep 2016 22:48:23 +0200 Subject: [PATCH 112/170] Made the supported image formats extendable, and supplied a SVG implementation right away with the jira addon. --- Greenshot/Drawing/ImageContainer.cs | 45 +- Greenshot/Drawing/Surface.cs | 2 +- Greenshot/Forms/MainForm.cs | 4 + Greenshot/Helpers/CaptureHelper.cs | 4 +- .../ConfluenceDestination.cs | 90 +- GreenshotImgurPlugin/ImgurUtils.cs | 58 +- .../GreenshotJiraPlugin.csproj | 1 + GreenshotJiraPlugin/JiraDestination.cs | 8 +- GreenshotJiraPlugin/JiraPlugin.cs | 19 + .../SvgBitmapHttpContentConverter.cs | 15 +- GreenshotJiraPlugin/SvgImage.cs | 118 ++ GreenshotPlugin/Core/AbstractDestination.cs | 2 +- GreenshotPlugin/Core/ClipboardHelper.cs | 295 ++--- GreenshotPlugin/Core/Func.cs | 29 + GreenshotPlugin/Core/IImage.cs | 68 ++ GreenshotPlugin/Core/ImageHelper.cs | 1067 +++++++++++------ GreenshotPlugin/Core/ImageOutput.cs | 34 +- GreenshotPlugin/Core/ImageWrapper.cs | 86 ++ GreenshotPlugin/Core/NetworkHelper.cs | 80 +- GreenshotPlugin/GreenshotPlugin.csproj | 3 + GreenshotPlugin/Interfaces/Generic.cs | 2 +- 21 files changed, 1354 insertions(+), 676 deletions(-) create mode 100644 GreenshotJiraPlugin/SvgImage.cs create mode 100644 GreenshotPlugin/Core/Func.cs create mode 100644 GreenshotPlugin/Core/IImage.cs create mode 100644 GreenshotPlugin/Core/ImageWrapper.cs diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index b9f08c28f..172ac7e9a 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -36,7 +36,7 @@ namespace Greenshot.Drawing { /// [Serializable] public class ImageContainer : DrawableContainer, IImageContainer { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageContainer)); + private static readonly ILog Log = LogManager.GetLogger(typeof(ImageContainer)); private Image image; @@ -80,7 +80,7 @@ namespace Greenshot.Drawing { protected void BitmapContainer_OnFieldChanged(object sender, FieldChangedEventArgs e) { if (sender.Equals(this)) { - if (e.Field.FieldType == FieldType.SHADOW) { + if (FieldType.SHADOW.Equals(e.Field.FieldType)) { ChangeShadowField(); } } @@ -140,15 +140,11 @@ namespace Greenshot.Drawing { } private void DisposeImage() { - if (image != null) { - image.Dispose(); - } + image?.Dispose(); image = null; } private void DisposeShadow() { - if (_shadowBitmap != null) { - _shadowBitmap.Dispose(); - } + _shadowBitmap?.Dispose(); _shadowBitmap = null; } @@ -162,10 +158,11 @@ namespace Greenshot.Drawing { int rotateAngle = CalculateAngle(matrix); // we currently assume only one transformation has been made. if (rotateAngle != 0) { - LOG.DebugFormat("Rotating element with {0} degrees.", rotateAngle); + Log.DebugFormat("Rotating element with {0} degrees.", rotateAngle); DisposeShadow(); using (var tmpMatrix = new Matrix()) { - using (Image tmpImage = image) { + using (image) + { image = ImageHelper.ApplyEffect(image, new RotateEffect(rotateAngle), tmpMatrix); } } @@ -178,14 +175,16 @@ namespace Greenshot.Drawing { /// /// public void Load(string filename) { - if (File.Exists(filename)) { - // Always make sure ImageHelper.LoadBitmap results are disposed some time, - // as we close the bitmap internally, we need to do it afterwards - using (Image tmpImage = ImageHelper.LoadImage(filename)) { - Image = tmpImage; - } - LOG.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); + if (!File.Exists(filename)) + { + return; } + // Always make sure ImageHelper.LoadBitmap results are disposed some time, + // as we close the bitmap internally, we need to do it afterwards + using (var tmpImage = ImageHelper.LoadImage(filename)) { + Image = tmpImage; + } + Log.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); } /// @@ -222,16 +221,8 @@ namespace Greenshot.Drawing { } } - public override bool HasDefaultSize { - get { - return true; - } - } + public override bool HasDefaultSize => true; - public override Size DefaultSize { - get { - return image.Size; - } - } + public override Size DefaultSize => image.Size; } } diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 7a4b368a9..12199733d 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -436,7 +436,7 @@ namespace Greenshot.Drawing /// /// Property for accessing the URL to which the surface was recently uploaded /// - public string UploadURL + public string UploadUrl { get; set; diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 355fb4396..7beee15f5 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -41,6 +41,7 @@ using GreenshotPlugin.Controls; using GreenshotPlugin.Core; using Greenshot.IniFile; using Greenshot.Destinations; +using Greenshot.Drawing; using log4net; using Timer = System.Timers.Timer; @@ -320,6 +321,9 @@ namespace Greenshot { public MainForm(CopyDataTransport dataTransport) { _instance = this; + // Factory for surface objects + ImageHelper.SurfaceFactory = () => new Surface(); + // // The InitializeComponent() call is required for Windows Forms designer support. // diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index f31c1e81e..74975f82f 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -549,8 +549,8 @@ namespace Greenshot.Helpers { MessageBox.Show(string.Format("{0}\r\nexplorer.exe {1}", errorMessage, surface.LastSaveFullPath), "explorer.exe", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - } else if (surface != null && !string.IsNullOrEmpty(surface.UploadURL)) { - Process.Start(surface.UploadURL); + } else if (surface != null && !string.IsNullOrEmpty(surface.UploadUrl)) { + Process.Start(surface.UploadUrl); } LOG.DebugFormat("Deregistering the BalloonTipClicked"); RemoveEventHandler(sender, e); diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index ea2594b29..fa9ccb7a1 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -36,11 +36,12 @@ namespace GreenshotConfluencePlugin { /// Description of ConfluenceDestination. /// public class ConfluenceDestination : AbstractDestination { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceDestination)); - private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection(); - private static readonly CoreConfiguration coreConfig = IniConfig.GetIniSection(); - private static readonly Image confluenceIcon = null; - private readonly Page page; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ConfluenceDestination)); + private static readonly ConfluenceConfiguration ConfluenceConfig = IniConfig.GetIniSection(); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private static readonly Image ConfluenceIcon; + private readonly Page _page; + public static bool IsInitialized { get; private set; @@ -49,14 +50,14 @@ namespace GreenshotConfluencePlugin { IsInitialized = false; try { Uri confluenceIconUri = new Uri("/GreenshotConfluencePlugin;component/Images/Confluence.ico", UriKind.Relative); - using (Stream iconStream = Application.GetResourceStream(confluenceIconUri).Stream) { - using (Image tmpImage = Image.FromStream(iconStream)) { - confluenceIcon = ImageHelper.Clone(tmpImage); - } + using (Stream iconStream = Application.GetResourceStream(confluenceIconUri)?.Stream) + { + // TODO: Check what to do with the IImage + ConfluenceIcon = ImageHelper.FromStream(iconStream); } IsInitialized = true; } catch (Exception ex) { - LOG.ErrorFormat("Problem in the confluence static initializer: {0}", ex.Message); + Log.ErrorFormat("Problem in the confluence static initializer: {0}", ex.Message); } } @@ -64,7 +65,7 @@ namespace GreenshotConfluencePlugin { } public ConfluenceDestination(Page page) { - this.page = page; + _page = page; } public override string Designation { @@ -75,10 +76,10 @@ namespace GreenshotConfluencePlugin { public override string Description { get { - if (page == null) { + if (_page == null) { return Language.GetString("confluence", LangKey.upload_menu_item); } else { - return Language.GetString("confluence", LangKey.upload_menu_item) + ": \"" + page.Title + "\""; + return Language.GetString("confluence", LangKey.upload_menu_item) + ": \"" + _page.Title + "\""; } } } @@ -91,13 +92,13 @@ namespace GreenshotConfluencePlugin { public override bool isActive { get { - return base.isActive && !string.IsNullOrEmpty(config.Url); + return base.isActive && !string.IsNullOrEmpty(ConfluenceConfig.Url); } } public override Image DisplayIcon { get { - return confluenceIcon; + return ConfluenceIcon; } } @@ -121,9 +122,9 @@ namespace GreenshotConfluencePlugin { return exportInformation; } - Page selectedPage = page; - bool openPage = (page == null) && config.OpenPageAfterUpload; - string filename = FilenameHelper.GetFilenameWithoutExtensionFromPattern(coreConfig.OutputFileFilenamePattern, captureDetails); + Page selectedPage = _page; + bool openPage = (_page == null) && ConfluenceConfig.OpenPageAfterUpload; + string filename = FilenameHelper.GetFilenameWithoutExtensionFromPattern(CoreConfig.OutputFileFilenamePattern, captureDetails); if (selectedPage == null) { ConfluenceUpload confluenceUpload = new ConfluenceUpload(filename); Nullable dialogResult = confluenceUpload.ShowDialog(); @@ -135,18 +136,23 @@ namespace GreenshotConfluencePlugin { filename = confluenceUpload.Filename; } } - string extension = "." + config.UploadFormat; + string extension = "." + ConfluenceConfig.UploadFormat; if (!filename.ToLower().EndsWith(extension)) { filename = filename + extension; } if (selectedPage != null) { string errorMessage; - bool uploaded = upload(surface, selectedPage, filename, out errorMessage); + bool uploaded = Upload(surface, selectedPage, filename, out errorMessage); if (uploaded) { if (openPage) { - try { + try + { Process.Start(selectedPage.Url); - } catch { } + } + catch + { + // Ignore + } } exportInformation.ExportMade = true; exportInformation.Uri = selectedPage.Url; @@ -158,31 +164,33 @@ namespace GreenshotConfluencePlugin { return exportInformation; } - private bool upload(ISurface surfaceToUpload, Page page, string filename, out string errorMessage) { - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(config.UploadFormat, config.UploadJpegQuality, config.UploadReduceColors); + private bool Upload(ISurface surfaceToUpload, Page page, string filename, out string errorMessage) { + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(ConfluenceConfig.UploadFormat, ConfluenceConfig.UploadJpegQuality, ConfluenceConfig.UploadReduceColors); errorMessage = null; try { new PleaseWaitForm().ShowAndWait(Description, Language.GetString("confluence", LangKey.communication_wait), - delegate() { - ConfluencePlugin.ConfluenceConnector.AddAttachment(page.Id, "image/" + config.UploadFormat.ToString().ToLower(), null, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + delegate { + ConfluencePlugin.ConfluenceConnector.AddAttachment(page.Id, "image/" + ConfluenceConfig.UploadFormat.ToString().ToLower(), null, filename, new SurfaceContainer(surfaceToUpload, outputSettings, filename)); } ); - LOG.Debug("Uploaded to Confluence."); - if (config.CopyWikiMarkupForImageToClipboard) { - int retryCount = 2; - while (retryCount >= 0) { - try { - Clipboard.SetText("!" + filename + "!"); - break; - } catch (Exception ee) { - if (retryCount == 0) { - LOG.Error(ee); - } else { - Thread.Sleep(100); - } - } finally { - --retryCount; + Log.Debug("Uploaded to Confluence."); + if (!ConfluenceConfig.CopyWikiMarkupForImageToClipboard) + { + return true; + } + int retryCount = 2; + while (retryCount >= 0) { + try { + Clipboard.SetText("!" + filename + "!"); + break; + } catch (Exception ee) { + if (retryCount == 0) { + Log.Error(ee); + } else { + Thread.Sleep(100); } + } finally { + --retryCount; } } return true; diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index ed430bb99..c32c0afba 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -32,7 +32,7 @@ namespace GreenshotImgurPlugin { /// Description of ImgurUtils. /// public static class ImgurUtils { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurUtils)); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurUtils)); private const string SmallUrlPattern = "http://i.imgur.com/{0}s.jpg"; private static readonly ImgurConfiguration Config = IniConfig.GetIniSection(); private const string AuthUrlPattern = "https://api.imgur.com/oauth2/authorize?response_type=code&client_id={ClientId}&redirect_uri={RedirectUrl}&state={State}"; @@ -64,7 +64,7 @@ namespace GreenshotImgurPlugin { RetrieveImgurThumbnail(imgurInfo); Config.runtimeImgurHistory.Add(hash, imgurInfo); } else { - LOG.DebugFormat("Deleting not found ImgUr {0} from config.", hash); + Log.DebugFormat("Deleting not found ImgUr {0} from config.", hash); Config.ImgurUploadHistory.Remove(hash); saveNeeded = true; } @@ -74,16 +74,16 @@ namespace GreenshotImgurPlugin { HttpWebResponse response = ((HttpWebResponse)wE.Response); // Image no longer available if (response.StatusCode == HttpStatusCode.Redirect) { - LOG.InfoFormat("ImgUr image for hash {0} is no longer available", hash); + Log.InfoFormat("ImgUr image for hash {0} is no longer available", hash); Config.ImgurUploadHistory.Remove(hash); redirected = true; } } if (!redirected) { - LOG.Error("Problem loading ImgUr history for hash " + hash, wE); + Log.Error("Problem loading ImgUr history for hash " + hash, wE); } } catch (Exception e) { - LOG.Error("Problem loading ImgUr history for hash " + hash, e); + Log.Error("Problem loading ImgUr history for hash " + hash, e); } } if (saveNeeded) { @@ -146,7 +146,7 @@ namespace GreenshotImgurPlugin { } } } catch (Exception ex) { - LOG.Error("Upload to imgur gave an exeption: ", ex); + Log.Error("Upload to imgur gave an exeption: ", ex); throw; } } else { @@ -200,10 +200,10 @@ namespace GreenshotImgurPlugin { /// public static void RetrieveImgurThumbnail(ImgurInfo imgurInfo) { if (imgurInfo.SmallSquare == null) { - LOG.Warn("Imgur URL was null, not retrieving thumbnail."); + Log.Warn("Imgur URL was null, not retrieving thumbnail."); return; } - LOG.InfoFormat("Retrieving Imgur image for {0} with url {1}", imgurInfo.Hash, imgurInfo.SmallSquare); + Log.InfoFormat("Retrieving Imgur image for {0} with url {1}", imgurInfo.Hash, imgurInfo.SmallSquare); HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(string.Format(SmallUrlPattern, imgurInfo.Hash), HTTPMethod.GET); webRequest.ServicePoint.Expect100Continue = false; // Not for getting the thumbnail, in anonymous modus @@ -213,7 +213,7 @@ namespace GreenshotImgurPlugin { Stream responseStream = response.GetResponseStream(); if (responseStream != null) { - imgurInfo.Image = Image.FromStream(responseStream); + imgurInfo.Image = ImageHelper.FromStream(responseStream); } } } @@ -226,16 +226,21 @@ namespace GreenshotImgurPlugin { /// ImgurInfo public static ImgurInfo RetrieveImgurInfo(string hash, string deleteHash) { string url = Config.ImgurApi3Url + "/image/" + hash + ".xml"; - LOG.InfoFormat("Retrieving Imgur info for {0} with url {1}", hash, url); + Log.InfoFormat("Retrieving Imgur info for {0} with url {1}", hash, url); HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.GET); webRequest.ServicePoint.Expect100Continue = false; SetClientId(webRequest); - string responseString; + string responseString = null; try { using (WebResponse response = webRequest.GetResponse()) { LogRateLimitInfo(response); - using (StreamReader reader = new StreamReader(response.GetResponseStream(), true)) { - responseString = reader.ReadToEnd(); + var responseStream = response.GetResponseStream(); + if (responseStream != null) + { + using (StreamReader reader = new StreamReader(responseStream, true)) + { + responseString = reader.ReadToEnd(); + } } } } catch (WebException wE) { @@ -246,9 +251,13 @@ namespace GreenshotImgurPlugin { } throw; } - LOG.Debug(responseString); - ImgurInfo imgurInfo = ImgurInfo.ParseResponse(responseString); - imgurInfo.DeleteHash = deleteHash; + ImgurInfo imgurInfo = null; + if (responseString != null) + { + Log.Debug(responseString); + imgurInfo = ImgurInfo.ParseResponse(responseString); + imgurInfo.DeleteHash = deleteHash; + } return imgurInfo; } @@ -257,21 +266,26 @@ namespace GreenshotImgurPlugin { /// /// public static void DeleteImgurImage(ImgurInfo imgurInfo) { - LOG.InfoFormat("Deleting Imgur image for {0}", imgurInfo.DeleteHash); + Log.InfoFormat("Deleting Imgur image for {0}", imgurInfo.DeleteHash); try { string url = Config.ImgurApi3Url + "/image/" + imgurInfo.DeleteHash + ".xml"; HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.DELETE); webRequest.ServicePoint.Expect100Continue = false; SetClientId(webRequest); - string responseString; + string responseString = null; using (WebResponse response = webRequest.GetResponse()) { LogRateLimitInfo(response); - using (StreamReader reader = new StreamReader(response.GetResponseStream(), true)) { - responseString = reader.ReadToEnd(); + var responseStream = response.GetResponseStream(); + if (responseStream != null) + { + using (StreamReader reader = new StreamReader(responseStream, true)) + { + responseString = reader.ReadToEnd(); + } } } - LOG.InfoFormat("Delete result: {0}", responseString); + Log.InfoFormat("Delete result: {0}", responseString); } catch (WebException wE) { // Allow "Bad request" this means we already deleted it if (wE.Status == WebExceptionStatus.ProtocolError) { @@ -293,7 +307,7 @@ namespace GreenshotImgurPlugin { /// private static void LogHeader(IDictionary nameValues, string key) { if (nameValues.ContainsKey(key)) { - LOG.InfoFormat("key={0}", nameValues[key]); + Log.InfoFormat("key={0}", nameValues[key]); } } diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index 935db3188..cc52a7b68 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -95,6 +95,7 @@ + Always diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index 455fcd061..f45859841 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -118,12 +118,12 @@ namespace GreenshotJiraPlugin { { var surfaceContainer = new SurfaceContainer(surfaceToUpload, outputSettings, filename); await _jiraPlugin.JiraConnector.AttachAsync(_jiraIssue.Key, surfaceContainer); - surfaceToUpload.UploadURL = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", _jiraIssue.Key).AbsoluteUri; + surfaceToUpload.UploadUrl = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", _jiraIssue.Key).AbsoluteUri; } ); Log.DebugFormat("Uploaded to Jira {0}", _jiraIssue.Key); exportInformation.ExportMade = true; - exportInformation.Uri = surfaceToUpload.UploadURL; + exportInformation.Uri = surfaceToUpload.UploadUrl; } catch (Exception e) { MessageBox.Show(Language.GetString("jira", LangKey.upload_failure) + " " + e.Message); } @@ -133,7 +133,7 @@ namespace GreenshotJiraPlugin { var dialogResult = jiraForm.ShowDialog(); if (dialogResult == DialogResult.OK) { try { - surfaceToUpload.UploadURL = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", jiraForm.GetJiraIssue().Key).AbsoluteUri; + surfaceToUpload.UploadUrl = _jiraPlugin.JiraConnector.JiraBaseUri.AppendSegments("browse", jiraForm.GetJiraIssue().Key).AbsoluteUri; // Run upload in the background new PleaseWaitForm().ShowAndWait(Description, Language.GetString("jira", LangKey.communication_wait), async () => @@ -143,7 +143,7 @@ namespace GreenshotJiraPlugin { ); Log.DebugFormat("Uploaded to Jira {0}", jiraForm.GetJiraIssue().Key); exportInformation.ExportMade = true; - exportInformation.Uri = surfaceToUpload.UploadURL; + exportInformation.Uri = surfaceToUpload.UploadUrl; } catch(Exception e) { MessageBox.Show(Language.GetString("jira", LangKey.upload_failure) + " " + e.Message); } diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index 009ac9ce3..b61bbe907 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -23,9 +23,13 @@ using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; using System; +using System.Drawing; +using System.Drawing.Imaging; using System.Threading.Tasks; using Dapplo.Log.Facade; using GreenshotJiraPlugin.Forms; +using GreenshotPlugin.Core; +using Svg; namespace GreenshotJiraPlugin { /// @@ -95,6 +99,21 @@ namespace GreenshotJiraPlugin { _config = IniConfig.GetIniSection(); LogSettings.RegisterDefaultLogger(); + // Add a SVG converter, although it doesn't fit to the Jira plugin there is currently no other way + ImageHelper.StreamConverters["svg"] = (stream, s) => + { + stream.Position = 0; + try + { + return SvgImage.FromStream(stream).Image; + } + catch (Exception ex) + { + Log.Error("Can't load SVG", ex); + } + return null; + }; + return true; } diff --git a/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs b/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs index f8d995d99..47b3a24d1 100644 --- a/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs +++ b/GreenshotJiraPlugin/SvgBitmapHttpContentConverter.cs @@ -22,7 +22,6 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -33,8 +32,6 @@ using Dapplo.HttpExtensions.Support; using Dapplo.Log.Facade; using System.Net.Http; using System.Net.Http.Headers; -using GreenshotPlugin.Core; -using Svg; namespace GreenshotJiraPlugin { @@ -86,12 +83,12 @@ namespace GreenshotJiraPlugin using (var memoryStream = (MemoryStream) await StreamHttpContentConverter.Instance.ConvertFromHttpContentAsync(typeof(MemoryStream), httpContent, cancellationToken).ConfigureAwait(false)) { Log.Debug().WriteLine("Creating a Bitmap from the SVG."); - var bitmap = ImageHelper.CreateEmpty(Width, Height, PixelFormat.Format32bppArgb, Color.Transparent, 96, 96); - var svgDoc = SvgDocument.Open(memoryStream); - svgDoc.Width = Width; - svgDoc.Height = Height; - svgDoc.Draw(bitmap); - return bitmap; + var svgImage = new SvgImage(memoryStream) + { + Height = Height, + Width = Width + }; + return svgImage.Image; } } diff --git a/GreenshotJiraPlugin/SvgImage.cs b/GreenshotJiraPlugin/SvgImage.cs new file mode 100644 index 000000000..bb86e3264 --- /dev/null +++ b/GreenshotJiraPlugin/SvgImage.cs @@ -0,0 +1,118 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Imaging; +using System.IO; +using GreenshotPlugin.Core; +using Svg; + +namespace GreenshotJiraPlugin +{ + /// + /// Create an image look like of the SVG + /// + public class SvgImage : IImage + { + private readonly SvgDocument _svgDocument; + + private Image _imageClone; + + /// + /// Factory to create via a stream + /// + /// Stream + /// IImage + public static IImage FromStream(Stream stream) + { + return new SvgImage(stream); + } + + /// + /// Default constructor + /// + /// + public SvgImage(Stream stream) + { + _svgDocument = SvgDocument.Open(stream); + Height = (int)_svgDocument.ViewBox.Height; + Width = (int)_svgDocument.ViewBox.Width; + } + + /// + /// Height of the image, can be set to change + /// + public int Height { get; set; } + + /// + /// Width of the image, can be set to change. + /// + public int Width { get; set; } + + /// + /// Size of the image + /// + public Size Size => new Size(Width, Height); + + /// + /// Pixelformat of the underlying image + /// + public PixelFormat PixelFormat => Image.PixelFormat; + + /// + /// Horizontal resolution of the underlying image + /// + public float HorizontalResolution => Image.HorizontalResolution; + + /// + /// Vertical resolution of the underlying image + /// + public float VerticalResolution => Image.VerticalResolution; + + /// + /// Unterlying image, or an on demand rendered version with different attributes as the original + /// + public Image Image + { + get + { + if (_imageClone?.Height == Height && _imageClone?.Width == Width) + { + return _imageClone; + } + // Calculate new image clone + _imageClone?.Dispose(); + _imageClone = ImageHelper.CreateEmpty(Width, Height, PixelFormat.Format32bppArgb, Color.Transparent, 96, 96); + _svgDocument.Draw((Bitmap)_imageClone); + return _imageClone; + + } + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + _imageClone?.Dispose(); + } + } +} diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index 42dbf812c..b0a0bd965 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -123,7 +123,7 @@ namespace GreenshotPlugin.Core { public void ProcessExport(ExportInformation exportInformation, ISurface surface) { if (exportInformation != null && exportInformation.ExportMade) { if (!string.IsNullOrEmpty(exportInformation.Uri)) { - surface.UploadURL = exportInformation.Uri; + surface.UploadUrl = exportInformation.Uri; surface.SendMessageEvent(this, SurfaceMessageTyp.UploadedUri, Language.GetFormattedString("exported_to", exportInformation.DestinationDescription)); } else if (!string.IsNullOrEmpty(exportInformation.Filepath)) { surface.LastSaveFullPath = exportInformation.Filepath; diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index ece141ab8..84950c05c 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -39,9 +39,9 @@ namespace GreenshotPlugin.Core { /// Description of ClipboardHelper. /// public static class ClipboardHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ClipboardHelper)); - private static readonly object clipboardLockObject = new object(); - private static readonly CoreConfiguration config = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(ClipboardHelper)); + private static readonly object ClipboardLockObject = new object(); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private static readonly string FORMAT_FILECONTENTS = "FileContents"; private static readonly string FORMAT_PNG = "PNG"; private static readonly string FORMAT_PNG_OFFICEART = "PNG+Office Art"; @@ -52,12 +52,11 @@ namespace GreenshotPlugin.Core { private static readonly string FORMAT_GIF = "GIF"; private static readonly string FORMAT_BITMAP = "System.Drawing.Bitmap"; //private static readonly string FORMAT_HTML = "HTML Format"; - - private static IntPtr nextClipboardViewer = IntPtr.Zero; + // Template for the HTML Text on the clipboard // see: http://msdn.microsoft.com/en-us/library/ms649015%28v=vs.85%29.aspx // or: http://msdn.microsoft.com/en-us/library/Aa767917.aspx - private const string HTML_CLIPBOARD_STRING = @"Version:0.9 + private const string HtmlClipboardString = @"Version:0.9 StartHTML:<<<<<<<1 EndHTML:<<<<<<<2 StartFragment:<<<<<<<3 @@ -75,7 +74,7 @@ EndSelection:<<<<<<<4 "; - private const string HTML_CLIPBOARD_BASE64_STRING = @"Version:0.9 + private const string HtmlClipboardBase64String = @"Version:0.9 StartHTML:<<<<<<<1 EndHTML:<<<<<<<2 StartFragment:<<<<<<<3 @@ -111,7 +110,7 @@ EndSelection:<<<<<<<4 using (Process ownerProcess = Process.GetProcessById(pid)) { // Exclude myself - if (ownerProcess != null && me.Id != ownerProcess.Id) + if (me.Id != ownerProcess.Id) { // Get Process Name owner = ownerProcess.ProcessName; @@ -122,20 +121,21 @@ EndSelection:<<<<<<<4 } catch (Exception) { + // Ignore } } } } catch(Exception e) { - LOG.Warn("Non critical error: Couldn't get clipboard process, trying to use the title.", e); - StringBuilder title = new StringBuilder(260, 260); + Log.Warn("Non critical error: Couldn't get clipboard process, trying to use the title.", e); + var title = new StringBuilder(260, 260); User32.GetWindowText(hWnd, title, title.Capacity); owner = title.ToString(); } } } catch (Exception e) { - LOG.Warn("Non critical error: Couldn't get clipboard owner.", e); + Log.Warn("Non critical error: Couldn't get clipboard owner.", e); } return owner; } @@ -147,7 +147,7 @@ EndSelection:<<<<<<<4 /// /// private static void SetDataObject(IDataObject ido, bool copy) { - lock (clipboardLockObject) { + lock (ClipboardLockObject) { // Clear first, this seems to solve some issues try { @@ -155,7 +155,7 @@ EndSelection:<<<<<<<4 } catch (Exception clearException) { - LOG.Warn(clearException.Message); + Log.Warn(clearException.Message); } try { @@ -164,7 +164,7 @@ EndSelection:<<<<<<<4 } catch (Exception clipboardSetException) { - string messageText = null; + string messageText; string clipboardOwner = GetClipboardOwner(); if (clipboardOwner != null) { @@ -173,7 +173,7 @@ EndSelection:<<<<<<<4 else { messageText = Language.GetString("clipboard_error"); } - LOG.Error(messageText, clipboardSetException); + Log.Error(messageText, clipboardSetException); } } } @@ -182,21 +182,21 @@ EndSelection:<<<<<<<4 /// The GetDataObject will lock/try/catch clipboard operations making it save and not show exceptions. /// public static IDataObject GetDataObject() { - lock (clipboardLockObject) { + lock (ClipboardLockObject) { int retryCount = 2; while (retryCount >= 0) { try { return Clipboard.GetDataObject(); } catch (Exception ee) { if (retryCount == 0) { - string messageText = null; + string messageText; string clipboardOwner = GetClipboardOwner(); if (clipboardOwner != null) { messageText = Language.GetFormattedString("clipboard_inuse", clipboardOwner); } else { messageText = Language.GetString("clipboard_error"); } - LOG.Error(messageText, ee); + Log.Error(messageText, ee); } else { Thread.Sleep(100); } @@ -264,13 +264,15 @@ EndSelection:<<<<<<<4 if (dataObject.GetDataPresent(FORMAT_FILECONTENTS)) { try { MemoryStream imageStream = dataObject.GetData(FORMAT_FILECONTENTS) as MemoryStream; - if (isValidStream(imageStream)) { - using (Image tmpImage = Image.FromStream(imageStream)) { + if (IsValidStream(imageStream)) { + using (ImageHelper.FromStream(imageStream)) + { // If we get here, there is an image return true; } } } catch (Exception) { + // Ignore } } } @@ -282,7 +284,7 @@ EndSelection:<<<<<<<4 /// /// /// - private static bool isValidStream(MemoryStream memoryStream) { + private static bool IsValidStream(MemoryStream memoryStream) { return memoryStream != null && memoryStream.Length > 0; } @@ -309,7 +311,7 @@ EndSelection:<<<<<<<4 // Get single image, this takes the "best" match Image singleImage = GetImage(dataObject); if (singleImage != null) { - LOG.InfoFormat("Got image from clipboard with size {0} and format {1}", singleImage.Size, singleImage.PixelFormat); + Log.InfoFormat("Got image from clipboard with size {0} and format {1}", singleImage.Size, singleImage.PixelFormat); yield return singleImage; } else { // check if files are supplied @@ -320,10 +322,10 @@ EndSelection:<<<<<<<4 try { returnImage = ImageHelper.LoadImage(imageFile); } catch (Exception streamImageEx) { - LOG.Error("Problem retrieving Image from clipboard.", streamImageEx); + Log.Error("Problem retrieving Image from clipboard.", streamImageEx); } if (returnImage != null) { - LOG.InfoFormat("Got image from clipboard with size {0} and format {1}", returnImage.Size, returnImage.PixelFormat); + Log.InfoFormat("Got image from clipboard with size {0} and format {1}", returnImage.Size, returnImage.PixelFormat); yield return returnImage; } } @@ -346,20 +348,19 @@ EndSelection:<<<<<<<4 // So I build some special logik to get the best format: if (formats != null && formats.Contains(FORMAT_PNG_OFFICEART) && formats.Contains(DataFormats.Dib)) { // Outlook ?? - LOG.Info("Most likely the current clipboard contents come from Outlook, as this has a problem with PNG and others we place the DIB format to the front..."); + Log.Info("Most likely the current clipboard contents come from Outlook, as this has a problem with PNG and others we place the DIB format to the front..."); retrieveFormats = new[] { DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, FORMAT_GIF }; } else { retrieveFormats = new[] { FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_GIF }; } foreach (string currentFormat in retrieveFormats) { if (formats.Contains(currentFormat)) { - LOG.InfoFormat("Found {0}, trying to retrieve.", currentFormat); + Log.InfoFormat("Found {0}, trying to retrieve.", currentFormat); returnImage = GetImageForFormat(currentFormat, dataObject); } else { - LOG.DebugFormat("Couldn't find format {0}.", currentFormat); + Log.DebugFormat("Couldn't find format {0}.", currentFormat); } if (returnImage != null) { - ImageHelper.Orientate(returnImage); return returnImage; } } @@ -378,78 +379,84 @@ EndSelection:<<<<<<<4 private static Image GetImageForFormat(string format, IDataObject dataObject) { object clipboardObject = GetFromDataObject(dataObject, format); MemoryStream imageStream = clipboardObject as MemoryStream; - if (!isValidStream(imageStream)) { + if (!IsValidStream(imageStream)) { // TODO: add "HTML Format" support here... return clipboardObject as Image; - } else { - if (config.EnableSpecialDIBClipboardReader) { - if (format == FORMAT_17 || format == DataFormats.Dib) { - LOG.Info("Found DIB stream, trying to process it."); - try { - byte[] dibBuffer = new byte[imageStream.Length]; - imageStream.Read(dibBuffer, 0, dibBuffer.Length); - BITMAPINFOHEADER infoHeader = BinaryStructHelper.FromByteArray(dibBuffer); - if (!infoHeader.IsDibV5) { - LOG.InfoFormat("Using special DIB (dibBuffer); + if (!infoHeader.IsDibV5) { + Log.InfoFormat("Using special DIB (fileHeader); + byte[] fileHeaderBytes = BinaryStructHelper.ToByteArray(fileHeader); - using (MemoryStream bitmapStream = new MemoryStream()) { - bitmapStream.Write(fileHeaderBytes, 0, fileHeaderSize); - bitmapStream.Write(dibBuffer, 0, dibBuffer.Length); - bitmapStream.Seek(0, SeekOrigin.Begin); - using (Image tmpImage = Image.FromStream(bitmapStream)) { - if (tmpImage != null) { - return ImageHelper.Clone(tmpImage); - } - } - } - } else { - LOG.Info("Using special DIBV5 / Format17 format reader"); - // CF_DIBV5 - IntPtr gcHandle = IntPtr.Zero; - try { - GCHandle handle = GCHandle.Alloc(dibBuffer, GCHandleType.Pinned); - gcHandle = GCHandle.ToIntPtr(handle); - return new Bitmap(infoHeader.biWidth, infoHeader.biHeight, -(int)(infoHeader.biSizeImage / infoHeader.biHeight), - infoHeader.biBitCount == 32?PixelFormat.Format32bppArgb: PixelFormat.Format24bppRgb, - new IntPtr(handle.AddrOfPinnedObject().ToInt32() + infoHeader.OffsetToPixels + (infoHeader.biHeight - 1) * (int)(infoHeader.biSizeImage / infoHeader.biHeight))); - } catch (Exception ex) { - LOG.Error("Problem retrieving Format17 from clipboard.", ex); - } finally { - if (gcHandle == IntPtr.Zero) { - GCHandle.FromIntPtr(gcHandle).Free(); - } + using (MemoryStream bitmapStream = new MemoryStream()) { + bitmapStream.Write(fileHeaderBytes, 0, fileHeaderSize); + bitmapStream.Write(dibBuffer, 0, dibBuffer.Length); + bitmapStream.Seek(0, SeekOrigin.Begin); + var image = ImageHelper.FromStream(bitmapStream); + if (image != null) + { + return image; + } + } + } else { + Log.Info("Using special DIBV5 / Format17 format reader"); + // CF_DIBV5 + IntPtr gcHandle = IntPtr.Zero; + try { + GCHandle handle = GCHandle.Alloc(dibBuffer, GCHandleType.Pinned); + gcHandle = GCHandle.ToIntPtr(handle); + return + new Bitmap(infoHeader.biWidth, infoHeader.biHeight, + -(int)(infoHeader.biSizeImage / infoHeader.biHeight), + infoHeader.biBitCount == 32?PixelFormat.Format32bppArgb: PixelFormat.Format24bppRgb, + new IntPtr(handle.AddrOfPinnedObject().ToInt32() + infoHeader.OffsetToPixels + (infoHeader.biHeight - 1) * (int)(infoHeader.biSizeImage / infoHeader.biHeight)) + ); + } catch (Exception ex) { + Log.Error("Problem retrieving Format17 from clipboard.", ex); + } finally { + if (gcHandle == IntPtr.Zero) { + GCHandle.FromIntPtr(gcHandle).Free(); } } - } catch (Exception dibEx) { - LOG.Error("Problem retrieving DIB from clipboard.", dibEx); } + } catch (Exception dibEx) { + Log.Error("Problem retrieving DIB from clipboard.", dibEx); } - } else { - LOG.Info("Skipping special DIB format reader as it's disabled in the configuration."); } - try { + } else { + Log.Info("Skipping special DIB format reader as it's disabled in the configuration."); + } + try { + if (imageStream != null) + { imageStream.Seek(0, SeekOrigin.Begin); - using (Image tmpImage = Image.FromStream(imageStream, true, true)) { - if (tmpImage != null) { - LOG.InfoFormat("Got image with clipboard format {0} from the clipboard.", format); - return ImageHelper.Clone(tmpImage); - } + var tmpImage = ImageHelper.FromStream(imageStream); + if (tmpImage != null) { + Log.InfoFormat("Got image with clipboard format {0} from the clipboard.", format); + return tmpImage; } - } catch (Exception streamImageEx) { - LOG.Error(string.Format("Problem retrieving {0} from clipboard.", format), streamImageEx); } + } catch (Exception streamImageEx) { + Log.Error(string.Format("Problem retrieving {0} from clipboard.", format), streamImageEx); } return null; } @@ -468,7 +475,7 @@ EndSelection:<<<<<<<4 /// string if there is text on the clipboard public static string GetText(IDataObject dataObject) { if (ContainsText(dataObject)) { - return (String)dataObject.GetData(DataFormats.Text); + return (string)dataObject.GetData(DataFormats.Text); } return null; } @@ -483,32 +490,32 @@ EndSelection:<<<<<<<4 SetDataObject(ido, true); } - private static string getHTMLString(ISurface surface, string filename) { - string utf8EncodedHTMLString = Encoding.GetEncoding(0).GetString(Encoding.UTF8.GetBytes(HTML_CLIPBOARD_STRING)); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${width}", surface.Image.Width.ToString()); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${height}", surface.Image.Height.ToString()); - utf8EncodedHTMLString= utf8EncodedHTMLString.Replace("${file}", filename.Replace("\\","/")); + private static string GetHtmlString(ISurface surface, string filename) { + string utf8EncodedHtmlString = Encoding.GetEncoding(0).GetString(Encoding.UTF8.GetBytes(HtmlClipboardString)); + utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${width}", surface.Image.Width.ToString()); + utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${height}", surface.Image.Height.ToString()); + utf8EncodedHtmlString= utf8EncodedHtmlString.Replace("${file}", filename.Replace("\\","/")); StringBuilder sb=new StringBuilder(); - sb.Append(utf8EncodedHTMLString); - sb.Replace("<<<<<<<1", (utf8EncodedHTMLString.IndexOf("") + "".Length).ToString("D8")); - sb.Replace("<<<<<<<2", (utf8EncodedHTMLString.IndexOf("")).ToString("D8")); - sb.Replace("<<<<<<<3", (utf8EncodedHTMLString.IndexOf("")+"".Length).ToString("D8")); - sb.Replace("<<<<<<<4", (utf8EncodedHTMLString.IndexOf("")).ToString("D8")); + sb.Append(utf8EncodedHtmlString); + sb.Replace("<<<<<<<1", (utf8EncodedHtmlString.IndexOf("") + "".Length).ToString("D8")); + sb.Replace("<<<<<<<2", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); + sb.Replace("<<<<<<<3", (utf8EncodedHtmlString.IndexOf("")+"".Length).ToString("D8")); + sb.Replace("<<<<<<<4", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); return sb.ToString(); } - private static string getHTMLDataURLString(ISurface surface, MemoryStream pngStream) { - string utf8EncodedHTMLString = Encoding.GetEncoding(0).GetString(Encoding.UTF8.GetBytes(HTML_CLIPBOARD_BASE64_STRING)); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${width}", surface.Image.Width.ToString()); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${height}", surface.Image.Height.ToString()); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${format}", "png"); - utf8EncodedHTMLString = utf8EncodedHTMLString.Replace("${data}", Convert.ToBase64String(pngStream.GetBuffer(),0, (int)pngStream.Length)); + private static string GetHtmlDataUrlString(ISurface surface, MemoryStream pngStream) { + string utf8EncodedHtmlString = Encoding.GetEncoding(0).GetString(Encoding.UTF8.GetBytes(HtmlClipboardBase64String)); + utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${width}", surface.Image.Width.ToString()); + utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${height}", surface.Image.Height.ToString()); + utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${format}", "png"); + utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${data}", Convert.ToBase64String(pngStream.GetBuffer(),0, (int)pngStream.Length)); StringBuilder sb=new StringBuilder(); - sb.Append(utf8EncodedHTMLString); - sb.Replace("<<<<<<<1", (utf8EncodedHTMLString.IndexOf("") + "".Length).ToString("D8")); - sb.Replace("<<<<<<<2", (utf8EncodedHTMLString.IndexOf("")).ToString("D8")); - sb.Replace("<<<<<<<3", (utf8EncodedHTMLString.IndexOf("")+"".Length).ToString("D8")); - sb.Replace("<<<<<<<4", (utf8EncodedHTMLString.IndexOf("")).ToString("D8")); + sb.Append(utf8EncodedHtmlString); + sb.Replace("<<<<<<<1", (utf8EncodedHtmlString.IndexOf("") + "".Length).ToString("D8")); + sb.Replace("<<<<<<<2", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); + sb.Replace("<<<<<<<3", (utf8EncodedHtmlString.IndexOf("")+"".Length).ToString("D8")); + sb.Replace("<<<<<<<4", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); return sb.ToString(); } @@ -539,7 +546,7 @@ EndSelection:<<<<<<<4 disposeImage = ImageOutput.CreateImageFromSurface(surface, outputSettings, out imageToSave); try { // Create PNG stream - if (config.ClipboardFormats.Contains(ClipboardFormat.PNG)) { + if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.PNG)) { pngStream = new MemoryStream(); // PNG works for e.g. Powerpoint SurfaceOutputSettings pngOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); @@ -549,11 +556,11 @@ EndSelection:<<<<<<<4 dataObject.SetData(FORMAT_PNG, false, pngStream); } } catch (Exception pngEX) { - LOG.Error("Error creating PNG for the Clipboard.", pngEX); + Log.Error("Error creating PNG for the Clipboard.", pngEX); } try { - if (config.ClipboardFormats.Contains(ClipboardFormat.DIB)) { + if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.DIB)) { using (MemoryStream tmpBmpStream = new MemoryStream()) { // Save image as BMP SurfaceOutputSettings bmpOutputSettings = new SurfaceOutputSettings(OutputFormat.bmp, 100, false); @@ -568,21 +575,23 @@ EndSelection:<<<<<<<4 dataObject.SetData(DataFormats.Dib, true, dibStream); } } catch (Exception dibEx) { - LOG.Error("Error creating DIB for the Clipboard.", dibEx); + Log.Error("Error creating DIB for the Clipboard.", dibEx); } // CF_DibV5 try { - if (config.ClipboardFormats.Contains(ClipboardFormat.DIBV5)) { + if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.DIBV5)) { // Create the stream for the clipboard dibV5Stream = new MemoryStream(); // Create the BITMAPINFOHEADER - BITMAPINFOHEADER header = new BITMAPINFOHEADER(imageToSave.Width, imageToSave.Height, 32); - // Make sure we have BI_BITFIELDS, this seems to be normal for Format17? - header.biCompression = BI_COMPRESSION.BI_BITFIELDS; + BITMAPINFOHEADER header = new BITMAPINFOHEADER(imageToSave.Width, imageToSave.Height, 32) + { + // Make sure we have BI_BITFIELDS, this seems to be normal for Format17? + biCompression = BI_COMPRESSION.BI_BITFIELDS + }; // Create a byte[] to write - byte[] headerBytes = BinaryStructHelper.ToByteArray(header); + byte[] headerBytes = BinaryStructHelper.ToByteArray(header); // Write the BITMAPINFOHEADER to the stream dibV5Stream.Write(headerBytes, 0, headerBytes.Length); @@ -591,7 +600,7 @@ EndSelection:<<<<<<<4 // Make sure the values are set colorMask.InitValues(); // Create the byte[] from the struct - byte[] colorMaskBytes = BinaryStructHelper.ToByteArray(colorMask); + byte[] colorMaskBytes = BinaryStructHelper.ToByteArray(colorMask); Array.Reverse(colorMaskBytes); // Write to the stream dibV5Stream.Write(colorMaskBytes, 0, colorMaskBytes.Length); @@ -605,35 +614,37 @@ EndSelection:<<<<<<<4 dataObject.SetData(FORMAT_17, true, dibV5Stream); } } catch (Exception dibEx) { - LOG.Error("Error creating DIB for the Clipboard.", dibEx); + Log.Error("Error creating DIB for the Clipboard.", dibEx); } // Set the HTML - if (config.ClipboardFormats.Contains(ClipboardFormat.HTML)) { + if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.HTML)) { string tmpFile = ImageOutput.SaveToTmpFile(surface, new SurfaceOutputSettings(OutputFormat.png, 100, false), null); - string html = getHTMLString(surface, tmpFile); + string html = GetHtmlString(surface, tmpFile); dataObject.SetText(html, TextDataFormat.Html); - } else if (config.ClipboardFormats.Contains(ClipboardFormat.HTMLDATAURL)) { + } else if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.HTMLDATAURL)) { string html; - using (MemoryStream tmpPNGStream = new MemoryStream()) { - SurfaceOutputSettings pngOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); - // Do not allow to reduce the colors, some applications dislike 256 color images - // reported with bug #3594681 - pngOutputSettings.DisableReduceColors = true; + using (MemoryStream tmpPngStream = new MemoryStream()) { + SurfaceOutputSettings pngOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false) + { + // Do not allow to reduce the colors, some applications dislike 256 color images + // reported with bug #3594681 + DisableReduceColors = true + }; // Check if we can use the previously used image if (imageToSave.PixelFormat != PixelFormat.Format8bppIndexed) { - ImageOutput.SaveToStream(imageToSave, surface, tmpPNGStream, pngOutputSettings); + ImageOutput.SaveToStream(imageToSave, surface, tmpPngStream, pngOutputSettings); } else { - ImageOutput.SaveToStream(surface, tmpPNGStream, pngOutputSettings); + ImageOutput.SaveToStream(surface, tmpPngStream, pngOutputSettings); } - html = getHTMLDataURLString(surface, tmpPNGStream); + html = GetHtmlDataUrlString(surface, tmpPngStream); } dataObject.SetText(html, TextDataFormat.Html); } } finally { // we need to use the SetDataOject before the streams are closed otherwise the buffer will be gone! // Check if Bitmap is wanted - if (config.ClipboardFormats.Contains(ClipboardFormat.BITMAP)) { + if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.BITMAP)) { dataObject.SetImage(imageToSave); // Place the DataObject to the clipboard SetDataObject(dataObject, true); @@ -656,8 +667,8 @@ EndSelection:<<<<<<<4 dibV5Stream = null; } // cleanup if needed - if (disposeImage && imageToSave != null) { - imageToSave.Dispose(); + if (disposeImage) { + imageToSave?.Dispose(); } } } @@ -695,7 +706,7 @@ EndSelection:<<<<<<<4 /// /// Type /// object - public static void SetClipboardData(Type type, Object obj) { + public static void SetClipboardData(Type type, object obj) { DataFormats.Format format = DataFormats.GetFormat(type.FullName); //now copy to clipboard @@ -724,7 +735,7 @@ EndSelection:<<<<<<<4 formats = dataObj.GetFormats(); } if (formats != null) { - LOG.DebugFormat("Got clipboard formats: {0}", String.Join(",", formats)); + Log.DebugFormat("Got clipboard formats: {0}", string.Join(",", formats)); return new List(formats); } return new List(); @@ -784,7 +795,7 @@ EndSelection:<<<<<<<4 /// /// Type to get /// object from clipboard - public static Object GetClipboardData(Type type) { + public static object GetClipboardData(Type type) { string format = type.FullName; return GetClipboardData(format); } @@ -795,7 +806,7 @@ EndSelection:<<<<<<<4 /// IDataObject /// Type to get /// object from IDataObject - public static Object GetFromDataObject(IDataObject dataObj, Type type) { + public static object GetFromDataObject(IDataObject dataObj, Type type) { if (type != null) { return GetFromDataObject(dataObj, type.FullName); } @@ -820,7 +831,7 @@ EndSelection:<<<<<<<4 } } } catch (Exception ex) { - LOG.Warn("Ignoring an issue with getting the dropFilenames from the clipboard: ", ex); + Log.Warn("Ignoring an issue with getting the dropFilenames from the clipboard: ", ex); } return filenames; } @@ -831,12 +842,12 @@ EndSelection:<<<<<<<4 /// IDataObject /// format to get /// object from IDataObject - public static Object GetFromDataObject(IDataObject dataObj, string format) { + public static object GetFromDataObject(IDataObject dataObj, string format) { if (dataObj != null) { try { return dataObj.GetData(format); } catch (Exception e) { - LOG.Error("Error in GetClipboardData.", e); + Log.Error("Error in GetClipboardData.", e); } } return null; @@ -847,7 +858,7 @@ EndSelection:<<<<<<<4 /// /// format to get /// object from clipboard - public static Object GetClipboardData(string format) { + public static object GetClipboardData(string format) { return GetFromDataObject(GetDataObject(), format); } } diff --git a/GreenshotPlugin/Core/Func.cs b/GreenshotPlugin/Core/Func.cs new file mode 100644 index 000000000..9c15475ca --- /dev/null +++ b/GreenshotPlugin/Core/Func.cs @@ -0,0 +1,29 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotPlugin.Core +{ + public delegate TResult Func(); + public delegate TResult Func(T arg); + public delegate TResult Func(T1 arg1, T2 arg2); + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3); + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4); +} diff --git a/GreenshotPlugin/Core/IImage.cs b/GreenshotPlugin/Core/IImage.cs new file mode 100644 index 000000000..ee5c9f367 --- /dev/null +++ b/GreenshotPlugin/Core/IImage.cs @@ -0,0 +1,68 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; + +namespace GreenshotPlugin.Core +{ + /// + /// The image interface, this abstracts an image + /// + public interface IImage : IDisposable + { + /// + /// Height of the image, can be set to change + /// + int Height { get; set; } + + /// + /// Width of the image, can be set to change. + /// + int Width { get; set; } + + /// + /// Size of the image + /// + Size Size { get; } + + /// + /// Pixelformat of the underlying image + /// + PixelFormat PixelFormat { get; } + + /// + /// Vertical resolution of the underlying image + /// + float VerticalResolution { get; } + + /// + /// Horizontal resolution of the underlying image + /// + float HorizontalResolution { get; } + + /// + /// Unterlying image, or an on demand rendered version with different attributes as the original + /// + Image Image { get; } + } +} diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 2918a6f4b..9473464f8 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -18,6 +18,7 @@ * 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; @@ -27,6 +28,7 @@ using System.IO; using Greenshot.IniFile; using GreenshotPlugin.UnmanagedHelpers; using Greenshot.Core; +using Greenshot.Plugin; using log4net; namespace GreenshotPlugin.Core { @@ -46,30 +48,109 @@ namespace GreenshotPlugin.Core { /// Description of ImageHelper. /// public static class ImageHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageHelper)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); - private const int EXIF_ORIENTATION_ID = 0x0112; + private static readonly ILog Log = LogManager.GetLogger(typeof(ImageHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private const int ExifOrientationId = 0x0112; + + /// + /// This is a factory method to create a surface, set from the Greenshot main project + /// + public static Func SurfaceFactory { get; set; } + + static ImageHelper() + { + StreamConverters["greenshot"] = (stream, s) => + { + var surface = SurfaceFactory(); + return surface.GetImageForExport(); + }; + + Func defaultConverter = (stream, s) => + { + stream.Position = 0; + using (var tmpImage = Image.FromStream(stream, true, true)) + { + Log.DebugFormat("Loaded bitmap with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); + return Clone(tmpImage, PixelFormat.Format32bppArgb); + } + }; + + // Fallback + StreamConverters[""] = defaultConverter; + StreamConverters["gif"] = defaultConverter; + StreamConverters["bmp"] = defaultConverter; + StreamConverters["jpg"] = defaultConverter; + StreamConverters["jpeg"] = defaultConverter; + StreamConverters["png"] = defaultConverter; + StreamConverters["wmf"] = defaultConverter; + + StreamConverters["ico"] = (stream, extension) => + { + // Icon logic, try to get the Vista icon, else the biggest possible + try + { + using (Image tmpImage = ExtractVistaIcon(stream)) + { + if (tmpImage != null) + { + return Clone(tmpImage, PixelFormat.Format32bppArgb); + } + } + } + catch (Exception vistaIconException) + { + Log.Warn("Can't read icon", vistaIconException); + } + try + { + // No vista icon, try normal icon + stream.Position = 0; + // We create a copy of the bitmap, so everything else can be disposed + using (Icon tmpIcon = new Icon(stream, new Size(1024, 1024))) + { + using (Image tmpImage = tmpIcon.ToBitmap()) + { + return Clone(tmpImage, PixelFormat.Format32bppArgb); + } + } + } + catch (Exception iconException) + { + Log.Warn("Can't read icon", iconException); + } + + stream.Position = 0; + return defaultConverter(stream, extension); + }; + } + + public static IDictionary> StreamConverters { get; } = new Dictionary>(); /// /// Make sure the image is orientated correctly /// /// - public static void Orientate(Image image) { - if (!conf.ProcessEXIFOrientation) { + public static void Orientate(Image image) + { + if (!CoreConfig.ProcessEXIFOrientation) + { return; } - try { + try + { // Get the index of the orientation property. - int orientationIndex = Array.IndexOf(image.PropertyIdList, EXIF_ORIENTATION_ID); + int orientationIndex = Array.IndexOf(image.PropertyIdList, ExifOrientationId); // If there is no such property, return Unknown. - if (orientationIndex < 0) { + if (orientationIndex < 0) + { return; } - PropertyItem item = image.GetPropertyItem(EXIF_ORIENTATION_ID); + PropertyItem item = image.GetPropertyItem(ExifOrientationId); ExifOrientations orientation = (ExifOrientations)item.Value[0]; // Orient the image. - switch (orientation) { + switch (orientation) + { case ExifOrientations.Unknown: case ExifOrientations.TopLeft: break; @@ -98,20 +179,11 @@ namespace GreenshotPlugin.Core { // Set the orientation to be normal, as we rotated the image. item.Value[0] = (byte)ExifOrientations.TopLeft; image.SetPropertyItem(item); - } catch (Exception orientEx) { - LOG.Warn("Problem orientating the image: ", orientEx); } - } - - /// - /// Create a thumbnail from an image - /// - /// - /// - /// - /// - public static Image CreateThumbnail(Image image, int thumbWidth, int thumbHeight) { - return CreateThumbnail(image, thumbWidth, thumbHeight, -1, -1); + catch (Exception orientEx) + { + Log.Warn("Problem orientating the image: ", orientEx); + } } /// @@ -123,53 +195,61 @@ namespace GreenshotPlugin.Core { /// /// /// - public static Image CreateThumbnail(Image image, int thumbWidth, int thumbHeight, int maxWidth, int maxHeight) { - int srcWidth=image.Width; - int srcHeight=image.Height; - if (thumbHeight < 0) { + public static Image CreateThumbnail(Image image, int thumbWidth, int thumbHeight, int maxWidth = -1, int maxHeight = -1) + { + int srcWidth = image.Width; + int srcHeight = image.Height; + if (thumbHeight < 0) + { thumbHeight = (int)(thumbWidth * (srcHeight / (float)srcWidth)); } - if (thumbWidth < 0) { + if (thumbWidth < 0) + { thumbWidth = (int)(thumbHeight * (srcWidth / (float)srcHeight)); } - if (maxWidth > 0 && thumbWidth > maxWidth) { + if (maxWidth > 0 && thumbWidth > maxWidth) + { thumbWidth = Math.Min(thumbWidth, maxWidth); thumbHeight = (int)(thumbWidth * (srcHeight / (float)srcWidth)); } - if (maxHeight > 0 && thumbHeight > maxHeight) { + if (maxHeight > 0 && thumbHeight > maxHeight) + { thumbHeight = Math.Min(thumbHeight, maxHeight); thumbWidth = (int)(thumbHeight * (srcWidth / (float)srcHeight)); } Bitmap bmp = new Bitmap(thumbWidth, thumbHeight); - using (Graphics graphics = Graphics.FromImage(bmp)) { + using (Graphics graphics = Graphics.FromImage(bmp)) + { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; Rectangle rectDestination = new Rectangle(0, 0, thumbWidth, thumbHeight); - graphics.DrawImage(image, rectDestination, 0, 0, srcWidth, srcHeight, GraphicsUnit.Pixel); + graphics.DrawImage(image, rectDestination, 0, 0, srcWidth, srcHeight, GraphicsUnit.Pixel); } return bmp; } - + /// /// Crops the image to the specified rectangle /// /// Image to crop /// Rectangle with bitmap coordinates, will be "intersected" to the bitmap - public static bool Crop(ref Image image, ref Rectangle cropRectangle) { - Image returnImage = null; - if (image != null && image is Bitmap && ((image.Width * image.Height) > 0)) { - cropRectangle.Intersect(new Rectangle(0,0, image.Width, image.Height)); - if (cropRectangle.Width != 0 || cropRectangle.Height != 0) { - returnImage = CloneArea(image, cropRectangle, PixelFormat.DontCare); + public static bool Crop(ref Image image, ref Rectangle cropRectangle) + { + if (image is Bitmap && (image.Width * image.Height > 0)) + { + cropRectangle.Intersect(new Rectangle(0, 0, image.Width, image.Height)); + if (cropRectangle.Width != 0 || cropRectangle.Height != 0) + { + Image returnImage = CloneArea(image, cropRectangle, PixelFormat.DontCare); image.Dispose(); image = returnImage; return true; } } - LOG.Warn("Can't crop a null/zero size image!"); + Log.Warn("Can't crop a null/zero size image!"); return false; } @@ -180,20 +260,25 @@ namespace GreenshotPlugin.Core { /// /// /// Rectangle - private static Rectangle FindAutoCropRectangle(IFastBitmap fastBitmap, Point colorPoint, int cropDifference) { + private static Rectangle FindAutoCropRectangle(IFastBitmap fastBitmap, Point colorPoint, int cropDifference) + { Rectangle cropRectangle = Rectangle.Empty; Color referenceColor = fastBitmap.GetColorAt(colorPoint.X, colorPoint.Y); Point min = new Point(int.MaxValue, int.MaxValue); Point max = new Point(int.MinValue, int.MinValue); - if (cropDifference > 0) { - for (int y = 0; y < fastBitmap.Height; y++) { - for (int x = 0; x < fastBitmap.Width; x++) { + if (cropDifference > 0) + { + for (int y = 0; y < fastBitmap.Height; y++) + { + for (int x = 0; x < fastBitmap.Width; x++) + { Color currentColor = fastBitmap.GetColorAt(x, y); int diffR = Math.Abs(currentColor.R - referenceColor.R); int diffG = Math.Abs(currentColor.G - referenceColor.G); int diffB = Math.Abs(currentColor.B - referenceColor.B); - if (((diffR + diffG + diffB)/3) <= cropDifference) { + if ((diffR + diffG + diffB) / 3 <= cropDifference) + { continue; } if (x < min.X) min.X = x; @@ -202,11 +287,16 @@ namespace GreenshotPlugin.Core { if (y > max.Y) max.Y = y; } } - } else { - for (int y = 0; y < fastBitmap.Height; y++) { - for (int x = 0; x < fastBitmap.Width; x++) { + } + else + { + for (int y = 0; y < fastBitmap.Height; y++) + { + for (int x = 0; x < fastBitmap.Width; x++) + { Color currentColor = fastBitmap.GetColorAt(x, y); - if (!referenceColor.Equals(currentColor)) { + if (!referenceColor.Equals(currentColor)) + { continue; } if (x < min.X) min.X = x; @@ -217,8 +307,10 @@ namespace GreenshotPlugin.Core { } } - if (!(Point.Empty.Equals(min) && max.Equals(new Point(fastBitmap.Width - 1, fastBitmap.Height - 1)))) { - if (!(min.X == int.MaxValue || min.Y == int.MaxValue || max.X == int.MinValue || min.X == int.MinValue)) { + if (!(Point.Empty.Equals(min) && max.Equals(new Point(fastBitmap.Width - 1, fastBitmap.Height - 1)))) + { + if (!(min.X == int.MaxValue || min.Y == int.MaxValue || max.X == int.MinValue || min.X == int.MinValue)) + { cropRectangle = new Rectangle(min.X, min.Y, max.X - min.X + 1, max.Y - min.Y + 1); } } @@ -231,89 +323,61 @@ namespace GreenshotPlugin.Core { /// /// /// Rectangle - public static Rectangle FindAutoCropRectangle(Image image, int cropDifference) { + public static Rectangle FindAutoCropRectangle(Image image, int cropDifference) + { Rectangle cropRectangle = Rectangle.Empty; - Rectangle currentRectangle; - List checkPoints = new List(); + var checkPoints = new List + { + new Point(0, 0), + new Point(0, image.Height - 1), + new Point(image.Width - 1, 0), + new Point(image.Width - 1, image.Height - 1) + }; // Top Left - checkPoints.Add(new Point(0, 0)); // Bottom Left - checkPoints.Add(new Point(0, image.Height - 1)); // Top Right - checkPoints.Add(new Point(image.Width - 1, 0)); // Bottom Right - checkPoints.Add(new Point(image.Width - 1, image.Height - 1)); - using (IFastBitmap fastBitmap = FastBitmap.Create((Bitmap)image)) { + using (IFastBitmap fastBitmap = FastBitmap.Create((Bitmap)image)) + { // find biggest area - foreach(Point checkPoint in checkPoints) { - currentRectangle = FindAutoCropRectangle(fastBitmap, checkPoint, cropDifference); - if (currentRectangle.Width * currentRectangle.Height > cropRectangle.Width * cropRectangle.Height) { + foreach (Point checkPoint in checkPoints) + { + var currentRectangle = FindAutoCropRectangle(fastBitmap, checkPoint, cropDifference); + if (currentRectangle.Width * currentRectangle.Height > cropRectangle.Width * cropRectangle.Height) + { cropRectangle = currentRectangle; } } } return cropRectangle; } - + /// /// Load an image from file /// /// /// - public static Image LoadImage(string filename) { - if (string.IsNullOrEmpty(filename)) { + public static Image LoadImage(string filename) + { + if (string.IsNullOrEmpty(filename)) + { return null; } - if (!File.Exists(filename)) { + if (!File.Exists(filename)) + { return null; } - Image fileImage = null; - LOG.InfoFormat("Loading image from file {0}", filename); + Image fileImage; + Log.InfoFormat("Loading image from file {0}", filename); // Fixed lock problem Bug #3431881 - using (Stream imageFileStream = File.OpenRead(filename)) { - // And fixed problem that the bitmap stream is disposed... by Cloning the image - // This also ensures the bitmap is correctly created - - if (filename.EndsWith(".ico")) { - // Icon logic, try to get the Vista icon, else the biggest possible - try { - using (Image tmpImage = ExtractVistaIcon(imageFileStream)) { - if (tmpImage != null) { - fileImage = Clone(tmpImage); - } - } - } catch (Exception vistaIconException) { - LOG.Warn("Can't read icon from " + filename, vistaIconException); - } - if (fileImage == null) { - try { - // No vista icon, try normal icon - imageFileStream.Position = 0; - // We create a copy of the bitmap, so everything else can be disposed - using (Icon tmpIcon = new Icon(imageFileStream, new Size(1024,1024))) { - using (Image tmpImage = tmpIcon.ToBitmap()) { - fileImage = Clone(tmpImage); - } - } - } catch (Exception iconException) { - LOG.Warn("Can't read icon from " + filename, iconException); - } - } - } - if (fileImage == null) { - // We create a copy of the bitmap, so everything else can be disposed - imageFileStream.Position = 0; - using (Image tmpImage = Image.FromStream(imageFileStream, true, true)) { - LOG.DebugFormat("Loaded {0} with Size {1}x{2} and PixelFormat {3}", filename, tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); - fileImage = Clone(tmpImage); - } - } + using (Stream imageFileStream = File.OpenRead(filename)) + { + fileImage = FromStream(imageFileStream); } - if (fileImage != null) { - LOG.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", filename, fileImage.Width, fileImage.Height, fileImage.PixelFormat, fileImage.HorizontalResolution, fileImage.VerticalResolution); + if (fileImage != null) + { + Log.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", filename, fileImage.Width, fileImage.Height, fileImage.PixelFormat, fileImage.HorizontalResolution, fileImage.VerticalResolution); } - // Make sure the orientation is set correctly so Greenshot can process the image correctly - Orientate(fileImage); return fileImage; } @@ -324,22 +388,26 @@ namespace GreenshotPlugin.Core { /// /// Stream with the icon information /// Bitmap with the Vista Icon (256x256) - private static Bitmap ExtractVistaIcon(Stream iconStream) { - const int SizeICONDIR = 6; - const int SizeICONDIRENTRY = 16; + private static Bitmap ExtractVistaIcon(Stream iconStream) + { + const int sizeIconDir = 6; + const int sizeIconDirEntry = 16; Bitmap bmpPngExtracted = null; - try { + try + { byte[] srcBuf = new byte[iconStream.Length]; iconStream.Read(srcBuf, 0, (int)iconStream.Length); int iCount = BitConverter.ToInt16(srcBuf, 4); - for (int iIndex=0; iIndexIndex of the icon /// true if the large icon is wanted /// Icon - public static Icon ExtractAssociatedIcon(string location, int index, bool takeLarge) { + public static Icon ExtractAssociatedIcon(string location, int index, bool takeLarge) + { IntPtr large; IntPtr small; Shell32.ExtractIconEx(location, index, out large, out small, 1); Icon returnIcon = null; bool isLarge = false; bool isSmall = false; - try { - if (takeLarge && !IntPtr.Zero.Equals(large)) { + try + { + if (takeLarge && !IntPtr.Zero.Equals(large)) + { returnIcon = Icon.FromHandle(large); isLarge = true; - } else if (!IntPtr.Zero.Equals(small)) { + } + else if (!IntPtr.Zero.Equals(small)) + { returnIcon = Icon.FromHandle(small); isSmall = true; - } else if (!IntPtr.Zero.Equals(large)) { + } + else if (!IntPtr.Zero.Equals(large)) + { returnIcon = Icon.FromHandle(large); isLarge = true; } - } finally { - if (isLarge && !IntPtr.Zero.Equals(small)) { + } + finally + { + if (isLarge && !IntPtr.Zero.Equals(small)) + { User32.DestroyIcon(small); } - if (isSmall && !IntPtr.Zero.Equals(large)) { + if (isSmall && !IntPtr.Zero.Equals(large)) + { User32.DestroyIcon(large); } } @@ -394,7 +475,8 @@ namespace GreenshotPlugin.Core { /// /// Location of the EXE or DLL /// - public static int CountAssociatedIcons(string location) { + public static int CountAssociatedIcons(string location) + { IntPtr large; IntPtr small; return Shell32.ExtractIconEx(location, -1, out large, out small, 0); @@ -407,8 +489,9 @@ namespace GreenshotPlugin.Core { /// IEffect /// /// Bitmap - public static Image ApplyEffect(Image sourceImage, IEffect effect, Matrix matrix) { - List effects = new List {effect}; + public static Image ApplyEffect(Image sourceImage, IEffect effect, Matrix matrix) + { + List effects = new List { effect }; return ApplyEffects(sourceImage, effects, matrix); } @@ -419,13 +502,17 @@ namespace GreenshotPlugin.Core { /// List of IEffect /// /// Bitmap - public static Image ApplyEffects(Image sourceImage, List effects, Matrix matrix) { + public static Image ApplyEffects(Image sourceImage, List effects, Matrix matrix) + { Image currentImage = sourceImage; bool disposeImage = false; - foreach (IEffect effect in effects) { + foreach (IEffect effect in effects) + { Image tmpImage = effect.Apply(currentImage, matrix); - if (tmpImage != null) { - if (disposeImage) { + if (tmpImage != null) + { + if (disposeImage) + { currentImage.Dispose(); } currentImage = tmpImage; @@ -442,10 +529,12 @@ namespace GreenshotPlugin.Core { /// /// Path to draw to /// Points for the lines to draw - private static void DrawLines(GraphicsPath path, List points) { + private static void DrawLines(GraphicsPath path, List points) + { path.AddLine(points[0], points[1]); - for (int i = 0; i < points.Count-1; i++) { - path.AddLine(points[i], points[i+1]); + for (int i = 0; i < points.Count - 1; i++) + { + path.AddLine(points[i], points[i + 1]); } } @@ -458,9 +547,11 @@ namespace GreenshotPlugin.Core { /// How wide is a vertical tooth /// bool[] with information on if the edge needs torn or not. Order is clockwise: 0=top,1=right,2=bottom,3=left /// Changed bitmap - public static Image CreateTornEdge(Image sourceImage, int toothHeight, int horizontalToothRange, int verticalToothRange, bool[] edges) { + public static Image CreateTornEdge(Image sourceImage, int toothHeight, int horizontalToothRange, int verticalToothRange, bool[] edges) + { Image returnImage = CreateEmpty(sourceImage.Width, sourceImage.Height, PixelFormat.Format32bppArgb, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - using (GraphicsPath path = new GraphicsPath()) { + using (GraphicsPath path = new GraphicsPath()) + { Random random = new Random(); int horizontalRegions = (int)Math.Round((float)sourceImage.Width / horizontalToothRange); int verticalRegions = (int)Math.Round((float)sourceImage.Height / verticalToothRange); @@ -472,53 +563,72 @@ namespace GreenshotPlugin.Core { List points = new List(); - if (edges[0]) { + if (edges[0]) + { // calculate starting point only if the left edge is torn - if (!edges[3]) { + if (!edges[3]) + { points.Add(topLeft); - } else { + } + else + { points.Add(new Point(random.Next(1, toothHeight), random.Next(1, toothHeight))); } - for (int i = 1; i < horizontalRegions-1; i++) { - points.Add(new Point(i*horizontalToothRange, random.Next(1, toothHeight))); + for (int i = 1; i < horizontalRegions - 1; i++) + { + points.Add(new Point(i * horizontalToothRange, random.Next(1, toothHeight))); } points.Add(new Point(sourceImage.Width - random.Next(1, toothHeight), random.Next(1, toothHeight))); - } else { + } + else + { // set start & endpoint to be the default "whole-line" points.Add(topLeft); points.Add(topRight); } // Right - if (edges[1]) { - for (int i = 1; i < verticalRegions-1; i++) { + if (edges[1]) + { + for (int i = 1; i < verticalRegions - 1; i++) + { points.Add(new Point(sourceImage.Width - random.Next(1, toothHeight), i * verticalToothRange)); } points.Add(new Point(sourceImage.Width - random.Next(1, toothHeight), sourceImage.Height - random.Next(1, toothHeight))); - } else { + } + else + { // correct previous ending point points[points.Count - 1] = topRight; // set endpoint to be the default "whole-line" points.Add(bottomRight); } // Bottom - if (edges[2]) { - for (int i = 1; i < horizontalRegions -1; i++) { + if (edges[2]) + { + for (int i = 1; i < horizontalRegions - 1; i++) + { points.Add(new Point(sourceImage.Width - i * horizontalToothRange, sourceImage.Height - random.Next(1, toothHeight))); } points.Add(new Point(random.Next(1, toothHeight), sourceImage.Height - random.Next(1, toothHeight))); - } else { + } + else + { // correct previous ending point points[points.Count - 1] = bottomRight; // set endpoint to be the default "whole-line" points.Add(bottomLeft); } // Left - if (edges[3]) { + if (edges[3]) + { // One fewer as the end point is the starting point - for (int i = 1; i < verticalRegions -1; i++) { + for (int i = 1; i < verticalRegions - 1; i++) + { points.Add(new Point(random.Next(1, toothHeight), points[points.Count - 1].Y - verticalToothRange)); } - } else { + } + else + { // correct previous ending point points[points.Count - 1] = bottomLeft; // set endpoint to be the default "whole-line" @@ -532,12 +642,14 @@ namespace GreenshotPlugin.Core { path.CloseFigure(); // Draw the created figure with the original image by using a TextureBrush so we have anti-aliasing - using (Graphics graphics = Graphics.FromImage(returnImage)) { + using (Graphics graphics = Graphics.FromImage(returnImage)) + { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - using (Brush brush = new TextureBrush(sourceImage)) { + using (Brush brush = new TextureBrush(sourceImage)) + { // Important note: If the target wouldn't be at 0,0 we need to translate-transform!! graphics.FillPath(brush, path); } @@ -551,9 +663,11 @@ namespace GreenshotPlugin.Core { /// /// Bitmap to blur /// Must be ODD! - public static void ApplyBoxBlur(Bitmap destinationBitmap, int range) { + public static void ApplyBoxBlur(Bitmap destinationBitmap, int range) + { // We only need one fastbitmap as we use it as source and target (the reading is done for one line H/V, writing after "parsing" one line H/V) - using (IFastBitmap fastBitmap = FastBitmap.Create(destinationBitmap)) { + using (IFastBitmap fastBitmap = FastBitmap.Create(destinationBitmap)) + { ApplyBoxBlur(fastBitmap, range); } } @@ -563,24 +677,30 @@ namespace GreenshotPlugin.Core { /// /// IFastBitmap to blur /// Must be ODD! - public static void ApplyBoxBlur(IFastBitmap fastBitmap, int range) { + public static void ApplyBoxBlur(IFastBitmap fastBitmap, int range) + { // Range must be odd! - if ((range & 1) == 0) { + if ((range & 1) == 0) + { range++; } - if (range <= 1) { + if (range <= 1) + { return; } // Box blurs are frequently used to approximate a Gaussian blur. // By the central limit theorem, if applied 3 times on the same image, a box blur approximates the Gaussian kernel to within about 3%, yielding the same result as a quadratic convolution kernel. // This might be true, but the GDI+ BlurEffect doesn't look the same, a 2x blur is more simular and we only make 2x Box-Blur. // (Might also be a mistake in our blur, but for now it looks great) - if (fastBitmap.HasAlphaChannel) { + if (fastBitmap.HasAlphaChannel) + { BoxBlurHorizontalAlpha(fastBitmap, range); BoxBlurVerticalAlpha(fastBitmap, range); BoxBlurHorizontalAlpha(fastBitmap, range); BoxBlurVerticalAlpha(fastBitmap, range); - } else { + } + else + { BoxBlurHorizontal(fastBitmap, range); BoxBlurVertical(fastBitmap, range); BoxBlurHorizontal(fastBitmap, range); @@ -593,21 +713,26 @@ namespace GreenshotPlugin.Core { /// /// Target BitmapBuffer /// Range must be odd! - private static void BoxBlurHorizontal(IFastBitmap targetFastBitmap, int range) { - if (targetFastBitmap.HasAlphaChannel) { + private static void BoxBlurHorizontal(IFastBitmap targetFastBitmap, int range) + { + if (targetFastBitmap.HasAlphaChannel) + { throw new NotSupportedException("BoxBlurHorizontal should NOT be called for bitmaps with alpha channel"); } int halfRange = range / 2; Color[] newColors = new Color[targetFastBitmap.Width]; byte[] tmpColor = new byte[3]; - for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) { + for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) + { int hits = 0; int r = 0; int g = 0; int b = 0; - for (int x = targetFastBitmap.Left - halfRange; x < targetFastBitmap.Right; x++) { + for (int x = targetFastBitmap.Left - halfRange; x < targetFastBitmap.Right; x++) + { int oldPixel = x - halfRange - 1; - if (oldPixel >= targetFastBitmap.Left) { + if (oldPixel >= targetFastBitmap.Left) + { targetFastBitmap.GetColorAt(oldPixel, y, tmpColor); r -= tmpColor[FastBitmap.ColorIndexR]; g -= tmpColor[FastBitmap.ColorIndexG]; @@ -616,7 +741,8 @@ namespace GreenshotPlugin.Core { } int newPixel = x + halfRange; - if (newPixel < targetFastBitmap.Right) { + if (newPixel < targetFastBitmap.Right) + { targetFastBitmap.GetColorAt(newPixel, y, tmpColor); r += tmpColor[FastBitmap.ColorIndexR]; g += tmpColor[FastBitmap.ColorIndexG]; @@ -624,11 +750,13 @@ namespace GreenshotPlugin.Core { hits++; } - if (x >= targetFastBitmap.Left) { + if (x >= targetFastBitmap.Left) + { newColors[x - targetFastBitmap.Left] = Color.FromArgb(255, (byte)(r / hits), (byte)(g / hits), (byte)(b / hits)); } } - for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) { + for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) + { targetFastBitmap.SetColorAt(x, y, newColors[x - targetFastBitmap.Left]); } } @@ -638,22 +766,27 @@ namespace GreenshotPlugin.Core { /// /// Target BitmapBuffer /// Range must be odd! - private static void BoxBlurHorizontalAlpha(IFastBitmap targetFastBitmap, int range) { - if (!targetFastBitmap.HasAlphaChannel) { + private static void BoxBlurHorizontalAlpha(IFastBitmap targetFastBitmap, int range) + { + if (!targetFastBitmap.HasAlphaChannel) + { throw new NotSupportedException("BoxBlurHorizontalAlpha should be called for bitmaps with alpha channel"); } int halfRange = range / 2; Color[] newColors = new Color[targetFastBitmap.Width]; byte[] tmpColor = new byte[4]; - for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) { + for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) + { int hits = 0; int a = 0; int r = 0; int g = 0; int b = 0; - for (int x = targetFastBitmap.Left - halfRange; x < targetFastBitmap.Right; x++) { + for (int x = targetFastBitmap.Left - halfRange; x < targetFastBitmap.Right; x++) + { int oldPixel = x - halfRange - 1; - if (oldPixel >= targetFastBitmap.Left) { + if (oldPixel >= targetFastBitmap.Left) + { targetFastBitmap.GetColorAt(oldPixel, y, tmpColor); a -= tmpColor[FastBitmap.ColorIndexA]; r -= tmpColor[FastBitmap.ColorIndexR]; @@ -663,7 +796,8 @@ namespace GreenshotPlugin.Core { } int newPixel = x + halfRange; - if (newPixel < targetFastBitmap.Right) { + if (newPixel < targetFastBitmap.Right) + { targetFastBitmap.GetColorAt(newPixel, y, tmpColor); a += tmpColor[FastBitmap.ColorIndexA]; r += tmpColor[FastBitmap.ColorIndexR]; @@ -672,11 +806,13 @@ namespace GreenshotPlugin.Core { hits++; } - if (x >= targetFastBitmap.Left) { + if (x >= targetFastBitmap.Left) + { newColors[x - targetFastBitmap.Left] = Color.FromArgb((byte)(a / hits), (byte)(r / hits), (byte)(g / hits), (byte)(b / hits)); } } - for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) { + for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) + { targetFastBitmap.SetColorAt(x, y, newColors[x - targetFastBitmap.Left]); } } @@ -687,21 +823,26 @@ namespace GreenshotPlugin.Core { /// /// BitmapBuffer which previously was created with BoxBlurHorizontal /// Range must be odd! - private static void BoxBlurVertical(IFastBitmap targetFastBitmap, int range) { - if (targetFastBitmap.HasAlphaChannel) { + private static void BoxBlurVertical(IFastBitmap targetFastBitmap, int range) + { + if (targetFastBitmap.HasAlphaChannel) + { throw new NotSupportedException("BoxBlurVertical should NOT be called for bitmaps with alpha channel"); } int halfRange = range / 2; Color[] newColors = new Color[targetFastBitmap.Height]; byte[] tmpColor = new byte[4]; - for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) { + for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) + { int hits = 0; int r = 0; int g = 0; int b = 0; - for (int y = targetFastBitmap.Top - halfRange; y < targetFastBitmap.Bottom; y++) { + for (int y = targetFastBitmap.Top - halfRange; y < targetFastBitmap.Bottom; y++) + { int oldPixel = y - halfRange - 1; - if (oldPixel >= targetFastBitmap.Top) { + if (oldPixel >= targetFastBitmap.Top) + { targetFastBitmap.GetColorAt(x, oldPixel, tmpColor); r -= tmpColor[FastBitmap.ColorIndexR]; g -= tmpColor[FastBitmap.ColorIndexG]; @@ -710,7 +851,8 @@ namespace GreenshotPlugin.Core { } int newPixel = y + halfRange; - if (newPixel < targetFastBitmap.Bottom) { + if (newPixel < targetFastBitmap.Bottom) + { targetFastBitmap.GetColorAt(x, newPixel, tmpColor); r += tmpColor[FastBitmap.ColorIndexR]; g += tmpColor[FastBitmap.ColorIndexG]; @@ -718,12 +860,14 @@ namespace GreenshotPlugin.Core { hits++; } - if (y >= targetFastBitmap.Top) { + if (y >= targetFastBitmap.Top) + { newColors[y - targetFastBitmap.Top] = Color.FromArgb(255, (byte)(r / hits), (byte)(g / hits), (byte)(b / hits)); } } - for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) { + for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) + { targetFastBitmap.SetColorAt(x, y, newColors[y - targetFastBitmap.Top]); } } @@ -734,23 +878,28 @@ namespace GreenshotPlugin.Core { /// /// BitmapBuffer which previously was created with BoxBlurHorizontal /// Range must be odd! - private static void BoxBlurVerticalAlpha(IFastBitmap targetFastBitmap, int range) { - if (!targetFastBitmap.HasAlphaChannel) { + private static void BoxBlurVerticalAlpha(IFastBitmap targetFastBitmap, int range) + { + if (!targetFastBitmap.HasAlphaChannel) + { throw new NotSupportedException("BoxBlurVerticalAlpha should be called for bitmaps with alpha channel"); } int halfRange = range / 2; Color[] newColors = new Color[targetFastBitmap.Height]; byte[] tmpColor = new byte[4]; - for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) { + for (int x = targetFastBitmap.Left; x < targetFastBitmap.Right; x++) + { int hits = 0; int a = 0; int r = 0; int g = 0; int b = 0; - for (int y = targetFastBitmap.Top - halfRange; y < targetFastBitmap.Bottom; y++) { + for (int y = targetFastBitmap.Top - halfRange; y < targetFastBitmap.Bottom; y++) + { int oldPixel = y - halfRange - 1; - if (oldPixel >= targetFastBitmap.Top) { + if (oldPixel >= targetFastBitmap.Top) + { targetFastBitmap.GetColorAt(x, oldPixel, tmpColor); a -= tmpColor[FastBitmap.ColorIndexA]; r -= tmpColor[FastBitmap.ColorIndexR]; @@ -760,7 +909,8 @@ namespace GreenshotPlugin.Core { } int newPixel = y + halfRange; - if (newPixel < targetFastBitmap.Bottom) { + if (newPixel < targetFastBitmap.Bottom) + { //int colorg = pixels[index + newPixelOffset]; targetFastBitmap.GetColorAt(x, newPixel, tmpColor); a += tmpColor[FastBitmap.ColorIndexA]; @@ -770,12 +920,14 @@ namespace GreenshotPlugin.Core { hits++; } - if (y >= targetFastBitmap.Top) { + if (y >= targetFastBitmap.Top) + { newColors[y - targetFastBitmap.Top] = Color.FromArgb((byte)(a / hits), (byte)(r / hits), (byte)(g / hits), (byte)(b / hits)); } } - for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) { + for (int y = targetFastBitmap.Top; y < targetFastBitmap.Bottom; y++) + { targetFastBitmap.SetColorAt(x, y, newColors[y - targetFastBitmap.Top]); } } @@ -790,11 +942,15 @@ namespace GreenshotPlugin.Core { /// /// /// - public static Rectangle CreateIntersectRectangle(Size applySize, Rectangle rect, bool invert) { + public static Rectangle CreateIntersectRectangle(Size applySize, Rectangle rect, bool invert) + { Rectangle myRect; - if (invert) { + if (invert) + { myRect = new Rectangle(0, 0, applySize.Width, applySize.Height); - } else { + } + 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); @@ -812,51 +968,63 @@ namespace GreenshotPlugin.Core { /// /// The transform matrix which describes how the elements need to be transformed to stay at the same location /// Bitmap with the shadow, is bigger than the sourceBitmap!! - public static Bitmap CreateShadow(Image sourceBitmap, float darkness, int shadowSize, Point shadowOffset, Matrix matrix, PixelFormat targetPixelformat) { + public static Bitmap CreateShadow(Image sourceBitmap, float darkness, int shadowSize, Point shadowOffset, Matrix matrix, PixelFormat targetPixelformat) + { Point offset = shadowOffset; offset.X += shadowSize - 1; offset.Y += shadowSize - 1; matrix.Translate(offset.X, offset.Y, MatrixOrder.Append); // Create a new "clean" image - Bitmap returnImage = CreateEmpty(sourceBitmap.Width + (shadowSize * 2), sourceBitmap.Height + (shadowSize * 2), targetPixelformat, Color.Empty, sourceBitmap.HorizontalResolution, sourceBitmap.VerticalResolution); + Bitmap returnImage = CreateEmpty(sourceBitmap.Width + shadowSize * 2, sourceBitmap.Height + shadowSize * 2, targetPixelformat, Color.Empty, sourceBitmap.HorizontalResolution, sourceBitmap.VerticalResolution); // Make sure the shadow is odd, there is no reason for an even blur! - if ((shadowSize & 1) == 0) { + if ((shadowSize & 1) == 0) + { shadowSize++; } - bool useGDIBlur = GDIplus.IsBlurPossible(shadowSize); + bool useGdiBlur = GDIplus.IsBlurPossible(shadowSize); // Create "mask" for the shadow - ColorMatrix maskMatrix = new ColorMatrix(); - maskMatrix.Matrix00 = 0; - maskMatrix.Matrix11 = 0; - maskMatrix.Matrix22 = 0; - if (useGDIBlur) { + ColorMatrix maskMatrix = new ColorMatrix + { + Matrix00 = 0, + Matrix11 = 0, + Matrix22 = 0 + }; + if (useGdiBlur) + { maskMatrix.Matrix33 = darkness + 0.1f; - } else { + } + else + { maskMatrix.Matrix33 = darkness; } Rectangle shadowRectangle = new Rectangle(new Point(shadowSize, shadowSize), sourceBitmap.Size); ApplyColorMatrix((Bitmap)sourceBitmap, Rectangle.Empty, returnImage, shadowRectangle, maskMatrix); // blur "shadow", apply to whole new image - if (useGDIBlur) { + if (useGdiBlur) + { // Use GDI Blur Rectangle newImageRectangle = new Rectangle(0, 0, returnImage.Width, returnImage.Height); - GDIplus.ApplyBlur(returnImage, newImageRectangle, shadowSize+1, false); - } else { + GDIplus.ApplyBlur(returnImage, newImageRectangle, shadowSize + 1, false); + } + else + { // try normal software blur //returnImage = CreateBlur(returnImage, newImageRectangle, true, shadowSize, 1d, false, newImageRectangle); ApplyBoxBlur(returnImage, shadowSize); } // Draw the original image over the shadow - using (Graphics graphics = Graphics.FromImage(returnImage)) { + using (Graphics graphics = Graphics.FromImage(returnImage)) + { // Make sure we draw with the best quality! graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; // draw original with a TextureBrush so we have nice antialiasing! - using (Brush textureBrush = new TextureBrush(sourceBitmap, WrapMode.Clamp)) { + using (Brush textureBrush = new TextureBrush(sourceBitmap, WrapMode.Clamp)) + { // We need to do a translate-transform otherwise the image is wrapped graphics.TranslateTransform(offset.X, offset.Y); graphics.FillRectangle(textureBrush, 0, 0, sourceBitmap.Width, sourceBitmap.Height); @@ -870,14 +1038,15 @@ namespace GreenshotPlugin.Core { /// /// Bitmap to create a negative off /// Negative bitmap - public static Bitmap CreateNegative(Image sourceImage) { + public static Bitmap CreateNegative(Image sourceImage) + { Bitmap clone = (Bitmap)Clone(sourceImage); - ColorMatrix invertMatrix = new ColorMatrix(new[] { - new float[] {-1, 0, 0, 0, 0}, - new float[] {0, -1, 0, 0, 0}, - new float[] {0, 0, -1, 0, 0}, - new float[] {0, 0, 0, 1, 0}, - new float[] {1, 1, 1, 1, 1} + ColorMatrix invertMatrix = new ColorMatrix(new[] { + new float[] {-1, 0, 0, 0, 0}, + new float[] {0, -1, 0, 0, 0}, + new float[] {0, 0, -1, 0, 0}, + new float[] {0, 0, 0, 1, 0}, + new float[] {1, 1, 1, 1, 1} }); ApplyColorMatrix(clone, invertMatrix); return clone; @@ -887,7 +1056,8 @@ namespace GreenshotPlugin.Core { /// /// Image to apply matrix to /// ColorMatrix to apply - public static void ApplyColorMatrix(Bitmap source, ColorMatrix colorMatrix) { + public static void ApplyColorMatrix(Bitmap source, ColorMatrix colorMatrix) + { ApplyColorMatrix(source, Rectangle.Empty, source, Rectangle.Empty, colorMatrix); } @@ -899,20 +1069,23 @@ namespace GreenshotPlugin.Core { /// Rectangle to copy to /// Image to copy to /// ColorMatrix to apply - public static void ApplyColorMatrix(Bitmap source, Rectangle sourceRect, Bitmap dest, Rectangle destRect, ColorMatrix colorMatrix) { - using (ImageAttributes imageAttributes = new ImageAttributes()) { + public static void ApplyColorMatrix(Bitmap source, Rectangle sourceRect, Bitmap dest, Rectangle destRect, ColorMatrix colorMatrix) + { + using (ImageAttributes imageAttributes = new ImageAttributes()) + { imageAttributes.ClearColorMatrix(); imageAttributes.SetColorMatrix(colorMatrix); ApplyImageAttributes(source, sourceRect, dest, destRect, imageAttributes); } } - + /// /// Apply image attributes to the image /// /// Image to apply matrix to /// ImageAttributes to apply - public static void ApplyColorMatrix(Bitmap source, ImageAttributes imageAttributes) { + public static void ApplyColorMatrix(Bitmap source, ImageAttributes imageAttributes) + { ApplyImageAttributes(source, Rectangle.Empty, source, Rectangle.Empty, imageAttributes); } @@ -924,17 +1097,22 @@ namespace GreenshotPlugin.Core { /// Rectangle to copy to /// Image to copy to /// ImageAttributes to apply - public static void ApplyImageAttributes(Bitmap source, Rectangle sourceRect, Bitmap dest, Rectangle destRect, ImageAttributes imageAttributes) { - if (sourceRect == Rectangle.Empty) { + public static void ApplyImageAttributes(Bitmap source, Rectangle sourceRect, Bitmap dest, Rectangle destRect, ImageAttributes imageAttributes) + { + if (sourceRect == Rectangle.Empty) + { sourceRect = new Rectangle(0, 0, source.Width, source.Height); } - if (dest == null) { + if (dest == null) + { dest = source; } - if (destRect == Rectangle.Empty) { + if (destRect == Rectangle.Empty) + { destRect = new Rectangle(0, 0, dest.Width, dest.Height); } - using (Graphics graphics = Graphics.FromImage(dest)) { + using (Graphics graphics = Graphics.FromImage(dest)) + { // Make sure we draw with the best quality! graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; @@ -945,19 +1123,23 @@ namespace GreenshotPlugin.Core { graphics.DrawImage(source, destRect, sourceRect.X, sourceRect.Y, sourceRect.Width, sourceRect.Height, GraphicsUnit.Pixel, imageAttributes); } } - + /// /// Returns a b/w of Bitmap /// /// Bitmap to create a b/w of /// Threshold for monochrome filter (0 - 255), lower value means less black /// b/w bitmap - public static Bitmap CreateMonochrome(Image sourceImage, byte threshold) { - using (IFastBitmap fastBitmap = FastBitmap.CreateCloneOf(sourceImage, sourceImage.PixelFormat)) { - for (int y = 0; y < fastBitmap.Height; y++) { - for (int x = 0; x < fastBitmap.Width; x++) { + public static Bitmap CreateMonochrome(Image sourceImage, byte threshold) + { + using (IFastBitmap fastBitmap = FastBitmap.CreateCloneOf(sourceImage, sourceImage.PixelFormat)) + { + for (int y = 0; y < fastBitmap.Height; y++) + { + for (int x = 0; x < fastBitmap.Width; x++) + { Color color = fastBitmap.GetColorAt(x, y); - int colorBrightness = ((color.R + color.G + color.B) / 3 > threshold) ? 255 : 0; + int colorBrightness = (color.R + color.G + color.B) / 3 > threshold ? 255 : 0; Color monoColor = Color.FromArgb(color.A, colorBrightness, colorBrightness, colorBrightness); fastBitmap.SetColorAt(x, y, monoColor); } @@ -975,22 +1157,26 @@ namespace GreenshotPlugin.Core { /// What pixel format must the returning bitmap have /// The transform matrix which describes how the elements need to be transformed to stay at the same location /// Bitmap with the shadow, is bigger than the sourceBitmap!! - public static Image CreateBorder(Image sourceImage, int borderSize, Color borderColor, PixelFormat targetPixelformat, Matrix matrix) { + public static Image CreateBorder(Image sourceImage, int borderSize, Color borderColor, PixelFormat targetPixelformat, Matrix matrix) + { // "return" the shifted offset, so the caller can e.g. move elements Point offset = new Point(borderSize, borderSize); matrix.Translate(offset.X, offset.Y, MatrixOrder.Append); // Create a new "clean" image - Bitmap newImage = CreateEmpty(sourceImage.Width + (borderSize * 2), sourceImage.Height + (borderSize * 2), targetPixelformat, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - using (Graphics graphics = Graphics.FromImage(newImage)) { + Bitmap newImage = CreateEmpty(sourceImage.Width + borderSize * 2, sourceImage.Height + borderSize * 2, targetPixelformat, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); + using (Graphics graphics = Graphics.FromImage(newImage)) + { // Make sure we draw with the best quality! graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - using (GraphicsPath path = new GraphicsPath()) { - path.AddRectangle(new Rectangle(borderSize >> 1, borderSize >> 1, newImage.Width - (borderSize), newImage.Height - (borderSize))); - using (Pen pen = new Pen(borderColor, borderSize)) { + using (GraphicsPath path = new GraphicsPath()) + { + path.AddRectangle(new Rectangle(borderSize >> 1, borderSize >> 1, newImage.Width - borderSize, newImage.Height - borderSize)); + using (Pen pen = new Pen(borderColor, borderSize)) + { pen.LineJoin = LineJoin.Round; pen.StartCap = LineCap.Round; pen.EndCap = LineCap.Round; @@ -998,7 +1184,8 @@ namespace GreenshotPlugin.Core { } } // draw original with a TextureBrush so we have nice antialiasing! - using (Brush textureBrush = new TextureBrush(sourceImage, WrapMode.Clamp)) { + using (Brush textureBrush = new TextureBrush(sourceImage, WrapMode.Clamp)) + { // We need to do a translate-tranform otherwise the image is wrapped graphics.TranslateTransform(offset.X, offset.Y); graphics.FillRectangle(textureBrush, 0, 0, sourceImage.Width, sourceImage.Height); @@ -1014,7 +1201,8 @@ namespace GreenshotPlugin.Core { /// /// /// ImageAttributes - public static ImageAttributes CreateAdjustAttributes(float brightness, float contrast, float gamma) { + public static ImageAttributes CreateAdjustAttributes(float brightness, float contrast, float gamma) + { float adjustedBrightness = brightness - 1.0f; ColorMatrix applyColorMatrix = new ColorMatrix( new[] @@ -1043,12 +1231,14 @@ namespace GreenshotPlugin.Core { /// /// /// Bitmap with grayscale - public static Image Adjust(Image sourceImage, float brightness, float contrast, float gamma) { + public static Image Adjust(Image sourceImage, float brightness, float contrast, float gamma) + { //create a blank bitmap the same size as original // If using 8bpp than the following exception comes: A Graphics object cannot be created from an image that has an indexed pixel format. Bitmap newBitmap = CreateEmpty(sourceImage.Width, sourceImage.Height, PixelFormat.Format24bppRgb, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - using (ImageAttributes adjustAttributes = CreateAdjustAttributes(brightness, contrast, gamma)) { - ApplyImageAttributes((Bitmap)sourceImage, Rectangle.Empty, newBitmap, Rectangle.Empty, adjustAttributes); + using (ImageAttributes adjustAttributes = CreateAdjustAttributes(brightness, contrast, gamma)) + { + ApplyImageAttributes((Bitmap)sourceImage, Rectangle.Empty, newBitmap, Rectangle.Empty, adjustAttributes); } return newBitmap; } @@ -1058,9 +1248,10 @@ namespace GreenshotPlugin.Core { /// /// Original bitmap /// Bitmap with grayscale - public static Image CreateGrayscale(Image sourceImage) { + public static Image CreateGrayscale(Image sourceImage) + { Bitmap clone = (Bitmap)Clone(sourceImage); - ColorMatrix grayscaleMatrix = new ColorMatrix( new[] + ColorMatrix grayscaleMatrix = new ColorMatrix(new[] { new[] {.3f, .3f, .3f, 0, 0}, new[] {.59f, .59f, .59f, 0, 0}, @@ -1077,7 +1268,8 @@ namespace GreenshotPlugin.Core { /// /// bitmap to check /// bool if we support it - public static bool SupportsPixelFormat(Image image) { + public static bool SupportsPixelFormat(Image image) + { return SupportsPixelFormat(image.PixelFormat); } @@ -1086,11 +1278,12 @@ namespace GreenshotPlugin.Core { /// /// PixelFormat to check /// bool if we support it - public static bool SupportsPixelFormat(PixelFormat pixelformat) { - return (pixelformat.Equals(PixelFormat.Format32bppArgb) || + public static bool SupportsPixelFormat(PixelFormat pixelformat) + { + return pixelformat.Equals(PixelFormat.Format32bppArgb) || pixelformat.Equals(PixelFormat.Format32bppPArgb) || pixelformat.Equals(PixelFormat.Format32bppRgb) || - pixelformat.Equals(PixelFormat.Format24bppRgb)); + pixelformat.Equals(PixelFormat.Format24bppRgb); } /// @@ -1098,8 +1291,10 @@ namespace GreenshotPlugin.Core { /// /// Image to clone /// Bitmap with clone image data - public static Image Clone(Image sourceImage) { - if (sourceImage is Metafile) { + public static Image Clone(Image sourceImage) + { + if (sourceImage is Metafile) + { return (Image)sourceImage.Clone(); } return CloneArea(sourceImage, Rectangle.Empty, PixelFormat.DontCare); @@ -1111,7 +1306,8 @@ namespace GreenshotPlugin.Core { /// Image to clone /// Target Format, use PixelFormat.DontCare if you want the original (or a default if the source PixelFormat is not supported) /// Bitmap with clone image data - public static Bitmap Clone(Image sourceBitmap, PixelFormat targetFormat) { + public static Bitmap Clone(Image sourceBitmap, PixelFormat targetFormat) + { return CloneArea(sourceBitmap, Rectangle.Empty, targetFormat); } @@ -1126,35 +1322,42 @@ namespace GreenshotPlugin.Core { /// Rectangle to copy from the source, use Rectangle.Empty for all /// Target Format, use PixelFormat.DontCare if you want the original (or a default if the source PixelFormat is not supported) /// - public static Bitmap CloneArea(Image sourceImage, Rectangle sourceRect, PixelFormat targetFormat) { - Bitmap newImage = null; + public static Bitmap CloneArea(Image sourceImage, Rectangle sourceRect, PixelFormat targetFormat) + { + Bitmap newImage; Rectangle bitmapRect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height); // Make sure the source is not Rectangle.Empty - if (Rectangle.Empty.Equals(sourceRect)) { + if (Rectangle.Empty.Equals(sourceRect)) + { sourceRect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height); - } else { + } + else + { sourceRect.Intersect(bitmapRect); } // If no pixelformat is supplied - if (PixelFormat.DontCare == targetFormat || PixelFormat.Undefined == targetFormat) { - if (SupportsPixelFormat(sourceImage.PixelFormat)) { + if (PixelFormat.DontCare == targetFormat || PixelFormat.Undefined == targetFormat) + { + if (SupportsPixelFormat(sourceImage.PixelFormat)) + { targetFormat = sourceImage.PixelFormat; - } else if (Image.IsAlphaPixelFormat(sourceImage.PixelFormat)) { + } + else if (Image.IsAlphaPixelFormat(sourceImage.PixelFormat)) + { targetFormat = PixelFormat.Format32bppArgb; - } else { + } + else + { targetFormat = PixelFormat.Format24bppRgb; } } // check the target format - if (!SupportsPixelFormat(targetFormat)) { - if (Image.IsAlphaPixelFormat(targetFormat)) { - targetFormat = PixelFormat.Format32bppArgb; - } else { - targetFormat = PixelFormat.Format24bppRgb; - } + if (!SupportsPixelFormat(targetFormat)) + { + targetFormat = Image.IsAlphaPixelFormat(targetFormat) ? PixelFormat.Format32bppArgb : PixelFormat.Format24bppRgb; } bool destinationIsTransparent = Image.IsAlphaPixelFormat(targetFormat); @@ -1162,64 +1365,77 @@ namespace GreenshotPlugin.Core { bool fromTransparentToNon = !destinationIsTransparent && sourceIsTransparent; bool isBitmap = sourceImage is Bitmap; bool isAreaEqual = sourceRect.Equals(bitmapRect); - if (isAreaEqual || fromTransparentToNon || !isBitmap) { + if (isAreaEqual || fromTransparentToNon || !isBitmap) + { // Rule 1: if the areas are equal, always copy ourselves newImage = new Bitmap(bitmapRect.Width, bitmapRect.Height, targetFormat); // Make sure both images have the same resolution newImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - - using (Graphics graphics = Graphics.FromImage(newImage)) { - if (fromTransparentToNon) { + + using (Graphics graphics = Graphics.FromImage(newImage)) + { + if (fromTransparentToNon) + { // Rule 2: Make sure the background color is white graphics.Clear(Color.White); } // decide fastest copy method - if (isAreaEqual) { + if (isAreaEqual) + { graphics.DrawImageUnscaled(sourceImage, 0, 0); - } else { + } + else + { graphics.DrawImage(sourceImage, 0, 0, sourceRect, GraphicsUnit.Pixel); } } - } else { + } + else + { // Let GDI+ decide how to convert, need to test what is quicker... newImage = (sourceImage as Bitmap).Clone(sourceRect, targetFormat); // Make sure both images have the same resolution newImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution); } // Clone property items (EXIF information etc) - if (sourceImage.PropertyItems != null) { - foreach (var propertyItem in sourceImage.PropertyItems) { - try { - newImage.SetPropertyItem(propertyItem); - } catch (Exception ex) { - LOG.Warn("Problem cloning a propertyItem.", ex); - } + foreach (var propertyItem in sourceImage.PropertyItems) + { + try + { + newImage.SetPropertyItem(propertyItem); + } + catch (Exception ex) + { + Log.Warn("Problem cloning a propertyItem.", ex); } } return newImage; } - + /// /// Rotate the bitmap /// /// /// /// - public static Image RotateFlip(Image sourceImage, RotateFlipType rotateFlipType) { + public static Image RotateFlip(Image sourceImage, RotateFlipType rotateFlipType) + { Image returnImage = Clone(sourceImage); returnImage.RotateFlip(rotateFlipType); return returnImage; } - + /// /// A generic way to create an empty image /// /// the source bitmap as the specifications for the new bitmap /// The color to fill with, or Color.Empty to take the default depending on the pixel format /// - public static Bitmap CreateEmptyLike(Image sourceImage, Color backgroundColor) { + public static Bitmap CreateEmptyLike(Image sourceImage, Color backgroundColor) + { PixelFormat pixelFormat = sourceImage.PixelFormat; - if (backgroundColor.A < 255) { + if (backgroundColor.A < 255) + { pixelFormat = PixelFormat.Format32bppArgb; } return CreateEmpty(sourceImage.Width, sourceImage.Height, pixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); @@ -1235,41 +1451,51 @@ namespace GreenshotPlugin.Core { /// /// /// Bitmap - public static Bitmap CreateEmpty(int width, int height, PixelFormat format, Color backgroundColor, float horizontalResolution, float verticalResolution) { + public static Bitmap CreateEmpty(int width, int height, PixelFormat format, Color backgroundColor, float horizontalResolution, float verticalResolution) + { // Create a new "clean" image Bitmap newImage = new Bitmap(width, height, format); newImage.SetResolution(horizontalResolution, verticalResolution); - if (format != PixelFormat.Format8bppIndexed) { - using (Graphics graphics = Graphics.FromImage(newImage)) { + if (format != PixelFormat.Format8bppIndexed) + { + using (Graphics graphics = Graphics.FromImage(newImage)) + { // Make sure the background color is what we want (transparent or white, depending on the pixel format) - if (!Color.Empty.Equals(backgroundColor)) { + if (!Color.Empty.Equals(backgroundColor)) + { graphics.Clear(backgroundColor); - } else if (Image.IsAlphaPixelFormat(format)) { + } + else if (Image.IsAlphaPixelFormat(format)) + { graphics.Clear(Color.Transparent); - } else { + } + else + { graphics.Clear(Color.White); } } } return newImage; } - + /// /// Get a scaled version of the sourceBitmap /// /// /// 1-99 to make smaller, use 101 and more to make the picture bigger /// - public static Bitmap ScaleByPercent(Bitmap sourceBitmap, int percent) { - float nPercent = ((float)percent/100); - + public static Bitmap ScaleByPercent(Bitmap sourceBitmap, int percent) + { + float nPercent = (float)percent / 100; + int sourceWidth = sourceBitmap.Width; int sourceHeight = sourceBitmap.Height; - int destWidth = (int)(sourceWidth * nPercent); + int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); - + Bitmap scaledBitmap = CreateEmpty(destWidth, destHeight, sourceBitmap.PixelFormat, Color.Empty, sourceBitmap.HorizontalResolution, sourceBitmap.VerticalResolution); - using (Graphics graphics = Graphics.FromImage(scaledBitmap)) { + using (Graphics graphics = Graphics.FromImage(scaledBitmap)) + { graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.DrawImage(sourceBitmap, new Rectangle(0, 0, destWidth, destHeight), new Rectangle(0, 0, sourceWidth, sourceHeight), GraphicsUnit.Pixel); } @@ -1287,10 +1513,12 @@ namespace GreenshotPlugin.Core { /// /// /// a new bitmap with the source copied on it - public static Image ResizeCanvas(Image sourceImage, Color backgroundColor, int left, int right, int top, int bottom, Matrix matrix) { + public static Image ResizeCanvas(Image sourceImage, Color backgroundColor, int left, int right, int top, int bottom, Matrix matrix) + { matrix.Translate(left, top, MatrixOrder.Append); Bitmap newBitmap = CreateEmpty(sourceImage.Width + left + right, sourceImage.Height + top + bottom, sourceImage.PixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - using (Graphics graphics = Graphics.FromImage(newBitmap)) { + using (Graphics graphics = Graphics.FromImage(newBitmap)) + { graphics.DrawImageUnscaled(sourceImage, left, top); } return newBitmap; @@ -1305,7 +1533,8 @@ namespace GreenshotPlugin.Core { /// /// /// - public static Image ResizeImage(Image sourceImage, bool maintainAspectRatio, int newWidth, int newHeight, Matrix matrix) { + public static Image ResizeImage(Image sourceImage, bool maintainAspectRatio, int newWidth, int newHeight, Matrix matrix) + { return ResizeImage(sourceImage, maintainAspectRatio, false, Color.Empty, newWidth, newHeight, matrix); } @@ -1316,20 +1545,27 @@ namespace GreenshotPlugin.Core { /// Color to count /// true if Alpha needs to be checked /// int with the number of pixels which have colorToCount - public static int CountColor(Image sourceImage, Color colorToCount, bool includeAlpha) { + public static int CountColor(Image sourceImage, Color colorToCount, bool includeAlpha) + { int colors = 0; int toCount = colorToCount.ToArgb(); - if (!includeAlpha) { + if (!includeAlpha) + { toCount = toCount & 0xffffff; } - using (IFastBitmap bb = FastBitmap.Create((Bitmap)sourceImage)) { - for (int y = 0; y < bb.Height; y++) { - for (int x = 0; x < bb.Width; x++) { + using (IFastBitmap bb = FastBitmap.Create((Bitmap)sourceImage)) + { + for (int y = 0; y < bb.Height; y++) + { + for (int x = 0; x < bb.Width; x++) + { int bitmapcolor = bb.GetColorAt(x, y).ToArgb(); - if (!includeAlpha) { + if (!includeAlpha) + { bitmapcolor = bitmapcolor & 0xffffff; } - if (bitmapcolor == toCount) { + if (bitmapcolor == toCount) + { colors++; } } @@ -1349,68 +1585,173 @@ namespace GreenshotPlugin.Core { /// new height /// /// a new bitmap with the specified size, the source-Image scaled to fit with aspect ratio locked - public static Image ResizeImage(Image sourceImage, bool maintainAspectRatio, bool canvasUseNewSize, Color backgroundColor, int newWidth, int newHeight, Matrix matrix) { + public static Image ResizeImage(Image sourceImage, bool maintainAspectRatio, bool canvasUseNewSize, Color backgroundColor, int newWidth, int newHeight, Matrix matrix) + { int destX = 0; int destY = 0; - - float nPercentW = 0; - float nPercentH = 0; - - nPercentW = (newWidth / (float)sourceImage.Width); - nPercentH = (newHeight / (float)sourceImage.Height); - if (maintainAspectRatio) { - if (nPercentW == 1) { + + var nPercentW = newWidth / (float)sourceImage.Width; + var nPercentH = newHeight / (float)sourceImage.Height; + if (maintainAspectRatio) + { + if ((int)nPercentW == 1) + { nPercentW = nPercentH; - if (canvasUseNewSize) { - destX = Math.Max(0, Convert.ToInt32((newWidth - (sourceImage.Width * nPercentW)) / 2)); - } - } else if (nPercentH == 1) { - nPercentH = nPercentW; - if (canvasUseNewSize) { - destY = Math.Max(0, Convert.ToInt32((newHeight - (sourceImage.Height * nPercentH)) / 2)); - } - } else if (nPercentH != 0 && nPercentH < nPercentW) { - nPercentW = nPercentH; - if (canvasUseNewSize) { - destX = Math.Max(0, Convert.ToInt32((newWidth - (sourceImage.Width * nPercentW)) / 2)); - } - } else { - nPercentH = nPercentW; - if (canvasUseNewSize) { - destY = Math.Max(0, Convert.ToInt32((newHeight - (sourceImage.Height * nPercentH)) / 2)); + if (canvasUseNewSize) + { + destX = Math.Max(0, Convert.ToInt32((newWidth - sourceImage.Width * nPercentW) / 2)); } } - } - - int destWidth = (int)(sourceImage.Width * nPercentW); - int destHeight = (int)(sourceImage.Height * nPercentH); - if (newWidth == 0) { - newWidth = destWidth; - } - if (newHeight == 0) { - newHeight = destHeight; - } - Image newImage = null; - if (maintainAspectRatio && canvasUseNewSize) { - newImage = CreateEmpty(newWidth, newHeight, sourceImage.PixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - if (matrix != null) { - matrix.Scale((float)newWidth / sourceImage.Width, (float)newHeight / sourceImage.Height, MatrixOrder.Append); + else if ((int)nPercentH == 1) + { + nPercentH = nPercentW; + if (canvasUseNewSize) + { + destY = Math.Max(0, Convert.ToInt32((newHeight - sourceImage.Height * nPercentH) / 2)); + } } - } else { - newImage = CreateEmpty(destWidth, destHeight, sourceImage.PixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - if (matrix != null) { - matrix.Scale((float)destWidth / sourceImage.Width, (float)destHeight / sourceImage.Height, MatrixOrder.Append); + else if ((int)nPercentH != 0 && nPercentH < nPercentW) + { + nPercentW = nPercentH; + if (canvasUseNewSize) + { + destX = Math.Max(0, Convert.ToInt32((newWidth - sourceImage.Width * nPercentW) / 2)); + } + } + else + { + nPercentH = nPercentW; + if (canvasUseNewSize) + { + destY = Math.Max(0, Convert.ToInt32((newHeight - sourceImage.Height * nPercentH) / 2)); + } } } - using (Graphics graphics = Graphics.FromImage(newImage)) { + int destWidth = (int)(sourceImage.Width * nPercentW); + int destHeight = (int)(sourceImage.Height * nPercentH); + if (newWidth == 0) + { + newWidth = destWidth; + } + if (newHeight == 0) + { + newHeight = destHeight; + } + Image newImage; + if (maintainAspectRatio && canvasUseNewSize) + { + newImage = CreateEmpty(newWidth, newHeight, sourceImage.PixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); + matrix?.Scale((float)newWidth / sourceImage.Width, (float)newHeight / sourceImage.Height, MatrixOrder.Append); + } + else + { + newImage = CreateEmpty(destWidth, destHeight, sourceImage.PixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); + matrix?.Scale((float)destWidth / sourceImage.Width, (float)destHeight / sourceImage.Height, MatrixOrder.Append); + } + + using (Graphics graphics = Graphics.FromImage(newImage)) + { graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - using (ImageAttributes wrapMode = new ImageAttributes()) { + using (ImageAttributes wrapMode = new ImageAttributes()) + { wrapMode.SetWrapMode(WrapMode.TileFlipXY); graphics.DrawImage(sourceImage, new Rectangle(destX, destY, destWidth, destHeight), 0, 0, sourceImage.Width, sourceImage.Height, GraphicsUnit.Pixel, wrapMode); } } return newImage; } + + /// + /// Load a Greenshot surface from a stream + /// + /// Stream + /// + /// ISurface + public static ISurface LoadGreenshotSurface(Stream surfaceFileStream, ISurface returnSurface) + { + Image fileImage; + // Fixed problem that the bitmap stream is disposed... by Cloning the image + // This also ensures the bitmap is correctly created + + // We create a copy of the bitmap, so everything else can be disposed + surfaceFileStream.Position = 0; + using (Image tmpImage = Image.FromStream(surfaceFileStream, true, true)) + { + Log.DebugFormat("Loaded .greenshot file with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); + fileImage = Clone(tmpImage); + } + // Start at -14 read "GreenshotXX.YY" (XX=Major, YY=Minor) + const int markerSize = 14; + surfaceFileStream.Seek(-markerSize, SeekOrigin.End); + using (StreamReader streamReader = new StreamReader(surfaceFileStream)) + { + var greenshotMarker = streamReader.ReadToEnd(); + if (!greenshotMarker.StartsWith("Greenshot")) + { + throw new ArgumentException("Stream is not a Greenshot file!"); + } + Log.InfoFormat("Greenshot file format: {0}", greenshotMarker); + const int filesizeLocation = 8 + markerSize; + surfaceFileStream.Seek(-filesizeLocation, SeekOrigin.End); + using (BinaryReader reader = new BinaryReader(surfaceFileStream)) + { + long bytesWritten = reader.ReadInt64(); + surfaceFileStream.Seek(-(bytesWritten + filesizeLocation), SeekOrigin.End); + returnSurface.LoadElementsFromStream(surfaceFileStream); + } + } + if (fileImage != null) + { + returnSurface.Image = fileImage; + Log.InfoFormat("Information about .greenshot file: {0}x{1}-{2} Resolution {3}x{4}", fileImage.Width, fileImage.Height, fileImage.PixelFormat, fileImage.HorizontalResolution, fileImage.VerticalResolution); + } + return returnSurface; + } + + /// + /// Create an image from a stream, if an extension is supplied more formats are supported. + /// + /// Stream + /// + /// Image + public static Image FromStream(Stream stream, string extension = null) + { + if (stream == null) + { + return null; + } + if (!string.IsNullOrEmpty(extension)) + { + extension = extension.Replace(".", ""); + } + + // Make sure we can try multiple times + if (!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + stream.CopyTo(memoryStream); + stream = memoryStream; + } + + Image returnImage = null; + Func converter; + if (StreamConverters.TryGetValue(extension ?? "", out converter)) + { + returnImage = converter(stream, extension); + } + // Fallback + if (returnImage == null) + { + // We create a copy of the bitmap, so everything else can be disposed + stream.Position = 0; + using (var tmpImage = Image.FromStream(stream, true, true)) + { + Log.DebugFormat("Loaded bitmap with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); + returnImage = Clone(tmpImage, PixelFormat.Format32bppArgb); + } + } + return returnImage; + } } } diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 354db0e57..4ca912e11 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -390,41 +390,13 @@ namespace GreenshotPlugin.Core { if (string.IsNullOrEmpty(fullPath)) { return null; } - Image fileImage; LOG.InfoFormat("Loading image from file {0}", fullPath); // Fixed lock problem Bug #3431881 using (Stream surfaceFileStream = File.OpenRead(fullPath)) { - // And fixed problem that the bitmap stream is disposed... by Cloning the image - // This also ensures the bitmap is correctly created - - // We create a copy of the bitmap, so everything else can be disposed - surfaceFileStream.Position = 0; - using (Image tmpImage = Image.FromStream(surfaceFileStream, true, true)) { - LOG.DebugFormat("Loaded {0} with Size {1}x{2} and PixelFormat {3}", fullPath, tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); - fileImage = ImageHelper.Clone(tmpImage); - } - // Start at -14 read "GreenshotXX.YY" (XX=Major, YY=Minor) - const int markerSize = 14; - surfaceFileStream.Seek(-markerSize, SeekOrigin.End); - string greenshotMarker; - using (StreamReader streamReader = new StreamReader(surfaceFileStream)) { - greenshotMarker = streamReader.ReadToEnd(); - if (!greenshotMarker.StartsWith("Greenshot")) { - throw new ArgumentException(string.Format("{0} is not a Greenshot file!", fullPath)); - } - LOG.InfoFormat("Greenshot file format: {0}", greenshotMarker); - const int filesizeLocation = 8 + markerSize; - surfaceFileStream.Seek(-filesizeLocation, SeekOrigin.End); - using (BinaryReader reader = new BinaryReader(surfaceFileStream)) { - long bytesWritten = reader.ReadInt64(); - surfaceFileStream.Seek(-(bytesWritten + filesizeLocation), SeekOrigin.End); - returnSurface.LoadElementsFromStream(surfaceFileStream); - } - } + returnSurface = ImageHelper.LoadGreenshotSurface(surfaceFileStream, returnSurface); } - if (fileImage != null) { - returnSurface.Image = fileImage; - LOG.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", fullPath, fileImage.Width, fileImage.Height, fileImage.PixelFormat, fileImage.HorizontalResolution, fileImage.VerticalResolution); + if (returnSurface != null) { + LOG.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", fullPath, returnSurface.Image.Width, returnSurface.Image.Height, returnSurface.Image.PixelFormat, returnSurface.Image.HorizontalResolution, returnSurface.Image.VerticalResolution); } return returnSurface; } diff --git a/GreenshotPlugin/Core/ImageWrapper.cs b/GreenshotPlugin/Core/ImageWrapper.cs new file mode 100644 index 000000000..f4cc03247 --- /dev/null +++ b/GreenshotPlugin/Core/ImageWrapper.cs @@ -0,0 +1,86 @@ +using System.Drawing; +using System.Drawing.Imaging; + +namespace GreenshotPlugin.Core +{ + /// + /// Wrap an image, make it resizeable + /// + public class ImageWrapper : IImage + { + // Underlying image, is used to generate a resized version of it when needed + private readonly Image _image; + private Image _imageClone; + + /// + /// Factory method + /// + /// Image + /// IImage + public static IImage FromImage(Image image) + { + return image == null ? null : new ImageWrapper(image); + } + + public ImageWrapper(Image image) + { + // Make sure the orientation is set correctly so Greenshot can process the image correctly + ImageHelper.Orientate(image); + _image = image; + Width = _image.Width; + Height = _image.Height; + } + + public void Dispose() + { + _image.Dispose(); + _imageClone?.Dispose(); + } + + /// + /// Height of the image, can be set to change + /// + public int Height { get; set; } + + /// + /// Width of the image, can be set to change. + /// + public int Width { get; set; } + + /// + /// Size of the image + /// + public Size Size => new Size(Width, Height); + + /// + /// Pixelformat of the underlying image + /// + public PixelFormat PixelFormat => Image.PixelFormat; + + public float HorizontalResolution => Image.HorizontalResolution; + public float VerticalResolution => Image.VerticalResolution; + + public Image Image + { + get + { + if (_imageClone == null) + { + if (_image.Height == Height && _image.Width == Width) + { + return _image; + } + } + if (_imageClone?.Height == Height && _imageClone?.Width == Width) + { + return _imageClone; + } + // Calculate new image clone + _imageClone?.Dispose(); + _imageClone = ImageHelper.ResizeImage(_image, false, Width, Height, null); + return _imageClone; + } + } + + } +} diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index e1d90c7fc..65f54baf6 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -25,7 +25,6 @@ using log4net; using System; using System.Collections.Generic; using System.Drawing; -using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Net; @@ -91,9 +90,9 @@ namespace GreenshotPlugin.Core { { if (responseStream != null) { - using (Image image = Image.FromStream(responseStream)) + using (Image image = ImageHelper.FromStream(responseStream)) { - return (image.Height > 16 && image.Width > 16) ? new Bitmap(image, 16, 16) : new Bitmap(image); + return image.Height > 16 && image.Width > 16 ? new Bitmap(image, 16, 16) : new Bitmap(image); } } } @@ -130,43 +129,60 @@ namespace GreenshotPlugin.Core { /// /// Of an image /// Bitmap - public static Image DownloadImage(string url) { - try { - string content; - using (MemoryStream memoryStream = GetAsMemoryStream(url)) { - try { - using (Image image = Image.FromStream(memoryStream)) { - return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); - } - } catch (Exception) { + public static Image DownloadImage(string url) + { + StringBuilder extensions = new StringBuilder(); + foreach (var extension in ImageHelper.StreamConverters.Keys) + { + if (string.IsNullOrEmpty(extension)) + { + continue; + } + extensions.AppendFormat(@"\.{0}|", extension); + } + extensions.Length--; + + var imageUrlRegex = new Regex($@"(http|https)://.*(?{extensions})"); + var match = imageUrlRegex.Match(url); + try + { + using (var memoryStream = GetAsMemoryStream(url)) + { + try + { + return ImageHelper.FromStream(memoryStream, match.Success ? match.Groups["extension"]?.Value : null); + } + catch (Exception) + { // If we arrive here, the image loading didn't work, try to see if the response has a http(s) URL to an image and just take this instead. - using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8, true)) { + string content; + using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8, true)) + { content = streamReader.ReadLine(); } - if (!string.IsNullOrEmpty(content)) + if (string.IsNullOrEmpty(content)) { - Regex imageUrlRegex = new Regex(@"(http|https)://.*(\.png|\.gif|\.jpg|\.tiff|\.jpeg|\.bmp)"); - Match match = imageUrlRegex.Match(content); - if (match.Success) - { - using (MemoryStream memoryStream2 = GetAsMemoryStream(match.Value)) - { - using (Image image = Image.FromStream(memoryStream2)) - { - return ImageHelper.Clone(image, PixelFormat.Format32bppArgb); - } - } - } + throw; + } + match = imageUrlRegex.Match(content); + if (!match.Success) + { + throw; + } + using (var memoryStream2 = GetAsMemoryStream(match.Value)) + { + return ImageHelper.FromStream(memoryStream2, match.Groups["extension"]?.Value); } - throw; } } - } catch (Exception e) { + } + catch (Exception e) + { LOG.Error("Problem downloading the image from: " + url, e); } return null; } - + /// /// Helper method to create a web request with a lot of default settings /// @@ -347,7 +363,7 @@ namespace GreenshotPlugin.Core { /// HttpWebRequest to write the multipart form data to /// Parameters to include in the multipart form data public static void WriteMultipartFormData(HttpWebRequest webRequest, IDictionary postParameters) { - string boundary = String.Format("----------{0:N}", Guid.NewGuid()); + string boundary = string.Format("----------{0:N}", Guid.NewGuid()); webRequest.ContentType = "multipart/form-data; boundary=" + boundary; using (Stream formDataStream = webRequest.GetRequestStream()) { WriteMultipartFormData(formDataStream, boundary, postParameters); @@ -360,7 +376,7 @@ namespace GreenshotPlugin.Core { /// HttpListenerResponse /// Parameters to include in the multipart form data public static void WriteMultipartFormData(HttpListenerResponse response, IDictionary postParameters) { - string boundary = String.Format("----------{0:N}", Guid.NewGuid()); + string boundary = string.Format("----------{0:N}", Guid.NewGuid()); response.ContentType = "multipart/form-data; boundary=" + boundary; WriteMultipartFormData(response.OutputStream, boundary, postParameters); } @@ -474,7 +490,7 @@ namespace GreenshotPlugin.Core { string responseData = null; HttpWebResponse response = null; bool isHttpError = false; - try { + try { response = (HttpWebResponse)webRequest.GetResponse(); LOG.InfoFormat("Response status: {0}", response.StatusCode); isHttpError = (int)response.StatusCode >= 300; diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 040062bc8..5dbed379b 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -42,6 +42,9 @@ + + + diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index a72142006..6f63972fb 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -226,7 +226,7 @@ namespace Greenshot.Plugin get; set; } - string UploadURL + string UploadUrl { get; set; From 7c7fd67b2aa45a0552c15a7a59fc353a76133369 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 5 Sep 2016 23:37:40 +0200 Subject: [PATCH 113/170] Added LinqBridge and did some code cleanup. --- Greenshot/Drawing/DrawableContainerList.cs | 35 ++--- Greenshot/Greenshot.csproj | 4 + Greenshot/Helpers/MailHelper.cs | 75 +++++------ Greenshot/packages.config | 1 + .../releases/innosetup/setup.iss.template | 3 +- GreenshotConfluencePlugin/Confluence.cs | 65 ++++------ GreenshotConfluencePlugin/ConfluenceUtils.cs | 3 +- .../Forms/ConfluenceSearch.xaml.cs | 69 +++++----- .../Forms/ConfluenceTreePicker.xaml.cs | 120 ++++++++--------- .../Forms/ConfluenceUpload.xaml.cs | 7 +- GreenshotPlugin/Core/AccessibleHelper.cs | 13 +- GreenshotPlugin/Core/ClipboardHelper.cs | 51 ++++---- GreenshotPlugin/Core/IEHelper.cs | 39 ++---- GreenshotPlugin/Core/ImageHelper.cs | 3 +- GreenshotPlugin/Core/ImageOutput.cs | 122 +++++++++--------- GreenshotPlugin/Core/WindowCapture.cs | 18 +-- GreenshotPlugin/GreenshotPlugin.csproj | 7 + .../Interfaces/Plugin/PluginInterfaces.cs | 29 ++--- GreenshotPlugin/packages.config | 4 + build.ps1 | 2 + 20 files changed, 327 insertions(+), 343 deletions(-) create mode 100644 GreenshotPlugin/packages.config diff --git a/Greenshot/Drawing/DrawableContainerList.cs b/Greenshot/Drawing/DrawableContainerList.cs index 8758c4885..3b0808ad3 100644 --- a/Greenshot/Drawing/DrawableContainerList.cs +++ b/Greenshot/Drawing/DrawableContainerList.cs @@ -40,7 +40,7 @@ namespace Greenshot.Drawing { [Serializable] public class DrawableContainerList : List, IDrawableContainerList { - private static readonly ComponentResourceManager editorFormResources = new ComponentResourceManager(typeof(ImageEditorForm)); + private static readonly ComponentResourceManager EditorFormResources = new ComponentResourceManager(typeof(ImageEditorForm)); public Guid ParentID { get; @@ -50,8 +50,8 @@ namespace Greenshot.Drawing { public DrawableContainerList() { } - public DrawableContainerList(Guid parentID) { - ParentID = parentID; + public DrawableContainerList(Guid parentId) { + ParentID = parentId; } public EditStatus Status { @@ -327,10 +327,11 @@ namespace Greenshot.Drawing { /// Pulls one or several elements up to the topmost level(s) in hierarchy (z-index). /// /// of elements to pull to top - public void PullElementsToTop(IDrawableContainerList elements) { + public void PullElementsToTop(IDrawableContainerList elements) + { var dcs = 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 @@ -462,27 +463,31 @@ namespace Greenshot.Drawing { menu.Items.Add(item); // Copy - item = new ToolStripMenuItem(Language.GetString(LangKey.editor_copytoclipboard)); - item.Image = ((Image)(editorFormResources.GetObject("copyToolStripMenuItem.Image"))); + item = new ToolStripMenuItem(Language.GetString(LangKey.editor_copytoclipboard)) + { + Image = (Image) EditorFormResources.GetObject("copyToolStripMenuItem.Image") + }; item.Click += delegate { ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), this); }; menu.Items.Add(item); // Cut - item = new ToolStripMenuItem(Language.GetString(LangKey.editor_cuttoclipboard)); - item.Image = ((Image)(editorFormResources.GetObject("btnCut.Image"))); + item = new ToolStripMenuItem(Language.GetString(LangKey.editor_cuttoclipboard)) + { + Image = (Image) EditorFormResources.GetObject("btnCut.Image") + }; item.Click += delegate { ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), this); - surface.RemoveElements(this, true); + surface.RemoveElements(this); }; menu.Items.Add(item); // Delete item = new ToolStripMenuItem(Language.GetString(LangKey.editor_deleteelement)); - item.Image = ((Image)(editorFormResources.GetObject("removeObjectToolStripMenuItem.Image"))); + item.Image = (Image)EditorFormResources.GetObject("removeObjectToolStripMenuItem.Image"); item.Click += delegate { - surface.RemoveElements(this, true); + surface.RemoveElements(this); }; menu.Items.Add(item); @@ -552,7 +557,7 @@ namespace Greenshot.Drawing { } #region IDisposable Support - private bool _disposedValue = false; // To detect redundant calls + private bool _disposedValue; // To detect redundant calls protected virtual void Dispose(bool disposing) { diff --git a/Greenshot/Greenshot.csproj b/Greenshot/Greenshot.csproj index 30d5a0210..40ba04d9c 100644 --- a/Greenshot/Greenshot.csproj +++ b/Greenshot/Greenshot.csproj @@ -22,6 +22,10 @@ + + ..\packages\LinqBridge.1.3.0\lib\net20\LinqBridge.dll + True + Lib\log4net.dll diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index efda5cb30..c2e5a190c 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -135,7 +135,6 @@ namespace Greenshot.Helpers { private string _subject; private string _body; private RecipientCollection _recipientCollection; - private readonly List _files; private readonly ManualResetEvent _manualResetEvent; #endregion Member Variables @@ -146,7 +145,7 @@ namespace Greenshot.Helpers { /// Creates a blank mail message. /// public MapiMailMessage() { - _files = new List(); + Files = new List(); _recipientCollection = new RecipientCollection(); _manualResetEvent = new ManualResetEvent(false); } @@ -206,11 +205,7 @@ namespace Greenshot.Helpers { /// /// Gets the file list for this mail message. /// - public List Files { - get { - return _files; - } - } + public List Files { get; } #endregion Public Properties @@ -255,9 +250,9 @@ namespace Greenshot.Helpers { /// Sends the mail message. /// private void _ShowMail() { - MAPIHelperInterop.MapiMessage message = new MAPIHelperInterop.MapiMessage(); + var message = new MapiHelperInterop.MapiMessage(); - using (RecipientCollection.InteropRecipientCollection interopRecipients = _recipientCollection.GetInteropRepresentation()) { + using (var interopRecipients = _recipientCollection.GetInteropRepresentation()) { message.Subject = _subject; message.NoteText = _body; @@ -265,7 +260,7 @@ namespace Greenshot.Helpers { message.RecipientCount = _recipientCollection.Count; // Check if we need to add attachments - if (_files.Count > 0) { + if (Files.Count > 0) { // Add attachments message.Files = _AllocAttachments(out message.FileCount); } @@ -275,25 +270,29 @@ namespace Greenshot.Helpers { const int MAPI_DIALOG = 0x8; //const int MAPI_LOGON_UI = 0x1; - int error = MAPIHelperInterop.MAPISendMail(IntPtr.Zero, IntPtr.Zero, message, MAPI_DIALOG, 0); + int error = MapiHelperInterop.MAPISendMail(IntPtr.Zero, IntPtr.Zero, message, MAPI_DIALOG, 0); - if (_files.Count > 0) { + if (Files.Count > 0) { // Deallocate the files _DeallocFiles(message); } MAPI_CODES errorCode = (MAPI_CODES)Enum.ToObject(typeof(MAPI_CODES), error); // Check for error - if (errorCode != MAPI_CODES.SUCCESS && errorCode != MAPI_CODES.USER_ABORT) { - string errorText = GetMapiError(errorCode); - LOG.Error("Error sending MAPI Email. Error: " + errorText + " (code = " + errorCode + ")."); - MessageBox.Show(errorText, "Mail (MAPI) destination", MessageBoxButtons.OK, MessageBoxIcon.Error); - // Recover from bad settings, show again - if (errorCode == MAPI_CODES.INVALID_RECIPS) { - _recipientCollection = new RecipientCollection(); - _ShowMail(); - } + if (errorCode == MAPI_CODES.SUCCESS || errorCode == MAPI_CODES.USER_ABORT) + { + return; } + string errorText = GetMapiError(errorCode); + LOG.Error("Error sending MAPI Email. Error: " + errorText + " (code = " + errorCode + ")."); + MessageBox.Show(errorText, "Mail (MAPI) destination", MessageBoxButtons.OK, MessageBoxIcon.Error); + // Recover from bad settings, show again + if (errorCode != MAPI_CODES.INVALID_RECIPS) + { + return; + } + _recipientCollection = new RecipientCollection(); + _ShowMail(); } } @@ -301,7 +300,7 @@ namespace Greenshot.Helpers { /// Deallocates the files in a message. /// /// The message to deallocate the files from. - private void _DeallocFiles(MAPIHelperInterop.MapiMessage message) { + private void _DeallocFiles(MapiHelperInterop.MapiMessage message) { if (message.Files != IntPtr.Zero) { Type fileDescType = typeof(MapiFileDescriptor); int fsize = Marshal.SizeOf(fileDescType); @@ -325,29 +324,31 @@ namespace Greenshot.Helpers { /// private IntPtr _AllocAttachments(out int fileCount) { fileCount = 0; - if (_files == null) { + if (Files == null) { return IntPtr.Zero; } - if ((_files.Count <= 0) || (_files.Count > 100)) { + if ((Files.Count <= 0) || (Files.Count > 100)) { return IntPtr.Zero; } Type atype = typeof(MapiFileDescriptor); int asize = Marshal.SizeOf(atype); - IntPtr ptra = Marshal.AllocHGlobal(_files.Count * asize); + IntPtr ptra = Marshal.AllocHGlobal(Files.Count * asize); - MapiFileDescriptor mfd = new MapiFileDescriptor(); - mfd.position = -1; + MapiFileDescriptor mfd = new MapiFileDescriptor + { + position = -1 + }; IntPtr runptr = ptra; - for (int i = 0; i < _files.Count; i++) { - string path = _files[i] as string; + for (int i = 0; i < Files.Count; i++) { + string path = Files[i]; mfd.name = Path.GetFileName(path); mfd.path = path; Marshal.StructureToPtr(mfd, runptr, false); runptr = new IntPtr(runptr.ToInt64() + asize); } - fileCount = _files.Count; + fileCount = Files.Count; return ptra; } @@ -480,13 +481,13 @@ namespace Greenshot.Helpers { /// /// Internal class for calling MAPI APIs /// - internal class MAPIHelperInterop { + internal class MapiHelperInterop { #region Constructors /// /// Private constructor. /// - private MAPIHelperInterop() { + private MapiHelperInterop() { // Intenationally blank } @@ -599,8 +600,8 @@ namespace Greenshot.Helpers { /// Returns an interop representation of a recepient. /// /// - internal MapiMailMessage.MAPIHelperInterop.MapiRecipDesc GetInteropRepresentation() { - MapiMailMessage.MAPIHelperInterop.MapiRecipDesc interop = new MapiMailMessage.MAPIHelperInterop.MapiRecipDesc(); + internal MapiMailMessage.MapiHelperInterop.MapiRecipDesc GetInteropRepresentation() { + MapiMailMessage.MapiHelperInterop.MapiRecipDesc interop = new MapiMailMessage.MapiHelperInterop.MapiRecipDesc(); if (DisplayName == null) { interop.Name = Address; @@ -699,13 +700,13 @@ namespace Greenshot.Helpers { } // allocate enough memory to hold all recipients - int size = Marshal.SizeOf(typeof(MapiMailMessage.MAPIHelperInterop.MapiRecipDesc)); + int size = Marshal.SizeOf(typeof(MapiMailMessage.MapiHelperInterop.MapiRecipDesc)); _handle = Marshal.AllocHGlobal(_count * size); // place all interop recipients into the memory just allocated IntPtr ptr = _handle; foreach (Recipient native in outer) { - MapiMailMessage.MAPIHelperInterop.MapiRecipDesc interop = native.GetInteropRepresentation(); + MapiMailMessage.MapiHelperInterop.MapiRecipDesc interop = native.GetInteropRepresentation(); // stick it in the memory block Marshal.StructureToPtr(interop, ptr, false); @@ -732,7 +733,7 @@ namespace Greenshot.Helpers { /// public void Dispose() { if (_handle != IntPtr.Zero) { - Type type = typeof(MapiMailMessage.MAPIHelperInterop.MapiRecipDesc); + Type type = typeof(MapiMailMessage.MapiHelperInterop.MapiRecipDesc); int size = Marshal.SizeOf(type); // destroy all the structures in the memory area diff --git a/Greenshot/packages.config b/Greenshot/packages.config index a9672879a..12343fb16 100644 --- a/Greenshot/packages.config +++ b/Greenshot/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 479f94f5c..8b6194c13 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -18,7 +18,8 @@ Source: ..\..\bin\Release\Greenshot.exe; DestDir: {app}; Components: greenshot; Source: ..\..\bin\Release\GreenshotPlugin.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: ..\..\bin\Release\Greenshot.exe.config; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: ..\..\bin\Release\log4net.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion -Source: ..\..\log4net.xml; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion +Source: ..\..\log4net.xml; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion +Source: ..\..\LinqBridge.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion Source: ..\..\bin\Release\checksum.MD5; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion ;Source: ..\greenshot-defaults.ini; DestDir: {app}; Flags: overwritereadonly ignoreversion replacesameversion Source: ..\additional_files\installer.txt; DestDir: {app}; Components: greenshot; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 1711970d1..714d3d20e 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -94,8 +94,8 @@ namespace Confluence { public class ConfluenceConnector : IDisposable { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ConfluenceConnector)); private const string AuthFailedExceptionName = "com.atlassian.confluence.rpc.AuthenticationFailedException"; - private const string V2Failed = "AXIS"; - private static readonly ConfluenceConfiguration Config = IniConfig.GetIniSection(); + private const string V2Failed = "AXIS"; + private static readonly ConfluenceConfiguration Config = IniConfig.GetIniSection(); private string _credentials; private DateTime _loggedInTime = DateTime.Now; private bool _loggedIn; @@ -123,17 +123,17 @@ namespace Confluence { public ConfluenceConnector(string url, int timeout) { _timeout = timeout; - Init(url); + Init(url); } - private void Init(string url) { - _url = url; - _confluence = new ConfluenceSoapServiceService - { - Url = url, - Proxy = NetworkHelper.CreateProxy(new Uri(url)) - }; - } + private void Init(string url) { + _url = url; + _confluence = new ConfluenceSoapServiceService + { + Url = url, + Proxy = NetworkHelper.CreateProxy(new Uri(url)) + }; + } ~ConfluenceConnector() { Dispose(false); @@ -149,11 +149,11 @@ namespace Confluence { _loggedInTime = DateTime.Now; _loggedIn = true; } catch (Exception e) { - // Check if confluence-v2 caused an error, use v1 instead - if (e.Message.Contains(V2Failed) && _url.Contains("v2")) { - Init(_url.Replace("v2", "v1")); - return DoLogin(user, password); - } + // Check if confluence-v2 caused an error, use v1 instead + if (e.Message.Contains(V2Failed) && _url.Contains("v2")) { + Init(_url.Replace("v2", "v1")); + return DoLogin(user, password); + } // check if auth failed if (e.Message.Contains(AuthFailedExceptionName)) { return false; @@ -173,7 +173,7 @@ namespace Confluence { try { // Get the system name, so the user knows where to login to string systemName = _url.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX1,""); - systemName = systemName.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX2, ""); + systemName = systemName.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX2, ""); CredentialsDialog dialog = new CredentialsDialog(systemName) { Name = null @@ -274,49 +274,40 @@ namespace Confluence { return new Page(page); } - public List GetSpaceSummaries() { + public IEnumerable GetSpaceSummaries() { CheckCredentials(); RemoteSpaceSummary [] spaces = _confluence.getSpaces(_credentials); - List returnSpaces = new List(); foreach(RemoteSpaceSummary space in spaces) { - returnSpaces.Add(new Space(space)); + yield return new Space(space); } - returnSpaces.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name)); - return returnSpaces; } - public List GetPageChildren(Page parentPage) { + public IEnumerable GetPageChildren(Page parentPage) { CheckCredentials(); List returnPages = new List(); RemotePageSummary[] pages = _confluence.getChildren(_credentials, parentPage.Id); foreach(RemotePageSummary page in pages) { - returnPages.Add(new Page(page)); + yield return new Page(page); } - returnPages.Sort((x, y) => string.CompareOrdinal(x.Title, y.Title)); - return returnPages; } - public List GetPageSummaries(Space space) { + public IEnumerable GetPageSummaries(Space space) { CheckCredentials(); - List returnPages = new List(); RemotePageSummary[] pages = _confluence.getPages(_credentials, space.Key); foreach(RemotePageSummary page in pages) { - returnPages.Add(new Page(page)); + yield return new Page(page); } - returnPages.Sort((x, y) => string.CompareOrdinal(x.Title, y.Title)); - return returnPages; } - public List SearchPages(string query, string space) { + public IEnumerable SearchPages(string query, string space) { CheckCredentials(); - List results = new List(); - foreach(RemoteSearchResult searchResult in _confluence.search(_credentials, query, 20)) { + foreach(var searchResult in _confluence.search(_credentials, query, 20)) { Log.DebugFormat("Got result of type {0}", searchResult.type); - if ("page".Equals(searchResult.type)) { - results.Add(new Page(searchResult, space)); + if ("page".Equals(searchResult.type)) + { + yield return new Page(searchResult, space); } } - return results; } } } diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index eef3501a3..64a8b9a3e 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -20,6 +20,7 @@ */ using System; using System.Collections.Generic; +using System.Linq; using System.Text.RegularExpressions; using System.Windows.Automation; @@ -140,7 +141,7 @@ namespace GreenshotConfluencePlugin { } } - foreach(string url in IEHelper.GetIEUrls()) { + foreach(string url in IEHelper.GetIEUrls().Distinct()) { urls.Add(url); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs index f1bf0d34a..815222ef7 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceSearch.xaml.cs @@ -21,77 +21,68 @@ using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Windows; using Greenshot.IniFile; namespace GreenshotConfluencePlugin { - public partial class ConfluenceSearch : System.Windows.Controls.Page { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceSearch)); - private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection(); - private readonly ConfluenceUpload confluenceUpload; + public partial class ConfluenceSearch + { + private static readonly ConfluenceConfiguration ConfluenceConfig = IniConfig.GetIniSection(); + private readonly ConfluenceUpload _confluenceUpload; - public List Spaces { - get { - return confluenceUpload.Spaces; - } - } + public IEnumerable Spaces => _confluenceUpload.Spaces; - private readonly ObservableCollection pages = new ObservableCollection(); - public ObservableCollection Pages { - get { - return pages; - } - } + public ObservableCollection Pages { get; } = new ObservableCollection(); public ConfluenceSearch(ConfluenceUpload confluenceUpload) { - this.confluenceUpload = confluenceUpload; + _confluenceUpload = confluenceUpload; DataContext = this; InitializeComponent(); - if (config.SearchSpaceKey == null) { - SpaceComboBox.SelectedItem = Spaces[0]; + if (ConfluenceConfig.SearchSpaceKey == null) { + SpaceComboBox.SelectedItem = Spaces.FirstOrDefault(); } else { - foreach(Confluence.Space space in Spaces) { - if (space.Key.Equals(config.SearchSpaceKey)) { + foreach(var space in Spaces) { + if (space.Key.Equals(ConfluenceConfig.SearchSpaceKey)) { SpaceComboBox.SelectedItem = space; } } } } - void PageListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { + private void PageListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { SelectionChanged(); } - - void SelectionChanged() { + + private void SelectionChanged() { if (PageListView.HasItems && PageListView.SelectedItems.Count > 0) { - confluenceUpload.SelectedPage = (Confluence.Page)PageListView.SelectedItem; + _confluenceUpload.SelectedPage = (Confluence.Page)PageListView.SelectedItem; } else { - confluenceUpload.SelectedPage = null; + _confluenceUpload.SelectedPage = null; } } - - void Search_Click(object sender, RoutedEventArgs e) { - doSearch(); + + private void Search_Click(object sender, RoutedEventArgs e) { + DoSearch(); } - void doSearch() { + private void DoSearch() { string spaceKey = (string)SpaceComboBox.SelectedValue; - config.SearchSpaceKey = spaceKey; - List searchResult = ConfluencePlugin.ConfluenceConnector.SearchPages(searchText.Text, spaceKey); - pages.Clear(); - foreach(Confluence.Page page in searchResult) { - pages.Add(page); + ConfluenceConfig.SearchSpaceKey = spaceKey; + Pages.Clear(); + foreach(var page in ConfluencePlugin.ConfluenceConnector.SearchPages(searchText.Text, spaceKey).OrderBy(p => p.Title)) { + Pages.Add(page); } } - void SearchText_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { + private void SearchText_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == System.Windows.Input.Key.Return && Search.IsEnabled) { - doSearch(); - e.Handled = true; + DoSearch(); + e.Handled = true; } } - - void Page_Loaded(object sender, RoutedEventArgs e) { + + private void Page_Loaded(object sender, RoutedEventArgs e) { SelectionChanged(); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs index 066f40334..6d3768973 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceTreePicker.xaml.cs @@ -18,8 +18,9 @@ * 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.Linq; using System.Threading; using System.Windows; using System.Windows.Controls; @@ -32,96 +33,99 @@ namespace GreenshotConfluencePlugin { /// /// Interaction logic for ConfluenceTreePicker.xaml /// - public partial class ConfluenceTreePicker : System.Windows.Controls.Page { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceTreePicker)); - private readonly ConfluenceConnector confluenceConnector; - private readonly ConfluenceUpload confluenceUpload; - private bool isInitDone = false; + public partial class ConfluenceTreePicker + { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ConfluenceTreePicker)); + private readonly ConfluenceConnector _confluenceConnector; + private readonly ConfluenceUpload _confluenceUpload; + private bool _isInitDone; public ConfluenceTreePicker(ConfluenceUpload confluenceUpload) { - confluenceConnector = ConfluencePlugin.ConfluenceConnector; - this.confluenceUpload = confluenceUpload; + _confluenceConnector = ConfluencePlugin.ConfluenceConnector; + _confluenceUpload = confluenceUpload; InitializeComponent(); } - void pageTreeViewItem_DoubleClick(object sender, MouseButtonEventArgs eventArgs) { - LOG.Debug("spaceTreeViewItem_MouseLeftButtonDown is called!"); + private void pageTreeViewItem_DoubleClick(object sender, MouseButtonEventArgs eventArgs) { + Log.Debug("spaceTreeViewItem_MouseLeftButtonDown is called!"); TreeViewItem clickedItem = eventArgs.Source as TreeViewItem; - if (clickedItem ==null) { - return; - } - Confluence.Page page = clickedItem.Tag as Confluence.Page; + Confluence.Page page = clickedItem?.Tag as Confluence.Page; if (page == null) { return; } - if (!clickedItem.HasItems) { - LOG.Debug("Loading pages for page: " + page.Title); - (new Thread(() => { - Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {ShowBusy.Visibility = Visibility.Visible;})); - List pages = confluenceConnector.GetPageChildren(page); - Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => { - foreach(Confluence.Page childPage in pages) { - LOG.Debug("Adding page: " + childPage.Title); - TreeViewItem pageTreeViewItem = new TreeViewItem(); - pageTreeViewItem.Header = childPage.Title; - pageTreeViewItem.Tag = childPage; - clickedItem.Items.Add(pageTreeViewItem); - pageTreeViewItem.PreviewMouseDoubleClick += new MouseButtonEventHandler(pageTreeViewItem_DoubleClick); - pageTreeViewItem.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(pageTreeViewItem_Click); - } - ShowBusy.Visibility = Visibility.Collapsed; - })); - } - ) { Name = "Loading childpages for confluence page " + page.Title }).Start(); + if (clickedItem.HasItems) + { + return; } + Log.Debug("Loading pages for page: " + page.Title); + new Thread(() => { + Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {ShowBusy.Visibility = Visibility.Visible;})); + var pages = _confluenceConnector.GetPageChildren(page).OrderBy(p => p.Title); + Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => { + foreach(var childPage in pages) { + Log.Debug("Adding page: " + childPage.Title); + var pageTreeViewItem = new TreeViewItem + { + Header = childPage.Title, + Tag = childPage + }; + clickedItem.Items.Add(pageTreeViewItem); + pageTreeViewItem.PreviewMouseDoubleClick += pageTreeViewItem_DoubleClick; + pageTreeViewItem.PreviewMouseLeftButtonDown += pageTreeViewItem_Click; + } + ShowBusy.Visibility = Visibility.Collapsed; + })); + }) { Name = "Loading childpages for confluence page " + page.Title }.Start(); } - - void pageTreeViewItem_Click(object sender, MouseButtonEventArgs eventArgs) { - LOG.Debug("pageTreeViewItem_PreviewMouseDoubleClick is called!"); + + private void pageTreeViewItem_Click(object sender, MouseButtonEventArgs eventArgs) { + Log.Debug("pageTreeViewItem_PreviewMouseDoubleClick is called!"); TreeViewItem clickedItem = eventArgs.Source as TreeViewItem; if (clickedItem ==null) { return; } Confluence.Page page = clickedItem.Tag as Confluence.Page; - confluenceUpload.SelectedPage = page; + _confluenceUpload.SelectedPage = page; if (page != null) { - LOG.Debug("Page selected: " + page.Title); + Log.Debug("Page selected: " + page.Title); } } - void Page_Loaded(object sender, RoutedEventArgs e) { - confluenceUpload.SelectedPage = null; - if (isInitDone) { + private void Page_Loaded(object sender, RoutedEventArgs e) { + _confluenceUpload.SelectedPage = null; + if (_isInitDone) { return; } ShowBusy.Visibility = Visibility.Visible; - (new Thread(() => { + new Thread(() => { Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => { - List spaces = confluenceUpload.Spaces; - foreach (Space space in spaces) { - TreeViewItem spaceTreeViewItem = new TreeViewItem(); - spaceTreeViewItem.Header = space.Name; - spaceTreeViewItem.Tag = space; - + foreach (Space space in _confluenceUpload.Spaces) { + TreeViewItem spaceTreeViewItem = new TreeViewItem + { + Header = space.Name, + Tag = space + }; + // Get homepage try { - Confluence.Page page = confluenceConnector.GetSpaceHomepage(space); - TreeViewItem pageTreeViewItem = new TreeViewItem(); - pageTreeViewItem.Header = page.Title; - pageTreeViewItem.Tag = page; - pageTreeViewItem.PreviewMouseDoubleClick += new MouseButtonEventHandler(pageTreeViewItem_DoubleClick); - pageTreeViewItem.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(pageTreeViewItem_Click); + Confluence.Page page = _confluenceConnector.GetSpaceHomepage(space); + TreeViewItem pageTreeViewItem = new TreeViewItem + { + Header = page.Title, + Tag = page + }; + pageTreeViewItem.PreviewMouseDoubleClick += pageTreeViewItem_DoubleClick; + pageTreeViewItem.PreviewMouseLeftButtonDown += pageTreeViewItem_Click; spaceTreeViewItem.Items.Add(pageTreeViewItem); ConfluenceTreeView.Items.Add(spaceTreeViewItem); } catch (Exception ex) { - LOG.Error("Can't get homepage for space : " + space.Name + " (" + ex.Message + ")"); + Log.Error("Can't get homepage for space : " + space.Name + " (" + ex.Message + ")"); } } ShowBusy.Visibility = Visibility.Collapsed; - isInitDone = true; + _isInitDone = true; })); - } - ) { Name = "Loading spaces for confluence"}).Start(); + }) { Name = "Loading spaces for confluence"}.Start(); } } } \ No newline at end of file diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index 8308dfe43..a9326887a 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -20,6 +20,7 @@ */ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Windows; using System.Windows.Controls; @@ -88,8 +89,8 @@ namespace GreenshotConfluencePlugin { } private static DateTime _lastLoad = DateTime.Now; - private static List _spaces; - public List Spaces { + private static IList _spaces; + public IList Spaces { get { UpdateSpaces(); while (_spaces == null) { @@ -118,7 +119,7 @@ namespace GreenshotConfluencePlugin { // Check if load is needed if (_spaces == null) { (new Thread(() => { - _spaces = ConfluencePlugin.ConfluenceConnector.GetSpaceSummaries(); + _spaces = ConfluencePlugin.ConfluenceConnector.GetSpaceSummaries().OrderBy(s => s.Name).ToList(); _lastLoad = DateTime.Now; }) { Name = "Loading spaces for confluence"}).Start(); } diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index db890c16e..704ecd60e 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -165,7 +165,7 @@ namespace GreenshotPlugin.Core { } } } - return String.Empty; + return string.Empty; } } @@ -201,7 +201,7 @@ namespace GreenshotPlugin.Core { } } } - return String.Empty; + return string.Empty; } } @@ -217,6 +217,7 @@ namespace GreenshotPlugin.Core { } } + // TODO: Why again? if (captionList.Count > 0) { captionList.RemoveAt(captionList.Count - 1); } @@ -226,10 +227,8 @@ namespace GreenshotPlugin.Core { } - public List IETabUrls { + public IEnumerable IETabUrls { get { - var urlList = new List(); - foreach (Accessible accessor in Children) { foreach (var child in accessor.Children) { foreach (var tab in child.Children) { @@ -238,14 +237,12 @@ namespace GreenshotPlugin.Core { if (!string.IsNullOrEmpty(description)) { if (description.Contains(Environment.NewLine)) { var url = description.Substring(description.IndexOf(Environment.NewLine)).Trim(); - urlList.Add(url); + yield return url; } } } } } - - return urlList; } } diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 84950c05c..93984853c 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -25,6 +25,7 @@ using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; @@ -257,8 +258,8 @@ EndSelection:<<<<<<<4 || dataObject.GetDataPresent(FORMAT_GIF)) { return true; } - List imageFiles = GetImageFilenames(dataObject); - if (imageFiles != null && imageFiles.Count > 0) { + var imageFiles = GetImageFilenames(dataObject); + if (imageFiles.Any()) { return true; } if (dataObject.GetDataPresent(FORMAT_FILECONTENTS)) { @@ -315,19 +316,16 @@ EndSelection:<<<<<<<4 yield return singleImage; } else { // check if files are supplied - List imageFiles = GetImageFilenames(dataObject); - if (imageFiles != null) { - foreach (string imageFile in imageFiles) { - Image returnImage = null; - try { - returnImage = ImageHelper.LoadImage(imageFile); - } catch (Exception streamImageEx) { - Log.Error("Problem retrieving Image from clipboard.", streamImageEx); - } - if (returnImage != null) { - Log.InfoFormat("Got image from clipboard with size {0} and format {1}", returnImage.Size, returnImage.PixelFormat); - yield return returnImage; - } + foreach (string imageFile in GetImageFilenames(dataObject)) { + Image returnImage = null; + try { + returnImage = ImageHelper.LoadImage(imageFile); + } catch (Exception streamImageEx) { + Log.Error("Problem retrieving Image from clipboard.", streamImageEx); + } + if (returnImage != null) { + Log.InfoFormat("Got image from clipboard with size {0} and format {1}", returnImage.Size, returnImage.PixelFormat); + yield return returnImage; } } } @@ -818,22 +816,21 @@ EndSelection:<<<<<<<4 /// /// IDataObject /// - public static List GetImageFilenames(IDataObject dataObject) { - List filenames = new List(); + public static IEnumerable GetImageFilenames(IDataObject dataObject) { string[] dropFileNames = (string[]) dataObject.GetData(DataFormats.FileDrop); - try { - if (dropFileNames != null && dropFileNames.Length > 0) { - foreach (string filename in dropFileNames) { - string ext = Path.GetExtension(filename).ToLower(); - if ((ext == ".jpg") || (ext == ".jpeg") || (ext == ".tiff") || (ext == ".gif") || (ext == ".png") || (ext == ".bmp") || (ext == ".ico") || (ext == ".wmf")) { - filenames.Add(filename); - } + if (dropFileNames != null && dropFileNames.Length > 0) { + foreach (string filename in dropFileNames) { + if (string.IsNullOrEmpty(filename)) + { + continue; + } + string ext = Path.GetExtension(filename).ToLower().Substring(1); + if (ImageHelper.StreamConverters.ContainsKey(ext)) + { + yield return filename; } } - } catch (Exception ex) { - Log.Warn("Ignoring an issue with getting the dropFilenames from the clipboard: ", ex); } - return filenames; } /// diff --git a/GreenshotPlugin/Core/IEHelper.cs b/GreenshotPlugin/Core/IEHelper.cs index 2f3a2ea2f..01a806422 100644 --- a/GreenshotPlugin/Core/IEHelper.cs +++ b/GreenshotPlugin/Core/IEHelper.cs @@ -36,11 +36,9 @@ namespace GreenshotPlugin.Core { int version = 7; // Seeing if IE 9 is used, here we need another offset! using (RegistryKey ieKey = Registry.LocalMachine.OpenSubKey(IE_KEY, false)) { - if (ieKey != null) { - object versionKey = ieKey.GetValue("Version"); - if (versionKey != null) { - int.TryParse(versionKey.ToString().Substring(0,1), out version); - } + object versionKey = ieKey?.GetValue("Version"); + if (versionKey != null) { + int.TryParse(versionKey.ToString().Substring(0,1), out version); } } return version; @@ -55,21 +53,15 @@ namespace GreenshotPlugin.Core { if (browserWindowDetails == null) { return null; } - WindowDetails tmpWD = browserWindowDetails; + WindowDetails tmpWd = browserWindowDetails; // Since IE 9 the TabBandClass is less deep! if (IEVersion() < 9) { - tmpWD = tmpWD.GetChild("CommandBarClass"); - if (tmpWD != null) { - tmpWD = tmpWD.GetChild("ReBarWindow32"); - } + tmpWd = tmpWd.GetChild("CommandBarClass"); + tmpWd = tmpWd?.GetChild("ReBarWindow32"); } - if (tmpWD != null) { - tmpWD = tmpWD.GetChild("TabBandClass"); - } - if (tmpWD != null) { - tmpWD = tmpWD.GetChild("DirectUIHWND"); - } - return tmpWD; + tmpWd = tmpWd?.GetChild("TabBandClass"); + tmpWd = tmpWd?.GetChild("DirectUIHWND"); + return tmpWd; } /// @@ -77,24 +69,17 @@ namespace GreenshotPlugin.Core { /// /// public static IEnumerable GetIEUrls() { - List urls = new List(); // Find the IE window foreach (WindowDetails ieWindow in WindowDetails.GetAllWindows("IEFrame")) { WindowDetails directUIWD = GetDirectUI(ieWindow); if (directUIWD != null) { Accessible ieAccessible = new Accessible(directUIWD.Handle); - List ieUrls = ieAccessible.IETabUrls; - if (ieUrls != null && ieUrls.Count > 0) { - foreach(string url in ieUrls) { - if (!urls.Contains(url)) { - urls.Add(url); - } - } + foreach(string url in ieAccessible.IETabUrls) + { + yield return url; } } } - - return urls; } } } diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 9473464f8..e0193a71b 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -372,7 +372,7 @@ namespace GreenshotPlugin.Core { // Fixed lock problem Bug #3431881 using (Stream imageFileStream = File.OpenRead(filename)) { - fileImage = FromStream(imageFileStream); + fileImage = FromStream(imageFileStream, Path.GetExtension(filename)); } if (fileImage != null) { @@ -381,7 +381,6 @@ namespace GreenshotPlugin.Core { return fileImage; } - /// /// Based on: http://www.codeproject.com/KB/cs/IconExtractor.aspx /// And a hint from: http://www.codeproject.com/KB/cs/IconLib.aspx diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 4ca912e11..3b1803e95 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -42,10 +42,10 @@ namespace GreenshotPlugin.Core { /// Description of ImageOutput. /// public static class ImageOutput { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageOutput)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(ImageOutput)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private static readonly int PROPERTY_TAG_SOFTWARE_USED = 0x0131; - private static readonly Cache tmpFileCache = new Cache(10 * 60 * 60, RemoveExpiredTmpFile); + private static readonly Cache TmpFileCache = new Cache(10 * 60 * 60, RemoveExpiredTmpFile); /// /// Creates a PropertyItem (Metadata) to store with the image. @@ -71,7 +71,7 @@ namespace GreenshotPlugin.Core { propertyItem.Value = byteString; propertyItem.Len = text.Length + 1; } catch (Exception e) { - LOG.WarnFormat("Error creating a PropertyItem: {0}", e.Message); + Log.WarnFormat("Error creating a PropertyItem: {0}", e.Message); } return propertyItem; } @@ -87,8 +87,8 @@ namespace GreenshotPlugin.Core { bool disposeImage = CreateImageFromSurface(surface, outputSettings, out imageToSave); SaveToStream(imageToSave, surface, stream, outputSettings); // cleanup if needed - if (disposeImage && imageToSave != null) { - imageToSave.Dispose(); + if (disposeImage) { + imageToSave?.Dispose(); } } @@ -133,13 +133,13 @@ namespace GreenshotPlugin.Core { if (!Environment.OSVersion.IsWindows7OrLater()) { useMemoryStream = true; - LOG.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); + Log.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); } } imageFormat = ImageFormat.Png; break; } - LOG.DebugFormat("Saving image to stream with Format {0} and PixelFormat {1}", imageFormat, imageToSave.PixelFormat); + Log.DebugFormat("Saving image to stream with Format {0} and PixelFormat {1}", imageFormat, imageToSave.PixelFormat); // Check if we want to use a memory stream, to prevent a issue which happens with Windows before "7". // The save is made to the targetStream, this is directed to either the MemoryStream or the original @@ -156,8 +156,10 @@ namespace GreenshotPlugin.Core { { if (imageCodec.FormatID == imageFormat.Guid) { - EncoderParameters parameters = new EncoderParameters(1); - parameters.Param[0] = new EncoderParameter(Encoder.Quality, outputSettings.JPGQuality); + EncoderParameters parameters = new EncoderParameters(1) + { + Param = {[0] = new EncoderParameter(Encoder.Quality, outputSettings.JPGQuality)} + }; // Removing transparency if it's not supported in the output if (Image.IsAlphaPixelFormat(imageToSave.PixelFormat)) { @@ -195,7 +197,7 @@ namespace GreenshotPlugin.Core { AddTag(imageToSave); // Added for OptiPNG bool processed = false; - if (Equals(imageFormat, ImageFormat.Png) && !string.IsNullOrEmpty(conf.OptimizePNGCommand)) { + if (Equals(imageFormat, ImageFormat.Png) && !string.IsNullOrEmpty(CoreConfig.OptimizePNGCommand)) { processed = ProcessPngImageExternally(imageToSave, targetStream); } if (!processed) { @@ -225,10 +227,10 @@ namespace GreenshotPlugin.Core { } } } - } finally { - if (memoryStream != null) { - memoryStream.Dispose(); - } + } + finally + { + memoryStream?.Dispose(); } } @@ -239,29 +241,29 @@ namespace GreenshotPlugin.Core { /// stream to write the processed image to /// private static bool ProcessPngImageExternally(Image imageToProcess, Stream targetStream) { - if (string.IsNullOrEmpty(conf.OptimizePNGCommand)) { + if (string.IsNullOrEmpty(CoreConfig.OptimizePNGCommand)) { return false; } - if (!File.Exists(conf.OptimizePNGCommand)) { - LOG.WarnFormat("Can't find 'OptimizePNGCommand' {0}", conf.OptimizePNGCommand); + if (!File.Exists(CoreConfig.OptimizePNGCommand)) { + Log.WarnFormat("Can't find 'OptimizePNGCommand' {0}", CoreConfig.OptimizePNGCommand); return false; } string tmpFileName = Path.Combine(Path.GetTempPath(),Path.GetRandomFileName() + ".png"); try { using (FileStream tmpStream = File.Create(tmpFileName)) { - LOG.DebugFormat("Writing png to tmp file: {0}", tmpFileName); + Log.DebugFormat("Writing png to tmp file: {0}", tmpFileName); imageToProcess.Save(tmpStream, ImageFormat.Png); - if (LOG.IsDebugEnabled) { - LOG.DebugFormat("File size before processing {0}", new FileInfo(tmpFileName).Length); + if (Log.IsDebugEnabled) { + Log.DebugFormat("File size before processing {0}", new FileInfo(tmpFileName).Length); } } - if (LOG.IsDebugEnabled) { - LOG.DebugFormat("Starting : {0}", conf.OptimizePNGCommand); + if (Log.IsDebugEnabled) { + Log.DebugFormat("Starting : {0}", CoreConfig.OptimizePNGCommand); } - ProcessStartInfo processStartInfo = new ProcessStartInfo(conf.OptimizePNGCommand) + ProcessStartInfo processStartInfo = new ProcessStartInfo(CoreConfig.OptimizePNGCommand) { - Arguments = string.Format(conf.OptimizePNGCommandArguments, tmpFileName), + Arguments = string.Format(CoreConfig.OptimizePNGCommandArguments, tmpFileName), CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true, @@ -271,24 +273,24 @@ namespace GreenshotPlugin.Core { if (process != null) { process.WaitForExit(); if (process.ExitCode == 0) { - if (LOG.IsDebugEnabled) { - LOG.DebugFormat("File size after processing {0}", new FileInfo(tmpFileName).Length); - LOG.DebugFormat("Reading back tmp file: {0}", tmpFileName); + if (Log.IsDebugEnabled) { + Log.DebugFormat("File size after processing {0}", new FileInfo(tmpFileName).Length); + Log.DebugFormat("Reading back tmp file: {0}", tmpFileName); } byte[] processedImage = File.ReadAllBytes(tmpFileName); targetStream.Write(processedImage, 0, processedImage.Length); return true; } - LOG.ErrorFormat("Error while processing PNG image: {0}", process.ExitCode); - LOG.ErrorFormat("Output: {0}", process.StandardOutput.ReadToEnd()); - LOG.ErrorFormat("Error: {0}", process.StandardError.ReadToEnd()); + Log.ErrorFormat("Error while processing PNG image: {0}", process.ExitCode); + Log.ErrorFormat("Output: {0}", process.StandardOutput.ReadToEnd()); + Log.ErrorFormat("Error: {0}", process.StandardError.ReadToEnd()); } } } catch (Exception e) { - LOG.Error("Error while processing PNG image: ", e); + Log.Error("Error while processing PNG image: ", e); } finally { if (File.Exists(tmpFileName)) { - LOG.DebugFormat("Cleaning up tmp file: {0}", tmpFileName); + Log.DebugFormat("Cleaning up tmp file: {0}", tmpFileName); File.Delete(tmpFileName); } } @@ -334,20 +336,20 @@ namespace GreenshotPlugin.Core { } // check for color reduction, forced or automatically, only when the DisableReduceColors is false - if (outputSettings.DisableReduceColors || (!conf.OutputFileAutoReduceColors && !outputSettings.ReduceColors)) { + if (outputSettings.DisableReduceColors || (!CoreConfig.OutputFileAutoReduceColors && !outputSettings.ReduceColors)) { return disposeImage; } bool isAlpha = Image.IsAlphaPixelFormat(imageToSave.PixelFormat); - if (outputSettings.ReduceColors || (!isAlpha && conf.OutputFileAutoReduceColors)) { + if (outputSettings.ReduceColors || (!isAlpha && CoreConfig.OutputFileAutoReduceColors)) { using (var quantizer = new WuQuantizer((Bitmap)imageToSave)) { int colorCount = quantizer.GetColorCount(); - LOG.InfoFormat("Image with format {0} has {1} colors", imageToSave.PixelFormat, colorCount); + Log.InfoFormat("Image with format {0} has {1} colors", imageToSave.PixelFormat, colorCount); if (!outputSettings.ReduceColors && colorCount >= 256) { return disposeImage; } try { - LOG.Info("Reducing colors on bitmap to 256."); - tmpImage = quantizer.GetQuantizedImage(conf.OutputFileReduceColorsTo); + Log.Info("Reducing colors on bitmap to 256."); + tmpImage = quantizer.GetQuantizedImage(CoreConfig.OutputFileReduceColorsTo); if (disposeImage) { imageToSave.Dispose(); } @@ -355,11 +357,11 @@ namespace GreenshotPlugin.Core { // Make sure the "new" image is disposed disposeImage = true; } catch (Exception e) { - LOG.Warn("Error occurred while Quantizing the image, ignoring and using original. Error: ", e); + Log.Warn("Error occurred while Quantizing the image, ignoring and using original. Error: ", e); } } } else if (isAlpha && !outputSettings.ReduceColors) { - LOG.Info("Skipping 'optional' color reduction as the image has alpha"); + Log.Info("Skipping 'optional' color reduction as the image has alpha"); } return disposeImage; } @@ -375,7 +377,7 @@ namespace GreenshotPlugin.Core { try { imageToSave.SetPropertyItem(softwareUsedPropertyItem); } catch (Exception) { - LOG.WarnFormat("Couldn't set property {0}", softwareUsedPropertyItem.Id); + Log.WarnFormat("Couldn't set property {0}", softwareUsedPropertyItem.Id); } } } @@ -390,13 +392,13 @@ namespace GreenshotPlugin.Core { if (string.IsNullOrEmpty(fullPath)) { return null; } - LOG.InfoFormat("Loading image from file {0}", fullPath); + Log.InfoFormat("Loading image from file {0}", fullPath); // Fixed lock problem Bug #3431881 using (Stream surfaceFileStream = File.OpenRead(fullPath)) { returnSurface = ImageHelper.LoadGreenshotSurface(surfaceFileStream, returnSurface); } if (returnSurface != null) { - LOG.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", fullPath, returnSurface.Image.Width, returnSurface.Image.Height, returnSurface.Image.PixelFormat, returnSurface.Image.HorizontalResolution, returnSurface.Image.VerticalResolution); + Log.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", fullPath, returnSurface.Image.Width, returnSurface.Image.Height, returnSurface.Image.PixelFormat, returnSurface.Image.HorizontalResolution, returnSurface.Image.VerticalResolution); } return returnSurface; } @@ -421,7 +423,7 @@ namespace GreenshotPlugin.Core { throwingException.Data.Add("fullPath", fullPath); throw throwingException; } - LOG.DebugFormat("Saving surface to {0}", fullPath); + Log.DebugFormat("Saving surface to {0}", fullPath); // Create the stream and call SaveToStream using (FileStream stream = new FileStream(fullPath, FileMode.Create, FileAccess.Write)) { SaveToStream(surface, stream, outputSettings); @@ -444,7 +446,7 @@ namespace GreenshotPlugin.Core { try { format = (OutputFormat)Enum.Parse(typeof(OutputFormat), extension.ToLower()); } catch (ArgumentException ae) { - LOG.Warn("Couldn't parse extension: " + extension, ae); + Log.Warn("Couldn't parse extension: " + extension, ae); } return format; } @@ -466,12 +468,12 @@ namespace GreenshotPlugin.Core { try { string fileNameWithExtension = saveImageFileDialog.FileNameWithExtension; SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(FormatForFilename(fileNameWithExtension)); - if (conf.OutputFilePromptQuality) { + if (CoreConfig.OutputFilePromptQuality) { QualityDialog qualityDialog = new QualityDialog(outputSettings); qualityDialog.ShowDialog(); } // TODO: For now we always overwrite, should be changed - Save(surface, fileNameWithExtension, true, outputSettings, conf.OutputFileCopyPathToClipboard); + Save(surface, fileNameWithExtension, true, outputSettings, CoreConfig.OutputFileCopyPathToClipboard); returnValue = fileNameWithExtension; IniConfig.Save(); } catch (ExternalException) { @@ -492,8 +494,8 @@ namespace GreenshotPlugin.Core { /// /// Path to image file public static string SaveNamedTmpFile(ISurface surface, ICaptureDetails captureDetails, SurfaceOutputSettings outputSettings) { - string pattern = conf.OutputFileFilenamePattern; - if (pattern == null || string.IsNullOrEmpty(pattern.Trim())) { + string pattern = CoreConfig.OutputFileFilenamePattern; + if (string.IsNullOrEmpty(pattern?.Trim())) { pattern = "greenshot ${capturetime}"; } string filename = FilenameHelper.GetFilenameFromPattern(pattern, outputSettings.Format, captureDetails); @@ -503,13 +505,13 @@ namespace GreenshotPlugin.Core { filename = Regex.Replace(filename, @"_+", "_"); string tmpFile = Path.Combine(Path.GetTempPath(), filename); - LOG.Debug("Creating TMP File: " + tmpFile); + Log.Debug("Creating TMP File: " + tmpFile); // 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 try { Save(surface, tmpFile, true, outputSettings, false); - tmpFileCache.Add(tmpFile, tmpFile); + TmpFileCache.Add(tmpFile, tmpFile); } catch (Exception e) { // Show the problem MessageBox.Show(e.Message, "Error"); @@ -526,15 +528,15 @@ namespace GreenshotPlugin.Core { /// /// true if it worked public static bool DeleteNamedTmpFile(string tmpfile) { - LOG.Debug("Deleting TMP File: " + tmpfile); + Log.Debug("Deleting TMP File: " + tmpfile); try { if (File.Exists(tmpfile)) { File.Delete(tmpfile); - tmpFileCache.Remove(tmpfile); + TmpFileCache.Remove(tmpfile); } return true; } catch (Exception ex) { - LOG.Warn("Error deleting tmp file: ", ex); + Log.Warn("Error deleting tmp file: ", ex); } return false; } @@ -554,11 +556,11 @@ namespace GreenshotPlugin.Core { destinationPath = Path.GetTempPath(); } string tmpPath = Path.Combine(destinationPath, tmpFile); - LOG.Debug("Creating TMP File : " + tmpPath); + Log.Debug("Creating TMP File : " + tmpPath); try { Save(surface, tmpPath, true, outputSettings, false); - tmpFileCache.Add(tmpPath, tmpPath); + TmpFileCache.Add(tmpPath, tmpPath); } catch (Exception) { return null; } @@ -569,12 +571,12 @@ namespace GreenshotPlugin.Core { /// Cleanup all created tmpfiles /// public static void RemoveTmpFiles() { - foreach (string tmpFile in tmpFileCache.Elements) { + foreach (string tmpFile in TmpFileCache.Elements) { if (File.Exists(tmpFile)) { - LOG.DebugFormat("Removing old temp file {0}", tmpFile); + Log.DebugFormat("Removing old temp file {0}", tmpFile); File.Delete(tmpFile); } - tmpFileCache.Remove(tmpFile); + TmpFileCache.Remove(tmpFile); } } @@ -586,7 +588,7 @@ namespace GreenshotPlugin.Core { private static void RemoveExpiredTmpFile(string filekey, object filename) { string path = filename as string; if (path != null && File.Exists(path)) { - LOG.DebugFormat("Removing expired file {0}", path); + Log.DebugFormat("Removing expired file {0}", path); File.Delete(path); } } diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index 48f0e31ad..eae9ba0ec 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -80,30 +80,26 @@ namespace GreenshotPlugin.Core { set; } - private List _captureDestinations = new List(); - public List CaptureDestinations { - get {return _captureDestinations;} - set {_captureDestinations = value;} - } + public List CaptureDestinations { get; set; } = new List(); public void ClearDestinations() { - _captureDestinations.Clear(); + CaptureDestinations.Clear(); } public void RemoveDestination(IDestination destination) { - if (_captureDestinations.Contains(destination)) { - _captureDestinations.Remove(destination); + if (CaptureDestinations.Contains(destination)) { + CaptureDestinations.Remove(destination); } } public void AddDestination(IDestination captureDestination) { - if (!_captureDestinations.Contains(captureDestination)) { - _captureDestinations.Add(captureDestination); + if (!CaptureDestinations.Contains(captureDestination)) { + CaptureDestinations.Add(captureDestination); } } public bool HasDestination(string designation) { - foreach(IDestination destination in _captureDestinations) { + foreach(IDestination destination in CaptureDestinations) { if (designation.Equals(destination.Designation)) { return true; } diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index 5dbed379b..b26c5c405 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -24,6 +24,10 @@ + + ..\packages\LinqBridge.1.3.0\lib\net20\LinqBridge.dll + True + ..\Greenshot\Lib\log4net.dll @@ -223,4 +227,7 @@ + + + \ No newline at end of file diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index c0956a359..c56cc6570 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -75,16 +75,15 @@ namespace Greenshot.Plugin { public delegate void HotKeyHandler(); public class SurfaceOutputSettings { - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); - private bool reduceColors; - private bool disableReduceColors; - private readonly List effects = new List(); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private bool _reduceColors; + private bool _disableReduceColors; public SurfaceOutputSettings() { - disableReduceColors = false; - Format = conf.OutputFileFormat; - JPGQuality = conf.OutputFileJpegQuality; - ReduceColors = conf.OutputFileReduceColors; + _disableReduceColors = false; + Format = CoreConfig.OutputFileFormat; + JPGQuality = CoreConfig.OutputFileJpegQuality; + ReduceColors = CoreConfig.OutputFileReduceColors; } public SurfaceOutputSettings(OutputFormat format) : this() { @@ -121,11 +120,7 @@ namespace Greenshot.Plugin { set; } - public List Effects { - get { - return effects; - } - } + public List Effects { get; } = new List(); public bool ReduceColors { get { @@ -133,10 +128,10 @@ namespace Greenshot.Plugin { if (OutputFormat.gif.Equals(Format)) { return true; } - return reduceColors; + return _reduceColors; } set { - reduceColors = value; + _reduceColors = value; } } @@ -145,12 +140,12 @@ namespace Greenshot.Plugin { /// public bool DisableReduceColors { get { - return disableReduceColors; + return _disableReduceColors; } set { // Quantizing os needed when output format is gif as this has only 256 colors! if (!OutputFormat.gif.Equals(Format)) { - disableReduceColors = value; + _disableReduceColors = value; } } } diff --git a/GreenshotPlugin/packages.config b/GreenshotPlugin/packages.config new file mode 100644 index 000000000..6003a80e6 --- /dev/null +++ b/GreenshotPlugin/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index e7aa2bf80..88bef73b7 100644 --- a/build.ps1 +++ b/build.ps1 @@ -135,6 +135,7 @@ Function PackagePortable { @( "$sourcebase\checksum.MD5", "$sourcebase\Greenshot.exe.config", "$sourcebase\GreenshotPlugin.dll", + "$sourcebase\LinqBridge.dll", "$sourcebase\log4net.dll", "$sourcebase\log4net-portable.xml", "$destbase\additional_files\*.txt" ) | foreach { Copy-Item $_ "$destbase\portabletmp\App\Greenshot\" } @@ -208,6 +209,7 @@ Function PackageZip { "$sourcebase\Greenshot.exe", "$sourcebase\Greenshot.exe.config", "$sourcebase\GreenshotPlugin.dll", + "$sourcebase\LinqBridge.dll", "$sourcebase\log4net.dll", "$destbase\additional_files\*.txt" ) | foreach { Copy-Item $_ "$destzip\" } From 14086923df3f0d91a06cb0662e5752361b360527 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 6 Sep 2016 07:02:45 +0200 Subject: [PATCH 114/170] Added LinqBridge from correct location. --- Greenshot/releases/innosetup/setup.iss.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 8b6194c13..c89aaf6d0 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -18,8 +18,8 @@ Source: ..\..\bin\Release\Greenshot.exe; DestDir: {app}; Components: greenshot; Source: ..\..\bin\Release\GreenshotPlugin.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: ..\..\bin\Release\Greenshot.exe.config; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: ..\..\bin\Release\log4net.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion +Source: ..\..\bin\Release\LinqBridge.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion Source: ..\..\log4net.xml; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion -Source: ..\..\LinqBridge.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion Source: ..\..\bin\Release\checksum.MD5; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion ;Source: ..\greenshot-defaults.ini; DestDir: {app}; Flags: overwritereadonly ignoreversion replacesameversion Source: ..\additional_files\installer.txt; DestDir: {app}; Components: greenshot; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion From 35ed3b8d6055cb794737cda62b7fe18280a8bc8b Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 14 Sep 2016 10:50:40 +0200 Subject: [PATCH 115/170] BUG-2021 & BUG-2022: Fixes for exceptions. --- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 +- Greenshot/Drawing/Surface.cs | 2 +- Greenshot/Drawing/TextContainer.cs | 16 ++++-- .../DrawableContainerBoundsChangeMemento.cs | 2 +- .../Core/{Objects.cs => ObjectExtensions.cs} | 53 +++++++++++++------ GreenshotPlugin/GreenshotPlugin.csproj | 2 +- 6 files changed, 51 insertions(+), 26 deletions(-) rename GreenshotPlugin/Core/{Objects.cs => ObjectExtensions.cs} (60%) diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index e9ba4b282..0bbd395d3 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -153,7 +153,7 @@ namespace Greenshot.Drawing.Fields { ClearFields(); internalUpdateRunning = true; - foreach (Field field in FindCommonFields()) + foreach (var field in FindCommonFields()) { SetFieldValue(field.FieldType, field.Value); } diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 12199733d..cc727eb7b 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -1910,7 +1910,7 @@ namespace Greenshot.Drawing FieldAggregator.UnbindElement(container); if (generateEvents && _movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs {Elements = selectedElements}; + var eventArgs = new SurfaceElementEventArgs {Elements = selectedElements}; _movingElementChanged(this, eventArgs); } } diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 18a3e66f6..84deb9868 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -56,7 +56,8 @@ namespace Greenshot.Drawing /// The StringFormat object is not serializable!! /// [NonSerialized] - StringFormat _stringFormat = new StringFormat(); + private StringFormat _stringFormat = new StringFormat(); + public StringFormat StringFormat => _stringFormat; // Although the name is wrong, we can't change it due to file serialization @@ -172,8 +173,13 @@ namespace Greenshot.Drawing Height = textSize.Height + lineThickness; } - void TextContainer_PropertyChanged(object sender, PropertyChangedEventArgs e) + private void TextContainer_PropertyChanged(object sender, PropertyChangedEventArgs e) { + if (_textBox == null) + { + return; + } + if (_textBox.Visible) { _textBox.Invalidate(); @@ -203,7 +209,7 @@ namespace Greenshot.Drawing } } - void TextContainer_FieldChanged(object sender, FieldChangedEventArgs e) + private void TextContainer_FieldChanged(object sender, FieldChangedEventArgs e) { if (_textBox == null) { @@ -467,7 +473,7 @@ namespace Greenshot.Drawing _textBox.ForeColor = lineColor; } - void textBox_KeyDown(object sender, KeyEventArgs e) + private 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.None)) @@ -477,7 +483,7 @@ namespace Greenshot.Drawing } } - void textBox_LostFocus(object sender, EventArgs e) + private void textBox_LostFocus(object sender, EventArgs e) { // next change will be made undoable makeUndoable = true; diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index 48b94e91c..37564b694 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -80,7 +80,7 @@ namespace Greenshot.Memento var other = otherMemento as DrawableContainerBoundsChangeMemento; if (other != null) { - if (Objects.CompareLists(listOfdrawableContainer, other.listOfdrawableContainer)) + if (ObjectExtensions.CompareLists(listOfdrawableContainer, other.listOfdrawableContainer)) { // Lists are equal, as we have the state already we can ignore the new memento return true; diff --git a/GreenshotPlugin/Core/Objects.cs b/GreenshotPlugin/Core/ObjectExtensions.cs similarity index 60% rename from GreenshotPlugin/Core/Objects.cs rename to GreenshotPlugin/Core/ObjectExtensions.cs index 8a56ea73c..0e31fd5d5 100644 --- a/GreenshotPlugin/Core/Objects.cs +++ b/GreenshotPlugin/Core/ObjectExtensions.cs @@ -18,6 +18,7 @@ * 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; @@ -26,7 +27,10 @@ using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace GreenshotPlugin.Core { - public static class Objects { + /// + /// Extension methods which work for objects + /// + public static class ObjectExtensions { /// /// Perform a deep Copy of the object. @@ -34,41 +38,56 @@ namespace GreenshotPlugin.Core { /// The type of object being copied. /// The object instance to copy. /// The copied object. - public static T Clone(this T source) { - if (!typeof(T).IsSerializable) { - throw new ArgumentException("The type must be serializable.", "source"); + public static T Clone(this T source) + { + var typeparam = typeof(T); + if (!typeparam.IsInterface && !typeparam.IsSerializable) + { + throw new ArgumentException("The type must be serializable.", nameof(source)); } - + // Don't serialize a null object, simply return the default for that object - if (ReferenceEquals(source, null)) { + if (source == null) { return default(T); } IFormatter formatter = new BinaryFormatter(); - Stream stream = new MemoryStream(); - using (stream) { + using (var stream = new MemoryStream()) { formatter.Serialize(stream, source); stream.Seek(0, SeekOrigin.Begin); return (T)formatter.Deserialize(stream); } } + /// + /// Clone the content from source to destination + /// + /// Type to clone + /// Instance to copy from + /// Instance to copy to public static void CloneTo(this T source, T destination) { - Type type = typeof(T); - FieldInfo[] myObjectFields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + var type = typeof(T); + var myObjectFields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); - foreach (FieldInfo fi in myObjectFields) { - fi.SetValue(destination, fi.GetValue(source)); + foreach (var fieldInfo in myObjectFields) { + fieldInfo.SetValue(destination, fieldInfo.GetValue(source)); } - PropertyInfo[] myObjectProperties = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + var myObjectProperties = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); - foreach (PropertyInfo pi in myObjectProperties) { - if (pi.CanWrite) { - pi.SetValue(destination, pi.GetValue(source, null), null); + foreach (var propertyInfo in myObjectProperties) { + if (propertyInfo.CanWrite) { + propertyInfo.SetValue(destination, propertyInfo.GetValue(source, null), null); } } } - + + /// + /// Compare two lists + /// + /// + /// IList + /// IList + /// true if they are the same public static bool CompareLists(IList l1, IList l2) { if (l1.Count != l2.Count) { return false; diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index b26c5c405..608c8a10b 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -189,7 +189,7 @@ - + From 6efc7796b896b2b9c6d8d6ae834bb0ba93ac14c0 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 16 Sep 2016 21:48:57 +0200 Subject: [PATCH 116/170] BUG-1908: Made Greenshot recheck & add the external commands like Ms-Paint and Paint.NET if they are not deleted manually and not yet available. Also cleaned up some code. --- Greenshot/Controls/BindableToolStripButton.cs | 2 +- .../Controls/BindableToolStripComboBox.cs | 2 +- Greenshot/Controls/ColorButton.cs | 2 +- Greenshot/Controls/FontFamilyComboBox.cs | 4 +- Greenshot/Controls/MenuStripEx.cs | 2 +- Greenshot/Controls/ToolStripColorButton.cs | 2 +- Greenshot/Controls/ToolStripEx.cs | 4 +- .../Fields/AbstractFieldHolderWithChildren.cs | 3 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 +- Greenshot/Drawing/Surface.cs | 10 +- Greenshot/Forms/AboutForm.cs | 4 +- Greenshot/Forms/BugReportForm.cs | 4 +- Greenshot/Forms/CaptureForm.cs | 15 +- Greenshot/Forms/ColorDialog.cs | 17 ++- Greenshot/Forms/LanguageDialog.cs | 4 +- Greenshot/Forms/MainForm.cs | 71 +++++----- Greenshot/Forms/PrintOptionsDialog.cs | 6 +- Greenshot/Forms/SettingsForm.cs | 38 +++--- Greenshot/GreenshotMain.cs | 2 +- Greenshot/Helpers/PrintHelper.cs | 2 +- Greenshot/Helpers/ToolStripItemEndisabler.cs | 2 +- .../DrawableContainerBoundsChangeMemento.cs | 6 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 4 +- .../Forms/ConfluencePagePicker.xaml.cs | 12 +- .../Forms/ConfluenceUpload.xaml.cs | 6 +- GreenshotDropboxPlugin/DropboxDestination.cs | 2 +- .../ExternalCommandConfiguration.cs | 129 +++++++++++------- .../ExternalCommandDestination.cs | 30 ++-- .../ExternalCommandPlugin.cs | 49 ++++--- GreenshotExternalCommandPlugin/IconCache.cs | 6 +- .../SettingsForm.cs | 39 +++--- .../SettingsFormDetail.cs | 46 +++---- GreenshotImgurPlugin/Forms/ImgurHistory.cs | 4 +- GreenshotImgurPlugin/Forms/SettingsForm.cs | 4 +- .../GreenshotJiraPlugin.csproj | 8 +- GreenshotJiraPlugin/packages.config | 4 +- GreenshotOCRPlugin/SettingsForm.cs | 4 +- .../OfficeInterop/OutlookUtils.cs | 6 +- GreenshotPlugin/Controls/AnimatingForm.cs | 2 +- GreenshotPlugin/Controls/BackgroundForm.cs | 4 +- .../Controls/ExtendedWebBrowser.cs | 12 +- GreenshotPlugin/Controls/HotkeyControl.cs | 6 +- GreenshotPlugin/Controls/PleaseWaitForm.cs | 2 +- GreenshotPlugin/Controls/QualityDialog.cs | 8 +- GreenshotPlugin/Core/AnimationHelpers.cs | 4 +- GreenshotPlugin/Core/ImageHelper.cs | 13 +- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- GreenshotPlugin/Interop/COMWrapper.cs | 4 +- .../UnmanagedHelpers/Win32Errors.cs | 2 +- 49 files changed, 322 insertions(+), 294 deletions(-) diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index 29387610c..52dfcd3e8 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -41,7 +41,7 @@ namespace Greenshot.Controls { CheckedChanged += BindableToolStripButton_CheckedChanged; } - void BindableToolStripButton_CheckedChanged(object sender, EventArgs e) { + private 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 index 639bb9637..14560ca12 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -41,7 +41,7 @@ namespace Greenshot.Controls { SelectedIndexChanged += BindableToolStripComboBox_SelectedIndexChanged; } - void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) { + private void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) { if(PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index 92f4c7d8b..50546a3d8 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -67,7 +67,7 @@ namespace Greenshot.Controls { } } - void ColorButtonClick(object sender, EventArgs e) { + private void ColorButtonClick(object sender, EventArgs e) { ColorDialog colorDialog = ColorDialog.GetInstance(); colorDialog.Color = SelectedColor; // Using the parent to make sure the dialog doesn't show on another window diff --git a/Greenshot/Controls/FontFamilyComboBox.cs b/Greenshot/Controls/FontFamilyComboBox.cs index 7b1e4183b..53a89111a 100644 --- a/Greenshot/Controls/FontFamilyComboBox.cs +++ b/Greenshot/Controls/FontFamilyComboBox.cs @@ -53,7 +53,7 @@ namespace Greenshot.Controls { } } - void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { + private void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { // DrawBackground handles drawing the background (i.e,. hot-tracked v. not) // It uses the system colors (Bluish, and and white, by default) // same as calling e.Graphics.FillRectangle ( SystemBrushes.Highlight, e.Bounds ); @@ -108,7 +108,7 @@ namespace Greenshot.Controls { } } - void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) { + private void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Text")); PropertyChanged(this, new PropertyChangedEventArgs("FontFamily")); diff --git a/Greenshot/Controls/MenuStripEx.cs b/Greenshot/Controls/MenuStripEx.cs index b2b1d0fc1..b8f1ab264 100644 --- a/Greenshot/Controls/MenuStripEx.cs +++ b/Greenshot/Controls/MenuStripEx.cs @@ -29,7 +29,7 @@ namespace Greenshot.Controls { public class MenuStripEx : MenuStrip { private const int WM_MOUSEACTIVATE = 0x21; - enum NativeConstants : uint { + private enum NativeConstants : uint { MA_ACTIVATE = 1, MA_ACTIVATEANDEAT = 2, } diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index c4d5d3808..05391bfd7 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -65,7 +65,7 @@ namespace Greenshot.Controls { } } - void ColorButtonClick(object sender, EventArgs e) { + private void ColorButtonClick(object sender, EventArgs e) { ColorDialog colorDialog = ColorDialog.GetInstance(); colorDialog.Color = SelectedColor; // Using the parent to make sure the dialog doesn't show on another window diff --git a/Greenshot/Controls/ToolStripEx.cs b/Greenshot/Controls/ToolStripEx.cs index c93e51653..1298db21f 100644 --- a/Greenshot/Controls/ToolStripEx.cs +++ b/Greenshot/Controls/ToolStripEx.cs @@ -26,10 +26,10 @@ namespace Greenshot.Controls { /// This is an extension of the default ToolStrip and allows us to click it even when the form doesn't have focus. /// See: http://blogs.msdn.com/b/rickbrew/archive/2006/01/09/511003.aspx /// - class ToolStripEx : ToolStrip { + internal class ToolStripEx : ToolStrip { private const int WM_MOUSEACTIVATE = 0x21; - enum NativeConstants : uint { + private enum NativeConstants : uint { MA_ACTIVATE = 1, MA_ACTIVATEANDEAT = 2, } diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index 21922cc1b..55c810d27 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -34,8 +34,7 @@ namespace Greenshot.Drawing.Fields [Serializable()] public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder { - - FieldChangedEventHandler fieldChangedEventHandler; + private FieldChangedEventHandler fieldChangedEventHandler; [NonSerialized] private EventHandler childrenChanged; diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 0bbd395d3..efeab79bd 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -47,7 +47,7 @@ namespace Greenshot.Drawing.Fields private IDrawableContainerList boundContainers; private bool internalUpdateRunning = false; - enum Status { IDLE, BINDING, UPDATING }; + private enum Status { IDLE, BINDING, UPDATING }; private static readonly ILog LOG = LogManager.GetLogger(typeof(FieldAggregator)); private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection(); diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index cc727eb7b..3edf59364 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -1169,7 +1169,7 @@ namespace Greenshot.Drawing /// /// /// - void SurfaceMouseDown(object sender, MouseEventArgs e) + private void SurfaceMouseDown(object sender, MouseEventArgs e) { // Handle Adorners @@ -1261,7 +1261,7 @@ namespace Greenshot.Drawing /// /// /// - void SurfaceMouseUp(object sender, MouseEventArgs e) + private void SurfaceMouseUp(object sender, MouseEventArgs e) { // Handle Adorners @@ -1350,7 +1350,7 @@ namespace Greenshot.Drawing /// /// /// - void SurfaceMouseMove(object sender, MouseEventArgs e) + private void SurfaceMouseMove(object sender, MouseEventArgs e) { // Handle Adorners var adorner = FindActiveAdorner(e); @@ -1417,7 +1417,7 @@ namespace Greenshot.Drawing /// /// /// - void SurfaceDoubleClick(object sender, MouseEventArgs e) + private void SurfaceDoubleClick(object sender, MouseEventArgs e) { selectedElements.OnDoubleClick(); selectedElements.Invalidate(); @@ -1459,7 +1459,7 @@ namespace Greenshot.Drawing /// /// /// PaintEventArgs - void SurfacePaint(object sender, PaintEventArgs paintEventArgs) + private void SurfacePaint(object sender, PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; Rectangle clipRectangle = paintEventArgs.ClipRectangle; diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index 8bca7f2eb..e35d281e7 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -116,7 +116,7 @@ namespace Greenshot { // 18 19 20 21 22 23 // The order in which we draw the dots & flow the collors. - readonly List flowOrder = new List() { 4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 22, 23, 16, 17, 13, 12, 11 }; + private readonly List flowOrder = new List() { 4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 22, 23, 16, 17, 13, 12, 11 }; /// /// Cleanup all the allocated resources @@ -211,7 +211,7 @@ namespace Greenshot { /// /// /// - void LinkLabelClicked(object sender, LinkLabelLinkClickedEventArgs e) { + private void LinkLabelClicked(object sender, LinkLabelLinkClickedEventArgs e) { LinkLabel linkLabel = sender as LinkLabel; if (linkLabel != null) { try { diff --git a/Greenshot/Forms/BugReportForm.cs b/Greenshot/Forms/BugReportForm.cs index 08c28c5ef..9cf72b968 100644 --- a/Greenshot/Forms/BugReportForm.cs +++ b/Greenshot/Forms/BugReportForm.cs @@ -37,8 +37,8 @@ namespace Greenshot.Forms { public BugReportForm(string bugText) : this() { textBoxDescription.Text = bugText; } - - void LinkLblBugsLinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { + + private void LinkLblBugsLinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { openLink((LinkLabel)sender); } diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index d4a9f0512..0f34ca0ab 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -185,7 +185,7 @@ namespace Greenshot.Forms { /// /// Create an animation for the zoomer, depending on if it's active or not. /// - void InitializeZoomer(bool isOn) { + private void InitializeZoomer(bool isOn) { if (isOn) { // Initialize the zoom with a invalid position _zoomAnimator = new RectangleAnimator(Rectangle.Empty, new Rectangle(int.MaxValue, int.MaxValue, 0, 0), FramesForMillis(1000), EasingType.Quintic, EasingMode.EaseOut); @@ -196,7 +196,8 @@ namespace Greenshot.Forms { } #region key handling - void CaptureFormKeyUp(object sender, KeyEventArgs e) { + + private void CaptureFormKeyUp(object sender, KeyEventArgs e) { switch(e.KeyCode) { case Keys.ShiftKey: _fixMode = FixMode.None; @@ -212,7 +213,7 @@ namespace Greenshot.Forms { /// /// /// - void CaptureFormKeyDown(object sender, KeyEventArgs e) { + private void CaptureFormKeyDown(object sender, KeyEventArgs e) { int step = _isCtrlPressed ? 10 : 1; switch (e.KeyCode) { @@ -319,7 +320,7 @@ namespace Greenshot.Forms { /// /// /// - void OnMouseDown(object sender, MouseEventArgs e) { + private void OnMouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { HandleMouseDown(); } @@ -360,7 +361,7 @@ namespace Greenshot.Forms { /// /// /// - void OnMouseUp(object sender, MouseEventArgs e) { + private void OnMouseUp(object sender, MouseEventArgs e) { if (_mouseDown) { HandleMouseUp(); } @@ -392,7 +393,7 @@ namespace Greenshot.Forms { /// /// /// - void OnMouseMove(object sender, MouseEventArgs e) { + private void OnMouseMove(object sender, MouseEventArgs e) { // Make sure the mouse coordinates are fixed, when pressing shift _mouseMovePos = FixMouseCoordinates(User32.GetCursorLocation()); _mouseMovePos = WindowCapture.GetLocationRelativeToScreenBounds(_mouseMovePos); @@ -704,7 +705,7 @@ namespace Greenshot.Forms { /// /// /// - void OnPaint(object sender, PaintEventArgs e) { + private void OnPaint(object sender, PaintEventArgs e) { Graphics graphics = e.Graphics; Rectangle clipRectangle = e.ClipRectangle; //graphics.BitBlt((Bitmap)buffer, Point.Empty); diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index 4c2bcbe9f..d4428b407 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -165,7 +165,8 @@ namespace Greenshot { #endregion #region textbox event handlers - void TextBoxHexadecimalTextChanged(object sender, EventArgs e) { + + private void TextBoxHexadecimalTextChanged(object sender, EventArgs e) { if (_updateInProgress) { return; } @@ -188,7 +189,7 @@ namespace Greenshot { PreviewColor(opaqueColor, textBox); } - void TextBoxRGBTextChanged(object sender, EventArgs e) { + private void TextBoxRGBTextChanged(object sender, EventArgs e) { if (_updateInProgress) { return; } @@ -196,11 +197,11 @@ namespace Greenshot { PreviewColor(Color.FromArgb(GetColorPartIntFromString(textBoxAlpha.Text), GetColorPartIntFromString(textBoxRed.Text), GetColorPartIntFromString(textBoxGreen.Text), GetColorPartIntFromString(textBoxBlue.Text)), textBox); } - void TextBoxGotFocus(object sender, EventArgs e) { + private void TextBoxGotFocus(object sender, EventArgs e) { textBoxHtmlColor.SelectAll(); } - void TextBoxKeyDown(object sender, KeyEventArgs e) { + private void TextBoxKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Enter) { AddToRecentColors(colorPanel.BackColor); } @@ -208,15 +209,17 @@ namespace Greenshot { #endregion #region button event handlers - void ColorButtonClick(object sender, EventArgs e) { + + private void ColorButtonClick(object sender, EventArgs e) { Button b = (Button)sender; PreviewColor(b.BackColor, b); } - void BtnTransparentClick(object sender, EventArgs e) { + private void BtnTransparentClick(object sender, EventArgs e) { ColorButtonClick(sender, e); } - void BtnApplyClick(object sender, EventArgs e) { + + private void BtnApplyClick(object sender, EventArgs e) { DialogResult = DialogResult.OK; Hide(); AddToRecentColors(colorPanel.BackColor); diff --git a/Greenshot/Forms/LanguageDialog.cs b/Greenshot/Forms/LanguageDialog.cs index ed77a1c8a..c043017da 100644 --- a/Greenshot/Forms/LanguageDialog.cs +++ b/Greenshot/Forms/LanguageDialog.cs @@ -78,8 +78,8 @@ namespace Greenshot.Forms { Close(); } } - - void BtnOKClick(object sender, EventArgs e) { + + private void BtnOKClick(object sender, EventArgs e) { properOkPressed = true; // Fix for Bug #3431100 Language.CurrentLanguage = SelectedLanguage; diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 7beee15f5..5c4a9d0a8 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -648,24 +648,26 @@ namespace Greenshot { #region mainform events - void MainFormFormClosing(object sender, FormClosingEventArgs e) { + + private void MainFormFormClosing(object sender, FormClosingEventArgs e) { LOG.DebugFormat("Mainform closing, reason: {0}", e.CloseReason); _instance = null; Exit(); } - void MainFormActivated(object sender, EventArgs e) { + private void MainFormActivated(object sender, EventArgs e) { Hide(); ShowInTaskbar = false; } #endregion #region key handlers - void CaptureRegion() { + + private void CaptureRegion() { CaptureHelper.CaptureRegion(true); } - void CaptureFile() { + private void CaptureFile() { var openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image files (*.greenshot, *.png, *.jpg, *.gif, *.bmp, *.ico, *.tiff, *.wmf)|*.greenshot; *.png; *.jpg; *.jpeg; *.gif; *.bmp; *.ico; *.tiff; *.tif; *.wmf"; if (openFileDialog.ShowDialog() == DialogResult.OK) { @@ -675,21 +677,21 @@ namespace Greenshot { } } - void CaptureFullScreen() { + private void CaptureFullScreen() { CaptureHelper.CaptureFullscreen(true, _conf.ScreenCaptureMode); } - void CaptureLastRegion() { + private void CaptureLastRegion() { CaptureHelper.CaptureLastRegion(true); } - void CaptureIE() { + private void CaptureIE() { if (_conf.IECapture) { CaptureHelper.CaptureIE(true, null); } } - void CaptureWindow() { + private void CaptureWindow() { if (_conf.CaptureWindowsInteractive) { CaptureHelper.CaptureWindowInteractive(true); } else { @@ -700,7 +702,8 @@ namespace Greenshot { #region contextmenu - void ContextMenuOpening(object sender, CancelEventArgs e) { + + private void ContextMenuOpening(object sender, CancelEventArgs e) { contextmenu_captureclipboard.Enabled = ClipboardHelper.ContainsImage(); contextmenu_capturelastregion.Enabled = coreConfiguration.LastCapturedRegion != Rectangle.Empty; @@ -735,8 +738,8 @@ namespace Greenshot { contextmenu_donate.Image = (Image)resources.GetObject("contextmenu_present.Image"); } } - - void ContextMenuClosing(object sender, EventArgs e) { + + private void ContextMenuClosing(object sender, EventArgs e) { contextmenu_captureiefromlist.DropDownItems.Clear(); contextmenu_capturewindowfromlist.DropDownItems.Clear(); CleanupThumbnail(); @@ -745,7 +748,7 @@ namespace Greenshot { /// /// Build a selectable list of IE tabs when we enter the menu item /// - void CaptureIEMenuDropDownOpening(object sender, EventArgs e) { + private void CaptureIEMenuDropDownOpening(object sender, EventArgs e) { if (!_conf.IECapture) { return; } @@ -903,43 +906,43 @@ namespace Greenshot { } } - void CaptureAreaToolStripMenuItemClick(object sender, EventArgs e) { + private void CaptureAreaToolStripMenuItemClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureRegion(false); }); } - void CaptureClipboardToolStripMenuItemClick(object sender, EventArgs e) { + private void CaptureClipboardToolStripMenuItemClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureClipboard(); }); } - - void OpenFileToolStripMenuItemClick(object sender, EventArgs e) { + + private void OpenFileToolStripMenuItemClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { CaptureFile(); }); } - void CaptureFullScreenToolStripMenuItemClick(object sender, EventArgs e) { + private void CaptureFullScreenToolStripMenuItemClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureFullscreen(false, _conf.ScreenCaptureMode); }); } - - void Contextmenu_capturelastregionClick(object sender, EventArgs e) { + + private void Contextmenu_capturelastregionClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureLastRegion(false); }); } - - void Contextmenu_capturewindow_Click(object sender,EventArgs e) { + + private void Contextmenu_capturewindow_Click(object sender,EventArgs e) { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureWindowInteractive(false); }); } - void Contextmenu_capturewindowfromlist_Click(object sender,EventArgs e) { + private void Contextmenu_capturewindowfromlist_Click(object sender,EventArgs e) { ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; BeginInvoke((MethodInvoker)delegate { try { @@ -950,12 +953,12 @@ namespace Greenshot { } }); } - - void Contextmenu_captureie_Click(object sender, EventArgs e) { + + private void Contextmenu_captureie_Click(object sender, EventArgs e) { CaptureIE(); } - void Contextmenu_captureiefromlist_Click(object sender, EventArgs e) { + private void Contextmenu_captureiefromlist_Click(object sender, EventArgs e) { if (!_conf.IECapture) { LOG.InfoFormat("IE Capture is disabled."); return; @@ -985,7 +988,7 @@ namespace Greenshot { /// /// /// - void Contextmenu_donateClick(object sender, EventArgs e) { + private void Contextmenu_donateClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { Process.Start("http://getgreenshot.org/support/"); }); @@ -996,7 +999,7 @@ namespace Greenshot { /// /// /// - void Contextmenu_settingsClick(object sender, EventArgs e) { + private void Contextmenu_settingsClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { ShowSetting(); }); @@ -1026,7 +1029,7 @@ namespace Greenshot { /// /// /// - void Contextmenu_aboutClick(object sender, EventArgs e) { + private void Contextmenu_aboutClick(object sender, EventArgs e) { ShowAbout(); } @@ -1049,7 +1052,7 @@ namespace Greenshot { /// /// /// - void Contextmenu_helpClick(object sender, EventArgs e) { + private void Contextmenu_helpClick(object sender, EventArgs e) { HelpFileLoader.LoadHelp(); } @@ -1058,7 +1061,7 @@ namespace Greenshot { /// /// /// - void Contextmenu_exitClick(object sender, EventArgs e) { + private void Contextmenu_exitClick(object sender, EventArgs e) { Exit(); } @@ -1150,8 +1153,8 @@ namespace Greenshot { contextmenu_quicksettings.DropDownItems.Add(selectList); } } - - void QuickSettingCaptureModeChanged(object sender, EventArgs e) { + + private void QuickSettingCaptureModeChanged(object sender, EventArgs e) { ToolStripMenuSelectListItem item = ((ItemCheckedChangedEventArgs)e).Item; WindowCaptureMode windowsCaptureMode = (WindowCaptureMode)item.Data; if (item.Checked) { @@ -1159,7 +1162,7 @@ namespace Greenshot { } } - void QuickSettingBoolItemChanged(object sender, EventArgs e) { + private void QuickSettingBoolItemChanged(object sender, EventArgs e) { ToolStripMenuSelectListItem item = ((ItemCheckedChangedEventArgs)e).Item; IniValue iniValue = item.Data as IniValue; if (iniValue != null) { @@ -1168,7 +1171,7 @@ namespace Greenshot { } } - void QuickSettingDestinationChanged(object sender, EventArgs e) { + private void QuickSettingDestinationChanged(object sender, EventArgs e) { ToolStripMenuSelectListItem item = ((ItemCheckedChangedEventArgs)e).Item; IDestination selectedDestination = (IDestination)item.Data; if (item.Checked) { diff --git a/Greenshot/Forms/PrintOptionsDialog.cs b/Greenshot/Forms/PrintOptionsDialog.cs index 18313498e..34884d402 100644 --- a/Greenshot/Forms/PrintOptionsDialog.cs +++ b/Greenshot/Forms/PrintOptionsDialog.cs @@ -34,9 +34,9 @@ namespace Greenshot.Forms { InitializeComponent(); checkbox_dontaskagain.Checked = false; } - - - void Button_okClick(object sender, EventArgs e) { + + + private void Button_okClick(object sender, EventArgs e) { // update config coreConfiguration.OutputPrintPromptOptions = !checkbox_dontaskagain.Checked; IniConfig.Save(); diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 00588bdee..21a584fe2 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -467,12 +467,12 @@ namespace Greenshot { LOG.Warn("Problem checking registry, ignoring for now: ", e); } } - - void Settings_cancelClick(object sender, EventArgs e) { + + private void Settings_cancelClick(object sender, EventArgs e) { DialogResult = DialogResult.Cancel; } - - void Settings_okayClick(object sender, EventArgs e) { + + private void Settings_okayClick(object sender, EventArgs e) { if (CheckSettings()) { HotkeyControl.UnregisterHotkeys(); SaveSettings(); @@ -486,8 +486,8 @@ namespace Greenshot { tabcontrol.SelectTab(tab_output); } } - - void BrowseClick(object sender, EventArgs e) { + + private void BrowseClick(object sender, EventArgs e) { // Get the storage location and replace the environment variables folderBrowserDialog1.SelectedPath = FilenameHelper.FillVariables(textbox_storagelocation.Text, false); if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { @@ -497,28 +497,28 @@ namespace Greenshot { } } } - - void TrackBarJpegQualityScroll(object sender, EventArgs e) { + + private void TrackBarJpegQualityScroll(object sender, EventArgs e) { textBoxJpegQuality.Text = trackBarJpegQuality.Value.ToString(CultureInfo.InvariantCulture); } - - void BtnPatternHelpClick(object sender, EventArgs e) { + + private void BtnPatternHelpClick(object sender, EventArgs e) { string filenamepatternText = Language.GetString(LangKey.settings_message_filenamepattern); // Convert %NUM% to ${NUM} for old language files! filenamepatternText = Regex.Replace(filenamepatternText, "%([a-zA-Z_0-9]+)%", @"${$1}"); MessageBox.Show(filenamepatternText, Language.GetString(LangKey.settings_filenamepattern)); } - - void Listview_pluginsSelectedIndexChanged(object sender, EventArgs e) { + + private void Listview_pluginsSelectedIndexChanged(object sender, EventArgs e) { button_pluginconfigure.Enabled = PluginHelper.Instance.isSelectedItemConfigurable(listview_plugins); } - - void Button_pluginconfigureClick(object sender, EventArgs e) { + + private void Button_pluginconfigureClick(object sender, EventArgs e) { PluginHelper.Instance.ConfigureSelectedItem(listview_plugins); } - void Combobox_languageSelectedIndexChanged(object sender, EventArgs e) { + private void Combobox_languageSelectedIndexChanged(object sender, EventArgs e) { // Get the combobox values BEFORE changing the language //EmailFormat selectedEmailFormat = GetSelected(combobox_emailformat); WindowCaptureMode selectedWindowCaptureMode = GetSelected(combobox_window_capture_mode); @@ -536,8 +536,8 @@ namespace Greenshot { //SetEmailFormat(selectedEmailFormat); SetWindowCaptureMode(selectedWindowCaptureMode); } - - void Combobox_window_capture_modeSelectedIndexChanged(object sender, EventArgs e) { + + private void Combobox_window_capture_modeSelectedIndexChanged(object sender, EventArgs e) { int windowsVersion = Environment.OSVersion.Version.Major; WindowCaptureMode mode = GetSelected(combobox_window_capture_mode); if (windowsVersion >= 6) { @@ -553,7 +553,7 @@ namespace Greenshot { /// /// Check the destination settings /// - void CheckDestinationSettings() { + private void CheckDestinationSettings() { bool clipboardDestinationChecked = false; bool pickerSelected = checkbox_picker.Checked; bool destinationsEnabled = true; @@ -588,7 +588,7 @@ namespace Greenshot { } } - void DestinationsCheckStateChanged(object sender, EventArgs e) { + private void DestinationsCheckStateChanged(object sender, EventArgs e) { CheckDestinationSettings(); } diff --git a/Greenshot/GreenshotMain.cs b/Greenshot/GreenshotMain.cs index 849b01b1a..150e2aecb 100644 --- a/Greenshot/GreenshotMain.cs +++ b/Greenshot/GreenshotMain.cs @@ -32,7 +32,7 @@ namespace Greenshot { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; } - static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { + private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { Assembly ayResult = null; string sShortAssemblyName = args.Name.Split(',')[0]; Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies(); diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index 65c32e939..95b01552c 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -155,7 +155,7 @@ namespace Greenshot.Helpers { return ret; } - void DrawImageForPrint(object sender, PrintPageEventArgs e) { + private void DrawImageForPrint(object sender, PrintPageEventArgs e) { // Create the output settins diff --git a/Greenshot/Helpers/ToolStripItemEndisabler.cs b/Greenshot/Helpers/ToolStripItemEndisabler.cs index f074f5e44..dc62f4cc7 100644 --- a/Greenshot/Helpers/ToolStripItemEndisabler.cs +++ b/Greenshot/Helpers/ToolStripItemEndisabler.cs @@ -29,7 +29,7 @@ namespace Greenshot.Helpers { /// public static class ToolStripItemEndisabler { [Flags] - enum PropagationMode {NONE=0, CHILDREN=1, ANCESTORS=2}; + private enum PropagationMode {NONE=0, CHILDREN=1, ANCESTORS=2}; /// /// Enables all of a ToolStrip's children (recursively), diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index 37564b694..01f372b10 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -31,9 +31,9 @@ namespace Greenshot.Memento /// public class DrawableContainerBoundsChangeMemento : IMemento { - List points = new List(); - List sizes = new List(); - IDrawableContainerList listOfdrawableContainer; + private List points = new List(); + private List sizes = new List(); + private IDrawableContainerList listOfdrawableContainer; private void StoreBounds() { diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index deee806a0..d194fddcb 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -38,8 +38,8 @@ namespace GreenshotConfluencePlugin { this.config = config; InitializeComponent(); } - - void Button_OK_Click(object sender, RoutedEventArgs e) { + + private void Button_OK_Click(object sender, RoutedEventArgs e) { DialogResult = true; } } diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index cbaa66438..cc237ccbe 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -35,12 +35,12 @@ namespace GreenshotConfluencePlugin { DataContext = pagesToPick; InitializeComponent(); } - - void PageListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { + + private void PageListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { SelectionChanged(); } - - void SelectionChanged() { + + private void SelectionChanged() { if (PageListView.HasItems && PageListView.SelectedItems.Count > 0) { confluenceUpload.SelectedPage = (Page)PageListView.SelectedItem; // Make sure the uploader knows we selected an already opened page @@ -49,8 +49,8 @@ namespace GreenshotConfluencePlugin { confluenceUpload.SelectedPage = null; } } - - void Page_Loaded(object sender, System.Windows.RoutedEventArgs e) { + + private void Page_Loaded(object sender, System.Windows.RoutedEventArgs e) { SelectionChanged(); } } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs index a9326887a..82424d5c7 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceUpload.xaml.cs @@ -110,8 +110,8 @@ namespace GreenshotConfluencePlugin { SearchTab.IsSelected = true; } } - - void UpdateSpaces() { + + private void UpdateSpaces() { if (_spaces != null && DateTime.Now.AddMinutes(-60).CompareTo(_lastLoad) > 0) { // Reset _spaces = null; @@ -125,7 +125,7 @@ namespace GreenshotConfluencePlugin { } } - void Upload_Click(object sender, RoutedEventArgs e) { + private void Upload_Click(object sender, RoutedEventArgs e) { DialogResult = true; } } diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index 004b20334..4faf9f9a1 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -24,7 +24,7 @@ using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; namespace GreenshotDropboxPlugin { - class DropboxDestination : AbstractDestination { + internal class DropboxDestination : AbstractDestination { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DropboxDestination)); private static readonly DropboxPluginConfiguration config = IniConfig.GetIniSection(); diff --git a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs index ea845fb6e..d6aae0d1f 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandConfiguration.cs @@ -52,28 +52,85 @@ namespace ExternalCommand { public bool UriToClipboard { get; set; } [IniProperty("Commandline", Description="The commandline for the output command.")] - public Dictionary commandlines { get; set; } + public Dictionary Commandline { get; set; } [IniProperty("Argument", Description="The arguments for the output command.")] - public Dictionary arguments { get; set; } + public Dictionary Argument { get; set; } [IniProperty("RunInbackground", Description = "Should the command be started in the background.")] - public Dictionary runInbackground { get; set; } + public Dictionary RunInbackground { get; set; } - private const string MSPAINT = "MS Paint"; - private static readonly string paintPath; - private static readonly bool hasPaint = false; + [IniProperty("DeletedBuildInCommands", Description = "If a build in command was deleted manually, it should not be recreated.")] + public List DeletedBuildInCommands { get; set; } - private const string PAINTDOTNET = "Paint.NET"; - private static readonly string paintDotNetPath; - private static readonly bool hasPaintDotNet = false; + private const string MsPaint = "MS Paint"; + private static readonly string PaintPath; + private static readonly bool HasPaint; + + private const string PaintDotNet = "Paint.NET"; + private static readonly string PaintDotNetPath; + private static readonly bool HasPaintDotNet; static ExternalCommandConfiguration() { try { - paintPath = PluginUtils.GetExePath("pbrush.exe"); - hasPaint = !string.IsNullOrEmpty(paintPath) && File.Exists(paintPath); - paintDotNetPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Paint.NET\PaintDotNet.exe"); - hasPaintDotNet = !string.IsNullOrEmpty(paintDotNetPath) && File.Exists(paintDotNetPath); + PaintPath = PluginUtils.GetExePath("pbrush.exe"); + HasPaint = !string.IsNullOrEmpty(PaintPath) && File.Exists(PaintPath); } catch { + // Ignore + } + try + { + PaintDotNetPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Paint.NET\PaintDotNet.exe"); + HasPaintDotNet = !string.IsNullOrEmpty(PaintDotNetPath) && File.Exists(PaintDotNetPath); + } + catch + { + // Ignore + } + } + + /// + /// Delete the configuration for the specified command + /// + /// string with command + public void Delete(string command) + { + if (string.IsNullOrEmpty(command)) + { + return; + } + Commands.Remove(command); + Commandline.Remove(command); + Argument.Remove(command); + RunInbackground.Remove(command); + if (MsPaint.Equals(command) || PaintDotNet.Equals(command)) + { + if (!DeletedBuildInCommands.Contains(command)) + { + DeletedBuildInCommands.Add(command); + } + } + } + + public override void AfterLoad() + { + base.AfterLoad(); + + // Check if we need to add MsPaint + if (HasPaint && !Commands.Contains(MsPaint) && !DeletedBuildInCommands.Contains(MsPaint)) + { + Commands.Add(MsPaint); + Commandline.Add(MsPaint, PaintPath); + Argument.Add(MsPaint, "\"{0}\""); + RunInbackground.Add(MsPaint, true); + } + + // Check if we need to add Paint.NET + if (HasPaintDotNet && !Commands.Contains(PaintDotNet) && !DeletedBuildInCommands.Contains(PaintDotNet)) + { + Commands.Add(PaintDotNet); + Commandline.Add(PaintDotNet, PaintDotNetPath); + Argument.Add(PaintDotNet, "\"{0}\""); + RunInbackground.Add(PaintDotNet, true); } } @@ -84,42 +141,16 @@ namespace ExternalCommand { /// object with the default value for the supplied property public override object GetDefault(string property) { switch(property) { - case "Commands": - List commandDefaults = new List(); - if (hasPaintDotNet) { - commandDefaults.Add(PAINTDOTNET); - } - if (hasPaint) { - commandDefaults.Add(MSPAINT); - } - return commandDefaults; - case "Commandline": - Dictionary commandlineDefaults = new Dictionary(); - if (hasPaintDotNet) { - commandlineDefaults.Add(PAINTDOTNET, paintDotNetPath); - } - if (hasPaint) { - commandlineDefaults.Add(MSPAINT, paintPath); - } - return commandlineDefaults; - case "Argument": - Dictionary argumentDefaults = new Dictionary(); - if (hasPaintDotNet) { - argumentDefaults.Add(PAINTDOTNET, "\"{0}\""); - } - if (hasPaint) { - argumentDefaults.Add(MSPAINT, "\"{0}\""); - } - return argumentDefaults; - case "RunInbackground": - Dictionary runInBackground = new Dictionary(); - if (hasPaintDotNet) { - runInBackground.Add(PAINTDOTNET, true); - } - if (hasPaint) { - runInBackground.Add(MSPAINT, true); - } - return runInBackground; + case nameof(DeletedBuildInCommands): + return new List(); + case nameof(Commands): + return new List(); + case nameof(Commandline): + return new Dictionary(); + case nameof(Argument): + return new Dictionary(); + case nameof(RunInbackground): + return new Dictionary(); } return null; } diff --git a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs index a115815ca..654c2051a 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandDestination.cs @@ -71,10 +71,10 @@ namespace ExternalCommand { if (_presetCommand != null) { - if (!config.runInbackground.ContainsKey(_presetCommand)) { - config.runInbackground.Add(_presetCommand, true); + if (!config.RunInbackground.ContainsKey(_presetCommand)) { + config.RunInbackground.Add(_presetCommand, true); } - bool runInBackground = config.runInbackground[_presetCommand]; + bool runInBackground = config.RunInbackground[_presetCommand]; string fullPath = captureDetails.Filename; if (fullPath == null) { fullPath = ImageOutput.SaveNamedTmpFile(surface, captureDetails, outputSettings); @@ -139,7 +139,7 @@ namespace ExternalCommand { } catch (Exception ex) { exportInformation.ExportMade = false; exportInformation.ErrorMessage = ex.Message; - LOG.WarnFormat("Error calling external command: {0} ", exportInformation.ErrorMessage); + LOG.WarnFormat("Error calling external command: {0} ", exportInformation.ErrorMessage); } } @@ -158,13 +158,13 @@ namespace ExternalCommand { try { return CallExternalCommand(commando, fullPath, "runas", out output, out error); } catch { - w32ex.Data.Add("commandline", config.commandlines[_presetCommand]); - w32ex.Data.Add("arguments", config.arguments[_presetCommand]); + w32ex.Data.Add("commandline", config.Commandline[_presetCommand]); + w32ex.Data.Add("arguments", config.Argument[_presetCommand]); throw; } } catch (Exception ex) { - ex.Data.Add("commandline", config.commandlines[_presetCommand]); - ex.Data.Add("arguments", config.arguments[_presetCommand]); + ex.Data.Add("commandline", config.Commandline[_presetCommand]); + ex.Data.Add("arguments", config.Argument[_presetCommand]); throw; } } @@ -179,8 +179,8 @@ namespace ExternalCommand { /// /// private int CallExternalCommand(string commando, string fullPath, string verb, out string output, out string error) { - string commandline = config.commandlines[commando]; - string arguments = config.arguments[commando]; + string commandline = config.Commandline[commando]; + string arguments = config.Argument[commando]; output = null; error = null; if (!string.IsNullOrEmpty(commandline)) { @@ -227,9 +227,9 @@ namespace ExternalCommand { return -1; } - public static string FormatArguments(string arguments, string fullpath) - { - return string.Format(arguments, fullpath); - } - } + public static string FormatArguments(string arguments, string fullpath) + { + return string.Format(arguments, fullpath); + } + } } diff --git a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs index 51d637a12..670b17106 100644 --- a/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs +++ b/GreenshotExternalCommandPlugin/ExternalCommandPlugin.cs @@ -33,9 +33,9 @@ namespace ExternalCommand { /// An Plugin to run commands after an image was written /// public class ExternalCommandPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExternalCommandPlugin)); - private static readonly CoreConfiguration coreConfig = IniConfig.GetIniSection(); - private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection(); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ExternalCommandPlugin)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private static readonly ExternalCommandConfiguration ExternalCommandConfig = IniConfig.GetIniSection(); private IGreenshotHost _host; private PluginAttribute _myAttributes; private ToolStripMenuItem _itemPlugInRoot; @@ -55,7 +55,7 @@ namespace ExternalCommand { } public IEnumerable Destinations() { - foreach(string command in config.Commands) { + foreach(string command in ExternalCommandConfig.Commands) { yield return new ExternalCommandDestination(command); } } @@ -69,26 +69,26 @@ namespace ExternalCommand { /// /// /// false if the command is not correctly configured - private bool isCommandValid(string command) { - if (!config.runInbackground.ContainsKey(command)) { - LOG.WarnFormat("Found missing runInbackground for {0}", command); + private bool IsCommandValid(string command) { + if (!ExternalCommandConfig.RunInbackground.ContainsKey(command)) { + Log.WarnFormat("Found missing runInbackground for {0}", command); // Fix it - config.runInbackground.Add(command, true); + ExternalCommandConfig.RunInbackground.Add(command, true); } - if (!config.arguments.ContainsKey(command)) { - LOG.WarnFormat("Found missing argument for {0}", command); + if (!ExternalCommandConfig.Argument.ContainsKey(command)) { + Log.WarnFormat("Found missing argument for {0}", command); // Fix it - config.arguments.Add(command, "{0}"); + ExternalCommandConfig.Argument.Add(command, "{0}"); } - if (!config.commandlines.ContainsKey(command)) { - LOG.WarnFormat("Found missing commandline for {0}", command); + if (!ExternalCommandConfig.Commandline.ContainsKey(command)) { + Log.WarnFormat("Found missing commandline for {0}", command); return false; } - string commandline = FilenameHelper.FillVariables(config.commandlines[command], true); + string commandline = FilenameHelper.FillVariables(ExternalCommandConfig.Commandline[command], true); commandline = FilenameHelper.FillCmdVariables(commandline, true); if (!File.Exists(commandline)) { - LOG.WarnFormat("Found 'invalid' commandline {0} for command {1}", config.commandlines[command], command); + Log.WarnFormat("Found 'invalid' commandline {0} for command {1}", ExternalCommandConfig.Commandline[command], command); return false; } return true; @@ -99,22 +99,19 @@ namespace ExternalCommand { /// Use the IGreenshotPluginHost interface to register events /// My own attributes public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { - LOG.DebugFormat("Initialize called of {0}", myAttributes.Name); + Log.DebugFormat("Initialize called of {0}", myAttributes.Name); List commandsToDelete = new List(); // Check configuration - foreach(string command in config.Commands) { - if (!isCommandValid(command)) { + foreach(string command in ExternalCommandConfig.Commands) { + if (!IsCommandValid(command)) { commandsToDelete.Add(command); } } // cleanup foreach (string command in commandsToDelete) { - config.runInbackground.Remove(command); - config.commandlines.Remove(command); - config.arguments.Remove(command); - config.Commands.Remove(command); + ExternalCommandConfig.Delete(command); } _host = pluginHost; @@ -128,7 +125,7 @@ namespace ExternalCommand { PluginUtils.AddToContextMenu(_host, _itemPlugInRoot); Language.LanguageChanged += OnLanguageChanged; - coreConfig.PropertyChanged += OnIconSizeChanged; + CoreConfig.PropertyChanged += OnIconSizeChanged; return true; } @@ -145,7 +142,7 @@ namespace ExternalCommand { _itemPlugInRoot.Image = PluginUtils.GetCachedExeIcon(exePath, 0); } } catch (Exception ex) { - LOG.Warn("Couldn't get the cmd.exe image", ex); + Log.Warn("Couldn't get the cmd.exe image", ex); } } } @@ -157,7 +154,7 @@ namespace ExternalCommand { } public virtual void Shutdown() { - LOG.Debug("Shutdown of " + _myAttributes.Name); + Log.Debug("Shutdown of " + _myAttributes.Name); } private void ConfigMenuClick(object sender, EventArgs eventArgs) { @@ -168,7 +165,7 @@ namespace ExternalCommand { /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - LOG.Debug("Configure called"); + Log.Debug("Configure called"); new SettingsForm().ShowDialog(); } } diff --git a/GreenshotExternalCommandPlugin/IconCache.cs b/GreenshotExternalCommandPlugin/IconCache.cs index 1e931634d..fdff5815e 100644 --- a/GreenshotExternalCommandPlugin/IconCache.cs +++ b/GreenshotExternalCommandPlugin/IconCache.cs @@ -33,11 +33,11 @@ namespace ExternalCommand { public static Image IconForCommand(string commandName) { Image icon = null; if (commandName != null) { - if (config.commandlines.ContainsKey(commandName) && File.Exists(config.commandlines[commandName])) { + if (config.Commandline.ContainsKey(commandName) && File.Exists(config.Commandline[commandName])) { try { - icon = PluginUtils.GetCachedExeIcon(config.commandlines[commandName], 0); + icon = PluginUtils.GetCachedExeIcon(config.Commandline[commandName], 0); } catch (Exception ex) { - LOG.Warn("Problem loading icon for " + config.commandlines[commandName], ex); + LOG.Warn("Problem loading icon for " + config.Commandline[commandName], ex); } } } diff --git a/GreenshotExternalCommandPlugin/SettingsForm.cs b/GreenshotExternalCommandPlugin/SettingsForm.cs index 2bb6a9331..e5721749b 100644 --- a/GreenshotExternalCommandPlugin/SettingsForm.cs +++ b/GreenshotExternalCommandPlugin/SettingsForm.cs @@ -29,8 +29,7 @@ namespace ExternalCommand { /// Description of SettingsForm. /// public partial class SettingsForm : ExternalCommandForm { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SettingsForm)); - private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection(); + private static readonly ExternalCommandConfiguration ExternalCommandConfig = IniConfig.GetIniSection(); public SettingsForm() { // @@ -42,35 +41,34 @@ namespace ExternalCommand { UpdateView(); } - void ButtonOkClick(object sender, EventArgs e) { + private void ButtonOkClick(object sender, EventArgs e) { IniConfig.Save(); } - void ButtonAddClick(object sender, EventArgs e) { - SettingsFormDetail form = new SettingsFormDetail(null); + private void ButtonAddClick(object sender, EventArgs e) { + var form = new SettingsFormDetail(null); form.ShowDialog(); UpdateView(); } - void ButtonDeleteClick(object sender, EventArgs e) { + private void ButtonDeleteClick(object sender, EventArgs e) { foreach(ListViewItem item in listView1.SelectedItems) { string commando = item.Tag as string; - config.Commands.Remove(commando); - config.commandlines.Remove(commando); - config.arguments.Remove(commando); + + ExternalCommandConfig.Delete(commando); } UpdateView(); } - void UpdateView() { + private void UpdateView() { listView1.Items.Clear(); - if(config.Commands != null) { + if(ExternalCommandConfig.Commands != null) { listView1.ListViewItemSorter = new ListviewComparer(); ImageList imageList = new ImageList(); listView1.SmallImageList = imageList; int imageNr = 0; - foreach(string commando in config.Commands) { + foreach(string commando in ExternalCommandConfig.Commands) { ListViewItem item; Image iconForExe = IconCache.IconForCommand(commando); if(iconForExe != null) { @@ -87,15 +85,15 @@ namespace ExternalCommand { button_edit.Enabled = listView1.SelectedItems.Count > 0; } - void ListView1ItemSelectionChanged(object sender, EventArgs e) { + private void ListView1ItemSelectionChanged(object sender, EventArgs e) { button_edit.Enabled = listView1.SelectedItems.Count > 0; } - void ButtonEditClick(object sender, EventArgs e) { + private void ButtonEditClick(object sender, EventArgs e) { ListView1DoubleClick(sender, e); } - void ListView1DoubleClick(object sender, EventArgs e) { + private void ListView1DoubleClick(object sender, EventArgs e) { // Safety check for bug #1484 bool selectionActive = listView1.SelectedItems.Count > 0; if(!selectionActive) { @@ -104,7 +102,7 @@ namespace ExternalCommand { } string commando = listView1.SelectedItems[0].Tag as string; - SettingsFormDetail form = new SettingsFormDetail(commando); + var form = new SettingsFormDetail(commando); form.ShowDialog(); UpdateView(); @@ -120,12 +118,9 @@ namespace ExternalCommand { return (0); } - ListViewItem l1 = (ListViewItem)x; - ListViewItem l2 = (ListViewItem)y; - if(l2 == null) { - return 1; - } - return l1.Text.CompareTo(l2.Text); + var l1 = (ListViewItem)x; + var l2 = (ListViewItem)y; + return string.Compare(l1.Text, l2.Text, StringComparison.Ordinal); } } } diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index a5e794524..dbe2aaf20 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -45,8 +45,8 @@ namespace ExternalCommand { if(commando != null) { textBox_name.Text = commando; - textBox_commandline.Text = config.commandlines[commando]; - textBox_arguments.Text = config.arguments[commando]; + textBox_commandline.Text = config.Commandline[commando]; + textBox_arguments.Text = config.Argument[commando]; _commandIndex = config.Commands.FindIndex(delegate(string s) { return s == commando; }); } else { textBox_arguments.Text = "\"{0}\""; @@ -54,25 +54,25 @@ namespace ExternalCommand { OkButtonState(); } - void ButtonOkClick(object sender, EventArgs e) { + private void ButtonOkClick(object sender, EventArgs e) { string commandName = textBox_name.Text; string commandLine = textBox_commandline.Text; string arguments = textBox_arguments.Text; if(_commando != null) { config.Commands[_commandIndex] = commandName; - config.commandlines.Remove(_commando); - config.commandlines.Add(commandName, commandLine); - config.arguments.Remove(_commando); - config.arguments.Add(commandName, arguments); + config.Commandline.Remove(_commando); + config.Commandline.Add(commandName, commandLine); + config.Argument.Remove(_commando); + config.Argument.Add(commandName, arguments); } else { config.Commands.Add(commandName); - config.commandlines.Add(commandName, commandLine); - config.arguments.Add(commandName, arguments); + config.Commandline.Add(commandName, commandLine); + config.Argument.Add(commandName, arguments); } } - void Button3Click(object sender, EventArgs e) { - OpenFileDialog openFileDialog = new OpenFileDialog + private void Button3Click(object sender, EventArgs e) { + var openFileDialog = new OpenFileDialog { Filter = "Executables (*.exe, *.bat, *.com)|*.exe; *.bat; *.com|All files (*)|*", FilterIndex = 1, @@ -106,7 +106,7 @@ namespace ExternalCommand { buttonOk.Enabled = true; textBox_name.BackColor = Color.White; textBox_commandline.BackColor = Color.White; - textBox_arguments.BackColor = Color.White; + textBox_arguments.BackColor = Color.White; // Is there a text in the name field if(string.IsNullOrEmpty(textBox_name.Text)) { buttonOk.Enabled = false; @@ -136,17 +136,17 @@ namespace ExternalCommand { } // Are the arguments in a valid format? try - { + { string arguments = FilenameHelper.FillVariables(textBox_arguments.Text, false); arguments = FilenameHelper.FillCmdVariables(arguments, false); ExternalCommandDestination.FormatArguments(arguments, string.Empty); - } - catch - { - buttonOk.Enabled = false; - textBox_arguments.BackColor = Color.Red; - } + } + catch + { + buttonOk.Enabled = false; + textBox_arguments.BackColor = Color.Red; + } } private void textBox_name_TextChanged(object sender, EventArgs e) { @@ -157,10 +157,10 @@ namespace ExternalCommand { OkButtonState(); } - private void textBox_arguments_TextChanged(object sender, EventArgs e) - { - OkButtonState(); - } + private void textBox_arguments_TextChanged(object sender, EventArgs e) + { + OkButtonState(); + } } } diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index 18a732fc0..e8a8d4cba 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -200,8 +200,8 @@ namespace GreenshotImgurPlugin { listview_imgur_uploads.Sort(); } - - void ImgurHistoryFormClosing(object sender, FormClosingEventArgs e) + + private void ImgurHistoryFormClosing(object sender, FormClosingEventArgs e) { _instance = null; } diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index b2d678478..dcf17fbf5 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -41,8 +41,8 @@ namespace GreenshotImgurPlugin { historyButton.Enabled = false; } } - - void ButtonHistoryClick(object sender, EventArgs e) { + + private void ButtonHistoryClick(object sender, EventArgs e) { ImgurHistory.ShowHistory(); } } diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index cc52a7b68..bb3f82676 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -34,12 +34,12 @@ - - ..\packages\Dapplo.HttpExtensions.0.5.33\lib\net45\Dapplo.HttpExtensions.dll + + ..\packages\Dapplo.HttpExtensions.0.5.36\lib\net45\Dapplo.HttpExtensions.dll True - - ..\packages\Dapplo.Jira.0.1.59\lib\net45\Dapplo.Jira.dll + + ..\packages\Dapplo.Jira.0.1.61\lib\net45\Dapplo.Jira.dll True diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index 58ee11d6b..bd1287f70 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,7 +1,7 @@  - - + + diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index a9782d256..871da209e 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -53,8 +53,8 @@ namespace GreenshotOCR { index++; } } - - void ButtonOKClick(object sender, EventArgs e) { + + private void ButtonOKClick(object sender, EventArgs e) { string selectedString = (string) comboBox_languages.SelectedItem; if (selectedString != null) { config.Language = selectedString.ToUpper(); diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs index 4a5f64b71..c0a85b341 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookUtils.cs @@ -22,7 +22,7 @@ using System; using System.Runtime.InteropServices; namespace Greenshot.Interop.Office { - enum PT : uint { + internal enum PT : uint { PT_UNSPECIFIED = 0, /* (Reserved for interface use) type doesn't matter to caller */ PT_NULL = 1, /* NULL property value */ PT_I2 = 2, /* Signed 16-bit value */ @@ -470,7 +470,7 @@ namespace Greenshot.Interop.Office { [ComImport()] [Guid(IID_IMAPIProp)] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - interface IMessage : IMAPIProp { + private interface IMessage : IMAPIProp { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int GetAttachmentTable(); @@ -558,7 +558,7 @@ namespace Greenshot.Interop.Office { [ComImport()] [Guid(IID_IMAPIProp)] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - interface IMAPIProp { + private interface IMAPIProp { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int GetLastError(); diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index f3765e9c9..c1e6bedc3 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -110,7 +110,7 @@ namespace GreenshotPlugin.Controls { /// /// /// - void timer_Tick(object sender, EventArgs e) { + private void timer_Tick(object sender, EventArgs e) { try { Animate(); } catch (Exception ex) { diff --git a/GreenshotPlugin/Controls/BackgroundForm.cs b/GreenshotPlugin/Controls/BackgroundForm.cs index 5994f4f2d..59fe024e3 100644 --- a/GreenshotPlugin/Controls/BackgroundForm.cs +++ b/GreenshotPlugin/Controls/BackgroundForm.cs @@ -92,8 +92,8 @@ namespace GreenshotPlugin.Controls { _shouldClose = true; Application.DoEvents(); } - - void BackgroundFormFormClosing(object sender, FormClosingEventArgs e) { + + private void BackgroundFormFormClosing(object sender, FormClosingEventArgs e) { timer_checkforclose.Stop(); } } diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index 8b8b886ad..5fae94edd 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -25,14 +25,14 @@ using GreenshotInterop.Interop; namespace GreenshotPlugin.Controls { public class ExtendedWebBrowser : WebBrowser { protected class ExtendedWebBrowserSite : WebBrowserSite, IOleCommandTarget { - const int OLECMDID_SHOWSCRIPTERROR = 40; - const int OLECMDID_SHOWMESSAGE = 41; + private const int OLECMDID_SHOWSCRIPTERROR = 40; + private const int OLECMDID_SHOWMESSAGE = 41; - static readonly Guid CGID_DocHostCommandHandler = new Guid("F38BC242-B950-11D1-8918-00C04FC2C836"); + private static readonly Guid CGID_DocHostCommandHandler = new Guid("F38BC242-B950-11D1-8918-00C04FC2C836"); - const int S_OK = 0; - const int OLECMDERR_E_NOTSUPPORTED = (-2147221248); - const int OLECMDERR_E_UNKNOWNGROUP = (-2147221244); + private const int S_OK = 0; + private const int OLECMDERR_E_NOTSUPPORTED = (-2147221248); + private const int OLECMDERR_E_UNKNOWNGROUP = (-2147221244); public ExtendedWebBrowserSite(WebBrowser wb) : base(wb) { } diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index ac9becaab..fb9674ec8 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -201,7 +201,7 @@ namespace GreenshotPlugin.Controls { /// Fires when a key is pushed down. Here, we'll want to update the text in the box /// to notify the user what combination is currently pressed. /// - void HotkeyControl_KeyDown(object sender, KeyEventArgs e) { + private void HotkeyControl_KeyDown(object sender, KeyEventArgs e) { // Clear the current hotkey if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete) { ResetHotkey(); @@ -217,7 +217,7 @@ namespace GreenshotPlugin.Controls { /// Fires when all keys are released. If the current hotkey isn't valid, reset it. /// Otherwise, do nothing and keep the text and hotkey as it was. /// - void HotkeyControl_KeyUp(object sender, KeyEventArgs e) { + private void HotkeyControl_KeyUp(object sender, KeyEventArgs e) { // Somehow the PrintScreen only comes as a keyup, therefore we handle it here. if (e.KeyCode == Keys.PrintScreen) { _modifiers = e.Modifiers; @@ -235,7 +235,7 @@ namespace GreenshotPlugin.Controls { /// Prevents the letter/whatever entered to show up in the TextBox /// Without this, a "A" key press would appear as "aControl, Alt + A" /// - void HotkeyControl_KeyPress(object sender, KeyPressEventArgs e) { + private void HotkeyControl_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; } diff --git a/GreenshotPlugin/Controls/PleaseWaitForm.cs b/GreenshotPlugin/Controls/PleaseWaitForm.cs index 2146a6247..3556af50b 100644 --- a/GreenshotPlugin/Controls/PleaseWaitForm.cs +++ b/GreenshotPlugin/Controls/PleaseWaitForm.cs @@ -115,7 +115,7 @@ namespace GreenshotPlugin.Controls { /// /// /// - void CancelButtonClick(object sender, EventArgs e) { + private void CancelButtonClick(object sender, EventArgs e) { LOG.DebugFormat("Cancel clicked on {0}", _title); cancelButton.Enabled = false; _waitFor.Abort(); diff --git a/GreenshotPlugin/Controls/QualityDialog.cs b/GreenshotPlugin/Controls/QualityDialog.cs index dc8a75f99..43029ed62 100644 --- a/GreenshotPlugin/Controls/QualityDialog.cs +++ b/GreenshotPlugin/Controls/QualityDialog.cs @@ -48,8 +48,8 @@ namespace GreenshotPlugin.Controls { textBoxJpegQuality.Text = Settings.JPGQuality.ToString(); ToFront = true; } - - void Button_okClick(object sender, EventArgs e) { + + private void Button_okClick(object sender, EventArgs e) { Settings.JPGQuality = trackBarJpegQuality.Value; Settings.ReduceColors = checkBox_reduceColors.Checked; if (checkbox_dontaskagain.Checked) { @@ -59,8 +59,8 @@ namespace GreenshotPlugin.Controls { IniConfig.Save(); } } - - void TrackBarJpegQualityScroll(object sender, EventArgs e) { + + private void TrackBarJpegQualityScroll(object sender, EventArgs e) { textBoxJpegQuality.Text = trackBarJpegQuality.Value.ToString(); } } diff --git a/GreenshotPlugin/Core/AnimationHelpers.cs b/GreenshotPlugin/Core/AnimationHelpers.cs index b63412632..f34fb04ab 100644 --- a/GreenshotPlugin/Core/AnimationHelpers.cs +++ b/GreenshotPlugin/Core/AnimationHelpers.cs @@ -519,7 +519,7 @@ namespace GreenshotPlugin.Core { throw new NotImplementedException(); } - static class Sine { + private static class Sine { public static double EaseIn(double s) { return Math.Sin(s * (Math.PI / 2) - (Math.PI / 2)) + 1; } @@ -531,7 +531,7 @@ namespace GreenshotPlugin.Core { } } - static class Power { + private static class Power { public static double EaseIn(double s, int power) { return Math.Pow(s, power); } diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index e0193a71b..44e0fd7b6 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -490,7 +490,7 @@ namespace GreenshotPlugin.Core { /// Bitmap public static Image ApplyEffect(Image sourceImage, IEffect effect, Matrix matrix) { - List effects = new List { effect }; + var effects = new List { effect }; return ApplyEffects(sourceImage, effects, matrix); } @@ -501,13 +501,13 @@ namespace GreenshotPlugin.Core { /// List of IEffect /// /// Bitmap - public static Image ApplyEffects(Image sourceImage, List effects, Matrix matrix) + public static Image ApplyEffects(Image sourceImage, IEnumerable effects, Matrix matrix) { - Image currentImage = sourceImage; + var currentImage = sourceImage; bool disposeImage = false; - foreach (IEffect effect in effects) + foreach (var effect in effects) { - Image tmpImage = effect.Apply(currentImage, matrix); + var tmpImage = effect.Apply(currentImage, matrix); if (tmpImage != null) { if (disposeImage) @@ -515,7 +515,6 @@ namespace GreenshotPlugin.Core { currentImage.Dispose(); } currentImage = tmpImage; - tmpImage = null; // Make sure the "new" image is disposed disposeImage = true; } @@ -549,7 +548,7 @@ namespace GreenshotPlugin.Core { public static Image CreateTornEdge(Image sourceImage, int toothHeight, int horizontalToothRange, int verticalToothRange, bool[] edges) { Image returnImage = CreateEmpty(sourceImage.Width, sourceImage.Height, PixelFormat.Format32bppArgb, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); - using (GraphicsPath path = new GraphicsPath()) + using (var path = new GraphicsPath()) { Random random = new Random(); int horizontalRegions = (int)Math.Round((float)sourceImage.Width / horizontalToothRange); diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 71db3675f..fb7624bbf 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -780,7 +780,7 @@ namespace GreenshotPlugin.Core { } if (windowRect.IsEmpty) { - if (GetWindowRect(out windowRect)) + if (!GetWindowRect(out windowRect)) { Win32Error error = Win32.GetLastErrorCode(); Log.WarnFormat("Couldn't retrieve the windows rectangle: {0}", Win32.GetMessage(error)); diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index ff9693a8e..243180939 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -64,10 +64,10 @@ namespace Greenshot.Interop { #endregion [DllImport("ole32.dll")] - static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgId); + private static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgId); // Converts failure HRESULTs to exceptions: [DllImport("oleaut32", PreserveSig=false)] - static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out object ppunk); + private static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out object ppunk); #region Construction diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index 25480d7eb..01e435daa 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -90,7 +90,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { public static class Win32 { [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, int nSize, IntPtr Arguments); + private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, int nSize, IntPtr Arguments); [DllImport("kernel32.dll")] public static extern void SetLastError(uint dwErrCode); From 07f5463a38ea9ace338ceb0af32983a220941cc6 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 16 Sep 2016 21:59:42 +0200 Subject: [PATCH 117/170] Updated tickets in the readme.txt [skip ci] --- .../additional_files/readme.txt.template | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 69f59e9ed..63c3ca9e3 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,35 +9,42 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ -Fixed: -* BUG-1762: Dropshadow & tornedge prompts for settings every time (now left mouse applies, right shows settings) -* BUG-1812: Opening the editor after removing a monitor shows it outside the visible screen. -* BUG-1876: Already running message, multi user environment -* BUG-1884: OCR has trailing blank spaces -* BUG-1887: hang on exit - hang time proportional to number of objects -* BUG-1890: Slight cropping around window on Windows 10 -* BUG-1892: Greenshot saves blank JPG file with reduce colors -* BUG-1896: Greenshot doesn't support the new Jira API, SOAP is deprecated. -* BUG-1898: Specify GPLv3 in the license text -* BUG-1910: Error occurs after adding 10+ text boxes with arrows -* BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on and transparency is used -* BUG-1933: Greenshot Installer sets bad registry key permission -* BUG-1935: Delay when pasting and ShapeShifter from FlameFusion is running -* BUG-1941: Error when creating speech bubble -* BUG-1945: Failure starting Greenshot at system startup -* BUG-1949: Can't delete Imgur upload -* BUG-1965: Activation border around window is visible in the capture -* BUG-1991: Greenshot portable (PAF) uses wrong log configuration -* BUG-2011: Editor issues when the font is gone or broken -* FEATURE-916: Added ico file format -* FEATURE-919: Allow adding of space around screenshot (use Ctrl + / Ctrl -) -* FEATURE-945: Added environment variables resolving to the external command -* FEATURE-949: Updated to Inno-Setup 5.5.9 for improved installer security -* FEATURE-958: Added code-signing of Greenshot and the installer, this should help preventing security issues +This is a pre-release for the coming release of Greenshot. +**Testing is not finished, use at your own risk...** + +Changes for the following reported tickets were added since 1.2.8.12: + +Fixed bugs: +* BUG-1762 Dropshadow & tornedge prompts for settings every time +* BUG-1812 Editor opens outside the screen +* BUG-1876 Already running message, multi user environment +* BUG-1884 OCR text has trailing blank spaces +* BUG-1887 Editor hangs on exit - hang time proportional to number of objects +* BUG-1890 Slight cropping around window on Windows 10 +* BUG-1892 Greenshot saves blank JPG file with reduce colors +* BUG-1896 JIRA Plugin doesn't work with JIRA Server v7.0 +* BUG-1898 Specify GPLv3 in the license text +* BUG-1908 External Command, add commands at startup +* BUG-1918 Editor Speechbubble Artifacts when shadow and transparent +* BUG-1933 Greenshot Installer sets bad registry key permission +* BUG-1935 Delay when pasting and ShapeShifter from FlameFusion is running +* BUG-1941 Error when creating a speech bubble in the editor +* BUG-1945 Failure starting Greenshot at system startup +* BUG-1949 Can't delete Imgur upload +* BUG-1965 Activation border around window is visible in the capture +* BUG-1991 Greenshot portable (PAF) uses wrong log configuration +* BUG-1992 OutputFilePath setting is wrong config used on a different system +* BUG-2011 Editor issues when the font is gone or broken + +Added features: +* FEATURE-916 Added icon save format (capture will be resized to 16x16, 32x32, 48x48 or 256x256) +* FEATURE-919 Added a way to increase the editor canvas size (use Ctrl + / Ctrl -) +* FEATURE-945 Added environment variables resolving to the external command plugin +* FEATURE-946 Updated to Inno-Setup 5.5.9 for improved installer security +* FEATURE-958 Greenshot is now using code signing certificates Open issues planned for this version: BUG-1872: OneDrive prevents Greenshot hotkeys from working -BUG-1908: External Command plugin should check for possible default-commands at startup FEATURE-912: [Storage Location] Define directory pattern From f07ed83722d3613c420b81f74d60cd88ad76b866 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 16 Sep 2016 22:57:36 +0200 Subject: [PATCH 118/170] BUG-1872: Hack for displaying the OneDrive is blocking the hotkey registration. --- Greenshot/Forms/MainForm.cs | 27 +++++++++++++++++++++++++- Greenshot/Languages/language-cs-CZ.xml | 2 +- Greenshot/Languages/language-de-DE.xml | 2 +- Greenshot/Languages/language-en-US.xml | 2 +- Greenshot/Languages/language-es-ES.xml | 2 +- Greenshot/Languages/language-fr-FR.xml | 2 +- Greenshot/Languages/language-fr-QC.xml | 2 +- Greenshot/Languages/language-hu-HU.xml | 2 +- Greenshot/Languages/language-it-IT.xml | 2 +- Greenshot/Languages/language-lt-LT.xml | 2 +- Greenshot/Languages/language-nl-NL.xml | 2 +- Greenshot/Languages/language-nn-NO.xml | 2 +- Greenshot/Languages/language-pl-PL.xml | 2 +- GreenshotPlugin/Core/Language.cs | 2 +- 14 files changed, 39 insertions(+), 14 deletions(-) diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 5c4a9d0a8..6810a8500 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -25,6 +25,7 @@ using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.IO; +using System.Linq; using System.Reflection; using System.Text; using System.Threading; @@ -610,6 +611,28 @@ namespace Greenshot { return success || ignoreFailedRegistration; } + /// + /// Check if OneDrive is blocking hotkeys + /// + /// true if onedrive has hotkeys turned on + private static bool IsOneDriveBlockingHotkey() + { + if (!Environment.OSVersion.IsWindows10()) + { + return false; + } + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + var oneDriveSettingsPath = Path.Combine(localAppData, @"Microsoft\OneDrive\settings\Personal"); + + var oneDriveSettingsFile = Directory.GetFiles(oneDriveSettingsPath, "*_screenshot.dat").FirstOrDefault(); + if (!File.Exists(oneDriveSettingsFile)) + { + return false; + } + var screenshotSetting = File.ReadAllLines(oneDriveSettingsFile).Skip(1).Take(1).First(); + return "2".Equals(screenshotSetting); + } + /// /// Displays a dialog for the user to choose how to handle hotkey registration failures: /// retry (allowing to shut down the conflicting application before), @@ -620,7 +643,9 @@ namespace Greenshot { /// private static bool HandleFailedHotkeyRegistration(string failedKeys) { bool success = false; - DialogResult dr = MessageBox.Show(Instance, Language.GetFormattedString(LangKey.warning_hotkeys, failedKeys), Language.GetString(LangKey.warning), MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Exclamation); + var warningTitle = Language.GetString(LangKey.warning); + var message = string.Format(Language.GetString(LangKey.warning_hotkeys), failedKeys, IsOneDriveBlockingHotkey() ? " (OneDrive)": ""); + DialogResult dr = MessageBox.Show(Instance, message, warningTitle, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Exclamation); if (dr == DialogResult.Retry) { LOG.DebugFormat("Re-trying to register hotkeys"); HotkeyControl.UnregisterHotkeys(); diff --git a/Greenshot/Languages/language-cs-CZ.xml b/Greenshot/Languages/language-cs-CZ.xml index 8b6b9a19f..7966ea216 100644 --- a/Greenshot/Languages/language-cs-CZ.xml +++ b/Greenshot/Languages/language-cs-CZ.xml @@ -273,7 +273,7 @@ Například: ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} vytvoří ve výchozím úlo K dispozici je novější verze Greenshot! Přejete si stáhnout Greenshot {0}? Počkejte prosím než bude zachycena stránka v aplikaci Internet Explorer... Upozornění - Klávesovou(é) zkratku(y) "{0}" nelze použít. Tento problém je pravděpodobně způsoben jiným programem používajícím tytéž klávesové zkratky! Můžete změnit nastavení klávesových zkratek, deaktivovat je nebo změnit nastavení softwaru využívajícího shodné klávesové zkratky. + Klávesovou(é) zkratku(y) "{0}" nelze použít. Tento problém je pravděpodobně způsoben jiným programem{1} používajícím tytéž klávesové zkratky! Můžete změnit nastavení klávesových zkratek, deaktivovat je nebo změnit nastavení softwaru využívajícího shodné klávesové zkratky. Všechny funkce Greenshotu jsou stále dostupné přímo z místní nabídky bez použití klávesové zkratky. Použít vlastní barvu diff --git a/Greenshot/Languages/language-de-DE.xml b/Greenshot/Languages/language-de-DE.xml index 931cd2d5e..cab377ef9 100644 --- a/Greenshot/Languages/language-de-DE.xml +++ b/Greenshot/Languages/language-de-DE.xml @@ -278,7 +278,7 @@ Verwendung durch Greenshot reserviert werden, bis das Programm geschlossen wird. Bitte warten Sie, während die Seite im Internet Explorer abfotografiert wird... Hinweis Die globale Tastenkombination "{0}" konnte nicht aktiviert werden. -Vermutlich wurde dieselbe Tastenkombination bereits von einem anderen Programm reserviert. +Vermutlich wurde dieselbe Tastenkombination bereits von einem anderen Programm{1} reserviert. Sie können die Tastenkombinationen für Greenshot ändern, oder das Programm, das die Tastenkombination verwendet, deaktivieren. Sie können aber auch alle Greenshot-Funktionen über das Kontextmenü des Greenshot-Icons im Infobereich verwenden. diff --git a/Greenshot/Languages/language-en-US.xml b/Greenshot/Languages/language-en-US.xml index 5ee1945d9..3100b76f0 100644 --- a/Greenshot/Languages/language-en-US.xml +++ b/Greenshot/Languages/language-en-US.xml @@ -275,7 +275,7 @@ time, e.g. 11_58_32 (plus extension defined in the settings) A newer version of Greenshot is available! Do you want to download Greenshot {0}? Please wait while the page in Internet Explorer is captured... Warning - The hotkey(s) "{0}" could not be registered. This problem is probably caused by another tool claiming usage of the same hotkey(s)! You could either change your hotkey settings or deactivate/change the software making use of the hotkey(s). + The hotkey(s) "{0}" could not be registered. This problem is probably caused by another tool{1} claiming usage of the same hotkey(s)! You could either change your hotkey settings or deactivate/change the software making use of the hotkey(s). All Greenshot features still work directly from the tray icon context menu without hotkeys. Use custom color diff --git a/Greenshot/Languages/language-es-ES.xml b/Greenshot/Languages/language-es-ES.xml index 2a8dffc7d..190e1f832 100644 --- a/Greenshot/Languages/language-es-ES.xml +++ b/Greenshot/Languages/language-es-ES.xml @@ -255,7 +255,7 @@ presente, ejemplo: 11_58_32 (más la extension definida en la configuración)Hay una nueva versión de Greenshot disponible, ¿quieres descargar {0}? Por favor, espera a que se termine de capturar la página en Internet Explorer... Atención - No se ha podido registrar la tecla rápida "{0}". Probablemente el problema es que alguna otra aplicación también quiere hacerse con esa combinación de teclas. Hay dos posibles soluciones: cambiar la tecla rápida en Greenshot, o desactivar/cambiar la configuración del otro programa que usa esta tecla rápida. + No se ha podido registrar la tecla rápida "{0}". Probablemente el problema es que alguna otra aplicación{1} también quiere hacerse con esa combinación de teclas. Hay dos posibles soluciones: cambiar la tecla rápida en Greenshot, o desactivar/cambiar la configuración del otro programa que usa esta tecla rápida. A pesar de esto, se sigue pudiendo utilizar todas las características de Greenshot directamente desde el menú contextual del icono en la bandeja del sistema. Usar color personalizado diff --git a/Greenshot/Languages/language-fr-FR.xml b/Greenshot/Languages/language-fr-FR.xml index c5e578993..0a6ff34a5 100644 --- a/Greenshot/Languages/language-fr-FR.xml +++ b/Greenshot/Languages/language-fr-FR.xml @@ -297,7 +297,7 @@ en cours, par exemple 11_58_32 (plus l'extension définie dans les paramètres)< Une nouvelle version de Greenshot est disponible ! Voulez-vous télécharger Greenshot {0} ? Veuillez patienter pendant la capture de la page Internet Explorer... Avertissement - Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). + Le(s) raccourci(s) clavier "{0}" n'a pu être enregistré. Ce problème est probablement dû à un autre outil{1} qui utilise le(s) même(s) raccourci(s) clavier. Vous pouvez soit modifier vos raccourcis clavier soit désactiver/modifier le logiciel utilisant le(s) raccourci(s). Toutes les fonctionnalités de Greenshot se lancent aussi directement depuis le menu contextuel de l'icône de la zone de notifications système. Utiliser une couleur personnalisée diff --git a/Greenshot/Languages/language-fr-QC.xml b/Greenshot/Languages/language-fr-QC.xml index 78d0309ce..4e1884644 100644 --- a/Greenshot/Languages/language-fr-QC.xml +++ b/Greenshot/Languages/language-fr-QC.xml @@ -251,7 +251,7 @@ ${hostname} Nom d'hôte du PC Veuillez patienter pendant que la page dans Internet Explorer est capturée... Avertissement Un ou plusieurs raccourcis clavier n'ont pu êtres enregistrés. Il n'est donc pas possible d'utiliser les raccourcis clavier de Greenshot. -Ce problème est probablement dû à un autre outil qui utilise les mêmes raccourcis clavier. +Ce problème est probablement dû à un autre outil{1} qui utilise les mêmes raccourcis clavier. Veuillez désactiver ce(s) logiciel(s) utilisant le bouton Impr.écran. Vous pouvez également utiliser Greenshot au moyen de son menu contextuel. Utiliser les couleurs personnalisées Conserver la transparence diff --git a/Greenshot/Languages/language-hu-HU.xml b/Greenshot/Languages/language-hu-HU.xml index 9e1201fec..cd5382890 100644 --- a/Greenshot/Languages/language-hu-HU.xml +++ b/Greenshot/Languages/language-hu-HU.xml @@ -187,7 +187,7 @@ fájl mentése az aktuális dátummal és időponttal, a megadott tárolási hel Jobb klikk ide vagy nyomja meg a PrinScrn gombot. Figyelem Egy vagy több gyors billentyű nincs regisztrálva. Ezért lehet az, hogy nem lehet használni. -Ez a hiba akkor fordulhat elő, ha egy másik program használja. +Ez a hiba akkor fordulhat elő, ha egy másik program{1} használja. Kapcsolja ki a szotvert és használja PrintScrn billentyűt. Egyszerűen használhatja a Greenshot -ot a tálca ikon helyi menüjéből. \ No newline at end of file diff --git a/Greenshot/Languages/language-it-IT.xml b/Greenshot/Languages/language-it-IT.xml index 30aca7bfa..5e7243f54 100644 --- a/Greenshot/Languages/language-it-IT.xml +++ b/Greenshot/Languages/language-it-IT.xml @@ -279,7 +279,7 @@ corrente, es: 11_58_32 (più l'estensione definita nelle impostazioni)Una nuova versione di Greenshot è ora disponibile! Vuoi scaricare Greenshot {0}? Attendere prego, finchè la pagina di Internet Explorer viene catturata... Attenzione - La registrazione della/e scorciatoie di tastiera "{0}" non è andata a buon fine. Questo problema è causato probabilmente da un altro software che richiede l'uso delle stesse scorciatoie di tastiera. E' possibile però variare le impostazioni delle scorciatoie, oppure disattivare il software. + La registrazione della/e scorciatoie di tastiera "{0}" non è andata a buon fine. Questo problema è causato probabilmente da un altro software{1} che richiede l'uso delle stesse scorciatoie di tastiera. E' possibile però variare le impostazioni delle scorciatoie, oppure disattivare il software. In alternativa alle scorciatoie di tastiera, tutte le funzioni di Greenshot sono comunque disponibili dal menù visualizzabile con tasto destro del mouse sull'icona G nella barra. Usa colori personalizzati diff --git a/Greenshot/Languages/language-lt-LT.xml b/Greenshot/Languages/language-lt-LT.xml index 2a84f330a..6cbe0628d 100644 --- a/Greenshot/Languages/language-lt-LT.xml +++ b/Greenshot/Languages/language-lt-LT.xml @@ -183,7 +183,7 @@ bus perimti Greenshot programos, kai ji yra paleista. Išlaikymas prieš fotografuojant (ms) Spauskite dešiniu pelės klavišu arba spauskite "PrintScreen". Dėmesio - Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai. + Ne visi numatyti mygtukai priskirti. Tikėtina, kad jie priskirti kitai programai{1}. Kad mygtuką Print (PrintScreen) ir jo derinius naudotų Greenshot, reikia uždaryti kitas programas, kurios naudoja šiuos mygtukus. Arba galima naudoti komandas iš Greenshot programos kontekstinio meniu. diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index 1d56f151f..b42ab02e1 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -248,7 +248,7 @@ genereert een directorie voor de huidige dag in uw standaard opslag lokatie, b.v Er is een nieuwere versie van Greenshot beschikbaar! Wilt U Greenshot {0} downloaden? Wacht terwijl de Internet Explorer pagina wordt vastgelegd... Waarschuwing - De hotkeys "{0}" kunnen niet geregistreerd worden. Dit probleem komt waarschijnlijk doordat een andere applicatie deze hotkeys al gebruikt. U kunt de hotkeys instellingen van Greenshot veranderen of de andere applicatie stoppen/veranderen. + De hotkeys "{0}" kunnen niet geregistreerd worden. Dit probleem komt waarschijnlijk doordat een andere applicatie{1} deze hotkeys al gebruikt. U kunt de hotkeys instellingen van Greenshot veranderen of de andere applicatie stoppen/veranderen. Alle Greenshot functies werken ook over het context menu. Eigen kleur diff --git a/Greenshot/Languages/language-nn-NO.xml b/Greenshot/Languages/language-nn-NO.xml index 9ae31d78f..b107307b3 100644 --- a/Greenshot/Languages/language-nn-NO.xml +++ b/Greenshot/Languages/language-nn-NO.xml @@ -248,7 +248,7 @@ vil lage ei mappe med dagens dato (f.eks. 2012-09-11) der fila blir lagra med ti Ein nyare versjon av skjermknipsaren er tilgjengeleg! Vil du laste ned Greenshot {0}? Ver venleg og vent medan Internet Explorer-sida blir knipsa... Åtvaring! - Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. + Snøggtasten/-ane "{0}" kunne ikkje brukast. Sannsynlegvis er den/dei alt i bruk av eit anna program{1}. Du kan anten endre snøggtasten/-ane eller deaktivere/endre dei i det andre verktøyet. Alle Greenshot-funksjonar er likevel tilgjengeleg via høgreklikkmenyen i varslingsfeltet nedst til høgre på skjermen. Bruk eigendefinert farge diff --git a/Greenshot/Languages/language-pl-PL.xml b/Greenshot/Languages/language-pl-PL.xml index 356332bd4..6b394c750 100644 --- a/Greenshot/Languages/language-pl-PL.xml +++ b/Greenshot/Languages/language-pl-PL.xml @@ -284,7 +284,7 @@ na podstawie bieżącego czasu, np. 11-58-32 (plus rozszerzenie zdefiniowane w u Proszę czekać aż strona Internet Explorera zostanie przechwycona... Ostrzeżenie Nie udało się zarejestrować jednego lub kilku skrótów klawiaturowych. Z tego powodu używanie skrótów klawiaturowych Greenshota może nie być możliwe. -Przyczyną problemu może być wykorzystywanie tych samych skrótów klawiaturowych przez inną aplikację. +Przyczyną problemu może być wykorzystywanie tych samych skrótów klawiaturowych przez inną aplikację{1}. Proszę wyłączyć oprogramowanie korzystające z klawisza Print. Możliwe jest również zwyczajne korzystanie ze wszystkich funkcji Greenshota za pomocą menu kontekstowego ikony w obszarze powiadomień na pasku zadań. Używaj własnego koloru Bez przezroczystości diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 3a86237a6..1f174260b 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -648,7 +648,7 @@ namespace GreenshotPlugin.Core { if (!resources.TryGetValue(key, out returnValue)) { return "string ###" + key + "### not found"; } - return String.Format(returnValue, param); + return string.Format(returnValue, param); } } From 610f45d08265bab29167740e5000a985fd8e53a7 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 22 Sep 2016 20:40:13 +0200 Subject: [PATCH 119/170] Code quality changes --- .../Configuration/EditorConfiguration.cs | 8 +- Greenshot/Controls/BindableToolStripButton.cs | 5 +- .../Controls/BindableToolStripComboBox.cs | 8 +- .../BindableToolStripDropDownButton.cs | 4 +- Greenshot/Controls/ColorButton.cs | 16 +- ...ontextMenuToolStripProfessionalRenderer.cs | 14 +- Greenshot/Controls/Pipette.cs | 9 +- Greenshot/Controls/ToolStripColorButton.cs | 16 +- Greenshot/Controls/ToolStripNumericUpDown.cs | 20 +- Greenshot/Destinations/EditorDestination.cs | 2 +- Greenshot/Destinations/EmailDestination.cs | 62 +- Greenshot/Destinations/FileDestination.cs | 80 +-- Greenshot/Destinations/PickerDestination.cs | 26 +- Greenshot/Destinations/PrinterDestination.cs | 2 +- Greenshot/Drawing/Adorners/MoveAdorner.cs | 9 +- Greenshot/Drawing/Adorners/ResizeAdorner.cs | 1 - Greenshot/Drawing/Adorners/TargetAdorner.cs | 1 - Greenshot/Drawing/DrawableContainer.cs | 14 +- .../Drawing/Fields/AbstractFieldHolder.cs | 71 +-- .../Fields/AbstractFieldHolderWithChildren.cs | 18 +- .../Fields/Binding/BidirectionalBinding.cs | 2 +- Greenshot/Drawing/Fields/Field.cs | 16 +- Greenshot/Drawing/Fields/FieldAggregator.cs | 102 ++-- Greenshot/Drawing/Filters/AbstractFilter.cs | 7 +- Greenshot/Drawing/FreehandContainer.cs | 19 +- Greenshot/Drawing/HighlightContainer.cs | 18 +- Greenshot/Drawing/IconContainer.cs | 27 +- Greenshot/Drawing/ImageContainer.cs | 1 + Greenshot/Drawing/ObfuscateContainer.cs | 2 +- Greenshot/Drawing/RoundedRectangle.cs | 2 + Greenshot/Drawing/StepLabelContainer.cs | 29 +- Greenshot/Drawing/Surface.cs | 221 +++----- Greenshot/Drawing/TextContainer.cs | 35 +- Greenshot/Forms/AboutForm.cs | 2 +- Greenshot/Forms/CaptureForm.cs | 71 +-- Greenshot/Forms/ColorDialog.Designer.cs | 8 +- Greenshot/Forms/ColorDialog.cs | 64 ++- Greenshot/Forms/DropShadowSettingsForm.cs | 20 +- Greenshot/Forms/ImageEditorForm.cs | 242 ++++---- Greenshot/Forms/MainForm.Designer.cs | 2 +- Greenshot/Forms/MainForm.cs | 161 +++--- Greenshot/Forms/MovableShowColorForm.cs | 2 +- Greenshot/Forms/ResizeSettingsForm.cs | 109 ++-- Greenshot/Forms/SettingsForm.cs | 57 +- Greenshot/Forms/ToolStripMenuSelectList.cs | 114 ++-- Greenshot/Forms/TornEdgeSettingsForm.cs | 98 ++-- Greenshot/Help/HelpFileLoader.cs | 37 +- Greenshot/Helpers/CaptureHelper.cs | 226 ++++---- Greenshot/Helpers/CopyData.cs | 41 +- Greenshot/Helpers/DestinationHelper.cs | 24 +- Greenshot/Helpers/EnvironmentInfo.cs | 59 +- Greenshot/Helpers/GeometryHelper.cs | 6 +- Greenshot/Helpers/IECaptureHelper.cs | 228 ++++---- Greenshot/Helpers/IEInterop/IEContainer.cs | 161 ++---- Greenshot/Helpers/MailHelper.cs | 115 ++-- Greenshot/Helpers/PluginHelper.cs | 141 +++-- Greenshot/Helpers/PrintHelper.cs | 91 ++- Greenshot/Helpers/SoundHelper.cs | 58 +- Greenshot/Helpers/StartupHelper.cs | 171 +++--- Greenshot/Helpers/UpdateHelper.cs | 74 +-- Greenshot/Helpers/WindowWrapper.cs | 8 +- Greenshot/Memento/AddElementsMemento.cs | 8 +- Greenshot/Memento/ChangeFieldHolderMemento.cs | 9 +- Greenshot/Memento/DeleteElementsMemento.cs | 5 +- .../DrawableContainerBoundsChangeMemento.cs | 45 +- GreenshotBoxPlugin/BoxConfiguration.cs | 2 +- GreenshotBoxPlugin/BoxUtils.cs | 34 +- GreenshotBoxPlugin/Forms/SettingsForm.cs | 2 +- GreenshotConfluencePlugin/Confluence.cs | 19 +- .../ConfluenceDestination.cs | 8 +- GreenshotConfluencePlugin/ConfluencePlugin.cs | 2 +- GreenshotConfluencePlugin/ConfluenceUtils.cs | 3 +- GreenshotConfluencePlugin/EnumDisplayer.cs | 56 +- .../Forms/ConfluenceConfigurationForm.xaml.cs | 11 +- .../Forms/ConfluencePagePicker.xaml.cs | 14 +- .../Support/LanguageChangedEventManager.cs | 2 +- .../Support/LanguageXMLTranslationProvider.cs | 46 +- .../Support/TranslationData.cs | 85 ++- .../Support/TranslationManager.cs | 80 ++- GreenshotDropboxPlugin/DropboxDestination.cs | 24 +- GreenshotDropboxPlugin/DropboxPlugin.cs | 6 +- GreenshotDropboxPlugin/DropboxUtils.cs | 38 +- GreenshotDropboxPlugin/Forms/SettingsForm.cs | 4 - .../SettingsFormDetail.cs | 34 +- GreenshotFlickrPlugin/FlickrConfiguration.cs | 2 +- GreenshotFlickrPlugin/FlickrDestination.cs | 24 +- GreenshotFlickrPlugin/FlickrPlugin.cs | 16 +- GreenshotFlickrPlugin/FlickrUtils.cs | 37 +- GreenshotFlickrPlugin/Forms/SettingsForm.cs | 4 +- GreenshotImgurPlugin/Forms/ImgurForm.cs | 2 - GreenshotImgurPlugin/Forms/ImgurHistory.cs | 59 +- GreenshotImgurPlugin/Forms/SettingsForm.cs | 9 +- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 +- GreenshotImgurPlugin/ImgurDestination.cs | 21 +- GreenshotImgurPlugin/ImgurInfo.cs | 63 +-- GreenshotImgurPlugin/ImgurPlugin.cs | 3 - GreenshotJiraPlugin/JiraDestination.cs | 4 +- GreenshotJiraPlugin/JiraPlugin.cs | 3 - GreenshotOCRCommand/COMWrapper.cs | 99 ++-- GreenshotOCRCommand/ComProgIdAttribute.cs | 20 +- GreenshotOCRPlugin/OCRDestination.cs | 27 +- GreenshotOCRPlugin/OCRForm.cs | 4 +- GreenshotOCRPlugin/OCRPlugin.cs | 114 ++-- GreenshotOCRPlugin/SettingsForm.cs | 2 +- .../Destinations/ExcelDestination.cs | 66 +-- .../Destinations/OneNoteDestination.cs | 10 +- .../Destinations/OutlookDestination.cs | 113 ++-- .../Destinations/PowerpointDestination.cs | 66 +-- .../Destinations/WordDestination.cs | 81 +-- .../OfficeExport/ExcelExporter.cs | 20 +- .../OfficeExport/OneNoteExporter.cs | 111 ++-- .../OfficeExport/OutlookEmailExporter.cs | 246 ++++---- .../OfficeExport/WordExporter.cs | 65 ++- .../OfficeInterop/OutlookInterop.cs | 8 +- .../Forms/PhotobucketForm.cs | 2 - .../Forms/SettingsForm.cs | 3 +- .../PhotobucketConfiguration.cs | 4 +- .../PhotobucketDestination.cs | 43 +- GreenshotPhotobucketPlugin/PhotobucketInfo.cs | 40 +- .../PhotobucketPlugin.cs | 3 - .../PhotobucketUtils.cs | 131 +++-- GreenshotPicasaPlugin/Forms/SettingsForm.cs | 3 +- GreenshotPicasaPlugin/PicasaConfiguration.cs | 2 +- GreenshotPicasaPlugin/PicasaDestination.cs | 22 +- GreenshotPicasaPlugin/PicasaPlugin.cs | 13 +- GreenshotPicasaPlugin/PicasaUtils.cs | 26 +- GreenshotPlugin/Controls/AnimatingForm.cs | 33 +- .../Controls/ExtendedWebBrowser.cs | 3 - GreenshotPlugin/Controls/GreenshotComboBox.cs | 2 +- GreenshotPlugin/Controls/GreenshotForm.cs | 110 ++-- .../Controls/GreenshotRadioButton.cs | 10 +- GreenshotPlugin/Controls/HotkeyControl.cs | 133 ++--- GreenshotPlugin/Controls/ThumbnailForm.cs | 4 +- GreenshotPlugin/Core/AbstractDestination.cs | 106 ++-- GreenshotPlugin/Core/AccessibleHelper.cs | 4 +- GreenshotPlugin/Core/Cache.cs | 86 +-- GreenshotPlugin/Core/ClipboardHelper.cs | 135 +++-- GreenshotPlugin/Core/CoreConfiguration.cs | 46 +- GreenshotPlugin/Core/CredentialsHelper.cs | 140 +++-- GreenshotPlugin/Core/DisplayKeyAttribute.cs | 9 +- GreenshotPlugin/Core/EffectConverter.cs | 180 ++++++ GreenshotPlugin/Core/Effects.cs | 529 ------------------ GreenshotPlugin/Core/EmailConfigHelper.cs | 32 +- GreenshotPlugin/Core/EnumExtensions.cs | 60 +- GreenshotPlugin/Core/FastBitmap.cs | 59 +- GreenshotPlugin/Core/FilenameHelper.cs | 95 ++-- GreenshotPlugin/Core/ImageHelper.cs | 1 + GreenshotPlugin/Core/ImageOutput.cs | 8 +- GreenshotPlugin/Core/JSONHelper.cs | 11 +- GreenshotPlugin/Core/Language.cs | 305 +++++----- GreenshotPlugin/Core/LogHelper.cs | 28 +- GreenshotPlugin/Core/NetworkHelper.cs | 83 ++- GreenshotPlugin/Core/OAuthHelper.cs | 357 ++++-------- GreenshotPlugin/Core/PluginUtils.cs | 79 +-- GreenshotPlugin/Core/QuantizerHelper.cs | 4 +- GreenshotPlugin/Core/RssHelper.cs | 140 +++-- GreenshotPlugin/Core/StringExtensions.cs | 28 +- GreenshotPlugin/Core/WindowCapture.cs | 167 +++--- GreenshotPlugin/Core/WindowsHelper.cs | 10 +- GreenshotPlugin/Effects/AdjustEffect.cs | 57 ++ GreenshotPlugin/Effects/BorderEffect.cs | 51 ++ GreenshotPlugin/Effects/DropShadowEffect.cs | 64 +++ GreenshotPlugin/Effects/GrayscaleEffect.cs | 39 ++ GreenshotPlugin/Effects/IEffect.cs | 45 ++ GreenshotPlugin/Effects/InvertEffect.cs | 39 ++ GreenshotPlugin/Effects/MonochromeEffect.cs | 44 ++ GreenshotPlugin/Effects/ReduceColorsEffect.cs | 60 ++ GreenshotPlugin/Effects/ResizeCanvasEffect.cs | 66 +++ GreenshotPlugin/Effects/ResizeEffect.cs | 56 ++ GreenshotPlugin/Effects/RotateEffect.cs | 59 ++ GreenshotPlugin/Effects/TornEdgeEffect.cs | 80 +++ GreenshotPlugin/GlobalSuppressions.cs | Bin 112942 -> 112958 bytes GreenshotPlugin/GreenshotPlugin.csproj | 14 +- GreenshotPlugin/IniFile/IniAttributes.cs | 12 +- GreenshotPlugin/IniFile/IniConfig.cs | 236 ++++---- GreenshotPlugin/IniFile/IniValue.cs | 206 +++---- GreenshotPlugin/Interfaces/Generic.cs | 1 + GreenshotPlugin/Interfaces/IDestination.cs | 75 +-- .../Interfaces/Plugin/PluginInterfaces.cs | 1 + GreenshotPlugin/Interop/COMWrapper.cs | 62 +- GreenshotPlugin/Interop/ComProgIdAttribute.cs | 24 +- GreenshotPlugin/Interop/IUnknown.cs | 4 +- GreenshotPlugin/UnmanagedHelpers/DWM.cs | 8 +- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 4 +- GreenshotPlugin/UnmanagedHelpers/GDIplus.cs | 55 +- GreenshotPlugin/UnmanagedHelpers/Shell32.cs | 4 +- GreenshotPlugin/UnmanagedHelpers/Structs.cs | 46 +- GreenshotPlugin/UnmanagedHelpers/User32.cs | 12 +- .../UnmanagedHelpers/Win32Errors.cs | 4 +- 189 files changed, 4609 insertions(+), 5203 deletions(-) create mode 100644 GreenshotPlugin/Core/EffectConverter.cs delete mode 100644 GreenshotPlugin/Core/Effects.cs create mode 100644 GreenshotPlugin/Effects/AdjustEffect.cs create mode 100644 GreenshotPlugin/Effects/BorderEffect.cs create mode 100644 GreenshotPlugin/Effects/DropShadowEffect.cs create mode 100644 GreenshotPlugin/Effects/GrayscaleEffect.cs create mode 100644 GreenshotPlugin/Effects/IEffect.cs create mode 100644 GreenshotPlugin/Effects/InvertEffect.cs create mode 100644 GreenshotPlugin/Effects/MonochromeEffect.cs create mode 100644 GreenshotPlugin/Effects/ReduceColorsEffect.cs create mode 100644 GreenshotPlugin/Effects/ResizeCanvasEffect.cs create mode 100644 GreenshotPlugin/Effects/ResizeEffect.cs create mode 100644 GreenshotPlugin/Effects/RotateEffect.cs create mode 100644 GreenshotPlugin/Effects/TornEdgeEffect.cs diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index f019b44af..e7c90623c 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -26,6 +26,7 @@ using Greenshot.Drawing.Fields; using GreenshotPlugin.UnmanagedHelpers; using Greenshot.IniFile; using Greenshot.Core; +using GreenshotPlugin.Effects; using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Configuration { @@ -99,9 +100,10 @@ namespace Greenshot.Configuration { } else { LastUsedFieldValues.Add(requestedField, fieldValue); } - Field returnField = new Field(fieldType, requestingType); - returnField.Value = fieldValue; - return returnField; + return new Field(fieldType, requestingType) + { + Value = fieldValue + }; } public void UpdateLastFieldValue(IField field) diff --git a/Greenshot/Controls/BindableToolStripButton.cs b/Greenshot/Controls/BindableToolStripButton.cs index 52dfcd3e8..7c1c50b85 100644 --- a/Greenshot/Controls/BindableToolStripButton.cs +++ b/Greenshot/Controls/BindableToolStripButton.cs @@ -41,8 +41,9 @@ namespace Greenshot.Controls { CheckedChanged += BindableToolStripButton_CheckedChanged; } - private void BindableToolStripButton_CheckedChanged(object sender, EventArgs e) { - if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Checked")); + private void BindableToolStripButton_CheckedChanged(object sender, EventArgs e) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Checked")); } } } diff --git a/Greenshot/Controls/BindableToolStripComboBox.cs b/Greenshot/Controls/BindableToolStripComboBox.cs index 14560ca12..d0f706260 100644 --- a/Greenshot/Controls/BindableToolStripComboBox.cs +++ b/Greenshot/Controls/BindableToolStripComboBox.cs @@ -41,11 +41,9 @@ namespace Greenshot.Controls { SelectedIndexChanged += BindableToolStripComboBox_SelectedIndexChanged; } - private void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) { - if(PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); - - } + private void BindableToolStripComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedItem")); } } } diff --git a/Greenshot/Controls/BindableToolStripDropDownButton.cs b/Greenshot/Controls/BindableToolStripDropDownButton.cs index 05df712b6..da638d481 100644 --- a/Greenshot/Controls/BindableToolStripDropDownButton.cs +++ b/Greenshot/Controls/BindableToolStripDropDownButton.cs @@ -48,7 +48,7 @@ namespace Greenshot.Controls { if(Tag == null || !Tag.Equals(clickedItem.Tag)) { Tag = clickedItem.Tag; Image = clickedItem.Image; - if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SelectedTag")); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedTag")); } base.OnDropDownItemClicked(e); } @@ -63,7 +63,7 @@ namespace Greenshot.Controls { } } Tag = tag; - if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SelectedTag")); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedTag")); } } } diff --git a/Greenshot/Controls/ColorButton.cs b/Greenshot/Controls/ColorButton.cs index 50546a3d8..d37fbf1c9 100644 --- a/Greenshot/Controls/ColorButton.cs +++ b/Greenshot/Controls/ColorButton.cs @@ -72,14 +72,16 @@ namespace Greenshot.Controls { colorDialog.Color = SelectedColor; // Using the parent to make sure the dialog doesn't show on another window colorDialog.ShowDialog(Parent.Parent); - if (colorDialog.DialogResult != DialogResult.Cancel) { - if (!colorDialog.Color.Equals(SelectedColor)) { - SelectedColor = colorDialog.Color; - if(PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs("SelectedColor")); - } - } + if (colorDialog.DialogResult == DialogResult.Cancel) + { + return; } + if (colorDialog.Color.Equals(SelectedColor)) + { + return; + } + SelectedColor = colorDialog.Color; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedColor")); } } } diff --git a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index f3e110bb2..d3e8b5db2 100644 --- a/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -29,18 +29,16 @@ namespace Greenshot.Controls { /// ToolStripProfessionalRenderer which draws the Check correctly when the icons are larger /// public class ContextMenuToolStripProfessionalRenderer : ToolStripProfessionalRenderer { - private static readonly CoreConfiguration coreConfiguration = IniConfig.GetIniSection(); - private static Image scaledCheckbox; + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private static Image _scaledCheckbox; protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { - if (scaledCheckbox == null || scaledCheckbox.Size != coreConfiguration.IconSize) { - if (scaledCheckbox != null) { - scaledCheckbox.Dispose(); - } - scaledCheckbox = ImageHelper.ResizeImage(e.Image, true, coreConfiguration.IconSize.Width, coreConfiguration.IconSize.Height, null); + if (_scaledCheckbox == null || _scaledCheckbox.Size != CoreConfig.IconSize) { + _scaledCheckbox?.Dispose(); + _scaledCheckbox = ImageHelper.ResizeImage(e.Image, true, CoreConfig.IconSize.Width, CoreConfig.IconSize.Height, null); } Rectangle old = e.ImageRectangle; - ToolStripItemImageRenderEventArgs clone = new ToolStripItemImageRenderEventArgs(e.Graphics, e.Item, scaledCheckbox, new Rectangle(old.X, 0, old.Width, old.Height)); + ToolStripItemImageRenderEventArgs clone = new ToolStripItemImageRenderEventArgs(e.Graphics, e.Item, _scaledCheckbox, new Rectangle(old.X, 0, old.Width, old.Height)); base.OnRenderItemCheck(clone); } } diff --git a/Greenshot/Controls/Pipette.cs b/Greenshot/Controls/Pipette.cs index f59b898f9..662b30931 100644 --- a/Greenshot/Controls/Pipette.cs +++ b/Greenshot/Controls/Pipette.cs @@ -84,9 +84,7 @@ namespace Greenshot.Controls { if (_cursor != null) { _cursor.Dispose(); } - if (_movableShowColorForm != null) { - _movableShowColorForm.Dispose(); - } + _movableShowColorForm?.Dispose(); } _movableShowColorForm = null; _cursor = null; @@ -114,10 +112,7 @@ namespace Greenshot.Controls { { //Release Capture should consume MouseUp when canceled with the escape key User32.ReleaseCapture(); - if (PipetteUsed != null) - { - PipetteUsed(this, new PipetteUsedArgs(_movableShowColorForm.color)); - } + PipetteUsed?.Invoke(this, new PipetteUsedArgs(_movableShowColorForm.color)); } base.OnMouseUp(e); } diff --git a/Greenshot/Controls/ToolStripColorButton.cs b/Greenshot/Controls/ToolStripColorButton.cs index 05391bfd7..ac4fcd736 100644 --- a/Greenshot/Controls/ToolStripColorButton.cs +++ b/Greenshot/Controls/ToolStripColorButton.cs @@ -70,14 +70,16 @@ namespace Greenshot.Controls { colorDialog.Color = SelectedColor; // Using the parent to make sure the dialog doesn't show on another window colorDialog.ShowDialog(Parent.Parent); - if (colorDialog.DialogResult != DialogResult.Cancel) { - if (!colorDialog.Color.Equals(SelectedColor)) { - SelectedColor = colorDialog.Color; - if (PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs("SelectedColor")); - } - } + if (colorDialog.DialogResult == DialogResult.Cancel) + { + return; } + if (colorDialog.Color.Equals(SelectedColor)) + { + return; + } + SelectedColor = colorDialog.Color; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedColor")); } } } diff --git a/Greenshot/Controls/ToolStripNumericUpDown.cs b/Greenshot/Controls/ToolStripNumericUpDown.cs index f368f8409..f683f7c9b 100644 --- a/Greenshot/Controls/ToolStripNumericUpDown.cs +++ b/Greenshot/Controls/ToolStripNumericUpDown.cs @@ -34,16 +34,13 @@ namespace Greenshot.Controls { { } - public NumericUpDown NumericUpDown - { - get {return Control as NumericUpDown;} - } - + public NumericUpDown NumericUpDown => Control as NumericUpDown; + public decimal Value - { - get { return NumericUpDown.Value; } - set { NumericUpDown.Value = value;} - } + { + get { return NumericUpDown.Value; } + set { NumericUpDown.Value = value;} + } public decimal Minimum { get { return NumericUpDown.Minimum; } set { NumericUpDown.Minimum = value; } @@ -74,8 +71,9 @@ namespace Greenshot.Controls { NumericUpDown.ValueChanged -= _valueChanged; } - private void _valueChanged(object sender, EventArgs e) { - if(PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Value")); + private void _valueChanged(object sender, EventArgs e) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value")); } } } diff --git a/Greenshot/Destinations/EditorDestination.cs b/Greenshot/Destinations/EditorDestination.cs index ac300f386..ab66cd04e 100644 --- a/Greenshot/Destinations/EditorDestination.cs +++ b/Greenshot/Destinations/EditorDestination.cs @@ -66,7 +66,7 @@ namespace Greenshot.Destinations { } } - public override bool isDynamic { + public override bool IsDynamic { get { return true; } diff --git a/Greenshot/Destinations/EmailDestination.cs b/Greenshot/Destinations/EmailDestination.cs index 01593fded..5c6b7e013 100644 --- a/Greenshot/Destinations/EmailDestination.cs +++ b/Greenshot/Destinations/EmailDestination.cs @@ -32,77 +32,57 @@ namespace Greenshot.Destinations { /// Description of EmailDestination. /// public class EmailDestination : AbstractDestination { - private static readonly Image mailIcon = GreenshotResources.getImage("Email.Image"); - private static bool isActiveFlag; - private static string mapiClient; + private static readonly Image MailIcon = GreenshotResources.getImage("Email.Image"); + private static bool _isActiveFlag; + private static string _mapiClient; public const string DESIGNATION = "EMail"; static EmailDestination() { // Logic to decide what email implementation we use - if (EmailConfigHelper.HasMAPI()) { - isActiveFlag = true; - mapiClient = EmailConfigHelper.GetMapiClient(); - if (!string.IsNullOrEmpty(mapiClient)) { + if (EmailConfigHelper.HasMapi()) { + _isActiveFlag = true; + _mapiClient = EmailConfigHelper.GetMapiClient(); + if (!string.IsNullOrEmpty(_mapiClient)) { // Active as we have a mapi client, can be disabled later - isActiveFlag = true; + _isActiveFlag = true; } } } - public EmailDestination() { - - } - - public override string Designation { - get { - return DESIGNATION; - } - } + public override string Designation => DESIGNATION; public override string Description { get { // Make sure there is some kind of "mail" name - if (mapiClient == null) { - mapiClient = Language.GetString(LangKey.editor_email); + if (_mapiClient == null) { + _mapiClient = Language.GetString(LangKey.editor_email); } - return mapiClient; + return _mapiClient; } } - public override int Priority { - get { - return 3; - } - } + public override int Priority => 3; - public override bool isActive { + public override bool IsActive { get { - if (isActiveFlag) { + if (_isActiveFlag) { // Disable if the office plugin is installed and the client is outlook // TODO: Change this! It always creates an exception, as the plugin has not been loaded the type is not there :( Type outlookdestination = Type.GetType("GreenshotOfficePlugin.OutlookDestination,GreenshotOfficePlugin"); if (outlookdestination != null) { - if (mapiClient.ToLower().Contains("microsoft outlook")) { - isActiveFlag = false; + if (_mapiClient.ToLower().Contains("microsoft outlook")) { + _isActiveFlag = false; } } } - return base.isActive && isActiveFlag; + return base.IsActive && _isActiveFlag; } } - public override Keys EditorShortcutKeys { - get { - return Keys.Control | Keys.E; - } - } + public override Keys EditorShortcutKeys => Keys.Control | Keys.E; + + public override Image DisplayIcon => MailIcon; - public override Image DisplayIcon { - get { - return mailIcon; - } - } - public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); MapiMailMessage.SendImage(surface, captureDetails); diff --git a/Greenshot/Destinations/FileDestination.cs b/Greenshot/Destinations/FileDestination.cs index 0a70073cd..d3f1a2cb4 100644 --- a/Greenshot/Destinations/FileDestination.cs +++ b/Greenshot/Destinations/FileDestination.cs @@ -35,60 +35,40 @@ namespace Greenshot.Destinations { /// Description of FileSaveAsDestination. /// public class FileDestination : AbstractDestination { - private static readonly ILog LOG = LogManager.GetLogger(typeof(FileDestination)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(FileDestination)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); public const string DESIGNATION = "FileNoDialog"; - public override string Designation { - get { - return DESIGNATION; - } - } + public override string Designation => DESIGNATION; - public override string Description { - get { - return Language.GetString(LangKey.quicksettings_destination_file); - } - } + public override string Description => Language.GetString(LangKey.quicksettings_destination_file); - public override int Priority { - get { - return 0; - } - } + public override int Priority => 0; - public override Keys EditorShortcutKeys { - get { - return Keys.Control | Keys.S; - } - } - - public override Image DisplayIcon { - get { - return GreenshotResources.getImage("Save.Image"); - } - } + public override Keys EditorShortcutKeys => Keys.Control | Keys.S; + + public override Image DisplayIcon => GreenshotResources.getImage("Save.Image"); public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); bool outputMade; - bool overwrite; - string fullPath; + bool overwrite; + string fullPath; // Get output settings from the configuration SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(); - if (captureDetails != null && captureDetails.Filename != null) { - // As we save a pre-selected file, allow to overwrite. - overwrite = true; - LOG.InfoFormat("Using previous filename"); - fullPath = captureDetails.Filename; + if (captureDetails?.Filename != null) { + // As we save a pre-selected file, allow to overwrite. + overwrite = true; + Log.InfoFormat("Using previous filename"); + fullPath = captureDetails.Filename; outputSettings.Format = ImageOutput.FormatForFilename(fullPath); - } else { - fullPath = CreateNewFilename(captureDetails); - // As we generate a file, the configuration tells us if we allow to overwrite - overwrite = conf.OutputFileAllowOverwrite; - } - if (conf.OutputFilePromptQuality) { + } else { + fullPath = CreateNewFilename(captureDetails); + // As we generate a file, the configuration tells us if we allow to overwrite + overwrite = CoreConfig.OutputFileAllowOverwrite; + } + if (CoreConfig.OutputFilePromptQuality) { QualityDialog qualityDialog = new QualityDialog(outputSettings); qualityDialog.ShowDialog(); } @@ -96,16 +76,16 @@ namespace Greenshot.Destinations { // 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(surface, fullPath, overwrite, outputSettings, conf.OutputFileCopyPathToClipboard); + ImageOutput.Save(surface, fullPath, overwrite, outputSettings, CoreConfig.OutputFileCopyPathToClipboard); outputMade = true; } catch (ArgumentException ex1) { // Our generated filename exists, display 'save-as' - LOG.InfoFormat("Not overwriting: {0}", ex1.Message); + Log.InfoFormat("Not overwriting: {0}", ex1.Message); // when we don't allow to overwrite present a new SaveWithDialog fullPath = ImageOutput.SaveWithDialog(surface, captureDetails); outputMade = fullPath != null; } catch (Exception ex2) { - LOG.Error("Error saving screenshot!", ex2); + Log.Error("Error saving screenshot!", ex2); // Show the problem MessageBox.Show(Language.GetString(LangKey.error_save), Language.GetString(LangKey.error)); // when save failed we present a SaveWithDialog @@ -120,7 +100,7 @@ namespace Greenshot.Destinations { { captureDetails.Filename = fullPath; } - conf.OutputFileAsFullpath = fullPath; + CoreConfig.OutputFileAsFullpath = fullPath; } ProcessExport(exportInformation, surface); @@ -129,18 +109,18 @@ namespace Greenshot.Destinations { private static string CreateNewFilename(ICaptureDetails captureDetails) { string fullPath; - LOG.InfoFormat("Creating new filename"); - string pattern = conf.OutputFileFilenamePattern; + Log.InfoFormat("Creating new filename"); + string pattern = CoreConfig.OutputFileFilenamePattern; if (string.IsNullOrEmpty(pattern)) { pattern = "greenshot ${capturetime}"; } - string filename = FilenameHelper.GetFilenameFromPattern(pattern, conf.OutputFileFormat, captureDetails); - string filepath = FilenameHelper.FillVariables(conf.OutputFilePath, false); + string filename = FilenameHelper.GetFilenameFromPattern(pattern, CoreConfig.OutputFileFormat, captureDetails); + string filepath = FilenameHelper.FillVariables(CoreConfig.OutputFilePath, false); try { fullPath = Path.Combine(filepath, filename); } catch (ArgumentException) { // configured filename or path not valid, show error message... - LOG.InfoFormat("Generated path or filename not valid: {0}, {1}", filepath, filename); + Log.InfoFormat("Generated path or filename not valid: {0}, {1}", filepath, filename); MessageBox.Show(Language.GetString(LangKey.error_save_invalid_chars), Language.GetString(LangKey.error)); // ... lets get the pattern fixed.... diff --git a/Greenshot/Destinations/PickerDestination.cs b/Greenshot/Destinations/PickerDestination.cs index b185d112c..6a7fc29be 100644 --- a/Greenshot/Destinations/PickerDestination.cs +++ b/Greenshot/Destinations/PickerDestination.cs @@ -24,36 +24,20 @@ using Greenshot.Configuration; using GreenshotPlugin.Core; using Greenshot.Plugin; using Greenshot.Helpers; -using Greenshot.IniFile; -using log4net; namespace Greenshot.Destinations { /// /// The PickerDestination shows a context menu with all possible destinations, so the user can "pick" one /// public class PickerDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(PickerDestination)); - private static CoreConfiguration conf = IniConfig.GetIniSection(); public const string DESIGNATION = "Picker"; - public override string Designation { - get { - return DESIGNATION; - } - } + public override string Designation => DESIGNATION; - public override string Description { - get { - return Language.GetString(LangKey.settings_destination_picker); - } - } + public override string Description => Language.GetString(LangKey.settings_destination_picker); + + public override int Priority => 1; - public override int Priority { - get { - return 1; - } - } - /// /// Export the capture with the destination picker @@ -68,7 +52,7 @@ namespace Greenshot.Destinations { if ("Picker".Equals(destination.Designation)) { continue; } - if (!destination.isActive) { + if (!destination.IsActive) { continue; } destinations.Add(destination); diff --git a/Greenshot/Destinations/PrinterDestination.cs b/Greenshot/Destinations/PrinterDestination.cs index 846d2bd99..8fa0c5f2e 100644 --- a/Greenshot/Destinations/PrinterDestination.cs +++ b/Greenshot/Destinations/PrinterDestination.cs @@ -76,7 +76,7 @@ namespace Greenshot.Destinations { } } - public override bool isDynamic { + public override bool IsDynamic { get { return true; } diff --git a/Greenshot/Drawing/Adorners/MoveAdorner.cs b/Greenshot/Drawing/Adorners/MoveAdorner.cs index 0cc39bb33..2d0c8d390 100644 --- a/Greenshot/Drawing/Adorners/MoveAdorner.cs +++ b/Greenshot/Drawing/Adorners/MoveAdorner.cs @@ -45,13 +45,7 @@ namespace Greenshot.Drawing.Adorners /// /// Returns the cursor for when the mouse is over the adorner /// - public override Cursor Cursor - { - get - { - return Cursors.SizeAll; - } - } + public override Cursor Cursor => Cursors.SizeAll; /// /// Handle the mouse down @@ -147,7 +141,6 @@ namespace Greenshot.Drawing.Adorners public override void Paint(PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; - Rectangle clipRectangle = paintEventArgs.ClipRectangle; var bounds = Bounds; GraphicsState state = targetGraphics.Save(); diff --git a/Greenshot/Drawing/Adorners/ResizeAdorner.cs b/Greenshot/Drawing/Adorners/ResizeAdorner.cs index ea6ab3843..55635e098 100644 --- a/Greenshot/Drawing/Adorners/ResizeAdorner.cs +++ b/Greenshot/Drawing/Adorners/ResizeAdorner.cs @@ -168,7 +168,6 @@ namespace Greenshot.Drawing.Adorners public override void Paint(PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; - Rectangle clipRectangle = paintEventArgs.ClipRectangle; var bounds = Bounds; GraphicsState state = targetGraphics.Save(); diff --git a/Greenshot/Drawing/Adorners/TargetAdorner.cs b/Greenshot/Drawing/Adorners/TargetAdorner.cs index cbb80e63a..92c51b5b9 100644 --- a/Greenshot/Drawing/Adorners/TargetAdorner.cs +++ b/Greenshot/Drawing/Adorners/TargetAdorner.cs @@ -95,7 +95,6 @@ namespace Greenshot.Drawing.Adorners public override void Paint(PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; - Rectangle clipRectangle = paintEventArgs.ClipRectangle; var bounds = Bounds; targetGraphics.FillRectangle(Brushes.Green, bounds.X, bounds.Y, bounds.Width, bounds.Height); diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 7cdd62b61..92c3a92d7 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -383,12 +383,12 @@ namespace Greenshot.Drawing Rectangle drawingRect = new Rectangle(Bounds.Location, Bounds.Size); drawingRect.Intersect(clipRectangle); if(filter is MagnifierFilter) { - // quick&dirty bugfix, because MagnifierFilter behaves differently when drawn only partially - // what we should actually do to resolve this is add a better magnifier which is not that special - filter.Apply(graphics, bmp, Bounds, renderMode); - } else { - filter.Apply(graphics, bmp, drawingRect, renderMode); - } + // quick&dirty bugfix, because MagnifierFilter behaves differently when drawn only partially + // what we should actually do to resolve this is add a better magnifier which is not that special + filter.Apply(graphics, bmp, Bounds, renderMode); + } else { + filter.Apply(graphics, bmp, drawingRect, renderMode); + } } } } @@ -517,7 +517,7 @@ namespace Greenshot.Drawing /// public void HandleFieldChanged(object sender, FieldChangedEventArgs e) { LOG.DebugFormat("Field {0} changed", e.Field.FieldType); - if (e.Field.FieldType == FieldType.SHADOW) { + if (Equals(e.Field.FieldType, FieldType.SHADOW)) { accountForShadowChange = true; } } diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index 3a8fd54bc..e0f1c864c 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -20,6 +20,7 @@ */ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Drawing; using System.Runtime.Serialization; @@ -37,52 +38,55 @@ namespace Greenshot.Drawing.Fields public abstract class AbstractFieldHolder : IFieldHolder { private static readonly ILog LOG = LogManager.GetLogger(typeof(AbstractFieldHolder)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection(); + private static readonly EditorConfiguration EditorConfig = IniConfig.GetIniSection(); + private readonly IDictionary _handlers = new Dictionary(); /// /// called when a field's value has changed /// [NonSerialized] - private FieldChangedEventHandler fieldChanged; + private FieldChangedEventHandler _fieldChanged; + public event FieldChangedEventHandler FieldChanged { - add { fieldChanged += value; } - remove { fieldChanged -= value; } + add { _fieldChanged += value; } + remove { _fieldChanged -= value; } } // we keep two Collections of our fields, dictionary for quick access, list for serialization // this allows us to use default serialization [NonSerialized] - private IDictionary fieldsByType = new Dictionary(); - private IList fields = new List(); - - public AbstractFieldHolder() { } + private IDictionary _fieldsByType = new Dictionary(); + private readonly IList fields = new List(); [OnDeserialized] private void OnDeserialized(StreamingContext context) { - fieldsByType = new Dictionary(); + _fieldsByType = new Dictionary(); // listen to changing properties - foreach (Field field in fields) + foreach (var field in fields) { field.PropertyChanged += delegate { - if (fieldChanged != null) - { - fieldChanged(this, new FieldChangedEventArgs(field)); - } + _fieldChanged?.Invoke(this, new FieldChangedEventArgs(field)); }; - fieldsByType[field.FieldType] = field; + _fieldsByType[field.FieldType] = field; } } public void AddField(Type requestingType, IFieldType fieldType, object fieldValue) { - AddField(editorConfiguration.CreateField(requestingType, fieldType, fieldValue)); + AddField(EditorConfig.CreateField(requestingType, fieldType, fieldValue)); } public virtual void AddField(IField field) { - if (fieldsByType != null && fieldsByType.ContainsKey(field.FieldType)) + fields.Add(field); + if (_fieldsByType == null) + { + return; + } + + if (_fieldsByType.ContainsKey(field.FieldType)) { if (LOG.IsDebugEnabled) { @@ -90,21 +94,21 @@ namespace Greenshot.Drawing.Fields } } - fields.Add(field); - fieldsByType[field.FieldType] = field; - field.PropertyChanged += delegate { if (fieldChanged != null) fieldChanged(this, new FieldChangedEventArgs(field)); }; + _fieldsByType[field.FieldType] = field; + + _handlers[field] = (sender, args) => + { + _fieldChanged?.Invoke(this, new FieldChangedEventArgs(field)); + }; + field.PropertyChanged += _handlers[field]; } public void RemoveField(IField field) { fields.Remove(field); - fieldsByType.Remove(field.FieldType); - field.PropertyChanged -= delegate { - if (fieldChanged != null) - { - fieldChanged(this, new FieldChangedEventArgs(field)); - } - }; + _fieldsByType.Remove(field.FieldType); + field.PropertyChanged -= _handlers[field]; + _handlers.Remove(field); } public IList GetFields() @@ -117,7 +121,7 @@ namespace Greenshot.Drawing.Fields { try { - return fieldsByType[fieldType]; + return _fieldsByType[fieldType]; } catch (KeyNotFoundException e) { @@ -169,19 +173,19 @@ namespace Greenshot.Drawing.Fields public bool HasField(IFieldType fieldType) { - return fieldsByType.ContainsKey(fieldType); + return _fieldsByType.ContainsKey(fieldType); } public bool HasFieldValue(IFieldType fieldType) { - return HasField(fieldType) && fieldsByType[fieldType].HasValue; + return HasField(fieldType) && _fieldsByType[fieldType].HasValue; } public void SetFieldValue(IFieldType fieldType, object value) { try { - fieldsByType[fieldType].Value = value; + _fieldsByType[fieldType].Value = value; } catch (KeyNotFoundException e) { @@ -191,10 +195,7 @@ namespace Greenshot.Drawing.Fields protected void OnFieldChanged(object sender, FieldChangedEventArgs e) { - if (fieldChanged != null) - { - fieldChanged(sender, e); - } + _fieldChanged?.Invoke(sender, e); } } } diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index 55c810d27..6aac87393 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -34,7 +34,7 @@ namespace Greenshot.Drawing.Fields [Serializable()] public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder { - private FieldChangedEventHandler fieldChangedEventHandler; + private readonly FieldChangedEventHandler _fieldChangedEventHandler; [NonSerialized] private EventHandler childrenChanged; @@ -48,7 +48,7 @@ namespace Greenshot.Drawing.Fields public AbstractFieldHolderWithChildren() { - fieldChangedEventHandler = OnFieldChanged; + _fieldChangedEventHandler = OnFieldChanged; } [OnDeserialized()] @@ -57,28 +57,28 @@ namespace Greenshot.Drawing.Fields // listen to changing properties foreach (IFieldHolder fieldHolder in Children) { - fieldHolder.FieldChanged += fieldChangedEventHandler; + fieldHolder.FieldChanged += _fieldChangedEventHandler; } - if (childrenChanged != null) childrenChanged(this, EventArgs.Empty); + childrenChanged?.Invoke(this, EventArgs.Empty); } public void AddChild(IFieldHolder fieldHolder) { Children.Add(fieldHolder); - fieldHolder.FieldChanged += fieldChangedEventHandler; - if (childrenChanged != null) childrenChanged(this, EventArgs.Empty); + fieldHolder.FieldChanged += _fieldChangedEventHandler; + childrenChanged?.Invoke(this, EventArgs.Empty); } public void RemoveChild(IFieldHolder fieldHolder) { Children.Remove(fieldHolder); - fieldHolder.FieldChanged -= fieldChangedEventHandler; - if (childrenChanged != null) childrenChanged(this, EventArgs.Empty); + fieldHolder.FieldChanged -= _fieldChangedEventHandler; + childrenChanged?.Invoke(this, EventArgs.Empty); } public new IList GetFields() { - List ret = new List(); + var ret = new List(); ret.AddRange(base.GetFields()); foreach (IFieldHolder fh in Children) { diff --git a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs index 3a3833d4b..69aa3feae 100644 --- a/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs +++ b/Greenshot/Drawing/Fields/Binding/BidirectionalBinding.cs @@ -129,7 +129,7 @@ namespace Greenshot.Drawing.Fields.Binding { 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); + throw new MemberAccessException("Could not set property '"+targetProperty+"' to '"+bValue+"' ["+(bValue?.GetType().Name ?? "")+"] on "+targetObject+". Probably other type than expected, IBindingCoverter to the rescue.", e); } } diff --git a/Greenshot/Drawing/Fields/Field.cs b/Greenshot/Drawing/Fields/Field.cs index cf6c1b81b..f6434b73a 100644 --- a/Greenshot/Drawing/Fields/Field.cs +++ b/Greenshot/Drawing/Fields/Field.cs @@ -47,10 +47,7 @@ namespace Greenshot.Drawing.Fields if (!Equals(_myValue, value)) { _myValue = value; - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs("Value")); - } + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value")); } } } @@ -93,10 +90,7 @@ namespace Greenshot.Drawing.Fields /// /// Returns true if this field holds a value other than null. /// - public bool HasValue - { - get { return Value != null; } - } + public bool HasValue => Value != null; /// /// Creates a flat clone of this Field. The fields value itself is not cloned. @@ -104,9 +98,7 @@ namespace Greenshot.Drawing.Fields /// public Field Clone() { - Field ret = new Field(FieldType, Scope); - ret.Value = Value; - return ret; + return new Field(FieldType, Scope) {Value = Value}; } public override int GetHashCode() @@ -123,7 +115,7 @@ namespace Greenshot.Drawing.Fields public override bool Equals(object obj) { - Field other = obj as Field; + var other = obj as Field; if (other == null) { return false; diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index efeab79bd..8f3631f87 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -24,7 +24,6 @@ using Greenshot.IniFile; using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using GreenshotPlugin.Interfaces.Drawing; -using log4net; using System.Collections.Generic; using System.ComponentModel; @@ -41,26 +40,25 @@ namespace Greenshot.Drawing.Fields /// 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 + public sealed class FieldAggregator : AbstractFieldHolder { - private IDrawableContainerList boundContainers; - private bool internalUpdateRunning = false; + private readonly IDrawableContainerList _boundContainers; + private bool _internalUpdateRunning; - private enum Status { IDLE, BINDING, UPDATING }; - - private static readonly ILog LOG = LogManager.GetLogger(typeof(FieldAggregator)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection(); + private static readonly EditorConfiguration EditorConfig = IniConfig.GetIniSection(); public FieldAggregator(ISurface parent) { - foreach (FieldType fieldType in FieldType.Values) + foreach (var fieldType in FieldType.Values) { - Field field = new Field(fieldType, GetType()); + var field = new Field(fieldType, GetType()); AddField(field); } - boundContainers = new DrawableContainerList(); - boundContainers.Parent = parent; + _boundContainers = new DrawableContainerList + { + Parent = parent + }; } public override void AddField(IField field) @@ -71,7 +69,7 @@ namespace Greenshot.Drawing.Fields public void BindElements(IDrawableContainerList dcs) { - foreach (DrawableContainer dc in dcs) + foreach (var dc in dcs) { BindElement(dc); } @@ -80,14 +78,15 @@ namespace Greenshot.Drawing.Fields public void BindElement(IDrawableContainer dc) { DrawableContainer container = dc as DrawableContainer; - if (container != null && !boundContainers.Contains(container)) + if (container == null || _boundContainers.Contains(container)) { - boundContainers.Add(container); - container.ChildrenChanged += delegate { - UpdateFromBoundElements(); - }; - UpdateFromBoundElements(); + return; } + _boundContainers.Add(container); + container.ChildrenChanged += delegate { + UpdateFromBoundElements(); + }; + UpdateFromBoundElements(); } public void BindAndUpdateElement(IDrawableContainer dc) @@ -103,8 +102,8 @@ namespace Greenshot.Drawing.Fields { return; } - internalUpdateRunning = true; - foreach (Field field in GetFields()) + _internalUpdateRunning = true; + foreach (var field in GetFields()) { if (container.HasField(field.FieldType) && field.HasValue) { @@ -112,14 +111,14 @@ namespace Greenshot.Drawing.Fields container.SetFieldValue(field.FieldType, field.Value); } } - internalUpdateRunning = false; + _internalUpdateRunning = false; } public void UnbindElement(IDrawableContainer dc) { - if (boundContainers.Contains(dc)) + if (_boundContainers.Contains(dc)) { - boundContainers.Remove(dc); + _boundContainers.Remove(dc); UpdateFromBoundElements(); } } @@ -127,7 +126,7 @@ namespace Greenshot.Drawing.Fields public void Clear() { ClearFields(); - boundContainers.Clear(); + _boundContainers.Clear(); UpdateFromBoundElements(); } @@ -136,12 +135,12 @@ namespace Greenshot.Drawing.Fields /// private void ClearFields() { - internalUpdateRunning = true; - foreach (Field field in GetFields()) + _internalUpdateRunning = true; + foreach (var field in GetFields()) { field.Value = null; } - internalUpdateRunning = false; + _internalUpdateRunning = false; } /// @@ -152,27 +151,27 @@ namespace Greenshot.Drawing.Fields private void UpdateFromBoundElements() { ClearFields(); - internalUpdateRunning = true; + _internalUpdateRunning = true; foreach (var field in FindCommonFields()) { SetFieldValue(field.FieldType, field.Value); } - internalUpdateRunning = false; + _internalUpdateRunning = false; } private IList FindCommonFields() { IList returnFields = null; - if (boundContainers.Count > 0) + if (_boundContainers.Count > 0) { // take all fields from the least selected container... - DrawableContainer leastSelectedContainer = boundContainers[boundContainers.Count - 1] as DrawableContainer; + DrawableContainer leastSelectedContainer = _boundContainers[_boundContainers.Count - 1] as DrawableContainer; if (leastSelectedContainer != null) { returnFields = leastSelectedContainer.GetFields(); - for (int i = 0; i < boundContainers.Count - 1; i++) + for (int i = 0; i < _boundContainers.Count - 1; i++) { - DrawableContainer dc = boundContainers[i] as DrawableContainer; + DrawableContainer dc = _boundContainers[i] as DrawableContainer; if (dc != null) { IList fieldsToRemove = new List(); @@ -184,7 +183,7 @@ namespace Greenshot.Drawing.Fields fieldsToRemove.Add(field); } } - foreach (IField field in fieldsToRemove) + foreach (var field in fieldsToRemove) { returnFields.Remove(field); } @@ -192,31 +191,30 @@ namespace Greenshot.Drawing.Fields } } } - if (returnFields == null) - { - returnFields = new List(); - } - return returnFields; + return returnFields ?? new List(); } public void OwnPropertyChanged(object sender, PropertyChangedEventArgs ea) { IField field = (IField)sender; - if (!internalUpdateRunning && field.Value != null) + if (_internalUpdateRunning || field.Value == null) { - foreach (DrawableContainer drawableContainer in boundContainers) + return; + } + foreach (var drawableContainer1 in _boundContainers) + { + var drawableContainer = (DrawableContainer) drawableContainer1; + if (!drawableContainer.HasField(field.FieldType)) { - if (drawableContainer.HasField(field.FieldType)) - { - IField drawableContainerField = drawableContainer.GetField(field.FieldType); - // Notify before change, so we can e.g. invalidate the area - drawableContainer.BeforeFieldChange(drawableContainerField, field.Value); - - drawableContainerField.Value = field.Value; - // update last used from DC field, so that scope is honored - editorConfiguration.UpdateLastFieldValue(drawableContainerField); - } + continue; } + IField drawableContainerField = drawableContainer.GetField(field.FieldType); + // Notify before change, so we can e.g. invalidate the area + drawableContainer.BeforeFieldChange(drawableContainerField, field.Value); + + drawableContainerField.Value = field.Value; + // update last used from DC field, so that scope is honored + EditorConfig.UpdateLastFieldValue(drawableContainerField); } } diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index e648c4291..e84d8913f 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -72,10 +72,9 @@ namespace Greenshot.Drawing.Filters { public abstract void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode); - protected void OnPropertyChanged(string propertyName) { - if (propertyChanged != null) { - propertyChanged(this, new PropertyChangedEventArgs(propertyName)); - } + protected void OnPropertyChanged(string propertyName) + { + propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } diff --git a/Greenshot/Drawing/FreehandContainer.cs b/Greenshot/Drawing/FreehandContainer.cs index 2f672a4ff..e8654bc4e 100644 --- a/Greenshot/Drawing/FreehandContainer.cs +++ b/Greenshot/Drawing/FreehandContainer.cs @@ -34,7 +34,7 @@ namespace Greenshot.Drawing { /// [Serializable] public class FreehandContainer : DrawableContainer { - private static readonly float [] POINT_OFFSET = new float[]{0.5f, 0.25f, 0.75f}; + private static readonly float [] PointOffset = {0.5f, 0.25f, 0.75f}; [NonSerialized] private GraphicsPath freehandPath = new GraphicsPath(); @@ -77,10 +77,9 @@ namespace Greenshot.Drawing { /// When disposing==true all non-managed resources should be freed too! protected override void Dispose(bool disposing) { base.Dispose(disposing); - if (disposing) { - if (freehandPath != null) { - freehandPath.Dispose(); - } + if (disposing) + { + freehandPath?.Dispose(); } freehandPath = null; } @@ -133,9 +132,7 @@ namespace Greenshot.Drawing { private void RecalculatePath() { isRecalculated = true; // Dispose the previous path, if we have one - if (freehandPath != null) { - freehandPath.Dispose(); - } + freehandPath?.Dispose(); freehandPath = new GraphicsPath(); // Here we can put some cleanup... like losing all the uninteresting points. @@ -143,7 +140,7 @@ namespace Greenshot.Drawing { int index = 0; while ((capturePoints.Count - 1) % 3 != 0) { // duplicate points, first at 50% than 25% than 75% - capturePoints.Insert((int)(capturePoints.Count*POINT_OFFSET[index]), capturePoints[(int)(capturePoints.Count*POINT_OFFSET[index++])]); + capturePoints.Insert((int)(capturePoints.Count*PointOffset[index]), capturePoints[(int)(capturePoints.Count*PointOffset[index++])]); } freehandPath.AddBeziers(capturePoints.ToArray()); } else if (capturePoints.Count == 2) { @@ -228,9 +225,9 @@ namespace Greenshot.Drawing { /// public override bool Equals(object obj) { bool ret = false; - if(obj != null && GetType().Equals(obj.GetType())) { + if(obj != null && GetType() == obj.GetType()) { FreehandContainer other = obj as FreehandContainer; - if(freehandPath.Equals(other.freehandPath)) { + if(other != null && freehandPath.Equals(other.freehandPath)) { ret = true; } } diff --git a/Greenshot/Drawing/HighlightContainer.cs b/Greenshot/Drawing/HighlightContainer.cs index 2f77fc158..82a352469 100644 --- a/Greenshot/Drawing/HighlightContainer.cs +++ b/Greenshot/Drawing/HighlightContainer.cs @@ -57,7 +57,7 @@ namespace Greenshot.Drawing { if (!sender.Equals(this)) { return; } - if (e.Field.FieldType == FieldType.PREPARED_FILTER_HIGHLIGHT) { + if (Equals(e.Field.FieldType, FieldType.PREPARED_FILTER_HIGHLIGHT)) { ConfigurePreparedFilters(); } } @@ -72,12 +72,16 @@ namespace Greenshot.Drawing { 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); + var brightnessFilter = new BrightnessFilter(this) + { + Invert = true + }; + Add(brightnessFilter); + var blurFilter = new BlurFilter(this) + { + Invert = true + }; + Add(blurFilter); break; case PreparedFilter.GRAYSCALE: AbstractFilter f = new GrayscaleFilter(this); diff --git a/Greenshot/Drawing/IconContainer.cs b/Greenshot/Drawing/IconContainer.cs index 8e5647a08..2277bd48a 100644 --- a/Greenshot/Drawing/IconContainer.cs +++ b/Greenshot/Drawing/IconContainer.cs @@ -32,7 +32,7 @@ namespace Greenshot.Drawing { /// [Serializable] public class IconContainer : DrawableContainer, IIconContainer { - private static readonly ILog LOG = LogManager.GetLogger(typeof(IconContainer)); + private static readonly ILog Log = LogManager.GetLogger(typeof(IconContainer)); protected Icon icon; @@ -57,9 +57,7 @@ namespace Greenshot.Drawing { public Icon Icon { set { - if (icon != null) { - icon.Dispose(); - } + icon?.Dispose(); icon = (Icon)value.Clone(); Width = value.Width; Height = value.Height; @@ -72,10 +70,9 @@ namespace Greenshot.Drawing { * When disposing==true all non-managed resources should be freed too! */ protected override void Dispose(bool disposing) { - if (disposing) { - if (icon != null) { - icon.Dispose(); - } + if (disposing) + { + icon?.Dispose(); } icon = null; base.Dispose(disposing); @@ -85,7 +82,7 @@ namespace Greenshot.Drawing { if (File.Exists(filename)) { using (Icon fileIcon = new Icon(filename)) { Icon = fileIcon; - LOG.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); + Log.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); } } } @@ -100,16 +97,8 @@ namespace Greenshot.Drawing { } } - public override bool HasDefaultSize { - get { - return true; - } - } + public override bool HasDefaultSize => true; - public override Size DefaultSize { - get { - return icon.Size; - } - } + public override Size DefaultSize => icon.Size; } } diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index 172ac7e9a..b29a92683 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -28,6 +28,7 @@ using System.Drawing.Drawing2D; using Greenshot.Core; using log4net; using System.Runtime.Serialization; +using GreenshotPlugin.Effects; using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Drawing { diff --git a/Greenshot/Drawing/ObfuscateContainer.cs b/Greenshot/Drawing/ObfuscateContainer.cs index 19782afab..ec3b0d734 100644 --- a/Greenshot/Drawing/ObfuscateContainer.cs +++ b/Greenshot/Drawing/ObfuscateContainer.cs @@ -52,7 +52,7 @@ namespace Greenshot.Drawing { protected void ObfuscateContainer_OnFieldChanged(object sender, FieldChangedEventArgs e) { if(sender.Equals(this)) { - if(e.Field.FieldType == FieldType.PREPARED_FILTER_OBFUSCATE) { + if(Equals(e.Field.FieldType, FieldType.PREPARED_FILTER_OBFUSCATE)) { ConfigurePreparedFilters(); } } diff --git a/Greenshot/Drawing/RoundedRectangle.cs b/Greenshot/Drawing/RoundedRectangle.cs index 751cc9ea1..54553ac37 100644 --- a/Greenshot/Drawing/RoundedRectangle.cs +++ b/Greenshot/Drawing/RoundedRectangle.cs @@ -19,6 +19,7 @@ * along with this program. If not, see . */ +using System; using System.Drawing; using System.Drawing.Drawing2D; @@ -27,6 +28,7 @@ namespace Greenshot.Drawing { /// TODO: currently this is only used in the capture form, we might move this code directly to there! /// public abstract class RoundedRectangle { + [Flags] public enum RectangleCorners { None = 0, TopLeft = 1, TopRight = 2, BottomLeft = 4, BottomRight = 8, diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index fd1da0091..d47f2ad0f 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -84,9 +84,11 @@ namespace Greenshot.Drawing { protected override void OnDeserialized(StreamingContext context) { Init(); - _stringFormat = new StringFormat(); - _stringFormat.Alignment = StringAlignment.Center; - _stringFormat.LineAlignment = StringAlignment.Center; + _stringFormat = new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }; } /// @@ -98,20 +100,14 @@ namespace Greenshot.Drawing { { return; } - if (Parent != null) { - ((Surface)Parent).RemoveStepLabel(this); - } + ((Surface) Parent)?.RemoveStepLabel(this); base.SwitchParent(newParent); if (newParent != null) { ((Surface)Parent)?.AddStepLabel(this); } } - public override Size DefaultSize { - get { - return new Size(30, 30); - } - } + public override Size DefaultSize => new Size(30, 30); public override bool InitContent() { _defaultEditMode = EditStatus.IDLE; @@ -148,14 +144,13 @@ namespace Greenshot.Drawing { if (!disposing) { return; } - if (Parent != null) + ((Surface) Parent)?.RemoveStepLabel(this); + if (_stringFormat == null) { - ((Surface)Parent).RemoveStepLabel(this); - } - if (_stringFormat != null) { - _stringFormat.Dispose(); - _stringFormat = null; + return; } + _stringFormat.Dispose(); + _stringFormat = null; } public override bool HandleMouseMove(int x, int y) { diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 3edf59364..3754b9f7f 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -40,6 +40,7 @@ using System.Drawing.Imaging; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Windows.Forms; +using GreenshotPlugin.Effects; namespace Greenshot.Drawing { @@ -48,9 +49,9 @@ namespace Greenshot.Drawing /// public sealed class Surface : Control, ISurface { - private static ILog LOG = LogManager.GetLogger(typeof(Surface)); - public static int Count = 0; - private static CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog LOG = LogManager.GetLogger(typeof(Surface)); + public static int Count; + private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); // Property to identify the Surface ID private Guid _uniqueId = Guid.NewGuid(); @@ -276,11 +277,6 @@ namespace Greenshot.Drawing /// private IDrawableContainer _cursorContainer; - /// - /// the capture details, needed with serialization - /// - private ICaptureDetails _captureDetails; - /// /// the modified flag specifies if the surface has had modifications after the last export. /// Initial state is modified, as "it's not saved" @@ -325,31 +321,19 @@ namespace Greenshot.Drawing /// /// The cursor container has it's own accessor so we can find and remove this (when needed) /// - public IDrawableContainer CursorContainer - { - get - { - return _cursorContainer; - } - } + public IDrawableContainer CursorContainer => _cursorContainer; /// /// A simple getter to ask if this surface has a cursor /// - public bool HasCursor - { - get - { - return _cursorContainer != null; - } - } + public bool HasCursor => _cursorContainer != null; /// /// A simple helper method to remove the cursor from the surface /// public void RemoveCursor() { - RemoveElement(_cursorContainer, true); + RemoveElement(_cursorContainer); _cursorContainer = null; } @@ -409,8 +393,10 @@ namespace Greenshot.Drawing _drawingMode = value; if (_drawingModeChanged != null) { - SurfaceDrawingModeEventArgs eventArgs = new SurfaceDrawingModeEventArgs(); - eventArgs.DrawingMode = _drawingMode; + SurfaceDrawingModeEventArgs eventArgs = new SurfaceDrawingModeEventArgs + { + DrawingMode = _drawingMode + }; _drawingModeChanged.Invoke(this, eventArgs); } DeselectAllElements(); @@ -445,22 +431,12 @@ namespace Greenshot.Drawing /// /// Property for accessing the capture details /// - public ICaptureDetails CaptureDetails - { - get - { - return _captureDetails; - } - set - { - _captureDetails = value; - } - } + public ICaptureDetails CaptureDetails { get; set; } /// /// Base Surface constructor /// - public Surface() : base() + public Surface() { _fieldAggregator = new FieldAggregator(this); Count++; @@ -537,7 +513,7 @@ namespace Greenshot.Drawing // Make sure the image is NOT disposed, we took the reference directly into ourselves ((Capture)capture).NullImage(); - _captureDetails = capture.CaptureDetails; + CaptureDetails = capture.CaptureDetails; } protected override void Dispose(bool disposing) @@ -615,46 +591,22 @@ namespace Greenshot.Drawing /// /// Returns if the surface can do a undo /// - public bool CanUndo - { - get - { - return _undoStack.Count > 0; - } - } + public bool CanUndo => _undoStack.Count > 0; /// /// Returns if the surface can do a redo /// - public bool CanRedo - { - get - { - return _redoStack.Count > 0; - } - } + public bool CanRedo => _redoStack.Count > 0; /// /// Get the language key for the undo action /// - public LangKey UndoActionLanguageKey - { - get - { - return LangKey.none; - } - } + public LangKey UndoActionLanguageKey => LangKey.none; /// /// Get the language key for redo action /// - public LangKey RedoActionLanguageKey - { - get - { - return LangKey.none; - } - } + public LangKey RedoActionLanguageKey => LangKey.none; /// /// Make an action undo-able @@ -722,9 +674,7 @@ namespace Greenshot.Drawing IDrawableContainerList loadedElements = (IDrawableContainerList)binaryRead.Deserialize(streamRead); loadedElements.Parent = this; // Make sure the steplabels are sorted accoring to their number - _stepLabels.Sort(delegate (StepLabelContainer p1, StepLabelContainer p2) { - return p1.Number.CompareTo(p2.Number); - }); + _stepLabels.Sort((p1, p2) => p1.Number.CompareTo(p2.Number)); DeselectAllElements(); AddElements(loadedElements); SelectElements(loadedElements); @@ -799,10 +749,12 @@ namespace Greenshot.Drawing #region Plugin interface implementations public IImageContainer AddImageContainer(Image image, int x, int y) { - ImageContainer bitmapContainer = new ImageContainer(this); - bitmapContainer.Image = image; - bitmapContainer.Left = x; - bitmapContainer.Top = y; + ImageContainer bitmapContainer = new ImageContainer(this) + { + Image = image, + Left = x, + Top = y + }; AddElement(bitmapContainer); return bitmapContainer; } @@ -818,10 +770,12 @@ namespace Greenshot.Drawing } public IIconContainer AddIconContainer(Icon icon, int x, int y) { - IconContainer iconContainer = new IconContainer(this); - iconContainer.Icon = icon; - iconContainer.Left = x; - iconContainer.Top = y; + IconContainer iconContainer = new IconContainer(this) + { + Icon = icon, + Left = x, + Top = y + }; AddElement(iconContainer); return iconContainer; } @@ -836,10 +790,12 @@ namespace Greenshot.Drawing } public ICursorContainer AddCursorContainer(Cursor cursor, int x, int y) { - CursorContainer cursorContainer = new CursorContainer(this); - cursorContainer.Cursor = cursor; - cursorContainer.Left = x; - cursorContainer.Top = y; + CursorContainer cursorContainer = new CursorContainer(this) + { + Cursor = cursor, + Left = x, + Top = y + }; AddElement(cursorContainer); return cursorContainer; } @@ -855,8 +811,7 @@ namespace Greenshot.Drawing 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 textContainer = new TextContainer(this) {Text = text}; textContainer.SetFieldValue(FieldType.FONT_FAMILY, family.Name); textContainer.SetFieldValue(FieldType.FONT_BOLD, bold); textContainer.SetFieldValue(FieldType.FONT_ITALIC, italic); @@ -1069,10 +1024,12 @@ namespace Greenshot.Drawing { if (_surfaceMessage != null) { - SurfaceMessageEventArgs eventArgs = new SurfaceMessageEventArgs(); - eventArgs.Message = message; - eventArgs.MessageType = messageType; - eventArgs.Surface = this; + var eventArgs = new SurfaceMessageEventArgs + { + Message = message, + MessageType = messageType, + Surface = this + }; _surfaceMessage(source, eventArgs); } } @@ -1133,10 +1090,7 @@ namespace Greenshot.Drawing { _elements.Transform(matrix); } - if (_surfaceSizeChanged != null) - { - _surfaceSizeChanged(this, null); - } + _surfaceSizeChanged?.Invoke(this, null); Invalidate(); } /// @@ -1196,8 +1150,7 @@ namespace Greenshot.Drawing IDrawableContainer rightClickedContainer = _elements.ClickableElementAt(_mouseStart.X, _mouseStart.Y); if (rightClickedContainer != null) { - selectedList = new DrawableContainerList(ID); - selectedList.Add(rightClickedContainer); + selectedList = new DrawableContainerList(ID) {rightClickedContainer}; } } if (selectedList != null && selectedList.Count > 0) @@ -1231,7 +1184,10 @@ namespace Greenshot.Drawing // if a new element has been drawn, set location and register it if (_drawingElement != null) { - _drawingElement.Status = _undrawnElement.DefaultEditMode; + if (_undrawnElement != null) + { + _drawingElement.Status = _undrawnElement.DefaultEditMode; + } if (!_drawingElement.HandleMouseDown(_mouseStart.X, _mouseStart.Y)) { _drawingElement.Left = _mouseStart.X; @@ -1362,14 +1318,7 @@ namespace Greenshot.Drawing Point currentMouse = e.Location; - if (DrawingMode != DrawingModes.None) - { - Cursor = Cursors.Cross; - } - else - { - Cursor = Cursors.Default; - } + Cursor = DrawingMode != DrawingModes.None ? Cursors.Cross : Cursors.Default; if (_mouseDown) { @@ -1597,8 +1546,7 @@ namespace Greenshot.Drawing Invalidate(); if (_movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = cloned; + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs {Elements = cloned}; _movingElementChanged(this, eventArgs); } } @@ -1663,13 +1611,7 @@ namespace Greenshot.Drawing /// Returns if this surface has selected elements /// /// - public bool HasSelectedElements - { - get - { - return (selectedElements != null && selectedElements.Count > 0); - } - } + public bool HasSelectedElements => (selectedElements != null && selectedElements.Count > 0); /// /// Remove all the selected elements @@ -1764,29 +1706,14 @@ namespace Greenshot.Drawing if (dcs != null) { // Make element(s) only move 10,10 if the surface is the same - Point moveOffset; bool isSameSurface = (dcs.ParentID == _uniqueId); dcs.Parent = this; - if (isSameSurface) - { - moveOffset = new Point(10, 10); - } - else - { - moveOffset = Point.Empty; - } + var moveOffset = isSameSurface ? new Point(10, 10) : Point.Empty; // Here a fix for bug #1475, first calculate the bounds of the complete IDrawableContainerList Rectangle drawableContainerListBounds = Rectangle.Empty; - foreach (IDrawableContainer element in dcs) + foreach (var element in dcs) { - if (drawableContainerListBounds == Rectangle.Empty) - { - drawableContainerListBounds = element.DrawingBounds; - } - else - { - drawableContainerListBounds = Rectangle.Union(drawableContainerListBounds, element.DrawingBounds); - } + drawableContainerListBounds = drawableContainerListBounds == Rectangle.Empty ? element.DrawingBounds : Rectangle.Union(drawableContainerListBounds, element.DrawingBounds); } // And find a location inside the target surface to paste to bool containersCanFit = drawableContainerListBounds.Width < Bounds.Width && drawableContainerListBounds.Height < Bounds.Height; @@ -1797,15 +1724,7 @@ namespace Greenshot.Drawing if (!Bounds.Contains(containersLocation)) { // Easy fix for same surface - if (isSameSurface) - { - moveOffset = new Point(-10, -10); - } - else - { - // For different surface, which is most likely smaller, we move to "10,10" - moveOffset = new Point(-drawableContainerListBounds.Location.X + 10, -drawableContainerListBounds.Location.Y + 10); - } + moveOffset = isSameSurface ? new Point(-10, -10) : new Point(-drawableContainerListBounds.Location.X + 10, -drawableContainerListBounds.Location.Y + 10); } } else @@ -1932,8 +1851,10 @@ namespace Greenshot.Drawing } if (_movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = selectedElements; + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs + { + Elements = selectedElements + }; _movingElementChanged(this, eventArgs); } Invalidate(); @@ -1962,8 +1883,10 @@ namespace Greenshot.Drawing FieldAggregator.BindElement(container); if (generateEvents && _movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = selectedElements; + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs + { + Elements = selectedElements + }; _movingElementChanged(this, eventArgs); } if (invalidate) @@ -1988,14 +1911,14 @@ namespace Greenshot.Drawing public void SelectElements(IDrawableContainerList elements) { SuspendLayout(); - foreach (DrawableContainer element in elements) + foreach (var drawableContainer in elements) { + var element = (DrawableContainer) drawableContainer; SelectElement(element, false, false); } if (_movingElementChanged != null) { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - eventArgs.Elements = selectedElements; + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs {Elements = selectedElements}; _movingElementChanged(this, eventArgs); } ResumeLayout(); @@ -2070,13 +1993,7 @@ namespace Greenshot.Drawing /// /// Property for accessing the elements on the surface /// - public IDrawableContainerList Elements - { - get - { - return _elements; - } - } + public IDrawableContainerList Elements => _elements; /// /// pulls selected elements up one level in hierarchy diff --git a/Greenshot/Drawing/TextContainer.cs b/Greenshot/Drawing/TextContainer.cs index 84deb9868..2761bfe9c 100644 --- a/Greenshot/Drawing/TextContainer.cs +++ b/Greenshot/Drawing/TextContainer.cs @@ -26,6 +26,7 @@ using Greenshot.Plugin.Drawing; using GreenshotPlugin.Interfaces.Drawing; using System; using System.ComponentModel; +using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; @@ -321,47 +322,47 @@ namespace Greenshot.Drawing UpdateFormat(); } - private Font CreateFont(string fontFamily, bool fontBold, bool fontItalic, float fontSize) + private Font CreateFont(string fontFamilyName, bool fontBold, bool fontItalic, float fontSize) { - FontStyle fs = FontStyle.Regular; + FontStyle fontStyle = FontStyle.Regular; bool hasStyle = false; - using (FontFamily fam = new FontFamily(fontFamily)) + using (var fontFamily = new FontFamily(fontFamilyName)) { - bool boldAvailable = fam.IsStyleAvailable(FontStyle.Bold); + bool boldAvailable = fontFamily.IsStyleAvailable(FontStyle.Bold); if (fontBold && boldAvailable) { - fs |= FontStyle.Bold; + fontStyle |= FontStyle.Bold; hasStyle = true; } - bool italicAvailable = fam.IsStyleAvailable(FontStyle.Italic); + bool italicAvailable = fontFamily.IsStyleAvailable(FontStyle.Italic); if (fontItalic && italicAvailable) { - fs |= FontStyle.Italic; + fontStyle |= FontStyle.Italic; hasStyle = true; } if (!hasStyle) { - bool regularAvailable = fam.IsStyleAvailable(FontStyle.Regular); + bool regularAvailable = fontFamily.IsStyleAvailable(FontStyle.Regular); if (regularAvailable) { - fs = FontStyle.Regular; + fontStyle = FontStyle.Regular; } else { if (boldAvailable) { - fs = FontStyle.Bold; + fontStyle = FontStyle.Bold; } else if (italicAvailable) { - fs = FontStyle.Italic; + fontStyle = FontStyle.Italic; } } } - return new Font(fam, fontSize, fs, GraphicsUnit.Pixel); + return new Font(fontFamily, fontSize, fontStyle, GraphicsUnit.Pixel); } } @@ -400,7 +401,7 @@ namespace Greenshot.Drawing catch (Exception) { // When this happens... the PC is broken - ex.Data.Add("fontFamily", fontFamily); + ex.Data.Add("fontFamilyName", fontFamily); ex.Data.Add("fontBold", fontBold); ex.Data.Add("fontItalic", fontItalic); ex.Data.Add("fontSize", fontSize); @@ -534,6 +535,14 @@ namespace Greenshot.Drawing /// public static void DrawText(Graphics graphics, Rectangle drawingRectange, int lineThickness, Color fontColor, bool drawShadow, StringFormat stringFormat, string text, Font font) { +#if DEBUG + Debug.Assert(font != null); +#else + if (font == null) + { + return; + } +#endif int textOffset = lineThickness > 0 ? (int)Math.Ceiling(lineThickness / 2d) : 0; // draw shadow before anything else if (drawShadow) diff --git a/Greenshot/Forms/AboutForm.cs b/Greenshot/Forms/AboutForm.cs index e35d281e7..68f2d48a5 100644 --- a/Greenshot/Forms/AboutForm.cs +++ b/Greenshot/Forms/AboutForm.cs @@ -152,7 +152,7 @@ namespace Greenshot { 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 + (IniConfig.IsPortable ? " Portable" : "") + (" (" + OSInfo.Bits) + " bit)"; + lblTitle.Text = "Greenshot " + v.Major + "." + v.Minor + "." + v.Build + " Build " + v.Revision + (IniConfig.IsPortable ? " Portable" : "") + (" (" + OsInfo.Bits) + " bit)"; //Random rand = new Random(); diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 0f34ca0ab..86ea4054f 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -43,7 +43,7 @@ namespace Greenshot.Forms { public sealed partial class CaptureForm : AnimatingForm { private enum FixMode {None, Initiated, Horizontal, Vertical}; - private static readonly ILog LOG = LogManager.GetLogger(typeof(CaptureForm)); + private static readonly ILog Log = LogManager.GetLogger(typeof(CaptureForm)); private static readonly CoreConfiguration Conf = IniConfig.GetIniSection(); private static readonly Brush GreenOverlayBrush = new SolidBrush(Color.FromArgb(50, Color.MediumSeaGreen)); private static readonly Pen OverlayPen = new Pen(Color.FromArgb(50, Color.Black)); @@ -79,29 +79,17 @@ namespace Greenshot.Forms { /// /// Property to access the selected capture rectangle /// - public Rectangle CaptureRectangle { - get { - return _captureRect; - } - } + public Rectangle CaptureRectangle => _captureRect; /// /// Property to access the used capture mode /// - public CaptureMode UsedCaptureMode { - get { - return _captureMode; - } - } + public CaptureMode UsedCaptureMode => _captureMode; /// /// Get the selected window /// - public WindowDetails SelectedCaptureWindow { - get { - return _selectedCaptureWindow; - } - } + public WindowDetails SelectedCaptureWindow => _selectedCaptureWindow; /// /// This should prevent childs to draw backgrounds @@ -117,11 +105,11 @@ namespace Greenshot.Forms { private void ClosedHandler(object sender, EventArgs e) { _currentForm = null; - LOG.Debug("Remove CaptureForm from currentForm"); + Log.Debug("Remove CaptureForm from currentForm"); } private void ClosingHandler(object sender, EventArgs e) { - LOG.Debug("Closing captureform"); + Log.Debug("Closing captureform"); WindowDetails.UnregisterIgnoreHandle(Handle); } @@ -132,7 +120,7 @@ namespace Greenshot.Forms { /// public CaptureForm(ICapture capture, List windows) { if (_currentForm != null) { - LOG.Warn("Found currentForm, Closing already opened CaptureForm"); + Log.Warn("Found currentForm, Closing already opened CaptureForm"); _currentForm.Close(); _currentForm = null; Application.DoEvents(); @@ -190,8 +178,10 @@ namespace Greenshot.Forms { // Initialize the zoom with a invalid position _zoomAnimator = new RectangleAnimator(Rectangle.Empty, new Rectangle(int.MaxValue, int.MaxValue, 0, 0), FramesForMillis(1000), EasingType.Quintic, EasingMode.EaseOut); VerifyZoomAnimation(_cursorPos, false); - } else if (_zoomAnimator != null) { - _zoomAnimator.ChangeDestination(new Rectangle(Point.Empty, Size.Empty), FramesForMillis(1000)); + } + else + { + _zoomAnimator?.ChangeDestination(new Rectangle(Point.Empty, Size.Empty), FramesForMillis(1000)); } } @@ -441,16 +431,14 @@ namespace Greenshot.Forms { Point cursorPosition = Cursor.Position; _selectedCaptureWindow = null; lock (_windows) { - foreach (WindowDetails window in _windows) { - if (window.Contains(cursorPosition)) { - // Only go over the children if we are in window mode - if (CaptureMode.Window == _captureMode) { - _selectedCaptureWindow = window.FindChildUnderPoint(cursorPosition); - } else { - _selectedCaptureWindow = window; - } - break; + foreach (var window in _windows) { + if (!window.Contains(cursorPosition)) + { + continue; } + // Only go over the children if we are in window mode + _selectedCaptureWindow = CaptureMode.Window == _captureMode ? window.FindChildUnderPoint(cursorPosition) : window; + break; } } @@ -619,8 +607,10 @@ namespace Greenshot.Forms { if (_isZoomerTransparent) { //create a color matrix object to change the opacy - ColorMatrix opacyMatrix = new ColorMatrix(); - opacyMatrix.Matrix33 = Conf.ZoomerOpacity; + ColorMatrix opacyMatrix = new ColorMatrix + { + Matrix33 = Conf.ZoomerOpacity + }; attributes = new ImageAttributes(); attributes.SetColorMatrix(opacyMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); } else { @@ -695,9 +685,7 @@ namespace Greenshot.Forms { // Horizontal middle + 1 to right graphics.DrawRectangle(pen, destinationRectangle.X + halfWidthEnd + 2 * padding, drawAtHeight, halfWidthEnd - 2 * padding - 1, pixelThickness); } - if (attributes != null) { - attributes.Dispose(); - } + attributes?.Dispose(); } /// @@ -717,15 +705,8 @@ namespace Greenshot.Forms { if (_mouseDown || _captureMode == CaptureMode.Window || IsAnimating(_windowAnimator)) { _captureRect.Intersect(new Rectangle(Point.Empty, _capture.ScreenBounds.Size)); // crop what is outside the screen - - Rectangle fixedRect; - //if (captureMode == CaptureMode.Window) { - if (IsAnimating(_windowAnimator)) { - // Use the animator - fixedRect = _windowAnimator.Current; - } else { - fixedRect = _captureRect; - } + + var fixedRect = IsAnimating(_windowAnimator) ? _windowAnimator.Current : _captureRect; // TODO: enable when the screen capture code works reliable //if (capture.CaptureDetails.CaptureMode == CaptureMode.Video) { @@ -827,7 +808,7 @@ namespace Greenshot.Forms { if (_showDebugInfo && _selectedCaptureWindow != null) { - string title = string.Format("#{0:X} - {1}", _selectedCaptureWindow.Handle.ToInt64(), _selectedCaptureWindow.Text.Length > 0 ? _selectedCaptureWindow.Text : _selectedCaptureWindow.Process.ProcessName); + string title = $"#{_selectedCaptureWindow.Handle.ToInt64():X} - {(_selectedCaptureWindow.Text.Length > 0 ? _selectedCaptureWindow.Text : _selectedCaptureWindow.Process.ProcessName)}"; PointF debugLocation = new PointF(fixedRect.X, fixedRect.Y); graphics.DrawString(title, sizeFont, Brushes.DarkOrange, debugLocation); } diff --git a/Greenshot/Forms/ColorDialog.Designer.cs b/Greenshot/Forms/ColorDialog.Designer.cs index ae06c722d..94dda653d 100644 --- a/Greenshot/Forms/ColorDialog.Designer.cs +++ b/Greenshot/Forms/ColorDialog.Designer.cs @@ -144,7 +144,7 @@ namespace Greenshot { this.textBoxRed.TabIndex = 2; this.textBoxRed.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; this.textBoxRed.Click += new System.EventHandler(this.TextBoxGotFocus); - this.textBoxRed.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxRed.TextChanged += new System.EventHandler(this.TextBoxRgbTextChanged); this.textBoxRed.GotFocus += new System.EventHandler(this.TextBoxGotFocus); this.textBoxRed.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); // @@ -156,7 +156,7 @@ namespace Greenshot { this.textBoxGreen.TabIndex = 3; this.textBoxGreen.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; this.textBoxGreen.Click += new System.EventHandler(this.TextBoxGotFocus); - this.textBoxGreen.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxGreen.TextChanged += new System.EventHandler(this.TextBoxRgbTextChanged); this.textBoxGreen.GotFocus += new System.EventHandler(this.TextBoxGotFocus); this.textBoxGreen.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); // @@ -168,7 +168,7 @@ namespace Greenshot { this.textBoxBlue.TabIndex = 4; this.textBoxBlue.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; this.textBoxBlue.Click += new System.EventHandler(this.TextBoxGotFocus); - this.textBoxBlue.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxBlue.TextChanged += new System.EventHandler(this.TextBoxRgbTextChanged); this.textBoxBlue.GotFocus += new System.EventHandler(this.TextBoxGotFocus); this.textBoxBlue.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); // @@ -189,7 +189,7 @@ namespace Greenshot { this.textBoxAlpha.TabIndex = 5; this.textBoxAlpha.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; this.textBoxAlpha.Click += new System.EventHandler(this.TextBoxGotFocus); - this.textBoxAlpha.TextChanged += new System.EventHandler(this.TextBoxRGBTextChanged); + this.textBoxAlpha.TextChanged += new System.EventHandler(this.TextBoxRgbTextChanged); this.textBoxAlpha.GotFocus += new System.EventHandler(this.TextBoxGotFocus); this.textBoxAlpha.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKeyDown); // diff --git a/Greenshot/Forms/ColorDialog.cs b/Greenshot/Forms/ColorDialog.cs index d4428b407..5cfbf187d 100644 --- a/Greenshot/Forms/ColorDialog.cs +++ b/Greenshot/Forms/ColorDialog.cs @@ -34,8 +34,8 @@ namespace Greenshot { /// Description of ColorDialog. /// public partial class ColorDialog : BaseForm { - private static ColorDialog uniqueInstance; - private static readonly EditorConfiguration editorConfiguration = IniConfig.GetIniSection(); + private static ColorDialog _uniqueInstance; + private static readonly EditorConfiguration EditorConfig = IniConfig.GetIniSection(); private ColorDialog() { SuspendLayout(); @@ -47,11 +47,9 @@ namespace Greenshot { UpdateRecentColorsButtonRow(); } - public static ColorDialog GetInstance() { - if (uniqueInstance == null) { - uniqueInstance = new ColorDialog(); - } - return uniqueInstance; + public static ColorDialog GetInstance() + { + return _uniqueInstance ?? (_uniqueInstance = new ColorDialog()); } private readonly List private void ShowSettings() { - trackBar1.Value = (int)(effect.Darkness * 40); - offsetX.Value = effect.ShadowOffset.X; - offsetY.Value = effect.ShadowOffset.Y; - thickness.Value = effect.ShadowSize; + trackBar1.Value = (int)(_effect.Darkness * 40); + offsetX.Value = _effect.ShadowOffset.X; + offsetY.Value = _effect.ShadowOffset.Y; + thickness.Value = _effect.ShadowSize; } private void ButtonOK_Click(object sender, EventArgs e) { - effect.Darkness = (float)trackBar1.Value / (float)40; - effect.ShadowOffset = new Point((int)offsetX.Value, (int)offsetY.Value); - effect.ShadowSize = (int)thickness.Value; + _effect.Darkness = trackBar1.Value / (float)40; + _effect.ShadowOffset = new Point((int)offsetX.Value, (int)offsetY.Value); + _effect.ShadowSize = (int)thickness.Value; DialogResult = DialogResult.OK; } } diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index cfa1ee0b2..00eeeaf8f 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -19,8 +19,15 @@ * along with this program. If not, see . */ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.IO; +using System.Threading; +using System.Windows.Forms; using Greenshot.Configuration; -using Greenshot.Core; using Greenshot.Destinations; using Greenshot.Drawing; using Greenshot.Drawing.Fields; @@ -33,26 +40,19 @@ using Greenshot.Plugin; using Greenshot.Plugin.Drawing; using GreenshotPlugin.Controls; using GreenshotPlugin.Core; +using GreenshotPlugin.Effects; using GreenshotPlugin.Interfaces.Drawing; using GreenshotPlugin.UnmanagedHelpers; using log4net; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.IO; -using System.Threading; -using System.Windows.Forms; namespace Greenshot { /// /// Description of ImageEditorForm. /// public partial class ImageEditorForm : BaseForm, IImageEditor { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ImageEditorForm)); + private static readonly ILog Log = LogManager.GetLogger(typeof(ImageEditorForm)); private static readonly EditorConfiguration EditorConfiguration = IniConfig.GetIniSection(); - private static readonly List IgnoreDestinations = new List() { PickerDestination.DESIGNATION, EditorDestination.DESIGNATION }; + private static readonly List IgnoreDestinations = new List { PickerDestination.DESIGNATION, EditorDestination.DESIGNATION }; private static readonly List EditorList = new List(); private Surface _surface; @@ -69,18 +69,14 @@ namespace Greenshot { /// /// An Implementation for the IImageEditor, this way Plugins have access to the HWND handles wich can be used with Win32 API calls. /// - public IWin32Window WindowHandle { - get { return this; } - } + public IWin32Window WindowHandle => this; public static List Editors { get { try { - EditorList.Sort(delegate(IImageEditor e1, IImageEditor e2) { - return string.Compare(e1.Surface.CaptureDetails.Title, e2.Surface.CaptureDetails.Title, StringComparison.Ordinal); - }); + EditorList.Sort((e1, e2) => string.Compare(e1.Surface.CaptureDetails.Title, e2.Surface.CaptureDetails.Title, StringComparison.Ordinal)); } catch(Exception ex) { - LOG.Warn("Sorting of editors failed.", ex); + Log.Warn("Sorting of editors failed.", ex); } return EditorList; } @@ -104,7 +100,7 @@ namespace Greenshot { }; // Make sure the editor is placed on the same location as the last editor was on close - // But only if this still exists, else it will be reset (BUG-1812 + // But only if this still exists, else it will be reset (BUG-1812) WindowPlacement editorWindowPlacement = EditorConfiguration.GetEditorPlacement(); Rectangle screenbounds = WindowCapture.GetScreenBounds(); if (!screenbounds.Contains(editorWindowPlacement.NormalPosition)) @@ -132,11 +128,13 @@ namespace Greenshot { /// Remove the current surface /// private void RemoveSurface() { - if (_surface != null) { - panel1.Controls.Remove(_surface); - _surface.Dispose(); - _surface = null; + if (_surface == null) + { + return; } + panel1.Controls.Remove(_surface); + _surface.Dispose(); + _surface = null; } /// @@ -174,7 +172,7 @@ namespace Greenshot { BindFieldControls(); RefreshEditorControls(); // Fix title - if (_surface != null && _surface.CaptureDetails != null && _surface.CaptureDetails.Title != null) { + if (_surface?.CaptureDetails?.Title != null) { Text = _surface.CaptureDetails.Title + " - " + Language.GetString(LangKey.editor_title); } } @@ -249,7 +247,7 @@ namespace Greenshot { if (destination.Priority <= 2) { continue; } - if (!destination.isActive) { + if (!destination.IsActive) { continue; } if (destination.DisplayIcon == null) { @@ -258,15 +256,15 @@ namespace Greenshot { try { AddDestinationButton(destination); } catch (Exception addingException) { - LOG.WarnFormat("Problem adding destination {0}", destination.Designation); - LOG.Warn("Exception: ", addingException); + Log.WarnFormat("Problem adding destination {0}", destination.Designation); + Log.Warn("Exception: ", addingException); } } }); } private void AddDestinationButton(IDestination toolstripDestination) { - if (toolstripDestination.isDynamic) { + if (toolstripDestination.IsDynamic) { ToolStripSplitButton destinationButton = new ToolStripSplitButton { DisplayStyle = ToolStripItemDisplayStyle.Image, @@ -302,9 +300,11 @@ namespace Greenshot { subDestinations.Sort(); foreach(IDestination subDestination in subDestinations) { IDestination closureFixedDestination = subDestination; - ToolStripMenuItem destinationMenuItem = new ToolStripMenuItem(closureFixedDestination.Description); - destinationMenuItem.Tag = closureFixedDestination; - destinationMenuItem.Image = closureFixedDestination.DisplayIcon; + ToolStripMenuItem destinationMenuItem = new ToolStripMenuItem(closureFixedDestination.Description) + { + Tag = closureFixedDestination, + Image = closureFixedDestination.DisplayIcon + }; destinationMenuItem.Click += delegate { closureFixedDestination.ExportCapture(true, _surface, _surface.CaptureDetails); }; @@ -351,7 +351,7 @@ namespace Greenshot { if (IgnoreDestinations.Contains(destination.Designation)) { continue; } - if (!destination.isActive) { + if (!destination.IsActive) { continue; } @@ -375,20 +375,20 @@ namespace Greenshot { /// private void SurfaceMessageReceived(object sender, SurfaceMessageEventArgs eventArgs) { if (InvokeRequired) { - Invoke(new SurfaceMessageReceivedThreadSafeDelegate(SurfaceMessageReceived), new object[] { sender, eventArgs }); + Invoke(new SurfaceMessageReceivedThreadSafeDelegate(SurfaceMessageReceived), sender, eventArgs); } else { string dateTime = DateTime.Now.ToLongTimeString(); // TODO: Fix that we only open files, like in the tooltip switch (eventArgs.MessageType) { case SurfaceMessageTyp.FileSaved: // Put the event message on the status label and attach the context menu - updateStatusLabel(dateTime + " - " + eventArgs.Message, fileSavedStatusContextMenu); + UpdateStatusLabel(dateTime + " - " + eventArgs.Message, fileSavedStatusContextMenu); // Change title Text = eventArgs.Surface.LastSaveFullPath + " - " + Language.GetString(LangKey.editor_title); break; default: // Put the event message on the status label - updateStatusLabel(dateTime + " - " + eventArgs.Message); + UpdateStatusLabel(dateTime + " - " + eventArgs.Message); break; } } @@ -434,7 +434,7 @@ namespace Greenshot { if (fullpath == null) { return; } - updateStatusLabel(Language.GetFormattedString(LangKey.editor_imagesaved, fullpath), fileSavedStatusContextMenu); + UpdateStatusLabel(Language.GetFormattedString(LangKey.editor_imagesaved, fullpath), fileSavedStatusContextMenu); Text = Path.GetFileName(fullpath) + " - " + Language.GetString(LangKey.editor_title); } @@ -489,10 +489,8 @@ namespace Greenshot { return _surface.GetImageForExport(); } - public ICaptureDetails CaptureDetails { - get { return _surface.CaptureDetails; } - } - + public ICaptureDetails CaptureDetails => _surface.CaptureDetails; + public ToolStripMenuItem GetPluginMenuItem() { return pluginToolStripMenuItem; } @@ -902,7 +900,7 @@ namespace Greenshot { if (IgnoreDestinations.Contains(destination.Designation)) { continue; } - if (!destination.isActive) { + if (!destination.IsActive) { continue; } @@ -943,9 +941,9 @@ namespace Greenshot { redoToolStripMenuItem.Enabled = canRedo; string redoAction = ""; if (canRedo) { - if (_surface.RedoActionLanguageKey != LangKey.none) { - redoAction = Language.GetString(_surface.RedoActionLanguageKey); - } + if (_surface.RedoActionLanguageKey != LangKey.none) { + redoAction = Language.GetString(_surface.RedoActionLanguageKey); + } } string redoText = Language.GetFormattedString(LangKey.editor_redo, redoAction); btnRedo.Text = redoText; @@ -981,23 +979,18 @@ namespace Greenshot { #endregion #region status label handling - private void updateStatusLabel(string text, ContextMenuStrip contextMenu) { + private void UpdateStatusLabel(string text, ContextMenuStrip contextMenu = null) { statusLabel.Text = text; statusStrip1.ContextMenuStrip = contextMenu; } - - private void updateStatusLabel(string text) { - updateStatusLabel(text, null); - } + private void ClearStatusLabel() { - updateStatusLabel(null, null); + UpdateStatusLabel(null); } private void StatusLabelClicked(object sender, MouseEventArgs e) { ToolStrip ss = (StatusStrip)((ToolStripStatusLabel)sender).Owner; - if(ss.ContextMenuStrip != null) { - ss.ContextMenuStrip.Show(ss, e.X, e.Y); - } + ss.ContextMenuStrip?.Show(ss, e.X, e.Y); } private void CopyPathMenuItemClick(object sender, EventArgs e) { @@ -1005,14 +998,19 @@ namespace Greenshot { } private void OpenDirectoryMenuItemClick(object sender, EventArgs e) { - ProcessStartInfo psi = new ProcessStartInfo("explorer") + var path = Path.GetDirectoryName(_surface.LastSaveFullPath); + if (path == null) { - Arguments = Path.GetDirectoryName(_surface.LastSaveFullPath), + return; + } + var processStartInfo = new ProcessStartInfo("explorer") + { + Arguments = path, UseShellExecute = false }; - using (Process p = new Process()) { - p.StartInfo = psi; - p.Start(); + using (var process = new Process()) { + process.StartInfo = processStartInfo; + process.Start(); } } #endregion @@ -1082,16 +1080,16 @@ namespace Greenshot { /// private void RefreshEditorControls() { int stepLabels = _surface.CountStepLabels(null); - Image icon; + Image icon; if (stepLabels <= 20) { - icon = (Image)resources.GetObject(string.Format("btnStepLabel{0:00}.Image", stepLabels)); + icon = (Image)resources.GetObject($"btnStepLabel{stepLabels:00}.Image"); } else { - icon = (Image)resources.GetObject("btnStepLabel20+.Image"); + icon = (Image)resources.GetObject("btnStepLabel20+.Image"); } - btnStepLabel.Image = icon; - addCounterToolStripMenuItem.Image = icon; + btnStepLabel.Image = icon; + addCounterToolStripMenuItem.Image = icon; - FieldAggregator props = _surface.FieldAggregator; + FieldAggregator props = _surface.FieldAggregator; // if a confirmable element is selected, we must disable most of the controls // since we demand confirmation or cancel for confirmable element if (props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE) @@ -1156,33 +1154,51 @@ namespace Greenshot { fontItalicButton.Checked = _originalItalicCheckState; } - FontFamily fam = fontFamilyComboBox.FontFamily; - - bool boldAvailable = fam.IsStyleAvailable(FontStyle.Bold); - if(!boldAvailable) { - _originalBoldCheckState = fontBoldButton.Checked; - fontBoldButton.Checked = false; - } - fontBoldButton.Enabled = boldAvailable; - - bool italicAvailable = fam.IsStyleAvailable(FontStyle.Italic); - if(!italicAvailable) fontItalicButton.Checked = false; - fontItalicButton.Enabled = italicAvailable; - - bool regularAvailable = fam.IsStyleAvailable(FontStyle.Regular); - if(!regularAvailable) { - if(boldAvailable) { - fontBoldButton.Checked = true; - } else if(italicAvailable) { - fontItalicButton.Checked = true; - } - } - } + var fontFamily = fontFamilyComboBox.FontFamily; + + bool boldAvailable = fontFamily.IsStyleAvailable(FontStyle.Bold); + if (fontBoldButton != null) + { + if (!boldAvailable) + { + _originalBoldCheckState = fontBoldButton.Checked; + fontBoldButton.Checked = false; + } + fontBoldButton.Enabled = boldAvailable; + } + + bool italicAvailable = fontFamily.IsStyleAvailable(FontStyle.Italic); + if (fontItalicButton != null) + { + if (!italicAvailable) + { + fontItalicButton.Checked = false; + } + fontItalicButton.Enabled = italicAvailable; + } + + bool regularAvailable = fontFamily.IsStyleAvailable(FontStyle.Regular); + if (regularAvailable) + { + return; + } + if (boldAvailable) { + if (fontBoldButton != null) + { + fontBoldButton.Checked = true; + } + } else if(italicAvailable) { + if (fontItalicButton != null) + { + fontItalicButton.Checked = true; + } + } + } private void FieldAggregatorFieldChanged(object sender, FieldChangedEventArgs e) { // in addition to selection, deselection of elements, we need to // refresh toolbar if prepared filter mode is changed - if(e.Field.FieldType == FieldType.PREPARED_FILTER_HIGHLIGHT) { + if(Equals(e.Field.FieldType, FieldType.PREPARED_FILTER_HIGHLIGHT)) { RefreshFieldControls(); } } @@ -1204,9 +1220,11 @@ namespace Greenshot { } private void SaveElementsToolStripMenuItemClick(object sender, EventArgs e) { - SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.Filter = "Greenshot templates (*.gst)|*.gst"; - saveFileDialog.FileName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(coreConfiguration.OutputFileFilenamePattern, _surface.CaptureDetails); + SaveFileDialog saveFileDialog = new SaveFileDialog + { + Filter = "Greenshot templates (*.gst)|*.gst", + FileName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(coreConfiguration.OutputFileFilenamePattern, _surface.CaptureDetails) + }; DialogResult dialogResult = saveFileDialog.ShowDialog(); if(dialogResult.Equals(DialogResult.OK)) { using (Stream streamWrite = File.OpenWrite(saveFileDialog.FileName)) { @@ -1216,8 +1234,10 @@ namespace Greenshot { } private void LoadElementsToolStripMenuItemClick(object sender, EventArgs e) { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "Greenshot templates (*.gst)|*.gst"; + OpenFileDialog openFileDialog = new OpenFileDialog + { + Filter = "Greenshot templates (*.gst)|*.gst" + }; if (openFileDialog.ShowDialog() == DialogResult.OK) { using (Stream streamRead = File.OpenRead(openFileDialog.FileName)) { _surface.LoadElementsFromStream(streamRead); @@ -1228,23 +1248,27 @@ namespace Greenshot { private void DestinationToolStripMenuItemClick(object sender, EventArgs e) { IDestination clickedDestination = null; - if (sender is Control) { - Control clickedControl = sender as Control; + var control = sender as Control; + if (control != null) { + Control clickedControl = control; if (clickedControl.ContextMenuStrip != null) { clickedControl.ContextMenuStrip.Show(Cursor.Position); return; } clickedDestination = (IDestination)clickedControl.Tag; - } else if (sender is ToolStripMenuItem) { - ToolStripMenuItem clickedMenuItem = sender as ToolStripMenuItem; - clickedDestination = (IDestination)clickedMenuItem.Tag; } - if (clickedDestination != null) { - ExportInformation exportInformation = clickedDestination.ExportCapture(true, _surface, _surface.CaptureDetails); - if (exportInformation != null && exportInformation.ExportMade) { - _surface.Modified = false; + else + { + var item = sender as ToolStripMenuItem; + if (item != null) { + ToolStripMenuItem clickedMenuItem = item; + clickedDestination = (IDestination)clickedMenuItem.Tag; } } + ExportInformation exportInformation = clickedDestination?.ExportCapture(true, _surface, _surface.CaptureDetails); + if (exportInformation != null && exportInformation.ExportMade) { + _surface.Modified = false; + } } protected void FilterPresetDropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) { @@ -1284,7 +1308,7 @@ namespace Greenshot { windowToCapture = CaptureHelper.SelectCaptureWindow(windowToCapture); if (windowToCapture != null) { capture = CaptureHelper.CaptureWindow(windowToCapture, capture, coreConfiguration.WindowCaptureMode); - if (capture != null && capture.CaptureDetails != null && capture.Image != null) { + if (capture?.CaptureDetails != null && capture.Image != null) { ((Bitmap)capture.Image).SetResolution(capture.CaptureDetails.DpiX, capture.CaptureDetails.DpiY); _surface.AddImageContainer((Bitmap)capture.Image, 100, 100); } @@ -1292,11 +1316,9 @@ namespace Greenshot { WindowDetails.ToForeground(Handle); } - if (capture!= null) { - capture.Dispose(); - } + capture?.Dispose(); } catch (Exception exception) { - LOG.Error(exception); + Log.Error(exception); } } @@ -1440,17 +1462,13 @@ namespace Greenshot { } private void ImageEditorFormResize(object sender, EventArgs e) { - if (Surface == null || Surface.Image == null || panel1 == null) { + if (Surface?.Image == null || panel1 == null) { return; } Size imageSize = Surface.Image.Size; Size currentClientSize = panel1.ClientSize; var canvas = Surface as Control; - if (canvas == null) - { - return; - } - Panel panel = (Panel)canvas.Parent; + Panel panel = (Panel) canvas?.Parent; if (panel == null) { return; } diff --git a/Greenshot/Forms/MainForm.Designer.cs b/Greenshot/Forms/MainForm.Designer.cs index 0415a8070..d77a39c10 100644 --- a/Greenshot/Forms/MainForm.Designer.cs +++ b/Greenshot/Forms/MainForm.Designer.cs @@ -162,7 +162,7 @@ namespace Greenshot { // this.contextmenu_captureiefromlist.Name = "contextmenu_captureiefromlist"; this.contextmenu_captureiefromlist.Size = new System.Drawing.Size(170, 22); - this.contextmenu_captureiefromlist.DropDownOpening += new System.EventHandler(this.CaptureIEMenuDropDownOpening); + this.contextmenu_captureiefromlist.DropDownOpening += new System.EventHandler(this.CaptureIeMenuDropDownOpening); // // toolStripOtherSourcesSeparator // diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 6810a8500..5ded41e26 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -56,15 +56,14 @@ namespace Greenshot { private static CoreConfiguration _conf; public static string LogFileLocation; - public static void Start(string[] args) { - bool isAlreadyRunning = false; - List filesToOpen = new List(); + public static void Start(string[] arguments) { + var filesToOpen = new List(); // Set the Thread name, is better than "1" Thread.CurrentThread.Name = Application.ProductName; // Init Log4NET - LogFileLocation = LogHelper.InitializeLog4NET(); + LogFileLocation = LogHelper.InitializeLog4Net(); // Get logger LOG = LogManager.GetLogger(typeof(MainForm)); @@ -84,18 +83,19 @@ namespace Greenshot { // check whether there's an local instance running already _applicationMutex = ResourceMutex.Create("F48E86D3-E34C-4DB7-8F8F-9A0EA55F0D08", "Greenshot", false); - isAlreadyRunning = !_applicationMutex.IsLocked; + var isAlreadyRunning = !_applicationMutex.IsLocked; - if (args.Length > 0 && LOG.IsDebugEnabled) { + if (arguments.Length > 0 && LOG.IsDebugEnabled) { StringBuilder argumentString = new StringBuilder(); - for(int argumentNr = 0; argumentNr < args.Length; argumentNr++) { - argumentString.Append("[").Append(args[argumentNr]).Append("] "); + foreach (string argument in arguments) + { + argumentString.Append("[").Append(argument).Append("] "); } LOG.Debug("Greenshot arguments: " + argumentString); } - for(int argumentNr = 0; argumentNr < args.Length; argumentNr++) { - string argument = args[argumentNr]; + for(int argumentNr = 0; argumentNr < arguments.Length; argumentNr++) { + string argument = arguments[argumentNr]; // Help if (argument.ToLower().Equals("/help") || argument.ToLower().Equals("/h") || argument.ToLower().Equals("/?")) { // Try to attach to the console @@ -104,7 +104,7 @@ namespace Greenshot { if (!attachedToConsole) { Kernel32.AllocConsole(); } - StringBuilder helpOutput = new StringBuilder(); + var helpOutput = new StringBuilder(); helpOutput.AppendLine(); helpOutput.AppendLine("Greenshot commandline options:"); helpOutput.AppendLine(); @@ -173,14 +173,14 @@ namespace Greenshot { // Language if (argument.ToLower().Equals("/language")) { - _conf.Language = args[++argumentNr]; + _conf.Language = arguments[++argumentNr]; IniConfig.Save(); continue; } // Setting the INI-directory if (argument.ToLower().Equals("/inidirectory")) { - IniConfig.IniDirectory = args[++argumentNr]; + IniConfig.IniDirectory = arguments[++argumentNr]; continue; } @@ -296,11 +296,7 @@ namespace Greenshot { } private static MainForm _instance; - public static MainForm Instance { - get { - return _instance; - } - } + public static MainForm Instance => _instance; private readonly CopyData _copyData; @@ -313,11 +309,7 @@ namespace Greenshot { // Timer for the double click test private readonly Timer _doubleClickTimer = new Timer(); - public NotifyIcon NotifyIcon { - get { - return notifyIcon; - } - } + public NotifyIcon NotifyIcon => notifyIcon; public MainForm(CopyDataTransport dataTransport) { _instance = this; @@ -341,12 +333,12 @@ namespace Greenshot { contextmenu_settings.Visible = !_conf.DisableSettings; // Make sure all hotkeys pass this window! - HotkeyControl.RegisterHotkeyHWND(Handle); + HotkeyControl.RegisterHotkeyHwnd(Handle); RegisterHotkeys(); new ToolTip(); - UpdateUI(); + UpdateUi(); // This forces the registration of all destinations inside Greenshot itself. DestinationHelper.GetAllDestinations(); @@ -452,7 +444,7 @@ namespace Greenshot { IniConfig.Reload(); Invoke((MethodInvoker) delegate { // Even update language when needed - UpdateUI(); + UpdateUi(); // Update the hotkey // Make sure the current hotkeys are disabled HotkeyControl.UnregisterHotkeys(); @@ -480,9 +472,10 @@ namespace Greenshot { } } - public ContextMenuStrip MainMenu { - get {return contextMenu;} - } + /// + /// Main context menu + /// + public ContextMenuStrip MainMenu => contextMenu; protected override void WndProc(ref Message m) { if (HotkeyControl.HandleMessages(ref m)) { @@ -659,7 +652,7 @@ namespace Greenshot { } #endregion - public void UpdateUI() { + public void UpdateUi() { // As the form is never loaded, call ApplyLanguage ourselves ApplyLanguage(); @@ -693,8 +686,10 @@ namespace Greenshot { } private void CaptureFile() { - var openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "Image files (*.greenshot, *.png, *.jpg, *.gif, *.bmp, *.ico, *.tiff, *.wmf)|*.greenshot; *.png; *.jpg; *.jpeg; *.gif; *.bmp; *.ico; *.tiff; *.tif; *.wmf"; + var openFileDialog = new OpenFileDialog + { + Filter = "Image files (*.greenshot, *.png, *.jpg, *.gif, *.bmp, *.ico, *.tiff, *.wmf)|*.greenshot; *.png; *.jpg; *.jpeg; *.gif; *.bmp; *.ico; *.tiff; *.tif; *.wmf" + }; if (openFileDialog.ShowDialog() == DialogResult.OK) { if (File.Exists(openFileDialog.FileName)) { CaptureHelper.CaptureFile(openFileDialog.FileName); @@ -712,7 +707,7 @@ namespace Greenshot { private void CaptureIE() { if (_conf.IECapture) { - CaptureHelper.CaptureIE(true, null); + CaptureHelper.CaptureIe(true, null); } } @@ -734,7 +729,7 @@ namespace Greenshot { // IE context menu code try { - if (_conf.IECapture && IECaptureHelper.IsIERunning()) { + if (_conf.IECapture && IeCaptureHelper.IsIeRunning()) { contextmenu_captureie.Enabled = true; contextmenu_captureiefromlist.Enabled = true; } else { @@ -773,12 +768,12 @@ namespace Greenshot { /// /// Build a selectable list of IE tabs when we enter the menu item /// - private void CaptureIEMenuDropDownOpening(object sender, EventArgs e) { + private void CaptureIeMenuDropDownOpening(object sender, EventArgs e) { if (!_conf.IECapture) { return; } try { - List> tabs = IECaptureHelper.GetBrowserTabs(); + List> tabs = IeCaptureHelper.GetBrowserTabs(); contextmenu_captureiefromlist.DropDownItems.Clear(); if (tabs.Count > 0) { contextmenu_captureie.Enabled = true; @@ -793,12 +788,12 @@ namespace Greenshot { if (title.Length > _conf.MaxMenuItemLength) { title = title.Substring(0, Math.Min(title.Length, _conf.MaxMenuItemLength)); } - ToolStripItem captureIETabItem = contextmenu_captureiefromlist.DropDownItems.Add(title); + var captureIeTabItem = contextmenu_captureiefromlist.DropDownItems.Add(title); int index = counter.ContainsKey(tabData.Key) ? counter[tabData.Key] : 0; - captureIETabItem.Image = tabData.Key.DisplayIcon; - captureIETabItem.Tag = new KeyValuePair(tabData.Key, index++); - captureIETabItem.Click += Contextmenu_captureiefromlist_Click; - contextmenu_captureiefromlist.DropDownItems.Add(captureIETabItem); + captureIeTabItem.Image = tabData.Key.DisplayIcon; + captureIeTabItem.Tag = new KeyValuePair(tabData.Key, index++); + captureIeTabItem.Click += Contextmenu_captureiefromlist_Click; + contextmenu_captureiefromlist.DropDownItems.Add(captureIeTabItem); if (counter.ContainsKey(tabData.Key)) { counter[tabData.Key] = index; } else { @@ -823,10 +818,9 @@ namespace Greenshot { ToolStripMenuItem captureScreenMenuItem = (ToolStripMenuItem)sender; captureScreenMenuItem.DropDownItems.Clear(); if (Screen.AllScreens.Length > 1) { - ToolStripMenuItem captureScreenItem; Rectangle allScreensBounds = WindowCapture.GetScreenBounds(); - captureScreenItem = new ToolStripMenuItem(Language.GetString(LangKey.contextmenu_capturefullscreen_all)); + var captureScreenItem = new ToolStripMenuItem(Language.GetString(LangKey.contextmenu_capturefullscreen_all)); captureScreenItem.Click += delegate { BeginInvoke((MethodInvoker)delegate { CaptureHelper.CaptureFullscreen(false, ScreenCaptureMode.FullScreen); @@ -893,17 +887,18 @@ namespace Greenshot { } } - private void HideThumbnailOnLeave(object sender, EventArgs e) { - if (_thumbnailForm != null) { - _thumbnailForm.Hide(); - } + private void HideThumbnailOnLeave(object sender, EventArgs e) + { + _thumbnailForm?.Hide(); } private void CleanupThumbnail() { - if (_thumbnailForm != null) { - _thumbnailForm.Close(); - _thumbnailForm = null; + if (_thumbnailForm == null) + { + return; } + _thumbnailForm.Close(); + _thumbnailForm = null; } public void AddCaptureWindowMenuItems(ToolStripMenuItem menuItem, EventHandler eventHandler) { @@ -938,15 +933,11 @@ namespace Greenshot { } private void CaptureClipboardToolStripMenuItemClick(object sender, EventArgs e) { - BeginInvoke((MethodInvoker)delegate { - CaptureHelper.CaptureClipboard(); - }); + BeginInvoke((MethodInvoker)CaptureHelper.CaptureClipboard); } private void OpenFileToolStripMenuItemClick(object sender, EventArgs e) { - BeginInvoke((MethodInvoker)delegate { - CaptureFile(); - }); + BeginInvoke((MethodInvoker)CaptureFile); } private void CaptureFullScreenToolStripMenuItemClick(object sender, EventArgs e) { @@ -996,12 +987,12 @@ namespace Greenshot { ieWindowToCapture.Restore(); } try { - IECaptureHelper.ActivateIETab(ieWindowToCapture, tabData.Value); + IeCaptureHelper.ActivateIeTab(ieWindowToCapture, tabData.Value); } catch (Exception exception) { LOG.Error(exception); } try { - CaptureHelper.CaptureIE(false, ieWindowToCapture); + CaptureHelper.CaptureIe(false, ieWindowToCapture); } catch (Exception exception) { LOG.Error(exception); } @@ -1025,9 +1016,7 @@ namespace Greenshot { /// /// private void Contextmenu_settingsClick(object sender, EventArgs e) { - BeginInvoke((MethodInvoker)delegate { - ShowSetting(); - }); + BeginInvoke((MethodInvoker)ShowSetting); } /// @@ -1110,10 +1099,12 @@ namespace Greenshot { // Only add if the value is not fixed if (!_conf.Values["CaptureMousepointer"].IsFixed) { // For the capture mousecursor option - ToolStripMenuSelectListItem captureMouseItem = new ToolStripMenuSelectListItem(); - captureMouseItem.Text = Language.GetString("settings_capture_mousepointer"); - captureMouseItem.Checked = _conf.CaptureMousepointer; - captureMouseItem.CheckOnClick = true; + ToolStripMenuSelectListItem captureMouseItem = new ToolStripMenuSelectListItem + { + Text = Language.GetString("settings_capture_mousepointer"), + Checked = _conf.CaptureMousepointer, + CheckOnClick = true + }; captureMouseItem.CheckStateChanged += CheckStateChangedHandler; contextmenu_quicksettings.DropDownItems.Add(captureMouseItem); @@ -1121,10 +1112,12 @@ namespace Greenshot { ToolStripMenuSelectList selectList; if (!_conf.Values["Destinations"].IsFixed) { // screenshot destination - selectList = new ToolStripMenuSelectList("destinations", true); - selectList.Text = Language.GetString(LangKey.settings_destination); + selectList = new ToolStripMenuSelectList("destinations", true) + { + Text = Language.GetString(LangKey.settings_destination) + }; // Working with IDestination: - foreach (IDestination destination in DestinationHelper.GetAllDestinations()) { + foreach (var destination in DestinationHelper.GetAllDestinations()) { selectList.AddItem(destination.Description, destination, _conf.OutputDestinations.Contains(destination.Designation)); } selectList.CheckedChanged += QuickSettingDestinationChanged; @@ -1133,20 +1126,24 @@ namespace Greenshot { if (!_conf.Values["WindowCaptureMode"].IsFixed) { // Capture Modes - selectList = new ToolStripMenuSelectList("capturemodes", false); - selectList.Text = Language.GetString(LangKey.settings_window_capture_mode); + selectList = new ToolStripMenuSelectList("capturemodes", false) + { + Text = Language.GetString(LangKey.settings_window_capture_mode) + }; string enumTypeName = typeof(WindowCaptureMode).Name; foreach (WindowCaptureMode captureMode in Enum.GetValues(typeof(WindowCaptureMode))) { - selectList.AddItem(Language.GetString(enumTypeName + "." + captureMode.ToString()), captureMode, _conf.WindowCaptureMode == captureMode); + selectList.AddItem(Language.GetString(enumTypeName + "." + captureMode), captureMode, _conf.WindowCaptureMode == captureMode); } selectList.CheckedChanged += QuickSettingCaptureModeChanged; contextmenu_quicksettings.DropDownItems.Add(selectList); } // print options - selectList = new ToolStripMenuSelectList("printoptions",true); - selectList.Text = Language.GetString(LangKey.settings_printoptions); - + selectList = new ToolStripMenuSelectList("printoptions", true) + { + Text = Language.GetString(LangKey.settings_printoptions) + }; + IniValue iniValue; foreach(string propertyName in _conf.Values.Keys) { if (propertyName.StartsWith("OutputPrint")) { @@ -1162,8 +1159,10 @@ namespace Greenshot { } // effects - selectList = new ToolStripMenuSelectList("effects",true); - selectList.Text = Language.GetString(LangKey.settings_visualization); + selectList = new ToolStripMenuSelectList("effects", true) + { + Text = Language.GetString(LangKey.settings_visualization) + }; iniValue = _conf.Values["PlayCameraSound"]; if (!iniValue.IsFixed) { @@ -1383,7 +1382,7 @@ namespace Greenshot { // Close all open forms (except this), use a separate List to make sure we don't get a "InvalidOperationException: Collection was modified" List
      formsToClose = new List(); foreach(Form form in Application.OpenForms) { - if (form.Handle != Handle && !form.GetType().Equals(typeof(ImageEditorForm))) { + if (form.Handle != Handle && form.GetType() != typeof(ImageEditorForm)) { formsToClose.Add(form); } } @@ -1459,9 +1458,11 @@ namespace Greenshot { if (UpdateHelper.IsUpdateCheckNeeded()) { LOG.Debug("BackgroundWorkerTimerTick checking for update"); // Start update check in the background - Thread backgroundTask = new Thread (UpdateHelper.CheckAndAskForUpdate); - backgroundTask.Name = "Update check"; - backgroundTask.IsBackground = true; + var backgroundTask = new Thread(UpdateHelper.CheckAndAskForUpdate) + { + Name = "Update check", + IsBackground = true + }; backgroundTask.Start(); } } diff --git a/Greenshot/Forms/MovableShowColorForm.cs b/Greenshot/Forms/MovableShowColorForm.cs index 7547a04d0..86f193206 100644 --- a/Greenshot/Forms/MovableShowColorForm.cs +++ b/Greenshot/Forms/MovableShowColorForm.cs @@ -86,7 +86,7 @@ namespace Greenshot.Forms { /// Point with the coordinates /// Color at the specified screenCoordinates private static Color GetPixelColor(Point screenCoordinates) { - using (SafeWindowDCHandle screenDC = SafeWindowDCHandle.FromDesktop()) { + using (SafeWindowDcHandle screenDC = SafeWindowDcHandle.FromDesktop()) { try { uint pixel = GDI32.GetPixel(screenDC, screenCoordinates.X, screenCoordinates.Y); Color color = Color.FromArgb(255, (int)(pixel & 0xFF), (int)(pixel & 0xFF00) >> 8, (int)(pixel & 0xFF0000) >> 16); diff --git a/Greenshot/Forms/ResizeSettingsForm.cs b/Greenshot/Forms/ResizeSettingsForm.cs index 2b5489ff6..4471ed443 100644 --- a/Greenshot/Forms/ResizeSettingsForm.cs +++ b/Greenshot/Forms/ResizeSettingsForm.cs @@ -21,137 +21,130 @@ using System; using System.Drawing; using System.Windows.Forms; -using Greenshot.Core; using GreenshotPlugin.Core; +using GreenshotPlugin.Effects; namespace Greenshot.Forms { /// /// A form to set the resize settings /// public partial class ResizeSettingsForm : BaseForm { - private readonly ResizeEffect effect; - private readonly string value_pixel; - private readonly string value_percent; - private double newWidth, newHeight; + private readonly ResizeEffect _effect; + private readonly string _valuePercent; + private double _newWidth, _newHeight; public ResizeSettingsForm(ResizeEffect effect) { - this.effect = effect; + _effect = effect; InitializeComponent(); - value_pixel = Language.GetString("editor_resize_pixel"); - value_percent = Language.GetString("editor_resize_percent"); - combobox_width.Items.Add(value_pixel); - combobox_width.Items.Add(value_percent); - combobox_width.SelectedItem = value_pixel; - combobox_height.Items.Add(value_pixel); - combobox_height.Items.Add(value_percent); - combobox_height.SelectedItem = value_pixel; + var valuePixel = Language.GetString("editor_resize_pixel"); + _valuePercent = Language.GetString("editor_resize_percent"); + combobox_width.Items.Add(valuePixel); + combobox_width.Items.Add(_valuePercent); + combobox_width.SelectedItem = valuePixel; + combobox_height.Items.Add(valuePixel); + combobox_height.Items.Add(_valuePercent); + combobox_height.SelectedItem = valuePixel; textbox_width.Text = effect.Width.ToString(); textbox_height.Text = effect.Height.ToString(); - newWidth = effect.Width; - newHeight = effect.Height; - combobox_width.SelectedIndexChanged += new EventHandler(combobox_SelectedIndexChanged); - combobox_height.SelectedIndexChanged += new EventHandler(combobox_SelectedIndexChanged); + _newWidth = effect.Width; + _newHeight = effect.Height; + combobox_width.SelectedIndexChanged += combobox_SelectedIndexChanged; + combobox_height.SelectedIndexChanged += combobox_SelectedIndexChanged; checkbox_aspectratio.Checked = effect.MaintainAspectRatio; } private void buttonOK_Click(object sender, EventArgs e) { - if (newWidth != effect.Width || newHeight != effect.Height) { - effect.Width = (int)newWidth; - effect.Height = (int)newHeight; - effect.MaintainAspectRatio = checkbox_aspectratio.Checked; + if (_newWidth != _effect.Width || _newHeight != _effect.Height) { + _effect.Width = (int)_newWidth; + _effect.Height = (int)_newHeight; + _effect.MaintainAspectRatio = checkbox_aspectratio.Checked; DialogResult = DialogResult.OK; } } - private bool validate(object sender) { + private static bool Validate(object sender) { TextBox textbox = sender as TextBox; if (textbox != null) { double numberEntered; if (!double.TryParse(textbox.Text, out numberEntered)) { textbox.BackColor = Color.Red; return false; - } else { - textbox.BackColor = Color.White; } + textbox.BackColor = Color.White; } return true; } - private void displayWidth() { + private void DisplayWidth() { double displayValue; - if (value_percent.Equals(combobox_width.SelectedItem)) { - displayValue = (double)newWidth / (double)effect.Width * 100d; + if (_valuePercent.Equals(combobox_width.SelectedItem)) { + displayValue = _newWidth / _effect.Width * 100d; } else { - displayValue = newWidth; + displayValue = _newWidth; } textbox_width.Text = ((int)displayValue).ToString(); } - private void displayHeight() { + private void DisplayHeight() { double displayValue; - if (value_percent.Equals(combobox_height.SelectedItem)) { - displayValue = (double)newHeight / (double)effect.Height * 100d; + if (_valuePercent.Equals(combobox_height.SelectedItem)) { + displayValue = _newHeight / _effect.Height * 100d; } else { - displayValue = newHeight; + displayValue = _newHeight; } textbox_height.Text = ((int)displayValue).ToString(); } private void textbox_KeyUp(object sender, KeyEventArgs e) { - if (!validate(sender)) { + if (!Validate(sender)) { return; } TextBox textbox = sender as TextBox; - if (textbox.Text.Length == 0) { + if (string.IsNullOrEmpty(textbox?.Text)) { return; } bool isWidth = textbox == textbox_width; if (!checkbox_aspectratio.Checked) { if (isWidth) { - newWidth = double.Parse(textbox_width.Text); + _newWidth = double.Parse(textbox_width.Text); } else { - newHeight = double.Parse(textbox_height.Text); + _newHeight = double.Parse(textbox_height.Text); } return; } - bool isPercent = false; - if (isWidth) { - isPercent = value_percent.Equals(combobox_width.SelectedItem); - } else { - isPercent = value_percent.Equals(combobox_height.SelectedItem); - } + var isPercent = _valuePercent.Equals(isWidth ? combobox_width.SelectedItem : combobox_height.SelectedItem); double percent; if (isWidth) { if (isPercent) { percent = double.Parse(textbox_width.Text); - newWidth = (double)effect.Width / 100d * percent; + _newWidth = _effect.Width / 100d * percent; } else { - newWidth = double.Parse(textbox_width.Text); - percent = (double)double.Parse(textbox_width.Text) / (double)effect.Width * 100d; + _newWidth = double.Parse(textbox_width.Text); + percent = double.Parse(textbox_width.Text) / _effect.Width * 100d; } if (checkbox_aspectratio.Checked) { - newHeight = (double)effect.Height / 100d * percent; - displayHeight(); + _newHeight = _effect.Height / 100d * percent; + DisplayHeight(); } } else { if (isPercent) { percent = double.Parse(textbox_height.Text); - newHeight = (double)effect.Height / 100d * percent; + _newHeight = _effect.Height / 100d * percent; } else { - newHeight = double.Parse(textbox_height.Text); - percent = (double)double.Parse(textbox_height.Text) / (double)effect.Height * 100d; + _newHeight = double.Parse(textbox_height.Text); + percent = double.Parse(textbox_height.Text) / _effect.Height * 100d; } if (checkbox_aspectratio.Checked) { - newWidth = (double)effect.Width / 100d * percent; - displayWidth(); + _newWidth = _effect.Width / 100d * percent; + DisplayWidth(); } } } private void textbox_Validating(object sender, System.ComponentModel.CancelEventArgs e) { - validate(sender); + Validate(sender); } /// @@ -160,11 +153,11 @@ namespace Greenshot.Forms { /// /// private void combobox_SelectedIndexChanged(object sender, EventArgs e) { - if (validate(textbox_width)) { - displayWidth(); + if (Validate(textbox_width)) { + DisplayWidth(); } - if (validate(textbox_height)) { - displayHeight(); + if (Validate(textbox_height)) { + DisplayHeight(); } } } diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 21a584fe2..126a13b57 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -43,8 +43,7 @@ namespace Greenshot { /// Description of SettingsForm. /// public partial class SettingsForm : BaseForm { - private static readonly ILog LOG = LogManager.GetLogger(typeof(SettingsForm)); - private static EditorConfiguration editorConfiguration = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(SettingsForm)); private readonly ToolTip _toolTip = new ToolTip(); private bool _inHotkey; @@ -59,11 +58,7 @@ namespace Greenshot { base.OnLoad(e); // Fix for Vista/XP differences - if (Environment.OSVersion.Version.Major >= 6) { - trackBarJpegQuality.BackColor = SystemColors.Window; - } else { - trackBarJpegQuality.BackColor = SystemColors.Control; - } + trackBarJpegQuality.BackColor = Environment.OSVersion.Version.Major >= 6 ? SystemColors.Window : SystemColors.Control; // This makes it possible to still capture the settings screen fullscreen_hotkeyControl.Enter += EnterHotkeyControl; @@ -78,7 +73,7 @@ namespace Greenshot { lastregion_hotkeyControl.Leave += LeaveHotkeyControl; DisplayPluginTab(); - UpdateUI(); + UpdateUi(); ExpertSettingsEnableState(false); DisplaySettings(); CheckSettings(); @@ -116,9 +111,9 @@ namespace Greenshot { /// ComboBox to populate /// /// - private void PopulateComboBox(ComboBox comboBox, ET[] availableValues, ET selectedValue) where ET : struct { + private void PopulateComboBox(ComboBox comboBox, TEnum[] availableValues, TEnum selectedValue) where TEnum : struct { comboBox.Items.Clear(); - foreach(ET enumValue in availableValues) { + foreach(TEnum enumValue in availableValues) { comboBox.Items.Add(Language.Translate(enumValue)); } comboBox.SelectedItem = Language.Translate(selectedValue); @@ -130,13 +125,13 @@ namespace Greenshot { ///
      /// Combobox to get the value from /// The generics value of the combobox - private ET GetSelected(ComboBox comboBox) { - string enumTypeName = typeof(ET).Name; + private TEnum GetSelected(ComboBox comboBox) { + string enumTypeName = typeof(TEnum).Name; string selectedValue = comboBox.SelectedItem as string; - ET[] availableValues = (ET[])Enum.GetValues(typeof(ET)); - ET returnValue = availableValues[0]; - foreach(ET enumValue in availableValues) { - string translation = Language.GetString(enumTypeName + "." + enumValue.ToString()); + TEnum[] availableValues = (TEnum[])Enum.GetValues(typeof(TEnum)); + TEnum returnValue = availableValues[0]; + foreach(TEnum enumValue in availableValues) { + string translation = Language.GetString(enumTypeName + "." + enumValue); if (translation.Equals(selectedValue)) { returnValue = enumValue; break; @@ -196,7 +191,7 @@ namespace Greenshot { /// /// Update the UI to reflect the language and other text settings /// - private void UpdateUI() { + private void UpdateUi() { if (coreConfiguration.HideExpertSettings) { tabcontrol.Controls.Remove(tab_expert); } @@ -229,14 +224,13 @@ namespace Greenshot { return CheckFilenamePattern() && CheckStorageLocationPath(); } - private bool CheckFilenamePattern() { - bool settingsOk = true; + private bool CheckFilenamePattern() { string filename = FilenameHelper.GetFilenameFromPattern(textbox_screenshotname.Text, coreConfiguration.OutputFileFormat, null); // we allow dynamically created subfolders, need to check for them, too string[] pathParts = filename.Split(Path.DirectorySeparatorChar); string filenamePart = pathParts[pathParts.Length-1]; - settingsOk = FilenameHelper.IsFilenameValid(filenamePart); + var settingsOk = FilenameHelper.IsFilenameValid(filenamePart); for (int i = 0; settingsOk && i= 6) { - textbox.BackColor = SystemColors.Window; - } else { - textbox.BackColor = SystemColors.Control; - } + textbox.BackColor = Environment.OSVersion.Version.Major >= 6 ? SystemColors.Window : SystemColors.Control; } else { textbox.BackColor = Color.Red; } @@ -464,7 +451,7 @@ namespace Greenshot { } } } catch (Exception e) { - LOG.Warn("Problem checking registry, ignoring for now: ", e); + Log.Warn("Problem checking registry, ignoring for now: ", e); } } @@ -480,7 +467,7 @@ namespace Greenshot { MainForm.RegisterHotkeys(); // Make sure the current language & settings are reflected in the Main-context menu - MainForm.Instance.UpdateUI(); + MainForm.Instance.UpdateUi(); DialogResult = DialogResult.OK; } else { tabcontrol.SelectTab(tab_output); @@ -511,7 +498,7 @@ namespace Greenshot { } private void Listview_pluginsSelectedIndexChanged(object sender, EventArgs e) { - button_pluginconfigure.Enabled = PluginHelper.Instance.isSelectedItemConfigurable(listview_plugins); + button_pluginconfigure.Enabled = PluginHelper.Instance.IsSelectedItemConfigurable(listview_plugins); } private void Button_pluginconfigureClick(object sender, EventArgs e) { @@ -523,11 +510,11 @@ namespace Greenshot { //EmailFormat selectedEmailFormat = GetSelected(combobox_emailformat); WindowCaptureMode selectedWindowCaptureMode = GetSelected(combobox_window_capture_mode); if (combobox_language.SelectedItem != null) { - LOG.Debug("Setting language to: " + (string)combobox_language.SelectedValue); + Log.Debug("Setting language to: " + (string)combobox_language.SelectedValue); Language.CurrentLanguage = (string)combobox_language.SelectedValue; } // Reflect language changes to the settings form - UpdateUI(); + UpdateUi(); // Reflect Language changes form ApplyLanguage(); @@ -652,7 +639,7 @@ namespace Greenshot { return 1; } if (firstDestination != null && firstDestination.Priority == secondDestination.Priority) { - return firstDestination.Description.CompareTo(secondDestination.Description); + return string.Compare(firstDestination.Description, secondDestination.Description, StringComparison.Ordinal); } if (firstDestination != null) { return firstDestination.Priority - secondDestination.Priority; diff --git a/Greenshot/Forms/ToolStripMenuSelectList.cs b/Greenshot/Forms/ToolStripMenuSelectList.cs index 88546a6bc..e6a77f53b 100644 --- a/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -31,11 +31,11 @@ namespace Greenshot.Forms { /// /// the ToolStripMenuSelectList makes it possible to have a single or multi-check menu /// - public class ToolStripMenuSelectList : ToolStripMenuItem { - private static readonly CoreConfiguration coreConfiguration = IniConfig.GetIniSection(); - private readonly bool multiCheckAllowed; - private bool updateInProgress; - private static Image defaultImage; + public sealed class ToolStripMenuSelectList : ToolStripMenuItem { + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private readonly bool _multiCheckAllowed; + private bool _updateInProgress; + private static Image _defaultImage; /// /// Occurs when one of the list's child element's Checked state changes. @@ -49,14 +49,12 @@ namespace Greenshot.Forms { public ToolStripMenuSelectList(object identifier, bool allowMultiCheck) { Identifier = identifier; CheckOnClick = false; - multiCheckAllowed = allowMultiCheck; - if (defaultImage == null || defaultImage.Size != coreConfiguration.IconSize) { - if (defaultImage != null) { - defaultImage.Dispose(); - } - defaultImage = ImageHelper.CreateEmpty(coreConfiguration.IconSize.Width, coreConfiguration.IconSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb, Color.Transparent, 96f, 96f); + _multiCheckAllowed = allowMultiCheck; + if (_defaultImage == null || _defaultImage.Size != CoreConfig.IconSize) { + _defaultImage?.Dispose(); + _defaultImage = ImageHelper.CreateEmpty(CoreConfig.IconSize.Width, CoreConfig.IconSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb, Color.Transparent, 96f, 96f); } - Image = defaultImage; + Image = _defaultImage; } public ToolStripMenuSelectList() : this(null,false) {} public ToolStripMenuSelectList(object identifier) : this(identifier,false) {} @@ -70,7 +68,7 @@ namespace Greenshot.Forms { IEnumerator items = DropDownItems.GetEnumerator(); while (items.MoveNext()) { ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)items.Current; - if (tsmi.Checked) { + if (tsmi != null && tsmi.Checked) { return tsmi; } } @@ -80,9 +78,9 @@ namespace Greenshot.Forms { IEnumerator items = DropDownItems.GetEnumerator(); while (items.MoveNext()) { ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)items.Current; - if (!multiCheckAllowed && !tsmi.Equals(value)) { + if (tsmi != null && !_multiCheckAllowed && !tsmi.Equals(value)) { tsmi.Checked = false; - } else if (tsmi.Equals(value)) { + } else if (tsmi != null && tsmi.Equals(value)) { tsmi.Checked = true; } } @@ -98,30 +96,31 @@ namespace Greenshot.Forms { IEnumerator items = DropDownItems.GetEnumerator(); while(items.MoveNext()) { ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)items.Current; - if (tsmi.Checked) { + if (tsmi != null && tsmi.Checked) { sel.Add(tsmi); } } return sel.ToArray(); } set { - if (!multiCheckAllowed) { + if (!_multiCheckAllowed) { throw new ArgumentException("Writing to checkedItems is only allowed in multi-check mode. Either set allowMultiCheck to true or use set SelectedItem instead of SelectedItems."); } IEnumerator items = DropDownItems.GetEnumerator(); IEnumerator sel = value.GetEnumerator(); while (items.MoveNext()) { - ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)items.Current; - while (sel.MoveNext()) { - if (tsmi.Equals(sel.Current)) { - tsmi.Checked = true; - } else { - tsmi.Checked = false; - } - if (!multiCheckAllowed && !tsmi.Equals(sel.Current)) { - tsmi.Checked = false; - } else if (tsmi.Equals(value)) { - tsmi.Checked = true; + var toolStripMenuSelectListItem = (ToolStripMenuSelectListItem)items.Current; + if (toolStripMenuSelectListItem == null) + { + continue; + } + while (sel.MoveNext()) + { + toolStripMenuSelectListItem.Checked = toolStripMenuSelectListItem.Equals(sel.Current); + if (!_multiCheckAllowed && !toolStripMenuSelectListItem.Equals(sel.Current)) { + toolStripMenuSelectListItem.Checked = false; + } else if (toolStripMenuSelectListItem.Equals(value)) { + toolStripMenuSelectListItem.Checked = true; } } } @@ -129,19 +128,17 @@ namespace Greenshot.Forms { } private void ItemCheckStateChanged(object sender, EventArgs e) { - if (updateInProgress) { + if (_updateInProgress) { return; } - ToolStripMenuSelectListItem tsmi = (ToolStripMenuSelectListItem)sender; - updateInProgress = true; - if (tsmi.Checked && !multiCheckAllowed) { + var toolStripMenuSelectListItem = (ToolStripMenuSelectListItem)sender; + _updateInProgress = true; + if (toolStripMenuSelectListItem.Checked && !_multiCheckAllowed) { UncheckAll(); - tsmi.Checked = true; - } - updateInProgress = false; - if (CheckedChanged != null) { - CheckedChanged(this, new ItemCheckedChangedEventArgs(tsmi)); + toolStripMenuSelectListItem.Checked = true; } + _updateInProgress = false; + CheckedChanged?.Invoke(this, new ItemCheckedChangedEventArgs(toolStripMenuSelectListItem)); } /// @@ -151,26 +148,28 @@ namespace Greenshot.Forms { /// the icon to be displayed /// the data to be returned when an item is queried /// whether the item is initially checked - public void AddItem(string label, Image image, Object data, bool isChecked) { - ToolStripMenuSelectListItem newItem = new ToolStripMenuSelectListItem(); - newItem.Text = label; + public void AddItem(string label, Image image, object data, bool isChecked) { + var toolStripMenuSelectListItem = new ToolStripMenuSelectListItem + { + Text = label + }; if (image == null) { - image = defaultImage; + image = _defaultImage; } - newItem.DisplayStyle = ToolStripItemDisplayStyle.Text; - newItem.Image = image; - newItem.CheckOnClick = true; - newItem.CheckStateChanged += ItemCheckStateChanged; - newItem.Data = data; + toolStripMenuSelectListItem.DisplayStyle = ToolStripItemDisplayStyle.Text; + toolStripMenuSelectListItem.Image = image; + toolStripMenuSelectListItem.CheckOnClick = true; + toolStripMenuSelectListItem.CheckStateChanged += ItemCheckStateChanged; + toolStripMenuSelectListItem.Data = data; if (isChecked) { - if (!multiCheckAllowed) { - updateInProgress = true; + if (!_multiCheckAllowed) { + _updateInProgress = true; UncheckAll(); - updateInProgress = false; + _updateInProgress = false; } - newItem.Checked = isChecked; + toolStripMenuSelectListItem.Checked = true; } - DropDownItems.Add(newItem); + DropDownItems.Add(toolStripMenuSelectListItem); } /// @@ -187,7 +186,7 @@ namespace Greenshot.Forms { /// /// the label to be displayed /// the data to be returned when an item is queried - public void AddItem(string label, Object data) { + public void AddItem(string label, object data) { AddItem(label, null, data, false); } @@ -216,7 +215,7 @@ namespace Greenshot.Forms { /// the label to be displayed /// the data to be returned when an item is queried /// whether the item is initially checked - public void AddItem(string label, Object data, bool isChecked) { + public void AddItem(string label, object data, bool isChecked) { AddItem(label, null, data, isChecked); } @@ -234,8 +233,13 @@ namespace Greenshot.Forms { /// public void UncheckAll() { IEnumerator items = DropDownItems.GetEnumerator(); - while (items.MoveNext()) { - ((ToolStripMenuSelectListItem)items.Current).Checked = false; + while (items.MoveNext()) + { + var toolStripMenuSelectListItem = (ToolStripMenuSelectListItem)items.Current; + if (toolStripMenuSelectListItem != null) + { + toolStripMenuSelectListItem.Checked = false; + } } } } diff --git a/Greenshot/Forms/TornEdgeSettingsForm.cs b/Greenshot/Forms/TornEdgeSettingsForm.cs index 3b0bda4d3..1eb9b7e53 100644 --- a/Greenshot/Forms/TornEdgeSettingsForm.cs +++ b/Greenshot/Forms/TornEdgeSettingsForm.cs @@ -21,41 +21,41 @@ using System; using System.Drawing; using System.Windows.Forms; -using Greenshot.Core; +using GreenshotPlugin.Effects; namespace Greenshot.Forms { public partial class TornEdgeSettingsForm : BaseForm { - private readonly TornEdgeEffect effect; + private readonly TornEdgeEffect _effect; public TornEdgeSettingsForm(TornEdgeEffect effect) { - this.effect = effect; + _effect = effect; InitializeComponent(); ShowSettings(); } private void ShowSettings() { - shadowCheckbox.Checked = effect.GenerateShadow; + shadowCheckbox.Checked = _effect.GenerateShadow; // Fix to prevent BUG-1753 - shadowDarkness.Value = Math.Max(shadowDarkness.Minimum, Math.Min(shadowDarkness.Maximum, (int)(effect.Darkness * shadowDarkness.Maximum))); - offsetX.Value = effect.ShadowOffset.X; - offsetY.Value = effect.ShadowOffset.Y; - toothsize.Value = effect.ToothHeight; - verticaltoothrange.Value = effect.VerticalToothRange; - horizontaltoothrange.Value = effect.HorizontalToothRange; - top.Checked = effect.Edges[0]; - right.Checked = effect.Edges[1]; - bottom.Checked = effect.Edges[2]; - left.Checked = effect.Edges[3]; + shadowDarkness.Value = Math.Max(shadowDarkness.Minimum, Math.Min(shadowDarkness.Maximum, (int)(_effect.Darkness * shadowDarkness.Maximum))); + offsetX.Value = _effect.ShadowOffset.X; + offsetY.Value = _effect.ShadowOffset.Y; + toothsize.Value = _effect.ToothHeight; + verticaltoothrange.Value = _effect.VerticalToothRange; + horizontaltoothrange.Value = _effect.HorizontalToothRange; + top.Checked = _effect.Edges[0]; + right.Checked = _effect.Edges[1]; + bottom.Checked = _effect.Edges[2]; + left.Checked = _effect.Edges[3]; } private void ButtonOK_Click(object sender, EventArgs e) { - effect.Darkness = (float)shadowDarkness.Value / (float)40; - effect.ShadowOffset = new Point((int)offsetX.Value, (int)offsetY.Value); - effect.ShadowSize = (int)thickness.Value; - effect.ToothHeight = (int)toothsize.Value; - effect.VerticalToothRange = (int)verticaltoothrange.Value; - effect.HorizontalToothRange = (int)horizontaltoothrange.Value; - effect.Edges = new bool[] { top.Checked, right.Checked, bottom.Checked, left.Checked }; - effect.GenerateShadow = shadowCheckbox.Checked; + _effect.Darkness = shadowDarkness.Value / (float)40; + _effect.ShadowOffset = new Point((int)offsetX.Value, (int)offsetY.Value); + _effect.ShadowSize = (int)thickness.Value; + _effect.ToothHeight = (int)toothsize.Value; + _effect.VerticalToothRange = (int)verticaltoothrange.Value; + _effect.HorizontalToothRange = (int)horizontaltoothrange.Value; + _effect.Edges = new[] { top.Checked, right.Checked, bottom.Checked, left.Checked }; + _effect.GenerateShadow = shadowCheckbox.Checked; DialogResult = DialogResult.OK; } @@ -66,37 +66,37 @@ namespace Greenshot.Forms { shadowDarkness.Enabled = shadowCheckbox.Checked; } - + - private void all_CheckedChanged(object sender, EventArgs e) { - AnySideChangeChecked(top, all.Checked); - AnySideChangeChecked(right, all.Checked); - AnySideChangeChecked(bottom, all.Checked); - AnySideChangeChecked(left, all.Checked); - } + private void all_CheckedChanged(object sender, EventArgs e) { + AnySideChangeChecked(top, all.Checked); + AnySideChangeChecked(right, all.Checked); + AnySideChangeChecked(bottom, all.Checked); + AnySideChangeChecked(left, all.Checked); + } - private void AnySideCheckedChanged(object sender, EventArgs e) { - all.CheckedChanged -= all_CheckedChanged; - all.Checked = top.Checked && right.Checked && bottom.Checked && left.Checked; - all.CheckedChanged += all_CheckedChanged; - } + private void AnySideCheckedChanged(object sender, EventArgs e) { + all.CheckedChanged -= all_CheckedChanged; + all.Checked = top.Checked && right.Checked && bottom.Checked && left.Checked; + all.CheckedChanged += all_CheckedChanged; + } - /// - /// changes the Checked property of top/right/bottom/left checkboxes without triggering AnySideCheckedChange - /// - /// Checkbox to change Checked - /// true to check - private void AnySideChangeChecked(CheckBox cb, bool status) { - if (status != cb.Checked) { - cb.CheckedChanged -= AnySideCheckedChanged; - cb.Checked = status; - cb.CheckedChanged += AnySideCheckedChanged; - } - } + /// + /// changes the Checked property of top/right/bottom/left checkboxes without triggering AnySideCheckedChange + /// + /// Checkbox to change Checked + /// true to check + private void AnySideChangeChecked(CheckBox cb, bool status) { + if (status != cb.Checked) { + cb.CheckedChanged -= AnySideCheckedChanged; + cb.Checked = status; + cb.CheckedChanged += AnySideCheckedChanged; + } + } - private void TornEdgeSettingsForm_Load(object sender, EventArgs e) - { + private void TornEdgeSettingsForm_Load(object sender, EventArgs e) + { - } + } } } diff --git a/Greenshot/Help/HelpFileLoader.cs b/Greenshot/Help/HelpFileLoader.cs index a2ebf9331..d51fffcc4 100644 --- a/Greenshot/Help/HelpFileLoader.cs +++ b/Greenshot/Help/HelpFileLoader.cs @@ -29,21 +29,14 @@ namespace Greenshot.Help /// /// Description of HelpFileLoader. /// - public sealed class HelpFileLoader + public static class HelpFileLoader { + private static readonly ILog Log = LogManager.GetLogger(typeof(HelpFileLoader)); - private static readonly ILog LOG = LogManager.GetLogger(typeof(HelpFileLoader)); - - private const string EXT_HELP_URL = @"http://getgreenshot.org/help/"; - - private HelpFileLoader() { - } - + private const string ExtHelpUrl = @"http://getgreenshot.org/help/"; + public static void LoadHelp() { - string uri = FindOnlineHelpUrl(Language.CurrentLanguage); - if(uri == null) { - uri = Language.HelpFilePath; - } + string uri = FindOnlineHelpUrl(Language.CurrentLanguage) ?? Language.HelpFilePath; Process.Start(uri); } @@ -51,7 +44,7 @@ namespace Greenshot.Help private static string FindOnlineHelpUrl(string currentIETF) { string ret = null; - string extHelpUrlForCurrrentIETF = EXT_HELP_URL; + string extHelpUrlForCurrrentIETF = ExtHelpUrl; if(!currentIETF.Equals("en-US")) { extHelpUrlForCurrrentIETF += currentIETF.ToLower() + "/"; @@ -60,16 +53,16 @@ namespace Greenshot.Help HttpStatusCode? httpStatusCode = GetHttpStatus(extHelpUrlForCurrrentIETF); if(httpStatusCode == HttpStatusCode.OK) { ret = extHelpUrlForCurrrentIETF; - } else if(httpStatusCode != null && !extHelpUrlForCurrrentIETF.Equals(EXT_HELP_URL)) { - LOG.DebugFormat("Localized online help not found at {0}, will try {1} as fallback", extHelpUrlForCurrrentIETF, EXT_HELP_URL); - httpStatusCode = GetHttpStatus(EXT_HELP_URL); + } else if(httpStatusCode != null && !extHelpUrlForCurrrentIETF.Equals(ExtHelpUrl)) { + Log.DebugFormat("Localized online help not found at {0}, will try {1} as fallback", extHelpUrlForCurrrentIETF, ExtHelpUrl); + httpStatusCode = GetHttpStatus(ExtHelpUrl); if(httpStatusCode == HttpStatusCode.OK) { - ret = EXT_HELP_URL; + ret = ExtHelpUrl; } else { - LOG.WarnFormat("{0} returned status {1}", EXT_HELP_URL, httpStatusCode); + Log.WarnFormat("{0} returned status {1}", ExtHelpUrl, httpStatusCode); } } else if(httpStatusCode == null){ - LOG.Info("Internet connection does not seem to be available, will load help from file system."); + Log.Info("Internet connection does not seem to be available, will load help from file system."); } return ret; @@ -88,11 +81,7 @@ namespace Greenshot.Help return res.StatusCode; } } catch (WebException e) { - if (e.Response != null) - { - return ((HttpWebResponse)e.Response).StatusCode; - } - return null; + return ((HttpWebResponse) e.Response)?.StatusCode; } } } diff --git a/Greenshot/Helpers/CaptureHelper.cs b/Greenshot/Helpers/CaptureHelper.cs index 74975f82f..e62afabe7 100644 --- a/Greenshot/Helpers/CaptureHelper.cs +++ b/Greenshot/Helpers/CaptureHelper.cs @@ -41,8 +41,8 @@ namespace Greenshot.Helpers { /// CaptureHelper contains all the capture logic /// public class CaptureHelper : IDisposable { - private static readonly ILog LOG = LogManager.GetLogger(typeof(CaptureHelper)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(CaptureHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); // TODO: when we get the screen capture code working correctly, this needs to be enabled //private static ScreenCaptureHelper screenCapture = null; private List _windows = new List(); @@ -78,7 +78,7 @@ namespace Greenshot.Helpers { _selectedCaptureWindow = null; _capture = null; // Empty working set after capturing - if (conf.MinimizeWorkingSetSize) { + if (CoreConfig.MinimizeWorkingSetSize) { PsAPI.EmptyWorkingSet(); } } @@ -114,7 +114,7 @@ namespace Greenshot.Helpers { } } - public static void CaptureIE(bool captureMouse, WindowDetails windowToCapture) { + public static void CaptureIe(bool captureMouse, WindowDetails windowToCapture) { using (CaptureHelper captureHelper = new CaptureHelper(CaptureMode.IE, captureMouse)) { captureHelper.SelectedCaptureWindow = windowToCapture; captureHelper.MakeCapture(); @@ -192,7 +192,7 @@ namespace Greenshot.Helpers { } private void DoCaptureFeedback() { - if(conf.PlayCameraSound) { + if(CoreConfig.PlayCameraSound) { SoundHelper.Play(); } } @@ -224,11 +224,11 @@ namespace Greenshot.Helpers { // This fixes a problem when a balloon is still visible and a capture needs to be taken // forcefully removes the balloon! - if (!conf.HideTrayicon) { + if (!CoreConfig.HideTrayicon) { MainForm.Instance.NotifyIcon.Visible = false; MainForm.Instance.NotifyIcon.Visible = true; } - LOG.Debug(String.Format("Capturing with mode {0} and using Cursor {1}", _captureMode, _captureMouseCursor)); + Log.Debug($"Capturing with mode {_captureMode} and using Cursor {_captureMouseCursor}"); _capture.CaptureDetails.CaptureMode = _captureMode; // Get the windows details in a seperate thread, only for those captures that have a Feedback @@ -251,27 +251,24 @@ namespace Greenshot.Helpers { } // Delay for the Context menu - if (conf.CaptureDelay > 0) { - Thread.Sleep(conf.CaptureDelay); + if (CoreConfig.CaptureDelay > 0) { + Thread.Sleep(CoreConfig.CaptureDelay); } else { - conf.CaptureDelay = 0; + CoreConfig.CaptureDelay = 0; } // Capture Mousecursor if we are not loading from file or clipboard, only show when needed - if (_captureMode != CaptureMode.File && _captureMode != CaptureMode.Clipboard) { + if (_captureMode != CaptureMode.File && _captureMode != CaptureMode.Clipboard) + { _capture = WindowCapture.CaptureCursor(_capture); - if (_captureMouseCursor) { - _capture.CursorVisible = conf.CaptureMousepointer; - } else { - _capture.CursorVisible = false; - } + _capture.CursorVisible = _captureMouseCursor && CoreConfig.CaptureMousepointer; } switch(_captureMode) { case CaptureMode.Window: _capture = WindowCapture.CaptureScreen(_capture); _capture.CaptureDetails.AddMetaData("source", "Screen"); - SetDPI(); + SetDpi(); CaptureWithFeedback(); break; case CaptureMode.ActiveWindow: @@ -285,13 +282,13 @@ namespace Greenshot.Helpers { _capture.CaptureDetails.AddMetaData("source", "Screen"); _capture.CaptureDetails.Title = "Screen"; } - SetDPI(); + SetDpi(); HandleCapture(); break; case CaptureMode.IE: - if (IECaptureHelper.CaptureIE(_capture, SelectedCaptureWindow) != null) { + if (IeCaptureHelper.CaptureIe(_capture, SelectedCaptureWindow) != null) { _capture.CaptureDetails.AddMetaData("source", "Internet Explorer"); - SetDPI(); + SetDpi(); HandleCapture(); } break; @@ -310,8 +307,8 @@ namespace Greenshot.Helpers { } break; case ScreenCaptureMode.Fixed: - if (conf.ScreenToCapture > 0 && conf.ScreenToCapture <= Screen.AllScreens.Length) { - _capture = WindowCapture.CaptureRectangle(_capture, Screen.AllScreens[conf.ScreenToCapture].Bounds); + if (CoreConfig.ScreenToCapture > 0 && CoreConfig.ScreenToCapture <= Screen.AllScreens.Length) { + _capture = WindowCapture.CaptureRectangle(_capture, Screen.AllScreens[CoreConfig.ScreenToCapture].Bounds); captureTaken = true; } break; @@ -322,7 +319,7 @@ namespace Greenshot.Helpers { if (!captureTaken) { _capture = WindowCapture.CaptureScreen(_capture); } - SetDPI(); + SetDpi(); HandleCapture(); break; case CaptureMode.Clipboard: @@ -363,13 +360,13 @@ namespace Greenshot.Helpers { break; } } catch (Exception e) { - LOG.Error(e.Message, e); + Log.Error(e.Message, e); MessageBox.Show(Language.GetFormattedString(LangKey.error_openfile, filename)); } try { fileImage = ImageHelper.LoadImage(filename); } catch (Exception e) { - LOG.Error(e.Message, e); + Log.Error(e.Message, e); MessageBox.Show(Language.GetFormattedString(LangKey.error_openfile, filename)); } } @@ -395,8 +392,8 @@ namespace Greenshot.Helpers { } break; case CaptureMode.LastRegion: - if (!conf.LastCapturedRegion.IsEmpty) { - _capture = WindowCapture.CaptureRectangle(_capture, conf.LastCapturedRegion); + if (!CoreConfig.LastCapturedRegion.IsEmpty) { + _capture = WindowCapture.CaptureRectangle(_capture, CoreConfig.LastCapturedRegion); // TODO: Reactive / check if the elements code is activated //if (windowDetailsThread != null) { // windowDetailsThread.Join(); @@ -404,7 +401,7 @@ namespace Greenshot.Helpers { // Set capture title, fixing bug #3569703 foreach (WindowDetails window in WindowDetails.GetVisibleWindows()) { - Point estimatedLocation = new Point(conf.LastCapturedRegion.X + conf.LastCapturedRegion.Width / 2, conf.LastCapturedRegion.Y + conf.LastCapturedRegion.Height / 2); + Point estimatedLocation = new Point(CoreConfig.LastCapturedRegion.X + CoreConfig.LastCapturedRegion.Width / 2, CoreConfig.LastCapturedRegion.Y + CoreConfig.LastCapturedRegion.Height / 2); if (window.Contains(estimatedLocation)) { _selectedCaptureWindow = window; _capture.CaptureDetails.Title = _selectedCaptureWindow.Text; @@ -416,7 +413,7 @@ namespace Greenshot.Helpers { //capture.MoveElements(capture.ScreenBounds.Location.X - capture.Location.X, capture.ScreenBounds.Location.Y - capture.Location.Y); _capture.CaptureDetails.AddMetaData("source", "screen"); - SetDPI(); + SetDpi(); HandleCapture(); } break; @@ -425,25 +422,23 @@ namespace Greenshot.Helpers { if (Rectangle.Empty.Equals(_captureRect)) { _capture = WindowCapture.CaptureScreen(_capture); _capture.CaptureDetails.AddMetaData("source", "screen"); - SetDPI(); + SetDpi(); CaptureWithFeedback(); } else { _capture = WindowCapture.CaptureRectangle(_capture, _captureRect); _capture.CaptureDetails.AddMetaData("source", "screen"); - SetDPI(); + SetDpi(); HandleCapture(); } break; default: - LOG.Warn("Unknown capture mode: " + _captureMode); + Log.Warn("Unknown capture mode: " + _captureMode); break; } // Wait for thread, otherwise we can't dipose the CaptureHelper - if (retrieveWindowDetailsThread != null) { - retrieveWindowDetailsThread.Join(); - } + retrieveWindowDetailsThread?.Join(); if (_capture != null) { - LOG.Debug("Disposing capture"); + Log.Debug("Disposing capture"); _capture.Dispose(); } } @@ -471,7 +466,7 @@ namespace Greenshot.Helpers { } private void RetrieveWindowDetails() { - LOG.Debug("start RetrieveWindowDetails"); + Log.Debug("start RetrieveWindowDetails"); // Start Enumeration of "active" windows foreach (var window in WindowDetails.GetVisibleWindows()) { // Make sure the details are retrieved once @@ -479,7 +474,7 @@ namespace Greenshot.Helpers { // Force children retrieval, sometimes windows close on losing focus and this is solved by caching int goLevelDeep = 3; - if (conf.WindowCaptureAllChildLocations) { + if (CoreConfig.WindowCaptureAllChildLocations) { goLevelDeep = 20; } window.GetChildren(goLevelDeep); @@ -487,11 +482,11 @@ namespace Greenshot.Helpers { _windows.Add(window); } } - LOG.Debug("end RetrieveWindowDetails"); + Log.Debug("end RetrieveWindowDetails"); } private void AddConfiguredDestination() { - foreach(string destinationDesignation in conf.OutputDestinations) { + foreach(string destinationDesignation in CoreConfig.OutputDestinations) { IDestination destination = DestinationHelper.GetDestination(destinationDesignation); if (destination != null) { _capture.CaptureDetails.AddDestination(destination); @@ -507,7 +502,7 @@ namespace Greenshot.Helpers { private void OpenCaptureOnClick(object sender, EventArgs e) { SurfaceMessageEventArgs eventArgs = MainForm.Instance.NotifyIcon.Tag as SurfaceMessageEventArgs; if (eventArgs == null) { - LOG.Warn("OpenCaptureOnClick called without SurfaceMessageEventArgs"); + Log.Warn("OpenCaptureOnClick called without SurfaceMessageEventArgs"); RemoveEventHandler(sender, e); return; } @@ -515,14 +510,19 @@ namespace Greenshot.Helpers { if (surface != null && eventArgs.MessageType == SurfaceMessageTyp.FileSaved) { if (!string.IsNullOrEmpty(surface.LastSaveFullPath)) { string errorMessage = null; - + var path = Path.GetDirectoryName(surface.LastSaveFullPath); try { - ProcessStartInfo psi = new ProcessStartInfo("explorer.exe"); - psi.Arguments = Path.GetDirectoryName(surface.LastSaveFullPath); - psi.UseShellExecute = false; - using (Process p = new Process()) { - p.StartInfo = psi; - p.Start(); + if (path != null) + { + var processStartInfo = new ProcessStartInfo("explorer.exe") + { + Arguments = path, + UseShellExecute = false + }; + using (var process = new Process()) { + process.StartInfo = processStartInfo; + process.Start(); + } } } catch (Exception ex) { errorMessage = ex.Message; @@ -531,28 +531,41 @@ namespace Greenshot.Helpers { if (errorMessage != null) { try { string windowsPath = Environment.GetEnvironmentVariable("SYSTEMROOT"); - string explorerPath = Path.Combine(windowsPath, "explorer.exe"); - if (File.Exists(explorerPath)) { - ProcessStartInfo psi = new ProcessStartInfo(explorerPath); - psi.Arguments = Path.GetDirectoryName(surface.LastSaveFullPath); - psi.UseShellExecute = false; - using (Process p = new Process()) { - p.StartInfo = psi; - p.Start(); + if (windowsPath != null) + { + string explorerPath = Path.Combine(windowsPath, "explorer.exe"); + if (File.Exists(explorerPath)) + { + var lastSaveDirectory = Path.GetDirectoryName(surface.LastSaveFullPath); + if (lastSaveDirectory != null) + { + var processStartInfo = new ProcessStartInfo(explorerPath) + { + Arguments = lastSaveDirectory, + UseShellExecute = false + }; + using (var process = new Process()) { + process.StartInfo = processStartInfo; + process.Start(); + } + } + errorMessage = null; } - errorMessage = null; } - } catch { + } + catch + { + // ignored } } if (errorMessage != null) { - MessageBox.Show(string.Format("{0}\r\nexplorer.exe {1}", errorMessage, surface.LastSaveFullPath), "explorer.exe", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"{errorMessage}\r\nexplorer.exe {surface.LastSaveFullPath}", "explorer.exe", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - } else if (surface != null && !string.IsNullOrEmpty(surface.UploadUrl)) { + } else if (!string.IsNullOrEmpty(surface?.UploadUrl)) { Process.Start(surface.UploadUrl); } - LOG.DebugFormat("Deregistering the BalloonTipClicked"); + Log.DebugFormat("Deregistering the BalloonTipClicked"); RemoveEventHandler(sender, e); } @@ -568,7 +581,11 @@ namespace Greenshot.Helpers { /// /// private void SurfaceMessageReceived(object sender, SurfaceMessageEventArgs eventArgs) { - if (eventArgs == null || string.IsNullOrEmpty(eventArgs.Message)) { + if (string.IsNullOrEmpty(eventArgs?.Message)) { + return; + } + if (MainForm.Instance == null) + { return; } switch (eventArgs.MessageType) { @@ -602,13 +619,13 @@ namespace Greenshot.Helpers { outputMade = true; } else { // Make sure the resolution is set correctly! - if (_capture.CaptureDetails != null && _capture.Image != null) { - ((Bitmap)_capture.Image).SetResolution(_capture.CaptureDetails.DpiX, _capture.CaptureDetails.DpiY); + if (_capture.CaptureDetails != null) { + ((Bitmap) _capture.Image)?.SetResolution(_capture.CaptureDetails.DpiX, _capture.CaptureDetails.DpiY); } DoCaptureFeedback(); } - LOG.Debug("A capture of: " + _capture.CaptureDetails.Title); + Log.Debug("A capture of: " + _capture.CaptureDetails.Title); // check if someone has passed a destination if (_capture.CaptureDetails.CaptureDestinations == null || _capture.CaptureDetails.CaptureDestinations.Count == 0) { @@ -616,18 +633,20 @@ namespace Greenshot.Helpers { } // Create Surface with capture, this way elements can be added automatically (like the mouse cursor) - Surface surface = new Surface(_capture); - surface.Modified = !outputMade; + Surface surface = new Surface(_capture) + { + Modified = !outputMade + }; // Register notify events if this is wanted - if (conf.ShowTrayNotification && !conf.HideTrayicon) { + if (CoreConfig.ShowTrayNotification && !CoreConfig.HideTrayicon) { surface.SurfaceMessage += SurfaceMessageReceived; } // Let the processors do their job foreach(IProcessor processor in ProcessorHelper.GetAllProcessors()) { if (processor.isActive) { - LOG.InfoFormat("Calling processor {0}", processor.Description); + Log.InfoFormat("Calling processor {0}", processor.Description); processor.ProcessCapture(surface, _capture.CaptureDetails); } } @@ -659,7 +678,7 @@ namespace Greenshot.Helpers { if (PickerDestination.DESIGNATION.Equals(destination.Designation)) { continue; } - LOG.InfoFormat("Calling destination {0}", destination.Description); + Log.InfoFormat("Calling destination {0}", destination.Description); ExportInformation exportInformation = destination.ExportCapture(false, surface, captureDetails); if (EditorDestination.DESIGNATION.Equals(destination.Designation) && exportInformation.ExportMade) { @@ -674,21 +693,21 @@ namespace Greenshot.Helpers { private bool CaptureActiveWindow() { bool presupplied = false; - LOG.Debug("CaptureActiveWindow"); + Log.Debug("CaptureActiveWindow"); if (_selectedCaptureWindow != null) { - LOG.Debug("Using supplied window"); + Log.Debug("Using supplied window"); presupplied = true; } else { _selectedCaptureWindow = WindowDetails.GetActiveWindow(); if (_selectedCaptureWindow != null) { - if (LOG.IsDebugEnabled) + if (Log.IsDebugEnabled) { - LOG.DebugFormat("Capturing window: {0} with {1}", _selectedCaptureWindow.Text, _selectedCaptureWindow.WindowRectangle); + Log.DebugFormat("Capturing window: {0} with {1}", _selectedCaptureWindow.Text, _selectedCaptureWindow.WindowRectangle); } } } if (_selectedCaptureWindow == null || (!presupplied && _selectedCaptureWindow.Iconic)) { - LOG.Warn("No window to capture!"); + Log.Warn("No window to capture!"); // Nothing to capture, code up in the stack will capture the full screen return false; } @@ -699,13 +718,13 @@ namespace Greenshot.Helpers { } _selectedCaptureWindow = SelectCaptureWindow(_selectedCaptureWindow); if (_selectedCaptureWindow == null) { - LOG.Warn("No window to capture, after SelectCaptureWindow!"); + Log.Warn("No window to capture, after SelectCaptureWindow!"); // Nothing to capture, code up in the stack will capture the full screen return false; } // Fix for Bug #3430560 - conf.LastCapturedRegion = _selectedCaptureWindow.WindowRectangle; - bool returnValue = CaptureWindow(_selectedCaptureWindow, _capture, conf.WindowCaptureMode) != null; + CoreConfig.LastCapturedRegion = _selectedCaptureWindow.WindowRectangle; + bool returnValue = CaptureWindow(_selectedCaptureWindow, _capture, CoreConfig.WindowCaptureMode) != null; return returnValue; } @@ -718,7 +737,7 @@ namespace Greenshot.Helpers { public static WindowDetails SelectCaptureWindow(WindowDetails windowToCapture) { Rectangle windowRectangle = windowToCapture.WindowRectangle; if (windowRectangle.Width == 0 || windowRectangle.Height == 0) { - LOG.WarnFormat("Window {0} has nothing to capture, using workaround to find other window of same process.", windowToCapture.Text); + Log.WarnFormat("Window {0} has nothing to capture, using workaround to find other window of same process.", windowToCapture.Text); // Trying workaround, the size 0 arrises with e.g. Toad.exe, has a different Window when minimized WindowDetails linkedWindow = WindowDetails.GetLinkedWindow(windowToCapture); if (linkedWindow != null) { @@ -735,18 +754,18 @@ namespace Greenshot.Helpers { ///
      /// Proces to check for the presentation framework /// true if the process uses WPF - private static bool isWPF(Process process) { + private static bool IsWpf(Process process) { if (process != null) { try { foreach (ProcessModule module in process.Modules) { if (module.ModuleName.StartsWith("PresentationFramework")) { - LOG.InfoFormat("Found that Process {0} uses {1}, assuming it's using WPF", process.ProcessName, module.FileName); + Log.InfoFormat("Found that Process {0} uses {1}, assuming it's using WPF", process.ProcessName, module.FileName); return true; } } } catch (Exception) { // Access denied on the modules - LOG.WarnFormat("No access on the modules from process {0}, assuming WPF is used.", process.ProcessName); + Log.WarnFormat("No access on the modules from process {0}, assuming WPF is used.", process.ProcessName); return true; } } @@ -776,14 +795,14 @@ namespace Greenshot.Helpers { // 2) Is Windows >= Vista & DWM enabled: use DWM // 3) Otherwise use GDI (Screen might be also okay but might lose content) if (isAutoMode) { - if (conf.IECapture && IECaptureHelper.IsIEWindow(windowToCapture)) { + if (CoreConfig.IECapture && IeCaptureHelper.IsIeWindow(windowToCapture)) { try { - ICapture ieCapture = IECaptureHelper.CaptureIE(captureForWindow, windowToCapture); + ICapture ieCapture = IeCaptureHelper.CaptureIe(captureForWindow, windowToCapture); if (ieCapture != null) { return ieCapture; } } catch (Exception ex) { - LOG.WarnFormat("Problem capturing IE, skipping to normal capture. Exception message was: {0}", ex.Message); + Log.WarnFormat("Problem capturing IE, skipping to normal capture. Exception message was: {0}", ex.Message); } } @@ -792,9 +811,9 @@ namespace Greenshot.Helpers { // Change to GDI, if allowed if (!windowToCapture.IsMetroApp && WindowCapture.IsGdiAllowed(process)) { - if (!dwmEnabled && isWPF(process)) { + if (!dwmEnabled && IsWpf(process)) { // do not use GDI, as DWM is not enabled and the application uses PresentationFramework.dll -> isWPF - LOG.InfoFormat("Not using GDI for windows of process {0}, as the process uses WPF", process.ProcessName); + Log.InfoFormat("Not using GDI for windows of process {0}, as the process uses WPF", process.ProcessName); } else { windowCaptureMode = WindowCaptureMode.GDI; } @@ -820,7 +839,7 @@ namespace Greenshot.Helpers { windowCaptureMode = WindowCaptureMode.Screen; } - LOG.InfoFormat("Capturing window with mode {0}", windowCaptureMode); + Log.InfoFormat("Capturing window with mode {0}", windowCaptureMode); bool captureTaken = false; windowRectangle.Intersect(captureForWindow.ScreenBounds); // Try to capture @@ -852,7 +871,7 @@ namespace Greenshot.Helpers { // "easy compare", both have the same size // If GDI has more black, use the screen capture. if (blackPercentageGdi > blackPercentageScreen) { - LOG.Debug("Using screen capture, as GDI had additional black."); + Log.Debug("Using screen capture, as GDI had additional black."); // changeing the image will automatically dispose the previous tmpCapture.Image = screenCapture.Image; // Make sure it's not disposed, else the picture is gone! @@ -861,7 +880,7 @@ namespace Greenshot.Helpers { } else if (screenPixels < gdiPixels) { // Screen capture is cropped, window is outside of screen if (blackPercentageGdi > 50 && blackPercentageGdi > blackPercentageScreen) { - LOG.Debug("Using screen capture, as GDI had additional black."); + Log.Debug("Using screen capture, as GDI had additional black."); // changeing the image will automatically dispose the previous tmpCapture.Image = screenCapture.Image; // Make sure it's not disposed, else the picture is gone! @@ -869,7 +888,7 @@ namespace Greenshot.Helpers { } } else { // Use the GDI capture by doing nothing - LOG.Debug("This should not happen, how can there be more screen as GDI pixels?"); + Log.Debug("This should not happen, how can there be more screen as GDI pixels?"); } } } @@ -910,7 +929,7 @@ namespace Greenshot.Helpers { captureForWindow = WindowCapture.CaptureRectangleFromDesktopScreen(captureForWindow, windowRectangle); captureTaken = true; } catch (Exception e) { - LOG.Error("Problem capturing", e); + Log.Error("Problem capturing", e); return null; } break; @@ -918,16 +937,15 @@ namespace Greenshot.Helpers { } } - if (captureForWindow != null) { - if (windowToCapture != null) { - captureForWindow.CaptureDetails.Title = windowToCapture.Text; - } + if (captureForWindow != null) + { + captureForWindow.CaptureDetails.Title = windowToCapture.Text; } return captureForWindow; } - private void SetDPI() { + private void SetDpi() { // Workaround for proble with DPI retrieval, the FromHwnd activates the window... WindowDetails previouslyActiveWindow = WindowDetails.GetActiveWindow(); // Workaround for changed DPI settings in Windows 7 @@ -935,12 +953,10 @@ namespace Greenshot.Helpers { _capture.CaptureDetails.DpiX = graphics.DpiX; _capture.CaptureDetails.DpiY = graphics.DpiY; } - if (previouslyActiveWindow != null) { - // Set previouslyActiveWindow as foreground window - previouslyActiveWindow.ToForeground(); - } - if (_capture.CaptureDetails != null && _capture.Image != null) { - ((Bitmap)_capture.Image).SetResolution(_capture.CaptureDetails.DpiX, _capture.CaptureDetails.DpiY); + // Set previouslyActiveWindow as foreground window + previouslyActiveWindow?.ToForeground(); + if (_capture.CaptureDetails != null) { + ((Bitmap) _capture.Image)?.SetResolution(_capture.CaptureDetails.DpiX, _capture.CaptureDetails.DpiY); } } @@ -958,7 +974,7 @@ namespace Greenshot.Helpers { using (CaptureForm captureForm = new CaptureForm(_capture, _windows)) { // Make sure the form is hidden after showing, even if an exception occurs, so all errors will be shown - DialogResult result = DialogResult.Cancel; + DialogResult result; try { result = captureForm.ShowDialog(MainForm.Instance); } finally { @@ -980,7 +996,7 @@ namespace Greenshot.Helpers { // Important here is that the location needs to be offsetted back to screen coordinates! Rectangle tmpRectangle = _captureRect; tmpRectangle.Offset(_capture.ScreenBounds.Location.X, _capture.ScreenBounds.Location.Y); - conf.LastCapturedRegion = tmpRectangle; + CoreConfig.LastCapturedRegion = tmpRectangle; HandleCapture(); } } diff --git a/Greenshot/Helpers/CopyData.cs b/Greenshot/Helpers/CopyData.cs index 1d489fd68..131684e9d 100644 --- a/Greenshot/Helpers/CopyData.cs +++ b/Greenshot/Helpers/CopyData.cs @@ -39,9 +39,8 @@ namespace Greenshot.Helpers { [Serializable()] public class CopyDataTransport { private readonly List> _commands; - public List> Commands { - get {return _commands;} - } + public List> Commands => _commands; + public CopyDataTransport() { _commands = new List>(); } @@ -100,9 +99,9 @@ namespace Greenshot.Helpers { ///
      /// The Windows Message information. protected override void WndProc (ref Message m ) { - if (m.Msg == WM_COPYDATA) { - COPYDATASTRUCT cds = new COPYDATASTRUCT(); - cds = (COPYDATASTRUCT) Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT)); + if (m.Msg == WM_COPYDATA) + { + var cds = (COPYDATASTRUCT) Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT)); if (cds.cbData > 0) { byte[] data = new byte[cds.cbData]; Marshal.Copy(cds.lpData, data, 0, cds.cbData); @@ -120,9 +119,7 @@ namespace Greenshot.Helpers { // WM_DESTROY fires before OnHandleChanged and is // a better place to ensure that we've cleared // everything up. - if (_channels != null) { - _channels.OnHandleChange(); - } + _channels?.OnHandleChange(); base.OnHandleChange(); } base.WndProc(ref m); @@ -134,10 +131,7 @@ namespace Greenshot.Helpers { /// The data which has been received. protected void OnCopyDataReceived(CopyDataReceivedEventArgs e) { - if (CopyDataReceived != null) - { - CopyDataReceived(this, e); - } + CopyDataReceived?.Invoke(this, e); } /// @@ -149,20 +143,14 @@ namespace Greenshot.Helpers { /// protected override void OnHandleChange () { // need to clear up everything we had set. - if (_channels != null) { - _channels.OnHandleChange(); - } + _channels?.OnHandleChange(); base.OnHandleChange(); } /// /// Gets the collection of channels. /// - public CopyDataChannels Channels { - get { - return _channels; - } - } + public CopyDataChannels Channels => _channels; public void Dispose() { Dispose(true); @@ -204,7 +192,7 @@ namespace Greenshot.Helpers { /// /// Gets the channel name that this data was sent on. /// - public string ChannelName { get; } = ""; + public string ChannelName { get; } /// /// Gets the data object which was sent. @@ -274,11 +262,8 @@ namespace Greenshot.Helpers { /// /// Returns the CopyDataChannel for the specified channelName /// - public CopyDataChannel this[string channelName] { - get { - return (CopyDataChannel) Dictionary[channelName]; - } - } + public CopyDataChannel this[string channelName] => (CopyDataChannel) Dictionary[channelName]; + /// /// Adds a new channel on which this application can send and /// receive messages. @@ -320,7 +305,7 @@ namespace Greenshot.Helpers { /// The channelName /// The CopyDataChannel object which has /// just been removed - protected override void OnRemoveComplete ( Object key , Object data ) { + protected override void OnRemoveComplete ( object key , object data ) { ( (CopyDataChannel) data).Dispose(); OnRemove(key, data); } diff --git a/Greenshot/Helpers/DestinationHelper.cs b/Greenshot/Helpers/DestinationHelper.cs index 94402e936..6ce287460 100644 --- a/Greenshot/Helpers/DestinationHelper.cs +++ b/Greenshot/Helpers/DestinationHelper.cs @@ -31,9 +31,9 @@ namespace Greenshot.Helpers { /// Description of DestinationHelper. /// public static class DestinationHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(DestinationHelper)); + private static readonly ILog Log = LogManager.GetLogger(typeof(DestinationHelper)); private static readonly Dictionary RegisteredDestinations = new Dictionary(); - private static readonly CoreConfiguration coreConfig = IniConfig.GetIniSection(); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); /// Initialize the destinations static DestinationHelper() { @@ -47,15 +47,15 @@ namespace Greenshot.Helpers { try { destination = (IDestination)Activator.CreateInstance(destinationType); } catch (Exception e) { - LOG.ErrorFormat("Can't create instance of {0}", destinationType); - LOG.Error(e); + Log.ErrorFormat("Can't create instance of {0}", destinationType); + Log.Error(e); continue; } - if (destination.isActive) { - LOG.DebugFormat("Found destination {0} with designation {1}", destinationType.Name, destination.Designation); + if (destination.IsActive) { + Log.DebugFormat("Found destination {0} with designation {1}", destinationType.Name, destination.Designation); RegisterDestination(destination); } else { - LOG.DebugFormat("Ignoring destination {0} with designation {1}", destinationType.Name, destination.Designation); + Log.DebugFormat("Ignoring destination {0} with designation {1}", destinationType.Name, destination.Designation); } } } @@ -66,7 +66,7 @@ namespace Greenshot.Helpers { /// /// public static void RegisterDestination(IDestination destination) { - if (coreConfig.ExcludeDestinations == null || !coreConfig.ExcludeDestinations.Contains(destination.Designation)) { + if (CoreConfig.ExcludeDestinations == null || !CoreConfig.ExcludeDestinations.Contains(destination.Designation)) { // don't test the key, an exception should happen wenn it's not unique RegisteredDestinations.Add(destination.Designation, destination); } @@ -82,13 +82,13 @@ namespace Greenshot.Helpers { IGreenshotPlugin plugin = PluginHelper.Instance.Plugins[pluginAttribute]; try { foreach (IDestination destination in plugin.Destinations()) { - if (coreConfig.ExcludeDestinations == null || !coreConfig.ExcludeDestinations.Contains(destination.Designation)) { + if (CoreConfig.ExcludeDestinations == null || !CoreConfig.ExcludeDestinations.Contains(destination.Designation)) { destinations.Add(destination); } } } catch (Exception ex) { - LOG.ErrorFormat("Couldn't get destinations from the plugin {0}", pluginAttribute.Name); - LOG.Error(ex); + Log.ErrorFormat("Couldn't get destinations from the plugin {0}", pluginAttribute.Name); + Log.Error(ex); } } destinations.Sort(); @@ -136,7 +136,7 @@ namespace Greenshot.Helpers { /// public static ExportInformation ExportCapture(bool manuallyInitiated, string designation, ISurface surface, ICaptureDetails captureDetails) { IDestination destination = GetDestination(designation); - if (destination != null && destination.isActive) { + if (destination != null && destination.IsActive) { return destination.ExportCapture(manuallyInitiated, surface, captureDetails); } return null; diff --git a/Greenshot/Helpers/EnvironmentInfo.cs b/Greenshot/Helpers/EnvironmentInfo.cs index f772444a8..70ce20a8c 100644 --- a/Greenshot/Helpers/EnvironmentInfo.cs +++ b/Greenshot/Helpers/EnvironmentInfo.cs @@ -62,7 +62,7 @@ namespace Greenshot.Helpers if (IniConfig.IsPortable) { environment.Append(" Portable"); } - environment.Append(" (" + OSInfo.Bits + " bit)"); + environment.Append(" (" + OsInfo.Bits + " bit)"); if (newline) { @@ -98,7 +98,7 @@ namespace Greenshot.Helpers { environment.Append(", "); } - environment.Append(string.Format("OS: {0} {1} {2} (x{3}) {4}", OSInfo.Name, OSInfo.Edition, OSInfo.ServicePack, OSInfo.Bits, OSInfo.VersionString)); + environment.Append(string.Format("OS: {0} {1} {2} (x{3}) {4}", OsInfo.Name, OsInfo.Edition, OsInfo.ServicePack, OsInfo.Bits, OsInfo.VersionString)); if (newline) { environment.AppendLine(); @@ -152,9 +152,9 @@ namespace Greenshot.Helpers StringBuilder report = new StringBuilder(); - report.AppendLine("Exception: " + ex.GetType().ToString()); + report.AppendLine("Exception: " + ex.GetType()); report.AppendLine("Message: " + ex.Message); - if (ex.Data != null && ex.Data.Count > 0) + if (ex.Data.Count > 0) { report.AppendLine(); report.AppendLine("Additional Information:"); @@ -207,7 +207,7 @@ namespace Greenshot.Helpers /// Provides detailed information about the host operating system. /// Code is available at: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ ///
      - public static class OSInfo + public static class OsInfo { #region BITS /// @@ -261,16 +261,7 @@ namespace Greenshot.Helpers } else if (productType == VER_NT_SERVER) { - if ((suiteMask & VER_SUITE_ENTERPRISE) != 0) - { - // Windows NT 4.0 Server Enterprise - edition = "Enterprise Server"; - } - else - { - // Windows NT 4.0 Server - edition = "Standard Server"; - } + edition = (suiteMask & VER_SUITE_ENTERPRISE) != 0 ? "Enterprise Server" : "Standard Server"; } } #endregion VERSION 4 @@ -470,7 +461,7 @@ namespace Greenshot.Helpers #endregion EDITION #region NAME - private static string s_Name; + private static string _name; /// /// Gets the name of the operating system running on this computer. /// @@ -478,16 +469,18 @@ namespace Greenshot.Helpers { get { - if (s_Name != null) + if (_name != null) { - return s_Name; //***** RETURN *****// + return _name; //***** RETURN *****// } string name = "unknown"; OperatingSystem osVersion = Environment.OSVersion; - OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX(); - osVersionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)); + OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX + { + dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)) + }; if (GetVersionEx(ref osVersionInfo)) { @@ -514,14 +507,7 @@ namespace Greenshot.Helpers } break; case 10: - if (csdVersion == "A") - { - name = "Windows 98 Second Edition"; - } - else - { - name = "Windows 98"; - } + name = csdVersion == "A" ? "Windows 98 Second Edition" : "Windows 98"; break; case 90: name = "Windows Me"; @@ -629,7 +615,7 @@ namespace Greenshot.Helpers } } - s_Name = name; + _name = name; return name; } } @@ -735,9 +721,11 @@ namespace Greenshot.Helpers get { string servicePack = string.Empty; - OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX(); + OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX + { + dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)) + }; - osVersionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)); if (GetVersionEx(ref osVersionInfo)) { @@ -754,13 +742,8 @@ namespace Greenshot.Helpers /// /// Gets the build version number of the operating system running on this computer. /// - public static int BuildVersion - { - get - { - return Environment.OSVersion.Version.Build; - } - } + public static int BuildVersion => Environment.OSVersion.Version.Build; + #endregion BUILD #region FULL diff --git a/Greenshot/Helpers/GeometryHelper.cs b/Greenshot/Helpers/GeometryHelper.cs index 3818e7efd..56b6a5381 100644 --- a/Greenshot/Helpers/GeometryHelper.cs +++ b/Greenshot/Helpers/GeometryHelper.cs @@ -34,8 +34,6 @@ namespace Greenshot.Helpers { /// The point on the y-axis of the second point /// public static int Distance2D(int x1, int y1, int x2, int y2) { - //Our end result - int result = 0; //Take x2-x1, then square it double part1 = Math.Pow(x2 - x1, 2); //Take y2-y1, then square it @@ -43,9 +41,7 @@ namespace Greenshot.Helpers { //Add both of the parts together double underRadical = part1 + part2; //Get the square root of the parts - result = (int)Math.Sqrt(underRadical); - //Return our result - return result; + return (int)Math.Sqrt(underRadical); } /// diff --git a/Greenshot/Helpers/IECaptureHelper.cs b/Greenshot/Helpers/IECaptureHelper.cs index 6780190b2..b7440825b 100644 --- a/Greenshot/Helpers/IECaptureHelper.cs +++ b/Greenshot/Helpers/IECaptureHelper.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; +using System.Linq; using System.Runtime.InteropServices; using Greenshot.Configuration; using Greenshot.Helpers.IEInterop; @@ -41,18 +42,18 @@ namespace Greenshot.Helpers { /// On top I modified it to use the already available code in Greenshot. /// Many thanks to all the people who contributed here! /// - public static class IECaptureHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(IECaptureHelper)); - private static readonly CoreConfiguration configuration = IniConfig.GetIniSection(); + public static class IeCaptureHelper { + private static readonly ILog Log = LogManager.GetLogger(typeof(IeCaptureHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); // Helper method to activate a certain IE Tab - public static void ActivateIETab(WindowDetails ieWindowDetails, int tabIndex) { - WindowDetails directUIWindowDetails = IEHelper.GetDirectUI(ieWindowDetails); - if(directUIWindowDetails != null) { + public static void ActivateIeTab(WindowDetails ieWindowDetails, int tabIndex) { + WindowDetails directUiWindowDetails = IEHelper.GetDirectUI(ieWindowDetails); + if(directUiWindowDetails != null) { // Bring window to the front ieWindowDetails.Restore(); // Get accessible - Accessible ieAccessible = new Accessible(directUIWindowDetails.Handle); + Accessible ieAccessible = new Accessible(directUiWindowDetails.Handle); // Activate Tab ieAccessible.ActivateIETab(tabIndex); } @@ -64,13 +65,13 @@ namespace Greenshot.Helpers { /// WindowDetails to check /// min percentage /// - public static bool IsMostlyIEWindow(WindowDetails someWindow, int minimumPercentage) { + public static bool IsMostlyIeWindow(WindowDetails someWindow, int minimumPercentage) { WindowDetails ieWindow = someWindow.GetChild("Internet Explorer_Server"); if (ieWindow != null) { Rectangle wholeClient = someWindow.ClientRectangle; Rectangle partClient = ieWindow.ClientRectangle; - int percentage = (int)(100*(float)(partClient.Width * partClient.Height) / (float)(wholeClient.Width * wholeClient.Height)); - LOG.InfoFormat("Window {0}, ie part {1}, percentage {2}", wholeClient, partClient, percentage); + int percentage = (int)(100*(float)(partClient.Width * partClient.Height) / (wholeClient.Width * wholeClient.Height)); + Log.InfoFormat("Window {0}, ie part {1}, percentage {2}", wholeClient, partClient, percentage); if (percentage > minimumPercentage) { return true; } @@ -83,11 +84,11 @@ namespace Greenshot.Helpers { /// /// /// - public static bool IsIEWindow(WindowDetails someWindow) { + public static bool IsIeWindow(WindowDetails someWindow) { if ("IEFrame".Equals(someWindow.ClassName)) { return true; } - if (configuration.WindowClassesToCheckForIE != null && configuration.WindowClassesToCheckForIE.Contains(someWindow.ClassName)) { + if (CoreConfig.WindowClassesToCheckForIE != null && CoreConfig.WindowClassesToCheckForIE.Contains(someWindow.ClassName)) { return someWindow.GetChild("Internet Explorer_Server") != null; } return false; @@ -97,16 +98,16 @@ namespace Greenshot.Helpers { /// Get Windows displaying an IE /// /// IEnumerable WindowDetails - public static IEnumerable GetIEWindows() { - foreach (WindowDetails possibleIEWindow in WindowDetails.GetAllWindows()) { - if (possibleIEWindow.Text.Length == 0) { + public static IEnumerable GetIeWindows() { + foreach (var possibleIeWindow in WindowDetails.GetAllWindows()) { + if (possibleIeWindow.Text.Length == 0) { continue; } - if (possibleIEWindow.ClientRectangle.IsEmpty) { + if (possibleIeWindow.ClientRectangle.IsEmpty) { continue; } - if (IsIEWindow(possibleIEWindow)) { - yield return possibleIEWindow; + if (IsIeWindow(possibleIeWindow)) { + yield return possibleIeWindow; } } } @@ -115,11 +116,9 @@ namespace Greenshot.Helpers { /// Simple check if IE is running /// /// bool - public static bool IsIERunning() { - foreach (WindowDetails ieWindow in GetIEWindows()) { - return true; - } - return false; + public static bool IsIeRunning() + { + return GetIeWindows().Any(); } /// @@ -127,44 +126,46 @@ namespace Greenshot.Helpers { /// /// List with KeyValuePair of WindowDetails and string public static List> GetBrowserTabs() { - List ieHandleList = new List(); - Dictionary> browserWindows = new Dictionary>(); + var ieHandleList = new List(); + var browserWindows = new Dictionary>(); // Find the IE windows - foreach (WindowDetails ieWindow in GetIEWindows()) { + foreach (var ieWindow in GetIeWindows()) { try { - if (!ieHandleList.Contains(ieWindow.Handle)) { - if ("IEFrame".Equals(ieWindow.ClassName)) { - WindowDetails directUIWD = IEHelper.GetDirectUI(ieWindow); - if (directUIWD != null) { - Accessible accessible = new Accessible(directUIWD.Handle); - browserWindows.Add(ieWindow, accessible.IETabCaptions); - } - } else if (configuration.WindowClassesToCheckForIE != null && configuration.WindowClassesToCheckForIE.Contains(ieWindow.ClassName)) { - List singleWindowText = new List(); - try { - IHTMLDocument2 document2 = GetHtmlDocument(ieWindow); - string title = document2.title; - Marshal.ReleaseComObject(document2); - if (string.IsNullOrEmpty(title)) { - singleWindowText.Add(ieWindow.Text); - } else { - singleWindowText.Add(ieWindow.Text + " - " + title); - } - } catch { - singleWindowText.Add(ieWindow.Text); - } - browserWindows.Add(ieWindow, singleWindowText); - } - ieHandleList.Add(ieWindow.Handle); + if (ieHandleList.Contains(ieWindow.Handle)) + { + continue; } + if ("IEFrame".Equals(ieWindow.ClassName)) { + var directUiwd = IEHelper.GetDirectUI(ieWindow); + if (directUiwd != null) { + var accessible = new Accessible(directUiwd.Handle); + browserWindows.Add(ieWindow, accessible.IETabCaptions); + } + } else if (CoreConfig.WindowClassesToCheckForIE != null && CoreConfig.WindowClassesToCheckForIE.Contains(ieWindow.ClassName)) { + var singleWindowText = new List(); + try { + var document2 = GetHtmlDocument(ieWindow); + string title = document2.title; + Marshal.ReleaseComObject(document2); + if (string.IsNullOrEmpty(title)) { + singleWindowText.Add(ieWindow.Text); + } else { + singleWindowText.Add(ieWindow.Text + " - " + title); + } + } catch { + singleWindowText.Add(ieWindow.Text); + } + browserWindows.Add(ieWindow, singleWindowText); + } + ieHandleList.Add(ieWindow.Handle); } catch (Exception) { - LOG.Warn("Can't get Info from " + ieWindow.ClassName); + Log.Warn("Can't get Info from " + ieWindow.ClassName); } } - List> returnList = new List>(); - foreach(WindowDetails windowDetails in browserWindows.Keys) { + var returnList = new List>(); + foreach(var windowDetails in browserWindows.Keys) { foreach(string tab in browserWindows[windowDetails]) { returnList.Add(new KeyValuePair(windowDetails, tab)); } @@ -178,35 +179,30 @@ namespace Greenshot.Helpers { /// /// private static IHTMLDocument2 GetHtmlDocument(WindowDetails mainWindow) { - WindowDetails ieServer; - if ("Internet Explorer_Server".Equals(mainWindow.ClassName)) { - ieServer = mainWindow; - } else { - ieServer = mainWindow.GetChild("Internet Explorer_Server"); - } + var ieServer = "Internet Explorer_Server".Equals(mainWindow.ClassName) ? mainWindow : mainWindow.GetChild("Internet Explorer_Server"); if (ieServer == null) { - LOG.WarnFormat("No Internet Explorer_Server for {0}", mainWindow.Text); + Log.WarnFormat("No Internet Explorer_Server for {0}", mainWindow.Text); return null; } - IHTMLDocument2 document2 = null; uint windowMessage = User32.RegisterWindowMessage("WM_HTML_GETOBJECT"); if (windowMessage == 0) { - LOG.WarnFormat("Couldn't register WM_HTML_GETOBJECT"); + Log.WarnFormat("Couldn't register WM_HTML_GETOBJECT"); return null; } - LOG.DebugFormat("Trying WM_HTML_GETOBJECT on {0}", ieServer.ClassName); + Log.DebugFormat("Trying WM_HTML_GETOBJECT on {0}", ieServer.ClassName); UIntPtr response; User32.SendMessageTimeout(ieServer.Handle, windowMessage, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_NORMAL, 5000, out response); + IHTMLDocument2 document2; if (response != UIntPtr.Zero) { document2 = (IHTMLDocument2)Accessible.ObjectFromLresult(response, typeof(IHTMLDocument).GUID, IntPtr.Zero); if (document2 == null) { - LOG.Error("No IHTMLDocument2 found"); + Log.Error("No IHTMLDocument2 found"); return null; } } else { - LOG.Error("No answer on WM_HTML_GETOBJECT."); + Log.Error("No answer on WM_HTML_GETOBJECT."); return null; } return document2; @@ -227,23 +223,23 @@ namespace Greenshot.Helpers { IHTMLDocument2 alternativeReturnDocument2 = null; // Find the IE windows - foreach (WindowDetails ieWindow in GetIEWindows()) { - LOG.DebugFormat("Processing {0} - {1}", ieWindow.ClassName, ieWindow.Text); + foreach (WindowDetails ieWindow in GetIeWindows()) { + Log.DebugFormat("Processing {0} - {1}", ieWindow.ClassName, ieWindow.Text); Accessible ieAccessible = null; - WindowDetails directUIWD = IEHelper.GetDirectUI(ieWindow); - if (directUIWD != null) { - ieAccessible = new Accessible(directUIWD.Handle); + WindowDetails directUiwd = IEHelper.GetDirectUI(ieWindow); + if (directUiwd != null) { + ieAccessible = new Accessible(directUiwd.Handle); } if (ieAccessible == null) { if (browserWindow != null) { - LOG.InfoFormat("Active Window is {0}", browserWindow.Text); + Log.InfoFormat("Active Window is {0}", browserWindow.Text); } if (!ieWindow.Equals(browserWindow)) { - LOG.WarnFormat("No ieAccessible for {0}", ieWindow.Text); + Log.WarnFormat("No ieAccessible for {0}", ieWindow.Text); continue; } - LOG.DebugFormat("No ieAccessible, but the active window is an IE window: {0}, ", ieWindow.Text); + Log.DebugFormat("No ieAccessible, but the active window is an IE window: {0}, ", ieWindow.Text); } try { @@ -256,9 +252,7 @@ namespace Greenshot.Helpers { // Get the content window handle for the shellWindow.Document IOleWindow oleWindow = (IOleWindow)document2; IntPtr contentWindowHandle = IntPtr.Zero; - if (oleWindow != null) { - oleWindow.GetWindow(out contentWindowHandle); - } + oleWindow?.GetWindow(out contentWindowHandle); if (contentWindowHandle != IntPtr.Zero) { // Get the HTMLDocument to check the hasFocus @@ -266,7 +260,7 @@ namespace Greenshot.Helpers { IHTMLDocument4 document4 = (IHTMLDocument4)document2; if (document4.hasFocus()) { - LOG.DebugFormat("Matched focused document: {0}", document2.title); + Log.DebugFormat("Matched focused document: {0}", document2.title); // Look no further, we got what we wanted! returnDocument2 = document2; returnWindow = new WindowDetails(contentWindowHandle); @@ -279,7 +273,7 @@ namespace Greenshot.Helpers { break; } if (ieAccessible != null && returnWindow == null && document2.title.Equals(ieAccessible.IEActiveTabCaption) ) { - LOG.DebugFormat("Title: {0}", document2.title); + Log.DebugFormat("Title: {0}", document2.title); returnDocument2 = document2; returnWindow = new WindowDetails(contentWindowHandle); } else { @@ -292,8 +286,8 @@ namespace Greenshot.Helpers { } } } catch (Exception e) { - LOG.ErrorFormat("Major problem: Problem retrieving Document from {0}", ieWindow.Text); - LOG.Error(e); + Log.ErrorFormat("Major problem: Problem retrieving Document from {0}", ieWindow.Text); + Log.Error(e); } } @@ -307,8 +301,8 @@ namespace Greenshot.Helpers { try { returnDocumentContainer = new DocumentContainer(returnDocument2, returnWindow); } catch (Exception e) { - LOG.Error("Major problem: Problem retrieving Document."); - LOG.Error(e); + Log.Error("Major problem: Problem retrieving Document."); + Log.Error(e); } } @@ -320,8 +314,8 @@ namespace Greenshot.Helpers { try { returnDocumentContainer = new DocumentContainer(alternativeReturnDocument2, alternativeReturnWindow); } catch (Exception e) { - LOG.Error("Major problem: Problem retrieving Document."); - LOG.Error(e); + Log.Error("Major problem: Problem retrieving Document."); + Log.Error(e); } } return returnDocumentContainer; @@ -332,8 +326,8 @@ namespace Greenshot.Helpers { /// /// ICapture where the capture needs to be stored /// ICapture with the content (if any) - public static ICapture CaptureIE(ICapture capture) { - return CaptureIE(capture, WindowDetails.GetActiveWindow()); + public static ICapture CaptureIe(ICapture capture) { + return CaptureIe(capture, WindowDetails.GetActiveWindow()); } /// /// Here the logic for capturing the IE Content is located @@ -341,7 +335,7 @@ namespace Greenshot.Helpers { /// ICapture where the capture needs to be stored /// window to use /// ICapture with the content (if any) - public static ICapture CaptureIE(ICapture capture, WindowDetails windowToCapture) { + public static ICapture CaptureIe(ICapture capture, WindowDetails windowToCapture) { if (windowToCapture == null) { windowToCapture = WindowDetails.GetActiveWindow(); } @@ -355,15 +349,15 @@ namespace Greenshot.Helpers { // Nothing found if (documentContainer == null) { - LOG.Debug("Nothing to capture found"); + Log.Debug("Nothing to capture found"); return null; } try { - LOG.DebugFormat("Window class {0}", documentContainer.ContentWindow.ClassName); - LOG.DebugFormat("Window location {0}", documentContainer.ContentWindow.Location); + Log.DebugFormat("Window class {0}", documentContainer.ContentWindow.ClassName); + Log.DebugFormat("Window location {0}", documentContainer.ContentWindow.Location); } catch (Exception ex) { - LOG.Warn("Error while logging information.", ex); + Log.Warn("Error while logging information.", ex); } // bitmap to return @@ -372,12 +366,12 @@ namespace Greenshot.Helpers { Size pageSize = PrepareCapture(documentContainer, capture); returnBitmap = CapturePage(documentContainer, pageSize); } catch (Exception captureException) { - LOG.Error("Exception found, ignoring and returning nothing! Error was: ", captureException); + Log.Error("Exception found, ignoring and returning nothing! Error was: ", captureException); } // TODO: Enable when the elements are usable again. // Capture the element on the page //try { - // if (configuration.IEFieldCapture && capture.CaptureDetails.HasDestination("Editor")) { + // if (CoreConfig.IEFieldCapture && capture.CaptureDetails.HasDestination("Editor")) { // // clear the current elements, as they are for the window itself // capture.Elements.Clear(); // CaptureElement documentCaptureElement = documentContainer.CreateCaptureElements(pageSize); @@ -414,13 +408,9 @@ namespace Greenshot.Helpers { // The URL is available unter "document2.url" and can be used to enhance the meta-data etc. capture.CaptureDetails.AddMetaData("url", documentContainer.Url); // Store the title of the page - if (documentContainer.Name != null) { - capture.CaptureDetails.Title = documentContainer.Name; - } else { - capture.CaptureDetails.Title = windowToCapture.Text; - } + capture.CaptureDetails.Title = documentContainer.Name ?? windowToCapture.Text; } catch (Exception ex) { - LOG.Warn("Problems getting some attributes...", ex); + Log.Warn("Problems getting some attributes...", ex); } // Store the URL of the page @@ -446,7 +436,7 @@ namespace Greenshot.Helpers { } capture.CaptureDetails.AddMetaData("URL_PORT", uri.Port.ToString()); } catch(Exception e) { - LOG.Warn("Exception when trying to use url in metadata "+documentContainer.Url,e); + Log.Warn("Exception when trying to use url in metadata "+documentContainer.Url,e); } } try { @@ -454,7 +444,7 @@ namespace Greenshot.Helpers { capture.MoveMouseLocation(-documentContainer.ViewportRectangle.X, -documentContainer.ViewportRectangle.Y); // Used to be: capture.MoveMouseLocation(-(capture.Location.X + documentContainer.CaptureOffset.X), -(capture.Location.Y + documentContainer.CaptureOffset.Y)); } catch (Exception ex) { - LOG.Warn("Error while correcting the mouse offset.", ex); + Log.Warn("Error while correcting the mouse offset.", ex); } } finally { // Always close the background form @@ -480,7 +470,7 @@ namespace Greenshot.Helpers { movedFrame = false; foreach(DocumentContainer currentFrame in documentContainer.Frames) { foreach(DocumentContainer otherFrame in documentContainer.Frames) { - if (otherFrame.ID == currentFrame.ID) { + if (otherFrame.Id == currentFrame.Id) { continue; } // check if we need to move @@ -494,16 +484,16 @@ namespace Greenshot.Helpers { if ((horizalResize || horizalMove) && leftOf) { // Current frame resized horizontally, so move other horizontally - LOG.DebugFormat("Moving Frame {0} horizontally to the right of {1}", otherFrame.Name, currentFrame.Name); + Log.DebugFormat("Moving Frame {0} horizontally to the right of {1}", otherFrame.Name, currentFrame.Name); otherFrame.DestinationLeft = currentFrame.DestinationRight; movedFrame = true; } else if ((verticalResize || verticalMove) && belowOf){ // Current frame resized vertically, so move other vertically - LOG.DebugFormat("Moving Frame {0} vertically to the bottom of {1}", otherFrame.Name, currentFrame.Name); + Log.DebugFormat("Moving Frame {0} vertically to the bottom of {1}", otherFrame.Name, currentFrame.Name); otherFrame.DestinationTop = currentFrame.DestinationBottom; movedFrame = true; } else { - LOG.DebugFormat("Frame {0} intersects with {1}", otherFrame.Name, currentFrame.Name); + Log.DebugFormat("Frame {0} intersects with {1}", otherFrame.Name, currentFrame.Name); } } } @@ -539,11 +529,11 @@ namespace Greenshot.Helpers { // Limit the size as the editor currently can't work with sizes > short.MaxValue if (pageWidth > short.MaxValue) { - LOG.WarnFormat("Capture has a width of {0} which bigger than the maximum supported {1}, cutting width to the maxium.", pageWidth, short.MaxValue); + Log.WarnFormat("Capture has a width of {0} which bigger than the maximum supported {1}, cutting width to the maxium.", pageWidth, short.MaxValue); pageWidth = Math.Min(pageWidth, short.MaxValue); } if (pageHeight > short.MaxValue) { - LOG.WarnFormat("Capture has a height of {0} which bigger than the maximum supported {1}, cutting height to the maxium", pageHeight, short.MaxValue); + Log.WarnFormat("Capture has a height of {0} which bigger than the maximum supported {1}, cutting height to the maxium", pageHeight, short.MaxValue); pageHeight = Math.Min(pageHeight, short.MaxValue); } return new Size(pageWidth, pageHeight); @@ -563,7 +553,7 @@ namespace Greenshot.Helpers { using (Graphics graphicsTarget = Graphics.FromImage(returnBitmap)) { // Clear the target with the backgroundcolor Color clearColor = documentContainer.BackgroundColor; - LOG.DebugFormat("Clear color: {0}", clearColor); + Log.DebugFormat("Clear color: {0}", clearColor); graphicsTarget.Clear(clearColor); // Get the base document & draw it @@ -597,7 +587,7 @@ namespace Greenshot.Helpers { int pageWidth = documentContainer.ScrollWidth; int pageHeight = documentContainer.ScrollHeight; if (pageWidth * pageHeight == 0) { - LOG.WarnFormat("Empty page for DocumentContainer {0}: {1}", documentContainer.Name, documentContainer.Url); + Log.WarnFormat("Empty page for DocumentContainer {0}: {1}", documentContainer.Name, documentContainer.Url); return; } @@ -605,7 +595,7 @@ namespace Greenshot.Helpers { int viewportWidth = documentContainer.ClientWidth; int viewportHeight = documentContainer.ClientHeight; if (viewportWidth * viewportHeight == 0) { - LOG.WarnFormat("Empty viewport for DocumentContainer {0}: {1}", documentContainer.Name, documentContainer.Url); + Log.WarnFormat("Empty viewport for DocumentContainer {0}: {1}", documentContainer.Name, documentContainer.Url); return; } @@ -613,7 +603,7 @@ namespace Greenshot.Helpers { int startLeft = documentContainer.ScrollLeft; int startTop = documentContainer.ScrollTop; - LOG.DebugFormat("Capturing {4} with total size {0},{1} displayed with size {2},{3}", pageWidth, pageHeight, viewportWidth, viewportHeight, documentContainer.Name); + Log.DebugFormat("Capturing {4} with total size {0},{1} displayed with size {2},{3}", pageWidth, pageHeight, viewportWidth, viewportHeight, documentContainer.Name); // Variable used for looping horizontally int horizontalPage = 0; @@ -640,34 +630,34 @@ namespace Greenshot.Helpers { Rectangle clientRectangle = new Rectangle(documentContainer.SourceLocation, viewPortSize); Image fragment = contentWindowDetails.PrintWindow(); if (fragment != null) { - LOG.DebugFormat("Captured fragment size: {0}x{1}", fragment.Width, fragment.Height); + Log.DebugFormat("Captured fragment size: {0}x{1}", fragment.Width, fragment.Height); try { // cut all junk, due to IE "border" we need to remove some parts Rectangle viewportRect = documentContainer.ViewportRectangle; if (!viewportRect.IsEmpty) { - LOG.DebugFormat("Cropping to viewport: {0}", viewportRect); + Log.DebugFormat("Cropping to viewport: {0}", viewportRect); ImageHelper.Crop(ref fragment, ref viewportRect); } - LOG.DebugFormat("Cropping to clientRectangle: {0}", clientRectangle); + Log.DebugFormat("Cropping to clientRectangle: {0}", clientRectangle); // Crop to clientRectangle if (ImageHelper.Crop(ref fragment, ref clientRectangle)) { Point targetLocation = new Point(documentContainer.DestinationLocation.X, documentContainer.DestinationLocation.Y); - LOG.DebugFormat("Fragment targetLocation is {0}", targetLocation); + Log.DebugFormat("Fragment targetLocation is {0}", targetLocation); targetLocation.Offset(targetOffset); - LOG.DebugFormat("After offsetting the fragment targetLocation is {0}", targetLocation); - LOG.DebugFormat("Drawing fragment of size {0} to {1}", fragment.Size, targetLocation); + Log.DebugFormat("After offsetting the fragment targetLocation is {0}", targetLocation); + Log.DebugFormat("Drawing fragment of size {0} to {1}", fragment.Size, targetLocation); graphicsTarget.DrawImage(fragment, targetLocation); graphicsTarget.Flush(); } else { // somehow we are capturing nothing!? - LOG.WarnFormat("Crop of {0} failed?", documentContainer.Name); + Log.WarnFormat("Crop of {0} failed?", documentContainer.Name); break; } } finally { fragment.Dispose(); } } else { - LOG.WarnFormat("Capture of {0} failed!", documentContainer.Name); + Log.WarnFormat("Capture of {0} failed!", documentContainer.Name); } verticalPage++; } diff --git a/Greenshot/Helpers/IEInterop/IEContainer.cs b/Greenshot/Helpers/IEInterop/IEContainer.cs index de77597a0..f0c3de49f 100644 --- a/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -36,15 +36,12 @@ namespace Greenshot.Helpers.IEInterop { private static readonly Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); private static readonly Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"); private static int _counter; - private readonly int _id = _counter++; private IHTMLDocument2 _document2; private IHTMLDocument3 _document3; private Point _sourceLocation; private Point _destinationLocation; private Point _startLocation = Point.Empty; private Rectangle _viewportRectangle = Rectangle.Empty; - private string _name; - private string _url; private bool _isDtd; private DocumentContainer _parent; private WindowDetails _contentWindow; @@ -58,7 +55,7 @@ namespace Greenshot.Helpers.IEInterop { IHTMLDocument2 document2 = GetDocumentFromWindow(frameWindow); try { LOG.DebugFormat("frameWindow.name {0}", frameWindow.name); - _name = frameWindow.name; + Name = frameWindow.name; } catch { // Ignore } @@ -91,7 +88,7 @@ namespace Greenshot.Helpers.IEInterop { public DocumentContainer(IHTMLDocument2 document2, WindowDetails contentWindow) { Init(document2, contentWindow); - LOG.DebugFormat("Creating DocumentContainer for Document {0} found in window with rectangle {1}", _name, SourceRectangle); + LOG.DebugFormat("Creating DocumentContainer for Document {0} found in window with rectangle {1}", Name, SourceRectangle); } /// @@ -119,7 +116,7 @@ namespace Greenshot.Helpers.IEInterop { //compatibility mode affects how height is computed _isDtd = false; try { - if (_document3 != null && (_document3.documentElement != null) && !document5.compatMode.Equals("BackCompat")) { + if (_document3?.documentElement != null && !document5.compatMode.Equals("BackCompat")) { _isDtd = true; } } catch (Exception ex) { @@ -176,15 +173,15 @@ namespace Greenshot.Helpers.IEInterop { try { LOG.DebugFormat("Calculated location {0} for {1}", _startLocation, document2.title); - if (_name == null) { - _name = document2.title; + if (Name == null) { + Name = document2.title; } } catch (Exception e) { LOG.Warn("Problem while trying to get document title!", e); } try { - _url = document2.url; + Url = document2.url; } catch (Exception e) { LOG.Warn("Problem while trying to get document url!", e); } @@ -202,7 +199,7 @@ namespace Greenshot.Helpers.IEInterop { DocumentContainer frameData = new DocumentContainer(frameWindow, contentWindow, this); // check if frame is hidden if (!frameData.IsHidden) { - LOG.DebugFormat("Creating DocumentContainer for Frame {0} found in window with rectangle {1}", frameData._name, frameData.SourceRectangle); + LOG.DebugFormat("Creating DocumentContainer for Frame {0} found in window with rectangle {1}", frameData.Name, frameData.SourceRectangle); _frames.Add(frameData); } else { LOG.DebugFormat("Skipping frame {0}", frameData.Name); @@ -341,18 +338,10 @@ namespace Greenshot.Helpers.IEInterop { } } - public Rectangle ViewportRectangle { - get { - return _viewportRectangle; - } - } + public Rectangle ViewportRectangle => _viewportRectangle; + + public WindowDetails ContentWindow => _contentWindow; - public WindowDetails ContentWindow { - get { - return _contentWindow; - } - } - public DocumentContainer Parent { get { return _parent; @@ -391,12 +380,7 @@ namespace Greenshot.Helpers.IEInterop { /// Attribute to set /// Value to set public void SetAttribute(string attribute, string value) { - IHTMLElement element = null; - if (!_isDtd) { - element = _document2.body; - } else { - element = _document3.documentElement; - } + var element = !_isDtd ? _document2.body : _document3.documentElement; element.setAttribute(attribute, value, 1); // Release IHTMLElement com object releaseCom(element); @@ -408,12 +392,7 @@ namespace Greenshot.Helpers.IEInterop { /// Attribute to get /// object with the attribute value public object GetAttribute(string attribute) { - IHTMLElement element; - if (!_isDtd) { - element = _document2.body; - } else { - element = _document3.documentElement; - } + var element = !_isDtd ? _document2.body : _document3.documentElement; var retVal = element.getAttribute(attribute, 1); // Release IHTMLElement com object releaseCom(element); @@ -428,53 +407,21 @@ namespace Greenshot.Helpers.IEInterop { return retVal; } - public int ID { - get { - return _id; - } - } + public int Id { get; } = _counter++; - public string Name { - get { - return _name; - } - } + public string Name { get; private set; } - public string Url { - get { - return _url; - } - } + public string Url { get; private set; } - public bool IsHidden { - get { - return ClientWidth == 0 || ClientHeight == 0; - } - } + public bool IsHidden => ClientWidth == 0 || ClientHeight == 0; - public int ClientWidth { - get { - return ScaleX(GetAttributeAsInt("clientWidth")); - } - } + public int ClientWidth => ScaleX(GetAttributeAsInt("clientWidth")); - public int ClientHeight { - get { - return ScaleY(GetAttributeAsInt("clientHeight")); - } - } + public int ClientHeight => ScaleY(GetAttributeAsInt("clientHeight")); - public int ScrollWidth { - get { - return ScaleX(GetAttributeAsInt("scrollWidth")); - } - } + public int ScrollWidth => ScaleX(GetAttributeAsInt("scrollWidth")); - public int ScrollHeight { - get { - return ScaleY(GetAttributeAsInt("scrollHeight")); - } - } + public int ScrollHeight => ScaleY(GetAttributeAsInt("scrollHeight")); public Point SourceLocation { get { @@ -485,41 +432,17 @@ namespace Greenshot.Helpers.IEInterop { } } - public Size SourceSize { - get { - return new Size(ClientWidth, ClientHeight); - } - } + public Size SourceSize => new Size(ClientWidth, ClientHeight); - public Rectangle SourceRectangle { - get { - return new Rectangle(SourceLocation, SourceSize); - } - } + public Rectangle SourceRectangle => new Rectangle(SourceLocation, SourceSize); - public int SourceLeft { - get { - return _sourceLocation.X; - } - } + public int SourceLeft => _sourceLocation.X; - public int SourceTop { - get { - return _sourceLocation.Y; - } - } + public int SourceTop => _sourceLocation.Y; - public int SourceRight { - get { - return _sourceLocation.X + ClientWidth; - } - } + public int SourceRight => _sourceLocation.X + ClientWidth; - public int SourceBottom { - get { - return _sourceLocation.Y + ClientHeight; - } - } + public int SourceBottom => _sourceLocation.Y + ClientHeight; public Point DestinationLocation { get { @@ -531,17 +454,9 @@ namespace Greenshot.Helpers.IEInterop { } - public Size DestinationSize { - get { - return new Size(ScrollWidth, ScrollHeight); - } - } - - public Rectangle DestinationRectangle { - get { - return new Rectangle(DestinationLocation, DestinationSize); - } - } + public Size DestinationSize => new Size(ScrollWidth, ScrollHeight); + + public Rectangle DestinationRectangle => new Rectangle(DestinationLocation, DestinationSize); public int DestinationLeft { get { @@ -561,17 +476,9 @@ namespace Greenshot.Helpers.IEInterop { } } - public int DestinationRight { - get { - return _destinationLocation.X + ScrollWidth; - } - } + public int DestinationRight => _destinationLocation.X + ScrollWidth; - public int DestinationBottom { - get { - return _destinationLocation.Y + ScrollHeight; - } - } + public int DestinationBottom => _destinationLocation.Y + ScrollHeight; public int ScrollLeft { get{ @@ -591,10 +498,6 @@ namespace Greenshot.Helpers.IEInterop { } } - public IList Frames { - get { - return _frames; - } - } + public IList Frames => _frames; } } diff --git a/Greenshot/Helpers/MailHelper.cs b/Greenshot/Helpers/MailHelper.cs index c2e5a190c..f2dfbbfd9 100644 --- a/Greenshot/Helpers/MailHelper.cs +++ b/Greenshot/Helpers/MailHelper.cs @@ -43,8 +43,8 @@ namespace Greenshot.Helpers { /// Represents an email message to be sent through MAPI. /// public class MapiMailMessage : IDisposable { - private static readonly ILog LOG = LogManager.GetLogger(typeof(MapiMailMessage)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(MapiMailMessage)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); /// /// Helper Method for creating an Email with Attachment @@ -54,14 +54,14 @@ namespace Greenshot.Helpers { public static void SendImage(string fullPath, string title) { using (MapiMailMessage message = new MapiMailMessage(title, null)) { message.Files.Add(fullPath); - if (!string.IsNullOrEmpty(conf.MailApiTo)) { - message._recipientCollection.Add(new Recipient(conf.MailApiTo, RecipientType.To)); + if (!string.IsNullOrEmpty(CoreConfig.MailApiTo)) { + message.Recipients.Add(new Recipient(CoreConfig.MailApiTo, RecipientType.To)); } - if (!string.IsNullOrEmpty(conf.MailApiCC)) { - message._recipientCollection.Add(new Recipient(conf.MailApiCC, RecipientType.CC)); + if (!string.IsNullOrEmpty(CoreConfig.MailApiCC)) { + message.Recipients.Add(new Recipient(CoreConfig.MailApiCC, RecipientType.CC)); } - if (!string.IsNullOrEmpty(conf.MailApiBCC)) { - message._recipientCollection.Add(new Recipient(conf.MailApiBCC, RecipientType.BCC)); + if (!string.IsNullOrEmpty(CoreConfig.MailApiBCC)) { + message.Recipients.Add(new Recipient(CoreConfig.MailApiBCC, RecipientType.BCC)); } message.ShowDialog(); } @@ -80,10 +80,10 @@ namespace Greenshot.Helpers { // Store the list of currently active windows, so we can make sure we show the email window later! var windowsBefore = WindowDetails.GetVisibleWindows(); //bool isEmailSend = false; - //if (EmailConfigHelper.HasOutlook() && (conf.OutputEMailFormat == EmailFormat.OUTLOOK_HTML || conf.OutputEMailFormat == EmailFormat.OUTLOOK_TXT)) { + //if (EmailConfigHelper.HasOutlook() && (CoreConfig.OutputEMailFormat == EmailFormat.OUTLOOK_HTML || CoreConfig.OutputEMailFormat == EmailFormat.OUTLOOK_TXT)) { // isEmailSend = OutlookExporter.ExportToOutlook(tmpFile, captureDetails); //} - if (/*!isEmailSend &&*/ EmailConfigHelper.HasMAPI()) { + if (/*!isEmailSend &&*/ EmailConfigHelper.HasMapi()) { // Fallback to MAPI // Send the email SendImage(tmpFile, captureDetails.Title); @@ -132,9 +132,6 @@ namespace Greenshot.Helpers { #region Member Variables - private string _subject; - private string _body; - private RecipientCollection _recipientCollection; private readonly ManualResetEvent _manualResetEvent; #endregion Member Variables @@ -146,7 +143,7 @@ namespace Greenshot.Helpers { /// public MapiMailMessage() { Files = new List(); - _recipientCollection = new RecipientCollection(); + Recipients = new RecipientCollection(); _manualResetEvent = new ManualResetEvent(false); } @@ -154,15 +151,15 @@ namespace Greenshot.Helpers { /// Creates a new mail message with the specified subject. /// public MapiMailMessage(string subject) : this() { - _subject = subject; + Subject = subject; } /// /// Creates a new mail message with the specified subject and body. /// public MapiMailMessage(string subject, string body) : this() { - _subject = subject; - _body = body; + Subject = subject; + Body = body; } #endregion Constructors @@ -172,35 +169,17 @@ namespace Greenshot.Helpers { /// /// Gets or sets the subject of this mail message. /// - public string Subject { - get { - return _subject; - } - set { - _subject = value; - } - } + public string Subject { get; set; } /// /// Gets or sets the body of this mail message. /// - public string Body { - get { - return _body; - } - set { - _body = value; - } - } + public string Body { get; set; } /// /// Gets the recipient list for this mail message. /// - public RecipientCollection Recipients { - get { - return _recipientCollection; - } - } + public RecipientCollection Recipients { get; private set; } /// /// Gets the file list for this mail message. @@ -216,11 +195,13 @@ namespace Greenshot.Helpers { /// public void ShowDialog() { // Create the mail message in an STA thread - Thread t = new Thread(_ShowMail); - t.IsBackground = true; - t.Name = "Create MAPI mail"; - t.SetApartmentState(ApartmentState.STA); - t.Start(); + var thread = new Thread(_ShowMail) + { + IsBackground = true, + Name = "Create MAPI mail" + }; + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); // only return when the new thread has built it's interop representation _manualResetEvent.WaitOne(); @@ -240,10 +221,7 @@ namespace Greenshot.Helpers { if (!disposing) { return; } - if (_manualResetEvent != null) { - _manualResetEvent.Close(); - } - + _manualResetEvent?.Close(); } /// @@ -252,12 +230,12 @@ namespace Greenshot.Helpers { private void _ShowMail() { var message = new MapiHelperInterop.MapiMessage(); - using (var interopRecipients = _recipientCollection.GetInteropRepresentation()) { - message.Subject = _subject; - message.NoteText = _body; + using (var interopRecipients = Recipients.GetInteropRepresentation()) { + message.Subject = Subject; + message.NoteText = Body; message.Recipients = interopRecipients.Handle; - message.RecipientCount = _recipientCollection.Count; + message.RecipientCount = Recipients.Count; // Check if we need to add attachments if (Files.Count > 0) { @@ -284,14 +262,14 @@ namespace Greenshot.Helpers { return; } string errorText = GetMapiError(errorCode); - LOG.Error("Error sending MAPI Email. Error: " + errorText + " (code = " + errorCode + ")."); + Log.Error("Error sending MAPI Email. Error: " + errorText + " (code = " + errorCode + ")."); MessageBox.Show(errorText, "Mail (MAPI) destination", MessageBoxButtons.OK, MessageBoxIcon.Error); // Recover from bad settings, show again if (errorCode != MAPI_CODES.INVALID_RECIPS) { return; } - _recipientCollection = new RecipientCollection(); + Recipients = new RecipientCollection(); _ShowMail(); } } @@ -340,8 +318,8 @@ namespace Greenshot.Helpers { position = -1 }; IntPtr runptr = ptra; - for (int i = 0; i < Files.Count; i++) { - string path = Files[i]; + foreach (string path in Files) + { mfd.name = Path.GetFileName(path); mfd.path = path; Marshal.StructureToPtr(mfd, runptr, false); @@ -664,11 +642,7 @@ namespace Greenshot.Helpers { /// /// Returns the recipient stored in this collection at the specified index. /// - public Recipient this[int index] { - get { - return (Recipient)List[index]; - } - } + public Recipient this[int index] => (Recipient)List[index]; internal InteropRecipientCollection GetInteropRepresentation() { return new InteropRecipientCollection(this); @@ -680,7 +654,6 @@ namespace Greenshot.Helpers { internal struct InteropRecipientCollection : IDisposable { #region Member Variables - private IntPtr _handle; private int _count; #endregion Member Variables @@ -695,16 +668,16 @@ namespace Greenshot.Helpers { _count = outer.Count; if (_count == 0) { - _handle = IntPtr.Zero; + Handle = IntPtr.Zero; return; } // allocate enough memory to hold all recipients int size = Marshal.SizeOf(typeof(MapiMailMessage.MapiHelperInterop.MapiRecipDesc)); - _handle = Marshal.AllocHGlobal(_count * size); + Handle = Marshal.AllocHGlobal(_count * size); // place all interop recipients into the memory just allocated - IntPtr ptr = _handle; + IntPtr ptr = Handle; foreach (Recipient native in outer) { MapiMailMessage.MapiHelperInterop.MapiRecipDesc interop = native.GetInteropRepresentation(); @@ -718,11 +691,7 @@ namespace Greenshot.Helpers { #region Public Properties - public IntPtr Handle { - get { - return _handle; - } - } + public IntPtr Handle { get; private set; } #endregion Public Properties @@ -732,21 +701,21 @@ namespace Greenshot.Helpers { /// Disposes of resources. /// public void Dispose() { - if (_handle != IntPtr.Zero) { + if (Handle != IntPtr.Zero) { Type type = typeof(MapiMailMessage.MapiHelperInterop.MapiRecipDesc); int size = Marshal.SizeOf(type); // destroy all the structures in the memory area - IntPtr ptr = _handle; + IntPtr ptr = Handle; for (int i = 0; i < _count; i++) { Marshal.DestroyStructure(ptr, type); ptr = new IntPtr(ptr.ToInt64() + size); } // free the memory - Marshal.FreeHGlobal(_handle); + Marshal.FreeHGlobal(Handle); - _handle = IntPtr.Zero; + Handle = IntPtr.Zero; _count = 0; } } diff --git a/Greenshot/Helpers/PluginHelper.cs b/Greenshot/Helpers/PluginHelper.cs index 0143aa50f..ed4adc649 100644 --- a/Greenshot/Helpers/PluginHelper.cs +++ b/Greenshot/Helpers/PluginHelper.cs @@ -35,42 +35,31 @@ namespace Greenshot.Helpers { /// [Serializable] public class PluginHelper : IGreenshotHost { - private static readonly ILog LOG = LogManager.GetLogger(typeof(PluginHelper)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(PluginHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); - private static readonly string pluginPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),Application.ProductName); - private static readonly string applicationPath = Path.GetDirectoryName(Application.ExecutablePath); - private static readonly string pafPath = Path.Combine(Application.StartupPath, @"App\Greenshot"); + private static readonly string PluginPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),Application.ProductName); + private static readonly string ApplicationPath = Path.GetDirectoryName(Application.ExecutablePath); + private static readonly string PafPath = Path.Combine(Application.StartupPath, @"App\Greenshot"); private static readonly IDictionary plugins = new SortedDictionary(); private static readonly PluginHelper instance = new PluginHelper(); - public static PluginHelper Instance { - get { - return instance; - } - } + + public static PluginHelper Instance => instance; private PluginHelper() { PluginUtils.Host = this; } - public Form GreenshotForm { - get { - return MainForm.Instance; - } - } + public Form GreenshotForm => MainForm.Instance; - public NotifyIcon NotifyIcon { - get { - return MainForm.Instance.NotifyIcon; - } - } + public NotifyIcon NotifyIcon => MainForm.Instance.NotifyIcon; public bool HasPlugins() { return plugins != null && plugins.Count > 0; } public void Shutdown() { - foreach(IGreenshotPlugin plugin in plugins.Values) { + foreach(var plugin in plugins.Values) { plugin.Shutdown(); plugin.Dispose(); } @@ -79,42 +68,49 @@ namespace Greenshot.Helpers { // Add plugins to the Listview public void FillListview(ListView listview) { - foreach(PluginAttribute pluginAttribute in plugins.Keys) { - ListViewItem item = new ListViewItem(pluginAttribute.Name); + foreach(var pluginAttribute in plugins.Keys) { + var item = new ListViewItem(pluginAttribute.Name) + { + Tag = pluginAttribute + }; item.SubItems.Add(pluginAttribute.Version); item.SubItems.Add(pluginAttribute.CreatedBy); item.SubItems.Add(pluginAttribute.DllFile); - item.Tag = pluginAttribute; listview.Items.Add(item); } } - public bool isSelectedItemConfigurable(ListView listview) { - if (listview.SelectedItems.Count > 0) { - PluginAttribute pluginAttribute = (PluginAttribute)listview.SelectedItems[0].Tag; - if (pluginAttribute != null) { - return pluginAttribute.Configurable; - } + public bool IsSelectedItemConfigurable(ListView listview) { + if (listview.SelectedItems.Count <= 0) + { + return false; } - return false; + var pluginAttribute = (PluginAttribute)listview.SelectedItems[0].Tag; + return pluginAttribute != null && pluginAttribute.Configurable; } public void ConfigureSelectedItem(ListView listview) { - if (listview.SelectedItems.Count > 0) { - PluginAttribute pluginAttribute = (PluginAttribute)listview.SelectedItems[0].Tag; - if (pluginAttribute != null) { - IGreenshotPlugin plugin = plugins[pluginAttribute]; - plugin.Configure(); - } + if (listview.SelectedItems.Count <= 0) + { + return; } + var pluginAttribute = (PluginAttribute)listview.SelectedItems[0].Tag; + if (pluginAttribute == null) + { + return; + } + var plugin = plugins[pluginAttribute]; + plugin.Configure(); } #region Implementation of IGreenshotPluginHost - + /// /// Create a Thumbnail /// /// Image of which we need a Thumbnail + /// Thumbnail width + /// Thumbnail height /// Image with Thumbnail public Image GetThumbnail(Image image, int width, int height) { return image.GetThumbnailImage(width, height, ThumbnailCallback, IntPtr.Zero); @@ -128,15 +124,9 @@ namespace Greenshot.Helpers { return true; } - public ContextMenuStrip MainMenu { - get { - return MainForm.Instance.MainMenu; - } - } - - public IDictionary Plugins { - get {return plugins;} - } + public ContextMenuStrip MainMenu => MainForm.Instance.MainMenu; + + public IDictionary Plugins => plugins; public IDestination GetDestination(string designation) { return DestinationHelper.GetDestination(designation); @@ -161,7 +151,7 @@ namespace Greenshot.Helpers { /// /// Use the supplied image, and handle it as if it's captured. /// - /// Image to handle + /// Image to handle public void ImportCapture(ICapture captureToImport) { MainForm.Instance.BeginInvoke((MethodInvoker)delegate { CaptureHelper.ImportCapture(captureToImport); @@ -173,10 +163,14 @@ namespace Greenshot.Helpers { /// /// public ICapture GetCapture(Image imageToCapture) { - Capture capture = new Capture(imageToCapture); - capture.CaptureDetails = new CaptureDetails(); - capture.CaptureDetails.CaptureMode = CaptureMode.Import; - capture.CaptureDetails.Title = "Imported"; + var capture = new Capture(imageToCapture) + { + CaptureDetails = new CaptureDetails + { + CaptureMode = CaptureMode.Import, + Title = "Imported" + } + }; return capture; } #endregion @@ -220,9 +214,8 @@ namespace Greenshot.Helpers { pluginFiles.Add(pluginFile); } } catch (UnauthorizedAccessException) { - return; } catch (Exception ex) { - LOG.Error("Error loading plugin: ", ex); + Log.Error("Error loading plugin: ", ex); } } } @@ -234,10 +227,10 @@ namespace Greenshot.Helpers { List pluginFiles = new List(); if (IniConfig.IsPortable) { - findPluginsOnPath(pluginFiles, pafPath); + findPluginsOnPath(pluginFiles, PafPath); } else { - findPluginsOnPath(pluginFiles, pluginPath); - findPluginsOnPath(pluginFiles, applicationPath); + findPluginsOnPath(pluginFiles, PluginPath); + findPluginsOnPath(pluginFiles, ApplicationPath); } Dictionary tmpAttributes = new Dictionary(); @@ -277,36 +270,36 @@ namespace Greenshot.Helpers { } if (checkPluginAttribute != null) { - LOG.WarnFormat("Duplicate plugin {0} found", pluginAttribute.Name); + Log.WarnFormat("Duplicate plugin {0} found", pluginAttribute.Name); if (isNewer(pluginAttribute.Version, checkPluginAttribute.Version)) { // Found is newer tmpAttributes[pluginAttribute.Name] = pluginAttribute; tmpAssemblies[pluginAttribute.Name] = assembly; - LOG.InfoFormat("Loading the newer plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); + Log.InfoFormat("Loading the newer plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); } else { - LOG.InfoFormat("Skipping (as the duplicate is newer or same version) the plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); + Log.InfoFormat("Skipping (as the duplicate is newer or same version) the plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); } continue; } - if (conf.ExcludePlugins != null && conf.ExcludePlugins.Contains(pluginAttribute.Name)) { - LOG.WarnFormat("Exclude list: {0}", conf.ExcludePlugins.ToArray()); - LOG.WarnFormat("Skipping the excluded plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); + if (CoreConfig.ExcludePlugins != null && CoreConfig.ExcludePlugins.Contains(pluginAttribute.Name)) { + Log.WarnFormat("Exclude list: {0}", CoreConfig.ExcludePlugins.ToArray()); + Log.WarnFormat("Skipping the excluded plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); continue; } - if (conf.IncludePlugins != null && conf.IncludePlugins.Count > 0 && !conf.IncludePlugins.Contains(pluginAttribute.Name)) { + if (CoreConfig.IncludePlugins != null && CoreConfig.IncludePlugins.Count > 0 && !CoreConfig.IncludePlugins.Contains(pluginAttribute.Name)) { // Whitelist is set - LOG.WarnFormat("Include list: {0}", conf.IncludePlugins.ToArray()); - LOG.WarnFormat("Skipping the not included plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); + Log.WarnFormat("Include list: {0}", CoreConfig.IncludePlugins.ToArray()); + Log.WarnFormat("Skipping the not included plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); continue; } - LOG.InfoFormat("Loading the plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); + Log.InfoFormat("Loading the plugin {0} with version {1} from {2}", pluginAttribute.Name, pluginAttribute.Version, pluginAttribute.DllFile); tmpAttributes[pluginAttribute.Name] = pluginAttribute; tmpAssemblies[pluginAttribute.Name] = assembly; } else { - LOG.ErrorFormat("Can't find the needed Plugin Attribute ({0}) in the assembly of the file \"{1}\", skipping this file.", typeof(PluginAttribute), pluginFile); + Log.ErrorFormat("Can't find the needed Plugin Attribute ({0}) in the assembly of the file \"{1}\", skipping this file.", typeof(PluginAttribute), pluginFile); } } catch (Exception e) { - LOG.Warn("Can't load file: " + pluginFile, e); + Log.Warn("Can't load file: " + pluginFile, e); } } foreach(string pluginName in tmpAttributes.Keys) { @@ -315,7 +308,7 @@ namespace Greenshot.Helpers { Assembly assembly = tmpAssemblies[pluginName]; Type entryType = assembly.GetType(pluginAttribute.EntryType); if (entryType == null) { - LOG.ErrorFormat("Can't find the in the PluginAttribute referenced type {0} in \"{1}\"", pluginAttribute.EntryType, pluginAttribute.DllFile); + Log.ErrorFormat("Can't find the in the PluginAttribute referenced type {0} in \"{1}\"", pluginAttribute.EntryType, pluginAttribute.DllFile); continue; } try { @@ -324,16 +317,16 @@ namespace Greenshot.Helpers { if (plugin.Initialize(this, pluginAttribute)) { plugins.Add(pluginAttribute, plugin); } else { - LOG.InfoFormat("Plugin {0} not initialized!", pluginAttribute.Name); + Log.InfoFormat("Plugin {0} not initialized!", pluginAttribute.Name); } } else { - LOG.ErrorFormat("Can't create an instance of the in the PluginAttribute referenced type {0} from \"{1}\"", pluginAttribute.EntryType, pluginAttribute.DllFile); + Log.ErrorFormat("Can't create an instance of the in the PluginAttribute referenced type {0} from \"{1}\"", pluginAttribute.EntryType, pluginAttribute.DllFile); } } catch(Exception e) { - LOG.Error("Can't load Plugin: " + pluginAttribute.Name, e); + Log.Error("Can't load Plugin: " + pluginAttribute.Name, e); } } catch(Exception e) { - LOG.Error("Can't load Plugin: " + pluginName, e); + Log.Error("Can't load Plugin: " + pluginName, e); } } } diff --git a/Greenshot/Helpers/PrintHelper.cs b/Greenshot/Helpers/PrintHelper.cs index 95b01552c..ad10d48d1 100644 --- a/Greenshot/Helpers/PrintHelper.cs +++ b/Greenshot/Helpers/PrintHelper.cs @@ -28,7 +28,7 @@ using Greenshot.Forms; using Greenshot.Plugin; using GreenshotPlugin.Core; using Greenshot.IniFile; -using Greenshot.Core; +using GreenshotPlugin.Effects; using log4net; namespace Greenshot.Helpers { @@ -36,21 +36,21 @@ namespace Greenshot.Helpers { /// Description of PrintHelper. /// public class PrintHelper : IDisposable { - private static readonly ILog LOG = LogManager.GetLogger(typeof(PrintHelper)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(PrintHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); - private ISurface surface; - private readonly ICaptureDetails captureDetails; - private PrintDocument printDocument = new PrintDocument(); - private PrintDialog printDialog = new PrintDialog(); + private ISurface _surface; + private readonly ICaptureDetails _captureDetails; + private PrintDocument _printDocument = new PrintDocument(); + private PrintDialog _printDialog = new PrintDialog(); public PrintHelper(ISurface surface, ICaptureDetails captureDetails) { - this.surface = surface; - this.captureDetails = captureDetails; - printDialog.UseEXDialog = true; - printDocument.DocumentName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(conf.OutputFileFilenamePattern, captureDetails); - printDocument.PrintPage += DrawImageForPrint; - printDialog.Document = printDocument; + _surface = surface; + _captureDetails = captureDetails; + _printDialog.UseEXDialog = true; + _printDocument.DocumentName = FilenameHelper.GetFilenameWithoutExtensionFromPattern(CoreConfig.OutputFileFilenamePattern, captureDetails); + _printDocument.PrintPage += DrawImageForPrint; + _printDialog.Document = _printDocument; } /** @@ -75,16 +75,12 @@ namespace Greenshot.Helpers { */ protected virtual void Dispose(bool disposing) { if (disposing) { - if (printDocument != null) { - printDocument.Dispose(); - } - if (printDialog != null) { - printDialog.Dispose(); - } + _printDocument?.Dispose(); + _printDialog?.Dispose(); } - surface = null; - printDocument = null; - printDialog = null; + _surface = null; + _printDocument = null; + _printDialog = null; } /// @@ -97,15 +93,15 @@ namespace Greenshot.Helpers { DialogResult? printOptionsResult = ShowPrintOptionsDialog(); try { if (printOptionsResult == null || printOptionsResult == DialogResult.OK) { - printDocument.PrinterSettings.PrinterName = printerName; + _printDocument.PrinterSettings.PrinterName = printerName; if (!IsColorPrint()) { - printDocument.DefaultPageSettings.Color = false; + _printDocument.DefaultPageSettings.Color = false; } - printDocument.Print(); - returnPrinterSettings = printDocument.PrinterSettings; + _printDocument.Print(); + returnPrinterSettings = _printDocument.PrinterSettings; } } catch (Exception e) { - LOG.Error("An error ocurred while trying to print", e); + Log.Error("An error ocurred while trying to print", e); MessageBox.Show(Language.GetString(LangKey.print_error), Language.GetString(LangKey.error)); } return returnPrinterSettings; @@ -118,18 +114,18 @@ namespace Greenshot.Helpers { /// printer settings if actually printed, or null if print was cancelled or has failed public PrinterSettings PrintWithDialog() { PrinterSettings returnPrinterSettings = null; - if (printDialog.ShowDialog() == DialogResult.OK) { + if (_printDialog.ShowDialog() == DialogResult.OK) { DialogResult? printOptionsResult = ShowPrintOptionsDialog(); try { if (printOptionsResult == null || printOptionsResult == DialogResult.OK) { if (!IsColorPrint()) { - printDocument.DefaultPageSettings.Color = false; + _printDocument.DefaultPageSettings.Color = false; } - printDocument.Print(); - returnPrinterSettings = printDialog.PrinterSettings; + _printDocument.Print(); + returnPrinterSettings = _printDialog.PrinterSettings; } } catch (Exception e) { - LOG.Error("An error ocurred while trying to print", e); + Log.Error("An error ocurred while trying to print", e); MessageBox.Show(Language.GetString(LangKey.print_error), Language.GetString(LangKey.error)); } @@ -138,7 +134,7 @@ namespace Greenshot.Helpers { } private bool IsColorPrint() { - return !conf.OutputPrintGrayscale && !conf.OutputPrintMonochrome; + return !CoreConfig.OutputPrintGrayscale && !CoreConfig.OutputPrintMonochrome; } /// @@ -147,7 +143,7 @@ namespace Greenshot.Helpers { /// result of the print dialog, or null if the dialog has not been displayed by config private DialogResult? ShowPrintOptionsDialog() { DialogResult? ret = null; - if (conf.OutputPrintPromptOptions) { + if (CoreConfig.OutputPrintPromptOptions) { using (PrintOptionsDialog printOptionsDialog = new PrintOptionsDialog()) { ret = printOptionsDialog.ShowDialog(); } @@ -164,16 +160,16 @@ namespace Greenshot.Helpers { ApplyEffects(printOutputSettings); Image image; - bool disposeImage = ImageOutput.CreateImageFromSurface(surface, printOutputSettings, out image); + bool disposeImage = ImageOutput.CreateImageFromSurface(_surface, printOutputSettings, out image); try { - ContentAlignment alignment = conf.OutputPrintCenter ? ContentAlignment.MiddleCenter : ContentAlignment.TopLeft; + ContentAlignment alignment = CoreConfig.OutputPrintCenter ? ContentAlignment.MiddleCenter : ContentAlignment.TopLeft; // prepare timestamp float footerStringWidth = 0; float footerStringHeight = 0; string footerString = null; //DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(); - if (conf.OutputPrintFooter) { - footerString = FilenameHelper.FillPattern(conf.OutputPrintFooterPattern, captureDetails, false); + if (CoreConfig.OutputPrintFooter) { + footerString = FilenameHelper.FillPattern(CoreConfig.OutputPrintFooterPattern, _captureDetails, false); using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { footerStringWidth = e.Graphics.MeasureString(footerString, f).Width; footerStringHeight = e.Graphics.MeasureString(footerString, f).Height; @@ -194,7 +190,7 @@ namespace Greenshot.Helpers { GraphicsUnit gu = GraphicsUnit.Pixel; RectangleF imageRect = image.GetBounds(ref gu); // rotate the image if it fits the page better - if (conf.OutputPrintAllowRotate) { + if (CoreConfig.OutputPrintAllowRotate) { if ((pageRect.Width > pageRect.Height && imageRect.Width < imageRect.Height) || (pageRect.Width < pageRect.Height && imageRect.Width > imageRect.Height)) { image.RotateFlip(RotateFlipType.Rotate270FlipNone); imageRect = image.GetBounds(ref gu); @@ -206,16 +202,16 @@ namespace Greenshot.Helpers { RectangleF printRect = new RectangleF(0, 0, imageRect.Width, imageRect.Height); // scale the image to fit the page better - if (conf.OutputPrintAllowEnlarge || conf.OutputPrintAllowShrink) { + if (CoreConfig.OutputPrintAllowEnlarge || CoreConfig.OutputPrintAllowShrink) { SizeF resizedRect = ScaleHelper.GetScaledSize(imageRect.Size, pageRect.Size, false); - if ((conf.OutputPrintAllowShrink && resizedRect.Width < printRect.Width) || conf.OutputPrintAllowEnlarge && resizedRect.Width > printRect.Width) { + if ((CoreConfig.OutputPrintAllowShrink && resizedRect.Width < printRect.Width) || CoreConfig.OutputPrintAllowEnlarge && resizedRect.Width > printRect.Width) { printRect.Size = resizedRect; } } // align the image printRect = ScaleHelper.GetAlignedRectangle(printRect, new RectangleF(0, 0, pageRect.Width, pageRect.Height), alignment); - if (conf.OutputPrintFooter) { + if (CoreConfig.OutputPrintFooter) { //printRect = new RectangleF(0, 0, printRect.Width, printRect.Height - (dateStringHeight * 2)); using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { e.Graphics.DrawString(footerString, f, Brushes.Black, pageRect.Width / 2 - footerStringWidth / 2, pageRect.Height); @@ -224,9 +220,8 @@ namespace Greenshot.Helpers { e.Graphics.DrawImage(image, printRect, imageRect, GraphicsUnit.Pixel); } finally { - if (disposeImage && image != null) { - image.Dispose(); - image = null; + if (disposeImage) { + image?.Dispose(); } } } @@ -234,14 +229,14 @@ namespace Greenshot.Helpers { private void ApplyEffects(SurfaceOutputSettings printOutputSettings) { // TODO: // add effects here - if (conf.OutputPrintMonochrome) { - byte threshold = conf.OutputPrintMonochromeThreshold; + if (CoreConfig.OutputPrintMonochrome) { + byte threshold = CoreConfig.OutputPrintMonochromeThreshold; printOutputSettings.Effects.Add(new MonochromeEffect(threshold)); printOutputSettings.ReduceColors = true; } // the invert effect should probably be the last - if (conf.OutputPrintInverted) { + if (CoreConfig.OutputPrintInverted) { printOutputSettings.Effects.Add(new InvertEffect()); } } diff --git a/Greenshot/Helpers/SoundHelper.cs b/Greenshot/Helpers/SoundHelper.cs index d1355d30c..581a18051 100644 --- a/Greenshot/Helpers/SoundHelper.cs +++ b/Greenshot/Helpers/SoundHelper.cs @@ -36,10 +36,10 @@ namespace Greenshot.Helpers { /// See: http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2487569 /// public static class SoundHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(SoundHelper)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(SoundHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private static GCHandle? _gcHandle; - private static byte[] _soundBuffer; + private static byte[] _soundBuffer; public static void Initialize() { if (_gcHandle == null) { @@ -47,49 +47,49 @@ namespace Greenshot.Helpers { ResourceManager resources = new ResourceManager("Greenshot.Sounds", Assembly.GetExecutingAssembly()); _soundBuffer = (byte[])resources.GetObject("camera"); - if (conf.NotificationSound != null && conf.NotificationSound.EndsWith(".wav")) { + if (CoreConfig.NotificationSound != null && CoreConfig.NotificationSound.EndsWith(".wav")) { try { - if (File.Exists(conf.NotificationSound)) { - _soundBuffer = File.ReadAllBytes(conf.NotificationSound); + if (File.Exists(CoreConfig.NotificationSound)) { + _soundBuffer = File.ReadAllBytes(CoreConfig.NotificationSound); } } catch (Exception ex) { - LOG.WarnFormat("couldn't load {0}: {1}", conf.NotificationSound, ex.Message); + Log.WarnFormat("couldn't load {0}: {1}", CoreConfig.NotificationSound, ex.Message); } } // Pin sound so it can't be moved by the Garbage Collector, this was the cause for the bad sound _gcHandle = GCHandle.Alloc(_soundBuffer, GCHandleType.Pinned); } catch (Exception e) { - LOG.Error("Error initializing.", e); + Log.Error("Error initializing.", e); } } } public static void Play() { - if (_soundBuffer != null) { - //Thread playSoundThread = new Thread(delegate() { - SoundFlags flags = SoundFlags.SND_ASYNC | SoundFlags.SND_MEMORY | SoundFlags.SND_NOWAIT | SoundFlags.SND_NOSTOP; - try { - WinMM.PlaySound(_gcHandle.Value.AddrOfPinnedObject(), (UIntPtr)0, (uint)flags); - } catch (Exception e) { - LOG.Error("Error in play.", e); - } - //}); - //playSoundThread.Name = "Play camera sound"; - //playSoundThread.IsBackground = true; - //playSoundThread.Start(); - } - } + if (_soundBuffer != null) { + //Thread playSoundThread = new Thread(delegate() { + SoundFlags flags = SoundFlags.SND_ASYNC | SoundFlags.SND_MEMORY | SoundFlags.SND_NOWAIT | SoundFlags.SND_NOSTOP; + try { + if (_gcHandle != null) WinMM.PlaySound(_gcHandle.Value.AddrOfPinnedObject(), (UIntPtr)0, (uint)flags); + } catch (Exception e) { + Log.Error("Error in play.", e); + } + //}); + //playSoundThread.Name = "Play camera sound"; + //playSoundThread.IsBackground = true; + //playSoundThread.Start(); + } + } - public static void Deinitialize() { - try { + public static void Deinitialize() { + try { if (_gcHandle != null) { - WinMM.PlaySound((byte[])null, (UIntPtr)0, (uint)0); + WinMM.PlaySound(null, (UIntPtr)0, 0); _gcHandle.Value.Free(); _gcHandle = null; } - } catch (Exception e) { - LOG.Error("Error in deinitialize.", e); - } - } + } catch (Exception e) { + Log.Error("Error in deinitialize.", e); + } + } } } diff --git a/Greenshot/Helpers/StartupHelper.cs b/Greenshot/Helpers/StartupHelper.cs index 8b9147edf..4944d4dee 100644 --- a/Greenshot/Helpers/StartupHelper.cs +++ b/Greenshot/Helpers/StartupHelper.cs @@ -29,12 +29,12 @@ namespace Greenshot.Helpers { /// A helper class for the startup registry /// public static class StartupHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(StartupHelper)); + private static readonly ILog Log = LogManager.GetLogger(typeof(StartupHelper)); - private const string RUNKEY6432 = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; - private const string RUNKEY = @"Software\Microsoft\Windows\CurrentVersion\Run"; + private const string RunKey6432 = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; + private const string RunKey = @"Software\Microsoft\Windows\CurrentVersion\Run"; - private const string APPLICATIONNAME = "Greenshot"; + private const string ApplicationName = "Greenshot"; private static string GetExecutablePath() { return "\"" + Application.ExecutablePath + "\""; @@ -46,7 +46,8 @@ namespace Greenshot.Helpers { /// true if Greenshot can write key public static bool CanWriteRunAll() { try { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RUNKEY, true)) { + using (Registry.LocalMachine.OpenSubKey(RunKey, true)) + { } } catch { return false; @@ -60,7 +61,8 @@ namespace Greenshot.Helpers { /// true if Greenshot can write key public static bool CanWriteRunUser() { try { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RUNKEY, true)) { + using (Registry.CurrentUser.OpenSubKey(RunKey, true)) + { } } catch { return false; @@ -72,24 +74,27 @@ namespace Greenshot.Helpers { /// Return the RUN key value of the local machine /// /// the RUN key value of the local machine - public static Object GetRunAllValue() { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RUNKEY, false)) { - if (key != null) { - object runValue = key.GetValue(APPLICATIONNAME); - if (runValue != null) { - return runValue; - } + public static object GetRunAllValue() + { + using (var key = Registry.LocalMachine.OpenSubKey(RunKey, false)) + { + object runValue = key?.GetValue(ApplicationName); + if (runValue != null) + { + return runValue; } } // for 64-bit systems we need to check the 32-bit keys too - if (IntPtr.Size == 8) { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RUNKEY6432, false)) { - if (key != null) { - object runValue = key.GetValue(APPLICATIONNAME); - if (runValue != null) { - return runValue; - } - } + if (IntPtr.Size != 8) + { + return null; + } + using (var key = Registry.LocalMachine.OpenSubKey(RunKey6432, false)) + { + object runValue = key?.GetValue(ApplicationName); + if (runValue != null) + { + return runValue; } } return null; @@ -99,24 +104,22 @@ namespace Greenshot.Helpers { /// Return the RUN key value of the current user /// /// the RUN key value of the current user - public static Object GetRunUserValue() { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RUNKEY, false)) { - if (key != null) { - object runValue = key.GetValue(APPLICATIONNAME); - if (runValue != null) { - return runValue; - } + public static object GetRunUserValue() { + using (var key = Registry.CurrentUser.OpenSubKey(RunKey, false)) { + object runValue = key?.GetValue(ApplicationName); + if (runValue != null) { + return runValue; } } // for 64-bit systems we need to check the 32-bit keys too - if (IntPtr.Size == 8) { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RUNKEY6432, false)) { - if (key != null) { - object runValue = key.GetValue(APPLICATIONNAME); - if (runValue != null) { - return runValue; - } - } + if (IntPtr.Size != 8) + { + return null; + } + using (var key = Registry.CurrentUser.OpenSubKey(RunKey6432, false)) { + object runValue = key?.GetValue(ApplicationName); + if (runValue != null) { + return runValue; } } return null; @@ -130,7 +133,7 @@ namespace Greenshot.Helpers { try { return GetRunAllValue() != null; } catch (Exception e) { - LOG.Error("Error retrieving RunAllValue", e); + Log.Error("Error retrieving RunAllValue", e); } return false; } @@ -140,11 +143,11 @@ namespace Greenshot.Helpers { /// /// true if there is a run key public static bool HasRunUser() { - Object runValue = null; + object runValue = null; try { runValue = GetRunUserValue(); } catch (Exception e) { - LOG.Error("Error retrieving RunUserValue", e); + Log.Error("Error retrieving RunUserValue", e); } return runValue != null; } @@ -153,24 +156,29 @@ namespace Greenshot.Helpers { /// Delete the RUN key for the localmachine ("ALL") /// public static void DeleteRunAll() { - if (HasRunAll()) { - try { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RUNKEY, true)) { - key.DeleteValue(APPLICATIONNAME); - } - } catch (Exception e) { - LOG.Error("Error in deleteRunAll.", e); + if (!HasRunAll()) + { + return; + } + try { + using (var key = Registry.LocalMachine.OpenSubKey(RunKey, true)) { + key?.DeleteValue(ApplicationName); } - try { - // for 64-bit systems we need to delete the 32-bit keys too - if (IntPtr.Size == 8) { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RUNKEY6432, false)) { - key.DeleteValue(APPLICATIONNAME); - } - } - } catch (Exception e) { - LOG.Error("Error in deleteRunAll.", e); + } catch (Exception e) { + Log.Error("Error in deleteRunAll.", e); + } + try + { + // for 64-bit systems we need to delete the 32-bit keys too + if (IntPtr.Size != 8) + { + return; } + using (var key = Registry.LocalMachine.OpenSubKey(RunKey6432, false)) { + key?.DeleteValue(ApplicationName); + } + } catch (Exception e) { + Log.Error("Error in deleteRunAll.", e); } } @@ -178,24 +186,29 @@ namespace Greenshot.Helpers { /// Delete the RUN key for the current user /// public static void DeleteRunUser() { - if (HasRunUser()) { - try { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RUNKEY, true)) { - key.DeleteValue(APPLICATIONNAME); - } - } catch (Exception e) { - LOG.Error("Error in deleteRunUser.", e); + if (!HasRunUser()) + { + return; + } + try { + using (var key = Registry.CurrentUser.OpenSubKey(RunKey, true)) { + key?.DeleteValue(ApplicationName); } - try { - // for 64-bit systems we need to delete the 32-bit keys too - if (IntPtr.Size == 8) { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RUNKEY6432, false)) { - key.DeleteValue(APPLICATIONNAME); - } - } - } catch (Exception e) { - LOG.Error("Error in deleteRunUser.", e); + } catch (Exception e) { + Log.Error("Error in deleteRunUser.", e); + } + try + { + // for 64-bit systems we need to delete the 32-bit keys too + if (IntPtr.Size != 8) + { + return; } + using (var key = Registry.CurrentUser.OpenSubKey(RunKey6432, false)) { + key?.DeleteValue(ApplicationName); + } + } catch (Exception e) { + Log.Error("Error in deleteRunUser.", e); } } @@ -204,11 +217,12 @@ namespace Greenshot.Helpers { /// public static void SetRunUser() { try { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(RUNKEY, true)) { - key.SetValue(APPLICATIONNAME, GetExecutablePath()); + using (var key = Registry.CurrentUser.OpenSubKey(RunKey, true)) + { + key?.SetValue(ApplicationName, GetExecutablePath()); } } catch (Exception e) { - LOG.Error("Error in setRunUser.", e); + Log.Error("Error in setRunUser.", e); } } @@ -221,19 +235,22 @@ namespace Greenshot.Helpers { string lnkName = Path.GetFileNameWithoutExtension(Application.ExecutablePath) + ".lnk"; string startupPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup); if (Directory.Exists(startupPath)) { - LOG.DebugFormat("Startup path: {0}", startupPath); + Log.DebugFormat("Startup path: {0}", startupPath); if (File.Exists(Path.Combine(startupPath, lnkName))) { return true; } } string startupAll = Environment.GetEnvironmentVariable("ALLUSERSPROFILE") + @"\Microsoft\Windows\Start Menu\Programs\Startup"; if (Directory.Exists(startupAll)) { - LOG.DebugFormat("Startup all path: {0}", startupAll); + Log.DebugFormat("Startup all path: {0}", startupAll); if (File.Exists(Path.Combine(startupAll, lnkName))) { return true; } } - } catch { + } + catch + { + // ignored } return false; } diff --git a/Greenshot/Helpers/UpdateHelper.cs b/Greenshot/Helpers/UpdateHelper.cs index 1d2231c39..68d5d5d9f 100644 --- a/Greenshot/Helpers/UpdateHelper.cs +++ b/Greenshot/Helpers/UpdateHelper.cs @@ -34,35 +34,37 @@ namespace Greenshot.Experimental { /// Description of RssFeedHelper. /// public static class UpdateHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(UpdateHelper)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); - private const string STABLE_DOWNLOAD_LINK = "http://getgreenshot.org/downloads/"; - private const string VERSION_HISTORY_LINK = "http://getgreenshot.org/version-history/"; + private static readonly ILog Log = LogManager.GetLogger(typeof(UpdateHelper)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private const string StableDownloadLink = "http://getgreenshot.org/downloads/"; + private const string VersionHistoryLink = "http://getgreenshot.org/version-history/"; private static readonly object LockObject = new object(); private static RssFile _latestGreenshot; - private static string _downloadLink = STABLE_DOWNLOAD_LINK; + private static string _downloadLink = StableDownloadLink; /// /// Is an update check needed? /// /// bool true if yes public static bool IsUpdateCheckNeeded() { - lock (LockObject) { - if (conf.UpdateCheckInterval == 0) { + lock (LockObject) + { + if (CoreConfig.UpdateCheckInterval == 0) + { return false; } - if (conf.LastUpdateCheck != null) { - DateTime checkTime = conf.LastUpdateCheck; - checkTime = checkTime.AddDays(conf.UpdateCheckInterval); - if (DateTime.Now.CompareTo(checkTime) < 0) { - LOG.DebugFormat("No need to check RSS feed for updates, feed check will be after {0}", checkTime); - return false; - } - LOG.DebugFormat("Update check is due, last check was {0} check needs to be made after {1} (which is one {2} later)", conf.LastUpdateCheck, checkTime, conf.UpdateCheckInterval); - if (!RssHelper.IsRSSModifiedAfter(conf.LastUpdateCheck)) { - LOG.DebugFormat("RSS feed has not been updated since after {0}", conf.LastUpdateCheck); - return false; - } + DateTime checkTime = CoreConfig.LastUpdateCheck; + checkTime = checkTime.AddDays(CoreConfig.UpdateCheckInterval); + if (DateTime.Now.CompareTo(checkTime) < 0) + { + Log.DebugFormat("No need to check RSS feed for updates, feed check will be after {0}", checkTime); + return false; + } + Log.DebugFormat("Update check is due, last check was {0} check needs to be made after {1} (which is one {2} later)", CoreConfig.LastUpdateCheck, checkTime, CoreConfig.UpdateCheckInterval); + if (!RssHelper.IsRssModifiedAfter(CoreConfig.LastUpdateCheck)) + { + Log.DebugFormat("RSS feed has not been updated since after {0}", CoreConfig.LastUpdateCheck); + return false; } } return true; @@ -79,15 +81,15 @@ namespace Greenshot.Experimental { try { _latestGreenshot = null; - ProcessRSSInfo(currentVersion); + ProcessRssInfo(currentVersion); if (_latestGreenshot != null) { MainForm.Instance.NotifyIcon.BalloonTipClicked += HandleBalloonTipClick; MainForm.Instance.NotifyIcon.BalloonTipClosed += CleanupBalloonTipClick; MainForm.Instance.NotifyIcon.ShowBalloonTip(10000, "Greenshot", Language.GetFormattedString(LangKey.update_found, "'" + _latestGreenshot.File + "'"), ToolTipIcon.Info); } - conf.LastUpdateCheck = DateTime.Now; + CoreConfig.LastUpdateCheck = DateTime.Now; } catch (Exception e) { - LOG.Error("An error occured while checking for updates, the error will be ignored: ", e); + Log.Error("An error occured while checking for updates, the error will be ignored: ", e); } } } @@ -112,9 +114,9 @@ namespace Greenshot.Experimental { } } - private static void ProcessRSSInfo(Version currentVersion) { + private static void ProcessRssInfo(Version currentVersion) { // Reset latest Greenshot - IList rssFiles = RssHelper.readRSS(); + IList rssFiles = RssHelper.ReadRss(); if (rssFiles == null) { return; @@ -124,29 +126,29 @@ namespace Greenshot.Experimental { foreach(RssFile rssFile in rssFiles) { if (rssFile.File.StartsWith("Greenshot")) { // check for exe - if (!rssFile.isExe) { + if (!rssFile.IsExe) { continue; } // do we have a version? if (rssFile.Version == null) { - LOG.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", rssFile.File, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + Log.DebugFormat("Skipping unversioned exe {0} which is published at {1} : {2}", rssFile.File, rssFile.Pubdate.ToLocalTime(), rssFile.Link); continue; } // if the file is unstable, we will skip it when: // the current version is a release or release candidate AND check unstable is turned off. - if (rssFile.isUnstable) { + if (rssFile.IsUnstable) { // Skip if we shouldn't check unstables - if ((conf.BuildState == BuildStates.RELEASE) && !conf.CheckForUnstable) { + if ((CoreConfig.BuildState == BuildStates.RELEASE) && !CoreConfig.CheckForUnstable) { continue; } } // if the file is a release candidate, we will skip it when: // the current version is a release AND check unstable is turned off. - if (rssFile.isReleaseCandidate) { - if (conf.BuildState == BuildStates.RELEASE && !conf.CheckForUnstable) { + if (rssFile.IsReleaseCandidate) { + if (CoreConfig.BuildState == BuildStates.RELEASE && !CoreConfig.CheckForUnstable) { continue; } } @@ -154,19 +156,19 @@ namespace Greenshot.Experimental { // Compare versions int versionCompare = rssFile.Version.CompareTo(currentVersion); if (versionCompare > 0) { - LOG.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + Log.DebugFormat("Found newer Greenshot '{0}' with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); if (_latestGreenshot == null || rssFile.Version.CompareTo(_latestGreenshot.Version) > 0) { _latestGreenshot = rssFile; - if (rssFile.isReleaseCandidate || rssFile.isUnstable) { - _downloadLink = VERSION_HISTORY_LINK; + if (rssFile.IsReleaseCandidate || rssFile.IsUnstable) { + _downloadLink = VersionHistoryLink; } else { - _downloadLink = STABLE_DOWNLOAD_LINK; + _downloadLink = StableDownloadLink; } } } else if (versionCompare < 0) { - LOG.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); + Log.DebugFormat("Skipping older greenshot with version {0}", rssFile.Version); } else if (versionCompare == 0) { - LOG.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); + Log.DebugFormat("Found current version as exe {0} with version {1} published at {2} : {3}", rssFile.File, rssFile.Version, rssFile.Pubdate.ToLocalTime(), rssFile.Link); } } } diff --git a/Greenshot/Helpers/WindowWrapper.cs b/Greenshot/Helpers/WindowWrapper.cs index a1d7e74be..63cb51e81 100644 --- a/Greenshot/Helpers/WindowWrapper.cs +++ b/Greenshot/Helpers/WindowWrapper.cs @@ -24,13 +24,9 @@ using System.Windows.Forms; namespace Greenshot.Helpers { public class WindowWrapper : IWin32Window { public WindowWrapper(IntPtr handle) { - _hwnd = handle; + Handle = handle; } - public IntPtr Handle { - get { return _hwnd; } - } - - private readonly IntPtr _hwnd; + public IntPtr Handle { get; } } } diff --git a/Greenshot/Memento/AddElementsMemento.cs b/Greenshot/Memento/AddElementsMemento.cs index 5b3885f30..b28543512 100644 --- a/Greenshot/Memento/AddElementsMemento.cs +++ b/Greenshot/Memento/AddElementsMemento.cs @@ -46,10 +46,7 @@ namespace Greenshot.Memento { if (disposing) { - if (_containerList != null) - { - _containerList.Dispose(); - } + _containerList?.Dispose(); } _containerList = null; _surface = null; @@ -62,9 +59,6 @@ namespace Greenshot.Memento public IMemento Restore() { - // Store the selected state, as it's overwritten by the RemoveElement - bool selected = _containerList.Selected; - var oldState = new DeleteElementsMemento(_surface, _containerList); _surface.RemoveElements(_containerList, false); diff --git a/Greenshot/Memento/ChangeFieldHolderMemento.cs b/Greenshot/Memento/ChangeFieldHolderMemento.cs index 688baf81a..0e5c371f3 100644 --- a/Greenshot/Memento/ChangeFieldHolderMemento.cs +++ b/Greenshot/Memento/ChangeFieldHolderMemento.cs @@ -30,8 +30,8 @@ namespace Greenshot.Memento public class ChangeFieldHolderMemento : IMemento { private IDrawableContainer _drawableContainer; - private IField _fieldToBeChanged; - private object _oldValue; + private readonly IField _fieldToBeChanged; + private readonly object _oldValue; public ChangeFieldHolderMemento(IDrawableContainer drawableContainer, IField fieldToBeChanged) { @@ -49,10 +49,7 @@ namespace Greenshot.Memento { if (disposing) { - if (_drawableContainer != null) - { - _drawableContainer.Dispose(); - } + _drawableContainer?.Dispose(); } _drawableContainer = null; } diff --git a/Greenshot/Memento/DeleteElementsMemento.cs b/Greenshot/Memento/DeleteElementsMemento.cs index a42e06b36..e0178a36e 100644 --- a/Greenshot/Memento/DeleteElementsMemento.cs +++ b/Greenshot/Memento/DeleteElementsMemento.cs @@ -46,10 +46,7 @@ namespace Greenshot.Memento { if (disposing) { - if (_containerList != null) - { - _containerList.Dispose(); - } + _containerList?.Dispose(); } _containerList = null; _surface = null; diff --git a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs index 01f372b10..08b4db616 100644 --- a/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/Greenshot/Memento/DrawableContainerBoundsChangeMemento.cs @@ -31,30 +31,32 @@ namespace Greenshot.Memento /// public class DrawableContainerBoundsChangeMemento : IMemento { - private List points = new List(); - private List sizes = new List(); - private IDrawableContainerList listOfdrawableContainer; + private readonly List _points = new List(); + private readonly List _sizes = new List(); + private IDrawableContainerList _listOfdrawableContainer; private void StoreBounds() { - foreach (IDrawableContainer drawableContainer in listOfdrawableContainer) + foreach (IDrawableContainer drawableContainer in _listOfdrawableContainer) { - points.Add(drawableContainer.Location); - sizes.Add(drawableContainer.Size); + _points.Add(drawableContainer.Location); + _sizes.Add(drawableContainer.Size); } } public DrawableContainerBoundsChangeMemento(IDrawableContainerList listOfdrawableContainer) { - this.listOfdrawableContainer = listOfdrawableContainer; + _listOfdrawableContainer = listOfdrawableContainer; StoreBounds(); } public DrawableContainerBoundsChangeMemento(IDrawableContainer drawableContainer) { - listOfdrawableContainer = new DrawableContainerList(); - listOfdrawableContainer.Add(drawableContainer); - listOfdrawableContainer.Parent = drawableContainer.Parent; + _listOfdrawableContainer = new DrawableContainerList + { + drawableContainer + }; + _listOfdrawableContainer.Parent = drawableContainer.Parent; StoreBounds(); } @@ -67,12 +69,9 @@ namespace Greenshot.Memento { if (disposing) { - if (listOfdrawableContainer != null) - { - listOfdrawableContainer.Dispose(); - } + _listOfdrawableContainer?.Dispose(); } - listOfdrawableContainer = null; + _listOfdrawableContainer = null; } public bool Merge(IMemento otherMemento) @@ -80,7 +79,7 @@ namespace Greenshot.Memento var other = otherMemento as DrawableContainerBoundsChangeMemento; if (other != null) { - if (ObjectExtensions.CompareLists(listOfdrawableContainer, other.listOfdrawableContainer)) + if (ObjectExtensions.CompareLists(_listOfdrawableContainer, other._listOfdrawableContainer)) { // Lists are equal, as we have the state already we can ignore the new memento return true; @@ -91,16 +90,16 @@ namespace Greenshot.Memento public IMemento Restore() { - var oldState = new DrawableContainerBoundsChangeMemento(listOfdrawableContainer); - for (int index = 0; index < listOfdrawableContainer.Count; index++) + var oldState = new DrawableContainerBoundsChangeMemento(_listOfdrawableContainer); + for (int index = 0; index < _listOfdrawableContainer.Count; index++) { - IDrawableContainer drawableContainer = listOfdrawableContainer[index]; + IDrawableContainer drawableContainer = _listOfdrawableContainer[index]; // Before drawableContainer.Invalidate(); - drawableContainer.Left = points[index].X; - drawableContainer.Top = points[index].Y; - drawableContainer.Width = sizes[index].Width; - drawableContainer.Height = sizes[index].Height; + drawableContainer.Left = _points[index].X; + drawableContainer.Top = _points[index].Y; + drawableContainer.Width = _sizes[index].Width; + drawableContainer.Height = _sizes[index].Height; // After drawableContainer.Invalidate(); drawableContainer.Parent.Modified = true; diff --git a/GreenshotBoxPlugin/BoxConfiguration.cs b/GreenshotBoxPlugin/BoxConfiguration.cs index 4745f2baa..4fb64cd2f 100644 --- a/GreenshotBoxPlugin/BoxConfiguration.cs +++ b/GreenshotBoxPlugin/BoxConfiguration.cs @@ -68,7 +68,7 @@ namespace GreenshotBoxPlugin { /// /// bool true if OK was pressed, false if cancel public bool ShowConfigDialog() { - DialogResult result = new SettingsForm(this).ShowDialog(); + DialogResult result = new SettingsForm().ShowDialog(); if (result == DialogResult.OK) { return true; } diff --git a/GreenshotBoxPlugin/BoxUtils.cs b/GreenshotBoxPlugin/BoxUtils.cs index b7910d0f7..4f375a28c 100644 --- a/GreenshotBoxPlugin/BoxUtils.cs +++ b/GreenshotBoxPlugin/BoxUtils.cs @@ -33,7 +33,7 @@ namespace GreenshotBoxPlugin { /// Description of ImgurUtils. /// public static class BoxUtils { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(BoxUtils)); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(BoxUtils)); private static readonly BoxConfiguration Config = IniConfig.GetIniSection(); private const string UploadFileUri = "https://upload.box.com/api/2.0/files/content"; private const string FilesUri = "https://www.box.com/api/2.0/files/{0}"; @@ -66,21 +66,23 @@ namespace GreenshotBoxPlugin { public static string UploadToBox(SurfaceContainer image, string title, string filename) { // Fill the OAuth2Settings - OAuth2Settings settings = new OAuth2Settings(); + var settings = new OAuth2Settings + { + AuthUrlPattern = "https://app.box.com/api/oauth2/authorize?client_id={ClientId}&response_type=code&state={State}&redirect_uri={RedirectUrl}", + TokenUrl = "https://api.box.com/oauth2/token", + CloudServiceName = "Box", + ClientId = BoxCredentials.ClientId, + ClientSecret = BoxCredentials.ClientSecret, + RedirectUrl = "https://www.box.com/home/", + BrowserSize = new Size(1060, 600), + AuthorizeMode = OAuth2AuthorizeMode.EmbeddedBrowser, + RefreshToken = Config.RefreshToken, + AccessToken = Config.AccessToken, + AccessTokenExpires = Config.AccessTokenExpires + }; - settings.AuthUrlPattern = "https://app.box.com/api/oauth2/authorize?client_id={ClientId}&response_type=code&state={State}&redirect_uri={RedirectUrl}"; - settings.TokenUrl = "https://api.box.com/oauth2/token"; - settings.CloudServiceName = "Box"; - settings.ClientId = BoxCredentials.ClientId; - settings.ClientSecret = BoxCredentials.ClientSecret; - settings.RedirectUrl = "https://www.box.com/home/"; - settings.BrowserSize = new Size(1060, 600); - settings.AuthorizeMode = OAuth2AuthorizeMode.EmbeddedBrowser; // Copy the settings from the config, which is kept in memory and on the disk - settings.RefreshToken = Config.RefreshToken; - settings.AccessToken = Config.AccessToken; - settings.AccessTokenExpires = Config.AccessTokenExpires; try { var webRequest = OAuth2Helper.CreateOAuth2WebRequest(HTTPMethod.POST, UploadFileUri, settings); @@ -92,17 +94,17 @@ namespace GreenshotBoxPlugin { var response = NetworkHelper.GetResponseAsString(webRequest); - LOG.DebugFormat("Box response: {0}", response); + Log.DebugFormat("Box response: {0}", response); var upload = JsonSerializer.Deserialize(response); - if (upload == null || upload.Entries == null || upload.Entries.Count == 0) return null; + if (upload?.Entries == null || upload.Entries.Count == 0) return null; if (Config.UseSharedLink) { string filesResponse = HttpPut(string.Format(FilesUri, upload.Entries[0].Id), "{\"shared_link\": {\"access\": \"open\"}}", settings); var file = JsonSerializer.Deserialize(filesResponse); return file.SharedLink.Url; } - return string.Format("http://www.box.com/files/0/f/0/1/f_{0}", upload.Entries[0].Id); + return $"http://www.box.com/files/0/f/0/1/f_{upload.Entries[0].Id}"; } finally { // Copy the settings back to the config, so they are stored. Config.RefreshToken = settings.RefreshToken; diff --git a/GreenshotBoxPlugin/Forms/SettingsForm.cs b/GreenshotBoxPlugin/Forms/SettingsForm.cs index 973620771..df1c50134 100644 --- a/GreenshotBoxPlugin/Forms/SettingsForm.cs +++ b/GreenshotBoxPlugin/Forms/SettingsForm.cs @@ -26,7 +26,7 @@ namespace GreenshotBoxPlugin { /// Description of PasswordRequestForm. /// public partial class SettingsForm : BoxForm { - public SettingsForm(BoxConfiguration config) { + public SettingsForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // diff --git a/GreenshotConfluencePlugin/Confluence.cs b/GreenshotConfluencePlugin/Confluence.cs index 714d3d20e..fdda7c31b 100644 --- a/GreenshotConfluencePlugin/Confluence.cs +++ b/GreenshotConfluencePlugin/Confluence.cs @@ -222,19 +222,17 @@ namespace Confluence { } } - public bool IsLoggedIn { - get { - return _loggedIn; - } - } - + public bool IsLoggedIn => _loggedIn; + public void AddAttachment(long pageId, string mime, string comment, string filename, IBinaryContainer image) { CheckCredentials(); - RemoteAttachment attachment = new RemoteAttachment(); // Comment is ignored, see: http://jira.atlassian.com/browse/CONF-9395 - attachment.comment = comment; - attachment.fileName = filename; - attachment.contentType = mime; + var attachment = new RemoteAttachment + { + comment = comment, + fileName = filename, + contentType = mime + }; _confluence.addAttachment(_credentials, pageId, attachment, image.ToByteArray()); } @@ -284,7 +282,6 @@ namespace Confluence { public IEnumerable GetPageChildren(Page parentPage) { CheckCredentials(); - List returnPages = new List(); RemotePageSummary[] pages = _confluence.getChildren(_credentials, parentPage.Id); foreach(RemotePageSummary page in pages) { yield return new Page(page); diff --git a/GreenshotConfluencePlugin/ConfluenceDestination.cs b/GreenshotConfluencePlugin/ConfluenceDestination.cs index fa9ccb7a1..50330f109 100644 --- a/GreenshotConfluencePlugin/ConfluenceDestination.cs +++ b/GreenshotConfluencePlugin/ConfluenceDestination.cs @@ -84,15 +84,15 @@ namespace GreenshotConfluencePlugin { } } - public override bool isDynamic { + public override bool IsDynamic { get { return true; } } - public override bool isActive { + public override bool IsActive { get { - return base.isActive && !string.IsNullOrEmpty(ConfluenceConfig.Url); + return base.IsActive && !string.IsNullOrEmpty(ConfluenceConfig.Url); } } @@ -127,7 +127,7 @@ namespace GreenshotConfluencePlugin { string filename = FilenameHelper.GetFilenameWithoutExtensionFromPattern(CoreConfig.OutputFileFilenamePattern, captureDetails); if (selectedPage == null) { ConfluenceUpload confluenceUpload = new ConfluenceUpload(filename); - Nullable dialogResult = confluenceUpload.ShowDialog(); + bool? dialogResult = confluenceUpload.ShowDialog(); if (dialogResult.HasValue && dialogResult.Value) { selectedPage = confluenceUpload.SelectedPage; if (confluenceUpload.IsOpenPageSelected) { diff --git a/GreenshotConfluencePlugin/ConfluencePlugin.cs b/GreenshotConfluencePlugin/ConfluencePlugin.cs index 4ba405800..eabc34b19 100644 --- a/GreenshotConfluencePlugin/ConfluencePlugin.cs +++ b/GreenshotConfluencePlugin/ConfluencePlugin.cs @@ -124,7 +124,7 @@ namespace GreenshotConfluencePlugin { ConfluenceConfiguration clonedConfig = _config.Clone(); ConfluenceConfigurationForm configForm = new ConfluenceConfigurationForm(clonedConfig); string url = _config.Url; - Nullable dialogResult = configForm.ShowDialog(); + bool? dialogResult = configForm.ShowDialog(); if (dialogResult.HasValue && dialogResult.Value) { // copy the new object to the old... clonedConfig.CloneTo(_config); diff --git a/GreenshotConfluencePlugin/ConfluenceUtils.cs b/GreenshotConfluencePlugin/ConfluenceUtils.cs index 64a8b9a3e..19c417136 100644 --- a/GreenshotConfluencePlugin/ConfluenceUtils.cs +++ b/GreenshotConfluencePlugin/ConfluenceUtils.cs @@ -95,7 +95,6 @@ namespace GreenshotConfluencePlugin { pages.Add(page); } - continue; } catch (Exception ex) { // Preventing security problems LOG.DebugFormat("Couldn't get page details for space {0} / title {1}", space, title); @@ -133,7 +132,7 @@ namespace GreenshotConfluencePlugin { if (pattern.ProgrammaticName != "ValuePatternIdentifiers.Pattern") { continue; } - string url = (docElement.GetCurrentPattern(pattern) as ValuePattern).Current.Value.ToString(); + string url = (docElement.GetCurrentPattern(pattern) as ValuePattern).Current.Value; if (!string.IsNullOrEmpty(url)) { urls.Add(url); break; diff --git a/GreenshotConfluencePlugin/EnumDisplayer.cs b/GreenshotConfluencePlugin/EnumDisplayer.cs index 9c31f2972..ca55afa40 100644 --- a/GreenshotConfluencePlugin/EnumDisplayer.cs +++ b/GreenshotConfluencePlugin/EnumDisplayer.cs @@ -30,11 +30,9 @@ using GreenshotPlugin.Core; namespace GreenshotConfluencePlugin { public class EnumDisplayer : IValueConverter { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(EnumDisplayer)); - - private Type type; - private IDictionary displayValues; - private IDictionary reverseValues; + private Type _type; + private IDictionary _displayValues; + private IDictionary _reverseValues; public EnumDisplayer() { } @@ -44,22 +42,30 @@ namespace GreenshotConfluencePlugin { } public Type Type { - get { return type; } + get { return _type; } set { if (!value.IsEnum) { - throw new ArgumentException("parameter is not an Enumerated type", "value"); + throw new ArgumentException("parameter is not an Enumerated type", nameof(value)); } - type = value; + _type = value; } } public ReadOnlyCollection DisplayNames { get { - reverseValues = (IDictionary) Activator.CreateInstance(typeof(Dictionary<,>).GetGenericTypeDefinition().MakeGenericType(typeof(string),type)); - - displayValues = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).GetGenericTypeDefinition().MakeGenericType(type, typeof(string))); - - var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static); + var genericTypeDefinition = typeof(Dictionary<,>).GetGenericTypeDefinition(); + if (genericTypeDefinition != null) + { + _reverseValues = (IDictionary) Activator.CreateInstance(genericTypeDefinition.MakeGenericType(typeof(string),_type)); + } + + var typeDefinition = typeof(Dictionary<,>).GetGenericTypeDefinition(); + if (typeDefinition != null) + { + _displayValues = (IDictionary)Activator.CreateInstance(typeDefinition.MakeGenericType(_type, typeof(string))); + } + + var fields = _type.GetFields(BindingFlags.Public | BindingFlags.Static); foreach (var field in fields) { DisplayKeyAttribute[] a = (DisplayKeyAttribute[])field.GetCustomAttributes(typeof(DisplayKeyAttribute), false); @@ -67,25 +73,19 @@ namespace GreenshotConfluencePlugin { object enumValue = field.GetValue(null); string displayString; - if (displayKey != null && Language.hasKey(displayKey)) { + if (displayKey != null && Language.HasKey(displayKey)) { displayString = Language.GetString(displayKey); } - if (displayKey != null) { - displayString = displayKey; - } else { - displayString = enumValue.ToString(); - } - - if (displayString != null) { - displayValues.Add(enumValue, displayString); - reverseValues.Add(displayString, enumValue); - } + displayString = displayKey ?? enumValue.ToString(); + + _displayValues.Add(enumValue, displayString); + _reverseValues.Add(displayString, enumValue); } - return new List((IEnumerable)displayValues.Values).AsReadOnly(); + return new List((IEnumerable)_displayValues.Values).AsReadOnly(); } } - private string GetDisplayKeyValue(DisplayKeyAttribute[] a) { + private static string GetDisplayKeyValue(DisplayKeyAttribute[] a) { if (a == null || a.Length == 0) { return null; } @@ -94,11 +94,11 @@ namespace GreenshotConfluencePlugin { } object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) { - return displayValues[value]; + return _displayValues[value]; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { - return reverseValues[value]; + return _reverseValues[value]; } } } diff --git a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs index d194fddcb..4ce336f3c 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluenceConfigurationForm.xaml.cs @@ -26,16 +26,11 @@ namespace GreenshotConfluencePlugin { /// Interaction logic for ConfluenceConfigurationForm.xaml /// public partial class ConfluenceConfigurationForm : Window { - private readonly ConfluenceConfiguration config; - public ConfluenceConfiguration Config { - get { - return config; - } - } - + public ConfluenceConfiguration Config { get; } + public ConfluenceConfigurationForm(ConfluenceConfiguration config) { DataContext = config; - this.config = config; + Config = config; InitializeComponent(); } diff --git a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs index cc237ccbe..0d5f78bfb 100644 --- a/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs +++ b/GreenshotConfluencePlugin/Forms/ConfluencePagePicker.xaml.cs @@ -26,12 +26,12 @@ namespace GreenshotConfluencePlugin { /// /// Interaction logic for ConfluencePagePicker.xaml /// - public partial class ConfluencePagePicker : System.Windows.Controls.Page { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluencePagePicker)); - private readonly ConfluenceUpload confluenceUpload = null; + public partial class ConfluencePagePicker + { + private readonly ConfluenceUpload _confluenceUpload; public ConfluencePagePicker(ConfluenceUpload confluenceUpload, List pagesToPick) { - this.confluenceUpload = confluenceUpload; + _confluenceUpload = confluenceUpload; DataContext = pagesToPick; InitializeComponent(); } @@ -42,11 +42,11 @@ namespace GreenshotConfluencePlugin { private void SelectionChanged() { if (PageListView.HasItems && PageListView.SelectedItems.Count > 0) { - confluenceUpload.SelectedPage = (Page)PageListView.SelectedItem; + _confluenceUpload.SelectedPage = (Page)PageListView.SelectedItem; // Make sure the uploader knows we selected an already opened page - confluenceUpload.IsOpenPageSelected = true; + _confluenceUpload.IsOpenPageSelected = true; } else { - confluenceUpload.SelectedPage = null; + _confluenceUpload.SelectedPage = null; } } diff --git a/GreenshotConfluencePlugin/Support/LanguageChangedEventManager.cs b/GreenshotConfluencePlugin/Support/LanguageChangedEventManager.cs index 056f9dfb0..8fe9289d3 100644 --- a/GreenshotConfluencePlugin/Support/LanguageChangedEventManager.cs +++ b/GreenshotConfluencePlugin/Support/LanguageChangedEventManager.cs @@ -26,7 +26,7 @@ namespace TranslationByMarkupExtension manager.LanguageChanged += OnLanguageChanged; } - protected override void StopListening(Object source) + protected override void StopListening(object source) { var manager = (TranslationManager)source; manager.LanguageChanged -= OnLanguageChanged; diff --git a/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs b/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs index 72a94da31..e5cf3bfe8 100644 --- a/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs +++ b/GreenshotConfluencePlugin/Support/LanguageXMLTranslationProvider.cs @@ -1,38 +1,30 @@ using GreenshotPlugin.Core; namespace TranslationByMarkupExtension { - /// - /// - /// - public class LanguageXMLTranslationProvider : ITranslationProvider { - #region Private Members + /// + /// + /// + public class LanguageXMLTranslationProvider : ITranslationProvider { + #region Private Members - #endregion + #endregion - #region Construction + #region Construction - /// - /// Initializes a new instance of the class. - /// - /// Name of the base. - /// The assembly. - public LanguageXMLTranslationProvider() { - } + #endregion - #endregion + #region ITranslationProvider Members - #region ITranslationProvider Members - - /// - /// See - /// - public object Translate(string key) { - if (Language.hasKey("confluence", key)) { + /// + /// See + /// + public object Translate(string key) { + if (Language.HasKey("confluence", key)) { return Language.GetString("confluence", key); - } - return key; - } + } + return key; + } - #endregion - } + #endregion + } } diff --git a/GreenshotConfluencePlugin/Support/TranslationData.cs b/GreenshotConfluencePlugin/Support/TranslationData.cs index e9be13aff..287cca4c0 100644 --- a/GreenshotConfluencePlugin/Support/TranslationData.cs +++ b/GreenshotConfluencePlugin/Support/TranslationData.cs @@ -3,62 +3,55 @@ using System.ComponentModel; using System.Windows; namespace TranslationByMarkupExtension { - public class TranslationData : IWeakEventListener, INotifyPropertyChanged { - #region Private Members + public class TranslationData : IWeakEventListener, INotifyPropertyChanged { + #region Private Members - private readonly string _key; + private readonly string _key; - #endregion + #endregion - /// - /// Initializes a new instance of the class. - /// - /// The key. - public TranslationData( string key) { - _key = key; - LanguageChangedEventManager.AddListener(TranslationManager.Instance, this); - } + /// + /// Initializes a new instance of the class. + /// + /// The key. + public TranslationData( string key) { + _key = key; + LanguageChangedEventManager.AddListener(TranslationManager.Instance, this); + } - /// - /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. - /// - ~TranslationData() { - LanguageChangedEventManager.RemoveListener(TranslationManager.Instance, this); - } + /// + /// Releases unmanaged resources and performs other cleanup operations before the + /// is reclaimed by garbage collection. + /// + ~TranslationData() { + LanguageChangedEventManager.RemoveListener(TranslationManager.Instance, this); + } - public object Value { - get { - return TranslationManager.Instance.Translate(_key); - } - } + public object Value => TranslationManager.Instance.Translate(_key); - #region IWeakEventListener Members + #region IWeakEventListener Members - public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e) - { - if (managerType == typeof(LanguageChangedEventManager)) - { - OnLanguageChanged(sender, e); - return true; - } - return false; - } + public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e) + { + if (managerType == typeof(LanguageChangedEventManager)) + { + OnLanguageChanged(sender, e); + return true; + } + return false; + } - private void OnLanguageChanged(object sender, EventArgs e) - { - if( PropertyChanged != null ) - { - PropertyChanged( this, new PropertyChangedEventArgs("Value")); - } - } + private void OnLanguageChanged(object sender, EventArgs e) + { + PropertyChanged?.Invoke( this, new PropertyChangedEventArgs("Value")); + } - #endregion + #endregion - #region INotifyPropertyChanged Members + #region INotifyPropertyChanged Members - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler PropertyChanged; - #endregion - } + #endregion + } } diff --git a/GreenshotConfluencePlugin/Support/TranslationManager.cs b/GreenshotConfluencePlugin/Support/TranslationManager.cs index 7e9516271..bf315a5d5 100644 --- a/GreenshotConfluencePlugin/Support/TranslationManager.cs +++ b/GreenshotConfluencePlugin/Support/TranslationManager.cs @@ -1,55 +1,45 @@ using System; namespace TranslationByMarkupExtension { - public class TranslationManager { - private static TranslationManager _translationManager; + public class TranslationManager { + private static TranslationManager _translationManager; - public event EventHandler LanguageChanged; + public event EventHandler LanguageChanged; - /*public CultureInfo CurrentLanguage { - get { return Thread.CurrentThread.CurrentUICulture; } - set { - if( value != Thread.CurrentThread.CurrentUICulture) { - Thread.CurrentThread.CurrentUICulture = value; - OnLanguageChanged(); - } - } - } - - public IEnumerable Languages { - get { - if( TranslationProvider != null) { - return TranslationProvider.Languages; - } - return Enumerable.Empty(); - } - }*/ - - public static TranslationManager Instance { - get { - if (_translationManager == null) { - _translationManager = new TranslationManager(); + /*public CultureInfo CurrentLanguage { + get { return Thread.CurrentThread.CurrentUICulture; } + set { + if( value != Thread.CurrentThread.CurrentUICulture) { + Thread.CurrentThread.CurrentUICulture = value; + OnLanguageChanged(); } - return _translationManager; - } - } + } + } - public ITranslationProvider TranslationProvider { get; set; } + public IEnumerable Languages { + get { + if( TranslationProvider != null) { + return TranslationProvider.Languages; + } + return Enumerable.Empty(); + } + }*/ - private void OnLanguageChanged() { - if (LanguageChanged != null) { - LanguageChanged(this, EventArgs.Empty); - } - } + public static TranslationManager Instance => _translationManager ?? (_translationManager = new TranslationManager()); - public object Translate(string key) { - if( TranslationProvider != null) { - object translatedValue = TranslationProvider.Translate(key); - if( translatedValue != null) { - return translatedValue; - } - } - return string.Format("!{0}!", key); - } - } + public ITranslationProvider TranslationProvider { get; set; } + + private void OnLanguageChanged() + { + LanguageChanged?.Invoke(this, EventArgs.Empty); + } + + public object Translate(string key) { + object translatedValue = TranslationProvider?.Translate(key); + if( translatedValue != null) { + return translatedValue; + } + return $"!{key}!"; + } + } } diff --git a/GreenshotDropboxPlugin/DropboxDestination.cs b/GreenshotDropboxPlugin/DropboxDestination.cs index 4faf9f9a1..1e378a7a1 100644 --- a/GreenshotDropboxPlugin/DropboxDestination.cs +++ b/GreenshotDropboxPlugin/DropboxDestination.cs @@ -23,27 +23,19 @@ using System.Drawing; using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; + namespace GreenshotDropboxPlugin { internal class DropboxDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DropboxDestination)); - private static readonly DropboxPluginConfiguration config = IniConfig.GetIniSection(); + private static readonly DropboxPluginConfiguration DropboxConfig = IniConfig.GetIniSection(); - private readonly DropboxPlugin plugin = null; + private readonly DropboxPlugin _plugin; public DropboxDestination(DropboxPlugin plugin) { - this.plugin = plugin; + _plugin = plugin; } - public override string Designation { - get { - return "Dropbox"; - } - } + public override string Designation => "Dropbox"; - public override string Description { - get { - return Language.GetString("dropbox", LangKey.upload_menu_item); - } - } + public override string Description => Language.GetString("dropbox", LangKey.upload_menu_item); public override Image DisplayIcon { get { @@ -55,11 +47,11 @@ namespace GreenshotDropboxPlugin { public override ExportInformation ExportCapture(bool manually, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadUrl; - bool uploaded = plugin.Upload(captureDetails, surface, out uploadUrl); + bool uploaded = _plugin.Upload(captureDetails, surface, out uploadUrl); if (uploaded) { exportInformation.Uri = uploadUrl; exportInformation.ExportMade = true; - if (config.AfterUploadLinkToClipBoard) { + if (DropboxConfig.AfterUploadLinkToClipBoard) { ClipboardHelper.SetClipboardData(uploadUrl); } } diff --git a/GreenshotDropboxPlugin/DropboxPlugin.cs b/GreenshotDropboxPlugin/DropboxPlugin.cs index d6f9ab083..9bd6115c5 100644 --- a/GreenshotDropboxPlugin/DropboxPlugin.cs +++ b/GreenshotDropboxPlugin/DropboxPlugin.cs @@ -55,9 +55,6 @@ namespace GreenshotDropboxPlugin { } } - public DropboxPlugin() { - } - public IEnumerable Destinations() { yield return new DropboxDestination(this); } @@ -123,7 +120,8 @@ namespace GreenshotDropboxPlugin { try { string dropboxUrl = null; new PleaseWaitForm().ShowAndWait(Attributes.Name, Language.GetString("dropbox", LangKey.communication_wait), - delegate() { + delegate + { string filename = Path.GetFileName(FilenameHelper.GetFilename(_config.UploadFormat, captureDetails)); dropboxUrl = DropboxUtils.UploadToDropbox(surfaceToUpload, outputSettings, filename); } diff --git a/GreenshotDropboxPlugin/DropboxUtils.cs b/GreenshotDropboxPlugin/DropboxUtils.cs index 49237374f..f8a180f4c 100644 --- a/GreenshotDropboxPlugin/DropboxUtils.cs +++ b/GreenshotDropboxPlugin/DropboxUtils.cs @@ -30,36 +30,38 @@ namespace GreenshotDropboxPlugin { /// Description of DropboxUtils. /// public class DropboxUtils { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DropboxUtils)); - private static readonly DropboxPluginConfiguration config = IniConfig.GetIniSection(); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(DropboxUtils)); + private static readonly DropboxPluginConfiguration DropboxConfig = IniConfig.GetIniSection(); private DropboxUtils() { } public static string UploadToDropbox(ISurface surfaceToUpload, SurfaceOutputSettings outputSettings, string filename) { - OAuthSession oAuth = new OAuthSession(DropBoxCredentials.CONSUMER_KEY, DropBoxCredentials.CONSUMER_SECRET); - oAuth.BrowserSize = new Size(1080, 650); - oAuth.CheckVerifier = false; - oAuth.AccessTokenUrl = "https://api.dropbox.com/1/oauth/access_token"; - oAuth.AuthorizeUrl = "https://api.dropbox.com/1/oauth/authorize"; - oAuth.RequestTokenUrl = "https://api.dropbox.com/1/oauth/request_token"; - oAuth.LoginTitle = "Dropbox authorization"; - oAuth.Token = config.DropboxToken; - oAuth.TokenSecret = config.DropboxTokenSecret; + var oAuth = new OAuthSession(DropBoxCredentials.CONSUMER_KEY, DropBoxCredentials.CONSUMER_SECRET) + { + BrowserSize = new Size(1080, 650), + CheckVerifier = false, + AccessTokenUrl = "https://api.dropbox.com/1/oauth/access_token", + AuthorizeUrl = "https://api.dropbox.com/1/oauth/authorize", + RequestTokenUrl = "https://api.dropbox.com/1/oauth/request_token", + LoginTitle = "Dropbox authorization", + Token = DropboxConfig.DropboxToken, + TokenSecret = DropboxConfig.DropboxTokenSecret + }; try { SurfaceContainer imageToUpload = new SurfaceContainer(surfaceToUpload, outputSettings, filename); string uploadResponse = oAuth.MakeOAuthRequest(HTTPMethod.POST, "https://api-content.dropbox.com/1/files_put/sandbox/" + OAuthSession.UrlEncode3986(filename), null, null, imageToUpload); - LOG.DebugFormat("Upload response: {0}", uploadResponse); + Log.DebugFormat("Upload response: {0}", uploadResponse); } catch (Exception ex) { - LOG.Error("Upload error: ", ex); + Log.Error("Upload error: ", ex); throw; } finally { if (!string.IsNullOrEmpty(oAuth.Token)) { - config.DropboxToken = oAuth.Token; + DropboxConfig.DropboxToken = oAuth.Token; } if (!string.IsNullOrEmpty(oAuth.TokenSecret)) { - config.DropboxTokenSecret = oAuth.TokenSecret; + DropboxConfig.DropboxTokenSecret = oAuth.TokenSecret; } } @@ -67,16 +69,16 @@ namespace GreenshotDropboxPlugin { try { string responseString = oAuth.MakeOAuthRequest(HTTPMethod.GET, "https://api.dropbox.com/1/shares/sandbox/" + OAuthSession.UrlEncode3986(filename), null, null, null); if (responseString != null) { - LOG.DebugFormat("Parsing output: {0}", responseString); + Log.DebugFormat("Parsing output: {0}", responseString); IDictionary returnValues = JSONHelper.JsonDecode(responseString); if (returnValues.ContainsKey("url")) { return returnValues["url"] as string; } } } catch (Exception ex) { - LOG.Error("Can't parse response.", ex); + Log.Error("Can't parse response.", ex); } return null; - } + } } } diff --git a/GreenshotDropboxPlugin/Forms/SettingsForm.cs b/GreenshotDropboxPlugin/Forms/SettingsForm.cs index 62e6bf25f..d057b10dc 100644 --- a/GreenshotDropboxPlugin/Forms/SettingsForm.cs +++ b/GreenshotDropboxPlugin/Forms/SettingsForm.cs @@ -20,16 +20,12 @@ */ using GreenshotDropboxPlugin.Forms; -using Greenshot.IniFile; namespace GreenshotDropboxPlugin { /// /// Description of PasswordRequestForm. /// public partial class SettingsForm : DropboxForm { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SettingsForm)); - private static DropboxPluginConfiguration config = IniConfig.GetIniSection(); - public SettingsForm() { // // The InitializeComponent() call is required for Windows Forms designer support. diff --git a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs index dbe2aaf20..00a306a6d 100644 --- a/GreenshotExternalCommandPlugin/SettingsFormDetail.cs +++ b/GreenshotExternalCommandPlugin/SettingsFormDetail.cs @@ -31,8 +31,8 @@ namespace ExternalCommand { /// Description of SettingsFormDetail. /// public partial class SettingsFormDetail : ExternalCommandForm { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(SettingsFormDetail)); - private static readonly ExternalCommandConfiguration config = IniConfig.GetIniSection(); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(SettingsFormDetail)); + private static readonly ExternalCommandConfiguration ExternalCommandConfig = IniConfig.GetIniSection(); private readonly string _commando; private readonly int _commandIndex; @@ -45,9 +45,9 @@ namespace ExternalCommand { if(commando != null) { textBox_name.Text = commando; - textBox_commandline.Text = config.Commandline[commando]; - textBox_arguments.Text = config.Argument[commando]; - _commandIndex = config.Commands.FindIndex(delegate(string s) { return s == commando; }); + textBox_commandline.Text = ExternalCommandConfig.Commandline[commando]; + textBox_arguments.Text = ExternalCommandConfig.Argument[commando]; + _commandIndex = ExternalCommandConfig.Commands.FindIndex(s => s == commando); } else { textBox_arguments.Text = "\"{0}\""; } @@ -59,15 +59,15 @@ namespace ExternalCommand { string commandLine = textBox_commandline.Text; string arguments = textBox_arguments.Text; if(_commando != null) { - config.Commands[_commandIndex] = commandName; - config.Commandline.Remove(_commando); - config.Commandline.Add(commandName, commandLine); - config.Argument.Remove(_commando); - config.Argument.Add(commandName, arguments); + ExternalCommandConfig.Commands[_commandIndex] = commandName; + ExternalCommandConfig.Commandline.Remove(_commando); + ExternalCommandConfig.Commandline.Add(commandName, commandLine); + ExternalCommandConfig.Argument.Remove(_commando); + ExternalCommandConfig.Argument.Add(commandName, arguments); } else { - config.Commands.Add(commandName); - config.Commandline.Add(commandName, commandLine); - config.Argument.Add(commandName, arguments); + ExternalCommandConfig.Commands.Add(commandName); + ExternalCommandConfig.Commandline.Add(commandName, commandLine); + ExternalCommandConfig.Argument.Add(commandName, arguments); } } @@ -86,8 +86,8 @@ namespace ExternalCommand { } catch (Exception ex) { - LOG.WarnFormat("Can't get the initial path via {0}", textBox_commandline.Text); - LOG.Warn("Exception: ", ex); + Log.WarnFormat("Can't get the initial path via {0}", textBox_commandline.Text); + Log.Warn("Exception: ", ex); } if(initialPath != null && Directory.Exists(initialPath)) { openFileDialog.InitialDirectory = initialPath; @@ -95,7 +95,7 @@ namespace ExternalCommand { initialPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); openFileDialog.InitialDirectory = initialPath; } - LOG.DebugFormat("Starting OpenFileDialog at {0}", initialPath); + Log.DebugFormat("Starting OpenFileDialog at {0}", initialPath); if(openFileDialog.ShowDialog() == DialogResult.OK) { textBox_commandline.Text = openFileDialog.FileName; } @@ -112,7 +112,7 @@ namespace ExternalCommand { buttonOk.Enabled = false; } // Check if commandname is unique - if(_commando == null && !string.IsNullOrEmpty(textBox_name.Text) && config.Commands.Contains(textBox_name.Text)) { + if(_commando == null && !string.IsNullOrEmpty(textBox_name.Text) && ExternalCommandConfig.Commands.Contains(textBox_name.Text)) { buttonOk.Enabled = false; textBox_name.BackColor = Color.Red; } diff --git a/GreenshotFlickrPlugin/FlickrConfiguration.cs b/GreenshotFlickrPlugin/FlickrConfiguration.cs index 3a5a53433..0d6ad0574 100644 --- a/GreenshotFlickrPlugin/FlickrConfiguration.cs +++ b/GreenshotFlickrPlugin/FlickrConfiguration.cs @@ -70,7 +70,7 @@ namespace GreenshotFlickrPlugin { /// /// bool true if OK was pressed, false if cancel public bool ShowConfigDialog() { - DialogResult result = new SettingsForm(this).ShowDialog(); + DialogResult result = new SettingsForm().ShowDialog(); if (result == DialogResult.OK) { return true; } diff --git a/GreenshotFlickrPlugin/FlickrDestination.cs b/GreenshotFlickrPlugin/FlickrDestination.cs index 9edd0befe..70778e1f7 100644 --- a/GreenshotFlickrPlugin/FlickrDestination.cs +++ b/GreenshotFlickrPlugin/FlickrDestination.cs @@ -22,27 +22,17 @@ using System.ComponentModel; using System.Drawing; using Greenshot.Plugin; using GreenshotPlugin.Core; -using log4net; namespace GreenshotFlickrPlugin { public class FlickrDestination : AbstractDestination { - private static ILog LOG = LogManager.GetLogger(typeof(FlickrDestination)); - private readonly FlickrPlugin plugin; + private readonly FlickrPlugin _plugin; public FlickrDestination(FlickrPlugin plugin) { - this.plugin = plugin; + _plugin = plugin; } - public override string Designation { - get { - return "Flickr"; - } - } + public override string Designation => "Flickr"; - public override string Description { - get { - return Language.GetString("flickr", LangKey.upload_menu_item); - } - } + public override string Description => Language.GetString("flickr", LangKey.upload_menu_item); public override Image DisplayIcon { get { @@ -53,11 +43,11 @@ namespace GreenshotFlickrPlugin { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string uploadURL; - bool uploaded = plugin.Upload(captureDetails, surface, out uploadURL); + string uploadUrl; + bool uploaded = _plugin.Upload(captureDetails, surface, out uploadUrl); if (uploaded) { exportInformation.ExportMade = true; - exportInformation.Uri = uploadURL; + exportInformation.Uri = uploadUrl; } ProcessExport(exportInformation, surface); return exportInformation; diff --git a/GreenshotFlickrPlugin/FlickrPlugin.cs b/GreenshotFlickrPlugin/FlickrPlugin.cs index ea6866ead..5533ba643 100644 --- a/GreenshotFlickrPlugin/FlickrPlugin.cs +++ b/GreenshotFlickrPlugin/FlickrPlugin.cs @@ -37,7 +37,7 @@ namespace GreenshotFlickrPlugin /// This is the Flickr base code /// public class FlickrPlugin : IGreenshotPlugin { - private static readonly ILog LOG = LogManager.GetLogger(typeof(FlickrPlugin)); + private static readonly ILog Log = LogManager.GetLogger(typeof(FlickrPlugin)); private static FlickrConfiguration _config; public static PluginAttribute Attributes; private IGreenshotHost _host; @@ -83,10 +83,12 @@ namespace GreenshotFlickrPlugin _config = IniConfig.GetIniSection(); _resources = new ComponentResourceManager(typeof(FlickrPlugin)); - _itemPlugInConfig = new ToolStripMenuItem(); - _itemPlugInConfig.Text = Language.GetString("flickr", LangKey.Configure); - _itemPlugInConfig.Tag = _host; - _itemPlugInConfig.Image = (Image)_resources.GetObject("flickr"); + _itemPlugInConfig = new ToolStripMenuItem + { + Text = Language.GetString("flickr", LangKey.Configure), + Tag = _host, + Image = (Image) _resources.GetObject("flickr") + }; _itemPlugInConfig.Click += ConfigMenuClick; PluginUtils.AddToContextMenu(_host, _itemPlugInConfig); @@ -101,7 +103,7 @@ namespace GreenshotFlickrPlugin } public virtual void Shutdown() { - LOG.Debug("Flickr Plugin shutdown."); + Log.Debug("Flickr Plugin shutdown."); } /// @@ -137,7 +139,7 @@ namespace GreenshotFlickrPlugin } return true; } catch (Exception e) { - LOG.Error("Error uploading.", e); + Log.Error("Error uploading.", e); MessageBox.Show(Language.GetString("flickr", LangKey.upload_failure) + " " + e.Message); } return false; diff --git a/GreenshotFlickrPlugin/FlickrUtils.cs b/GreenshotFlickrPlugin/FlickrUtils.cs index 0cf84a58e..00cb56ed4 100644 --- a/GreenshotFlickrPlugin/FlickrUtils.cs +++ b/GreenshotFlickrPlugin/FlickrUtils.cs @@ -57,15 +57,17 @@ namespace GreenshotFlickrPlugin { /// /// url to image public static string UploadToFlickr(ISurface surfaceToUpload, SurfaceOutputSettings outputSettings, string title, string filename) { - OAuthSession oAuth = new OAuthSession(FlickrCredentials.ConsumerKey, FlickrCredentials.ConsumerSecret); - oAuth.BrowserSize = new Size(520, 800); - oAuth.CheckVerifier = false; - oAuth.AccessTokenUrl = FLICKR_ACCESS_TOKEN_URL; - oAuth.AuthorizeUrl = FLICKR_AUTHORIZE_URL; - oAuth.RequestTokenUrl = FLICKR_REQUEST_TOKEN_URL; - oAuth.LoginTitle = "Flickr authorization"; - oAuth.Token = config.FlickrToken; - oAuth.TokenSecret = config.FlickrTokenSecret; + var oAuth = new OAuthSession(FlickrCredentials.ConsumerKey, FlickrCredentials.ConsumerSecret) + { + BrowserSize = new Size(520, 800), + CheckVerifier = false, + AccessTokenUrl = FLICKR_ACCESS_TOKEN_URL, + AuthorizeUrl = FLICKR_AUTHORIZE_URL, + RequestTokenUrl = FLICKR_REQUEST_TOKEN_URL, + LoginTitle = "Flickr authorization", + Token = config.FlickrToken, + TokenSecret = config.FlickrTokenSecret + }; if (string.IsNullOrEmpty(oAuth.Token)) { if (!oAuth.Authorize()) { return null; @@ -85,7 +87,7 @@ namespace GreenshotFlickrPlugin { signedParameters.Add("is_public", config.IsPublic ? "1" : "0"); signedParameters.Add("is_friend", config.IsFriend ? "1" : "0"); signedParameters.Add("is_family", config.IsFamily ? "1" : "0"); - signedParameters.Add("safety_level", string.Format("{0}", (int)config.SafetyLevel)); + signedParameters.Add("safety_level", $"{(int) config.SafetyLevel}"); signedParameters.Add("hidden", config.HiddenFromSearch ? "1" : "2"); IDictionary otherParameters = new Dictionary(); otherParameters.Add("photo", new SurfaceContainer(surfaceToUpload, outputSettings, filename)); @@ -125,16 +127,13 @@ namespace GreenshotFlickrPlugin { XmlNodeList nodes = doc.GetElementsByTagName("photo"); if (nodes.Count > 0) { var item = nodes.Item(0); - if (item != null) { - if (item.Attributes != null) { - string farmId = item.Attributes["farm"].Value; - string serverId = item.Attributes["server"].Value; - string photoId = item.Attributes["id"].Value; - string secret = item.Attributes["secret"].Value; - return string.Format(FLICKR_FARM_URL, farmId, serverId, photoId, secret); - } + if (item?.Attributes != null) { + string farmId = item.Attributes["farm"].Value; + string serverId = item.Attributes["server"].Value; + string photoId = item.Attributes["id"].Value; + string secret = item.Attributes["secret"].Value; + return string.Format(FLICKR_FARM_URL, farmId, serverId, photoId, secret); } - } } } catch (Exception ex) { diff --git a/GreenshotFlickrPlugin/Forms/SettingsForm.cs b/GreenshotFlickrPlugin/Forms/SettingsForm.cs index 874617db3..5c1e24551 100644 --- a/GreenshotFlickrPlugin/Forms/SettingsForm.cs +++ b/GreenshotFlickrPlugin/Forms/SettingsForm.cs @@ -26,9 +26,7 @@ namespace GreenshotFlickrPlugin { /// Description of PasswordRequestForm. /// public partial class SettingsForm : FlickrForm { - private string flickrFrob = string.Empty; - - public SettingsForm(FlickrConfiguration config) { + public SettingsForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // diff --git a/GreenshotImgurPlugin/Forms/ImgurForm.cs b/GreenshotImgurPlugin/Forms/ImgurForm.cs index f74815e2b..00d3c01fd 100644 --- a/GreenshotImgurPlugin/Forms/ImgurForm.cs +++ b/GreenshotImgurPlugin/Forms/ImgurForm.cs @@ -26,7 +26,5 @@ namespace GreenshotImgurPlugin { /// This class is needed for design-time resolving of the language files /// public class ImgurForm : GreenshotForm { - public ImgurForm() : base() { - } } } diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index e8a8d4cba..4d67ab528 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -81,8 +81,10 @@ namespace GreenshotImgurPlugin { listview_imgur_uploads.Columns.Add(column); } foreach (ImgurInfo imgurInfo in Config.runtimeImgurHistory.Values) { - ListViewItem item = new ListViewItem(imgurInfo.Hash); - item.Tag = imgurInfo; + var item = new ListViewItem(imgurInfo.Hash) + { + Tag = imgurInfo + }; item.SubItems.Add(imgurInfo.Title); item.SubItems.Add(imgurInfo.DeleteHash); item.SubItems.Add(imgurInfo.Timestamp.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo)); @@ -101,7 +103,7 @@ namespace GreenshotImgurPlugin { private void Listview_imgur_uploadsSelectedIndexChanged(object sender, EventArgs e) { pictureBox1.Image = pictureBox1.ErrorImage; - if (listview_imgur_uploads.SelectedItems != null && listview_imgur_uploads.SelectedItems.Count > 0) { + if (listview_imgur_uploads.SelectedItems.Count > 0) { deleteButton.Enabled = true; openButton.Enabled = true; clipboardButton.Enabled = true; @@ -118,25 +120,27 @@ namespace GreenshotImgurPlugin { } private void DeleteButtonClick(object sender, EventArgs e) { - if (listview_imgur_uploads.SelectedItems != null && listview_imgur_uploads.SelectedItems.Count > 0) { + if (listview_imgur_uploads.SelectedItems.Count > 0) { for (int i = 0; i < listview_imgur_uploads.SelectedItems.Count; i++) { ImgurInfo imgurInfo = (ImgurInfo)listview_imgur_uploads.SelectedItems[i].Tag; DialogResult result = MessageBox.Show(Language.GetFormattedString("imgur", LangKey.delete_question, imgurInfo.Title), Language.GetFormattedString("imgur", LangKey.delete_title, imgurInfo.Hash), MessageBoxButtons.YesNo, MessageBoxIcon.Question); - if (result == DialogResult.Yes) { - // Should fix Bug #3378699 - pictureBox1.Image = pictureBox1.ErrorImage; - try { - new PleaseWaitForm().ShowAndWait(ImgurPlugin.Attributes.Name, Language.GetString("imgur", LangKey.communication_wait), - delegate() { - ImgurUtils.DeleteImgurImage(imgurInfo); - } - ); - } catch (Exception ex) { - Log.Warn("Problem communicating with Imgur: ", ex); - } - - imgurInfo.Dispose(); + if (result != DialogResult.Yes) + { + continue; } + // Should fix Bug #3378699 + pictureBox1.Image = pictureBox1.ErrorImage; + try { + new PleaseWaitForm().ShowAndWait(ImgurPlugin.Attributes.Name, Language.GetString("imgur", LangKey.communication_wait), + delegate { + ImgurUtils.DeleteImgurImage(imgurInfo); + } + ); + } catch (Exception ex) { + Log.Warn("Problem communicating with Imgur: ", ex); + } + + imgurInfo.Dispose(); } } Redraw(); @@ -144,14 +148,11 @@ namespace GreenshotImgurPlugin { private void ClipboardButtonClick(object sender, EventArgs e) { StringBuilder links = new StringBuilder(); - if (listview_imgur_uploads.SelectedItems != null && listview_imgur_uploads.SelectedItems.Count > 0) { - for (int i = 0; i < listview_imgur_uploads.SelectedItems.Count; i++) { + if (listview_imgur_uploads.SelectedItems.Count > 0) { + for (int i = 0; i < listview_imgur_uploads.SelectedItems.Count; i++) + { ImgurInfo imgurInfo = (ImgurInfo)listview_imgur_uploads.SelectedItems[i].Tag; - if (Config.UsePageLink) { - links.AppendLine(imgurInfo.Page); - } else { - links.AppendLine(imgurInfo.Original); - } + links.AppendLine(Config.UsePageLink ? imgurInfo.Page : imgurInfo.Original); } } ClipboardHelper.SetClipboardData(links.ToString()); @@ -173,7 +174,7 @@ namespace GreenshotImgurPlugin { } private void OpenButtonClick(object sender, EventArgs e) { - if (listview_imgur_uploads.SelectedItems != null && listview_imgur_uploads.SelectedItems.Count > 0) { + if (listview_imgur_uploads.SelectedItems.Count > 0) { for (int i = 0; i < listview_imgur_uploads.SelectedItems.Count; i++) { ImgurInfo imgurInfo = (ImgurInfo)listview_imgur_uploads.SelectedItems[i].Tag; System.Diagnostics.Process.Start(imgurInfo.Page); @@ -185,11 +186,7 @@ namespace GreenshotImgurPlugin { // Determine if clicked column is already the column that is being sorted. if (e.Column == _columnSorter.SortColumn) { // Reverse the current sort direction for this column. - if (_columnSorter.Order == SortOrder.Ascending) { - _columnSorter.Order = SortOrder.Descending; - } else { - _columnSorter.Order = SortOrder.Ascending; - } + _columnSorter.Order = _columnSorter.Order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending; } else { // Set the column number that is to be sorted; default to ascending. _columnSorter.SortColumn = e.Column; diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index dcf17fbf5..e7afda70c 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -25,7 +25,8 @@ namespace GreenshotImgurPlugin { /// Description of PasswordRequestForm. /// public partial class SettingsForm : ImgurForm { - public SettingsForm(ImgurConfiguration config) : base() { + public SettingsForm(ImgurConfiguration config) + { // // The InitializeComponent() call is required for Windows Forms designer support. // @@ -35,11 +36,7 @@ namespace GreenshotImgurPlugin { ImgurUtils.LoadHistory(); - if (config.runtimeImgurHistory.Count > 0) { - historyButton.Enabled = true; - } else { - historyButton.Enabled = false; - } + historyButton.Enabled = config.runtimeImgurHistory.Count > 0; } private void ButtonHistoryClick(object sender, EventArgs e) { diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 2c010adb7..2889c9501 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -98,7 +98,7 @@ namespace GreenshotImgurPlugin { SettingsForm settingsForm = null; new PleaseWaitForm().ShowAndWait(ImgurPlugin.Attributes.Name, Language.GetString("imgur", LangKey.communication_wait), - delegate() { + delegate { settingsForm = new SettingsForm(this); } ); diff --git a/GreenshotImgurPlugin/ImgurDestination.cs b/GreenshotImgurPlugin/ImgurDestination.cs index f41425c76..030a6e81a 100644 --- a/GreenshotImgurPlugin/ImgurDestination.cs +++ b/GreenshotImgurPlugin/ImgurDestination.cs @@ -20,7 +20,6 @@ */ using System.ComponentModel; using System.Drawing; -using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; @@ -29,25 +28,15 @@ namespace GreenshotImgurPlugin { /// Description of ImgurDestination. /// public class ImgurDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurDestination)); - private static ImgurConfiguration config = IniConfig.GetIniSection(); - private readonly ImgurPlugin plugin = null; + private readonly ImgurPlugin _plugin; public ImgurDestination(ImgurPlugin plugin) { - this.plugin = plugin; + _plugin = plugin; } - public override string Designation { - get { - return "Imgur"; - } - } + public override string Designation => "Imgur"; - public override string Description { - get { - return Language.GetString("imgur", LangKey.upload_menu_item); - } - } + public override string Description => Language.GetString("imgur", LangKey.upload_menu_item); public override Image DisplayIcon { get { @@ -59,7 +48,7 @@ namespace GreenshotImgurPlugin { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadUrl; - exportInformation.ExportMade = plugin.Upload(captureDetails, surface, out uploadUrl); + exportInformation.ExportMade = _plugin.Upload(captureDetails, surface, out uploadUrl); exportInformation.Uri = uploadUrl; ProcessExport(exportInformation, surface); return exportInformation; diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index c8e66cb35..61f16a17e 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -29,7 +29,7 @@ namespace GreenshotImgurPlugin /// public class ImgurInfo : IDisposable { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurInfo)); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurInfo)); public string Hash { @@ -37,13 +37,13 @@ namespace GreenshotImgurPlugin set; } - private string deleteHash; + private string _deleteHash; public string DeleteHash { - get { return deleteHash; } + get { return _deleteHash; } set { - deleteHash = value; + _deleteHash = value; DeletePage = "https://imgur.com/delete/" + value; } } @@ -96,24 +96,17 @@ namespace GreenshotImgurPlugin set; } - private Image image; + private Image _image; public Image Image { - get { return image; } + get { return _image; } set { - if (image != null) - { - image.Dispose(); - } - image = value; + _image?.Dispose(); + _image = value; } } - public ImgurInfo() - { - } - /// /// The public accessible Dispose /// Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice @@ -133,16 +126,13 @@ namespace GreenshotImgurPlugin { if (disposing) { - if (image != null) - { - image.Dispose(); - } + _image?.Dispose(); } - image = null; + _image = null; } public static ImgurInfo ParseResponse(string response) { - LOG.Debug(response); + Log.Debug(response); // This is actually a hack for BUG-1695 // The problem is the (C) sign, we send it HTML encoded "®" to Imgur and get it HTML encoded in the XML back // Added all the encodings I found quickly, I guess these are not all... but it should fix the issue for now. @@ -161,34 +151,34 @@ namespace GreenshotImgurPlugin XmlNodeList nodes = doc.GetElementsByTagName("id"); if (nodes.Count > 0) { - imgurInfo.Hash = nodes.Item(0).InnerText; + imgurInfo.Hash = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("hash"); if (nodes.Count > 0) { - imgurInfo.Hash = nodes.Item(0).InnerText; + imgurInfo.Hash = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("deletehash"); if (nodes.Count > 0) { - imgurInfo.DeleteHash = nodes.Item(0).InnerText; + imgurInfo.DeleteHash = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("type"); if (nodes.Count > 0) { - imgurInfo.ImageType = nodes.Item(0).InnerText; + imgurInfo.ImageType = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("title"); if (nodes.Count > 0) { - imgurInfo.Title = nodes.Item(0).InnerText; + imgurInfo.Title = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("datetime"); if (nodes.Count > 0) { // Version 3 has seconds since Epoch double secondsSince; - if (double.TryParse(nodes.Item(0).InnerText, out secondsSince)) + if (double.TryParse(nodes.Item(0)?.InnerText, out secondsSince)) { var epoch = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); imgurInfo.Timestamp = epoch.AddSeconds(secondsSince).DateTime; @@ -197,37 +187,30 @@ namespace GreenshotImgurPlugin nodes = doc.GetElementsByTagName("original"); if (nodes.Count > 0) { - imgurInfo.Original = nodes.Item(0).InnerText.Replace("http:", "https:"); + imgurInfo.Original = nodes.Item(0)?.InnerText.Replace("http:", "https:"); } // Version 3 API only has Link nodes = doc.GetElementsByTagName("link"); if (nodes.Count > 0) { - imgurInfo.Original = nodes.Item(0).InnerText.Replace("http:", "https:"); + imgurInfo.Original = nodes.Item(0)?.InnerText.Replace("http:", "https:"); } nodes = doc.GetElementsByTagName("imgur_page"); if (nodes.Count > 0) { - imgurInfo.Page = nodes.Item(0).InnerText.Replace("http:", "https:"); + imgurInfo.Page = nodes.Item(0)?.InnerText.Replace("http:", "https:"); } else { // Version 3 doesn't have a page link in the response - imgurInfo.Page = string.Format("https://imgur.com/{0}", imgurInfo.Hash); + imgurInfo.Page = $"https://imgur.com/{imgurInfo.Hash}"; } nodes = doc.GetElementsByTagName("small_square"); - if (nodes.Count > 0) - { - imgurInfo.SmallSquare = nodes.Item(0).InnerText; - } - else - { - imgurInfo.SmallSquare = string.Format("http://i.imgur.com/{0}s.png",imgurInfo.Hash); - } + imgurInfo.SmallSquare = nodes.Count > 0 ? nodes.Item(0)?.InnerText : $"http://i.imgur.com/{imgurInfo.Hash}s.png"; } catch (Exception e) { - LOG.ErrorFormat("Could not parse Imgur response due to error {0}, response was: {1}", e.Message, response); + Log.ErrorFormat("Could not parse Imgur response due to error {0}, response was: {1}", e.Message, response); } return imgurInfo; } diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index 895c482fd..93b8ede40 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -61,9 +61,6 @@ namespace GreenshotImgurPlugin { } } - public ImgurPlugin() { - } - public IEnumerable Destinations() { yield return new ImgurDestination(this); } diff --git a/GreenshotJiraPlugin/JiraDestination.cs b/GreenshotJiraPlugin/JiraDestination.cs index f45859841..1b35e6fde 100644 --- a/GreenshotJiraPlugin/JiraDestination.cs +++ b/GreenshotJiraPlugin/JiraDestination.cs @@ -65,9 +65,9 @@ namespace GreenshotJiraPlugin { } } - public override bool isActive => base.isActive && !string.IsNullOrEmpty(Config.Url); + public override bool IsActive => base.IsActive && !string.IsNullOrEmpty(Config.Url); - public override bool isDynamic => true; + public override bool IsDynamic => true; public override Image DisplayIcon { get diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index b61bbe907..cf888d5d8 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -23,13 +23,10 @@ using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; using System; -using System.Drawing; -using System.Drawing.Imaging; using System.Threading.Tasks; using Dapplo.Log.Facade; using GreenshotJiraPlugin.Forms; using GreenshotPlugin.Core; -using Svg; namespace GreenshotJiraPlugin { /// diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index 5b3624460..67ef5fad9 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -316,13 +316,9 @@ namespace Greenshot.Interop { /// public override IMessage Invoke(IMessage myMessage) { IMethodCallMessage callMessage = myMessage as IMethodCallMessage; - if (null == callMessage) { - //LOG.DebugFormat("Message type not implemented: {0}", myMessage.GetType().ToString()); - return null; - } - MethodInfo method = callMessage.MethodBase as MethodInfo; - if (null == method) { + MethodInfo method = callMessage?.MethodBase as MethodInfo; + if (method == null) { //LOG.DebugFormat("Unrecognized Invoke call: {0}", callMessage.MethodBase.ToString()); return null; } @@ -336,18 +332,8 @@ namespace Greenshot.Interop { BindingFlags flags = BindingFlags.InvokeMethod; int argCount = callMessage.ArgCount; - object invokeObject; - Type invokeType; - Type byValType; - - object[] args; - object arg; - COMWrapper[] originalArgs; - COMWrapper wrapper; - ParameterModifier[] argModifiers = null; ParameterInfo[] parameters = null; - ParameterInfo parameter; if ("Dispose" == methodName && 0 == argCount && typeof(void) == returnType) { Dispose(); @@ -365,9 +351,11 @@ namespace Greenshot.Interop { return new ReturnMessage(new ArgumentNullException(nameof(handler)), callMessage); } } else { - invokeObject = _comObject; - invokeType = _comType; + var invokeObject = _comObject; + var invokeType = _comType; + ParameterInfo parameter; + object[] args; if (methodName.StartsWith("get_")) { // Property Get methodName = methodName.Substring(4); @@ -401,6 +389,9 @@ namespace Greenshot.Interop { } // Un-wrap wrapped COM objects before passing to the method + COMWrapper[] originalArgs; + COMWrapper wrapper; + Type byValType; if (null == args || 0 == args.Length) { originalArgs = null; } else { @@ -412,7 +403,7 @@ namespace Greenshot.Interop { originalArgs[i] = wrapper; args[i] = wrapper._comObject; } - } else if (0 != outArgsCount && argModifiers[0][i]) { + } else if (argModifiers != null && (0 != outArgsCount && argModifiers[0][i])) { byValType = GetByValType(parameters[i].ParameterType); if (byValType.IsInterface) { // If we're passing a COM object by reference, and @@ -453,42 +444,48 @@ namespace Greenshot.Interop { // Handle out args if (0 != outArgsCount) { - outArgs = new object[args.Length]; - for (int i = 0; i < parameters.Length; i++) { - if (!argModifiers[0][i]) { - continue; - } - - arg = args[i]; - if (null == arg) { - continue; - } - - parameter = parameters[i]; - wrapper = null; - - byValType = GetByValType(parameter.ParameterType); - if (typeof(decimal) == byValType) { - if (arg is CurrencyWrapper) { - arg = ((CurrencyWrapper)arg).WrappedObject; + if (args != null && parameters != null) + { + outArgs = new object[args.Length]; + for (int i = 0; i < parameters.Length; i++) { + if (argModifiers != null && !argModifiers[0][i]) { + continue; } - } else if (byValType.IsEnum) { - arg = Enum.Parse(byValType, arg.ToString()); - } else if (byValType.IsInterface) { - if (Marshal.IsComObject(arg)) { - wrapper = originalArgs[i]; - if (null != wrapper && wrapper._comObject != arg) { - wrapper.Dispose(); - wrapper = null; - } - if (null == wrapper) { - wrapper = new COMWrapper(arg, byValType); - } - arg = wrapper.GetTransparentProxy(); + var arg = args[i]; + if (null == arg) { + continue; } + + parameter = parameters[i]; + wrapper = null; + + byValType = GetByValType(parameter.ParameterType); + if (typeof(decimal) == byValType) { + if (arg is CurrencyWrapper) { + arg = ((CurrencyWrapper)arg).WrappedObject; + } + } else if (byValType.IsEnum) { + arg = Enum.Parse(byValType, arg.ToString()); + } else if (byValType.IsInterface) { + if (Marshal.IsComObject(arg)) { + if (originalArgs != null) + { + wrapper = originalArgs[i]; + } + if (null != wrapper && wrapper._comObject != arg) { + wrapper.Dispose(); + wrapper = null; + } + + if (null == wrapper) { + wrapper = new COMWrapper(arg, byValType); + } + arg = wrapper.GetTransparentProxy(); + } + } + outArgs[i] = arg; } - outArgs[i] = arg; } } } diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 9f806c679..893db2fcb 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -24,10 +24,8 @@ namespace Greenshot.Interop { /// /// An attribute to specifiy the ProgID of the COM class to create. (As suggested by Kristen Wegner) /// - [AttributeUsage(AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] + [AttributeUsage(AttributeTargets.Interface)] public sealed class ComProgIdAttribute : Attribute { - private readonly string _value; - /// /// Extracts the attribute from the specified type. /// @@ -42,24 +40,24 @@ namespace Greenshot.Interop { /// public static ComProgIdAttribute GetAttribute(Type interfaceType) { if (null == interfaceType) { - throw new ArgumentNullException("interfaceType"); + throw new ArgumentNullException(nameof(interfaceType)); } Type attributeType = typeof(ComProgIdAttribute); object[] attributes = interfaceType.GetCustomAttributes(attributeType, false); - if (null == attributes || 0 == attributes.Length) { + if (0 == attributes.Length) { Type[] interfaces = interfaceType.GetInterfaces(); for (int i = 0; i < interfaces.Length; i++) { interfaceType = interfaces[i]; attributes = interfaceType.GetCustomAttributes(attributeType, false); - if (null != attributes && 0 != attributes.Length) { + if (0 != attributes.Length) { break; } } } - if (null == attributes || 0 == attributes.Length) { + if (0 == attributes.Length) { return null; } return (ComProgIdAttribute)attributes[0]; @@ -68,16 +66,12 @@ namespace Greenshot.Interop { /// Constructor /// The COM ProgID. public ComProgIdAttribute(string value) { - _value = value; + Value = value; } /// /// Returns the COM ProgID /// - public string Value { - get { - return _value; - } - } + public string Value { get; } } } diff --git a/GreenshotOCRPlugin/OCRDestination.cs b/GreenshotOCRPlugin/OCRDestination.cs index d5388ee84..69503cc3b 100644 --- a/GreenshotOCRPlugin/OCRDestination.cs +++ b/GreenshotOCRPlugin/OCRDestination.cs @@ -20,7 +20,6 @@ */ using System.Drawing; using System.IO; -using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; @@ -29,23 +28,11 @@ namespace GreenshotOCR { /// Description of OCRDestination. /// public class OCRDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OCRDestination)); - private static OCRConfiguration config = IniConfig.GetIniSection(); - private const int MIN_WIDTH = 130; - private const int MIN_HEIGHT = 130; - private readonly OcrPlugin plugin; + private readonly OcrPlugin _plugin; - public override string Designation { - get { - return "OCR"; - } - } + public override string Designation => "OCR"; - public override string Description { - get { - return "OCR"; - } - } + public override string Description => "OCR"; public override Image DisplayIcon { get { @@ -58,12 +45,14 @@ namespace GreenshotOCR { } public OCRDestination(OcrPlugin plugin) { - this.plugin = plugin; + _plugin = plugin; } public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(Designation, Description); - exportInformation.ExportMade = plugin.DoOCR(surface) != null; + ExportInformation exportInformation = new ExportInformation(Designation, Description) + { + ExportMade = _plugin.DoOcr(surface) != null + }; return exportInformation; } } diff --git a/GreenshotOCRPlugin/OCRForm.cs b/GreenshotOCRPlugin/OCRForm.cs index 9be31a48e..468b31bac 100644 --- a/GreenshotOCRPlugin/OCRForm.cs +++ b/GreenshotOCRPlugin/OCRForm.cs @@ -25,8 +25,6 @@ namespace GreenshotOCR { /// /// This class is needed for design-time resolving of the language files /// - public class OCRForm : GreenshotForm { - public OCRForm() : base() { - } + public class OcrForm : GreenshotForm { } } diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 745003da4..65ae39723 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -27,6 +27,7 @@ using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; using Greenshot.Core; +using GreenshotPlugin.Effects; //using Microsoft.Win32; @@ -60,13 +61,11 @@ namespace GreenshotOCR { /// OCR Plugin Greenshot /// public class OcrPlugin : IGreenshotPlugin { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OcrPlugin)); - private const string CONFIG_FILENAME = "ocr-config.properties"; - private string OCR_COMMAND; - private static IGreenshotHost host; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(OcrPlugin)); + private string _ocrCommand; private static OCRConfiguration config; - private PluginAttribute myAttributes; - private ToolStripMenuItem ocrMenuItem = new ToolStripMenuItem(); + private PluginAttribute _myAttributes; + private ToolStripMenuItem _ocrMenuItem = new ToolStripMenuItem(); public void Dispose() { Dispose(true); @@ -75,15 +74,13 @@ namespace GreenshotOCR { protected virtual void Dispose(bool disposing) { if (disposing) { - if (ocrMenuItem != null) { - ocrMenuItem.Dispose(); - ocrMenuItem = null; + if (_ocrMenuItem != null) { + _ocrMenuItem.Dispose(); + _ocrMenuItem = null; } } } - public OcrPlugin() { } - public IEnumerable Destinations() { yield return new OCRDestination(this); } @@ -98,14 +95,18 @@ namespace GreenshotOCR { /// My own attributes /// true if plugin is initialized, false if not (doesn't show) public virtual bool Initialize(IGreenshotHost greenshotHost, PluginAttribute myAttributes) { - LOG.Debug("Initialize called of " + myAttributes.Name); - host = greenshotHost; - this.myAttributes = myAttributes; - - OCR_COMMAND = Path.Combine(Path.GetDirectoryName(myAttributes.DllFile), "greenshotocrcommand.exe"); + Log.Debug("Initialize called of " + myAttributes.Name); + _myAttributes = myAttributes; - if (!HasMODI()) { - LOG.Warn("No MODI found!"); + var ocrDirectory = Path.GetDirectoryName(myAttributes.DllFile); + if (ocrDirectory == null) + { + return false; + } + _ocrCommand = Path.Combine(ocrDirectory, "greenshotocrcommand.exe"); + + if (!HasModi()) { + Log.Warn("No MODI found!"); return false; } // Load configuration @@ -121,14 +122,14 @@ namespace GreenshotOCR { /// Implementation of the IGreenshotPlugin.Shutdown /// public void Shutdown() { - LOG.Debug("Shutdown of " + myAttributes.Name); + Log.Debug("Shutdown of " + _myAttributes.Name); } /// /// Implementation of the IPlugin.Configure /// public virtual void Configure() { - if (!HasMODI()) { + if (!HasModi()) { MessageBox.Show("Sorry, is seems that Microsoft Office Document Imaging (MODI) is not installed, therefor the OCR Plugin cannot work."); return; } @@ -141,62 +142,68 @@ namespace GreenshotOCR { } + private const int MinWidth = 130; + private const int MinHeight = 130; /// /// 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; - public string DoOCR(ISurface surface) { - string filePath = null; - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(OutputFormat.bmp, 0, true); - outputSettings.ReduceColors = true; + /// Has the Image and the capture details + public string DoOcr(ISurface surface) { + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(OutputFormat.bmp, 0, true) + { + ReduceColors = true, + SaveBackgroundOnly = true + }; // We only want the background - outputSettings.SaveBackgroundOnly = true; // Force Grayscale output outputSettings.Effects.Add(new GrayscaleEffect()); // Also we need to check the size, resize if needed to 130x130 this is the minimum - if (surface.Image.Width < MIN_WIDTH || surface.Image.Height < MIN_HEIGHT) { - int addedWidth = MIN_WIDTH - surface.Image.Width; + if (surface.Image.Width < MinWidth || surface.Image.Height < MinHeight) { + int addedWidth = MinWidth - surface.Image.Width; if (addedWidth < 0) { addedWidth = 0; } - int addedHeight = MIN_HEIGHT - surface.Image.Height; + int addedHeight = MinHeight - surface.Image.Height; if (addedHeight < 0) { addedHeight = 0; } IEffect effect = new ResizeCanvasEffect(addedWidth / 2, addedWidth / 2, addedHeight / 2, addedHeight / 2); outputSettings.Effects.Add(effect); } - filePath = ImageOutput.SaveToTmpFile(surface, outputSettings, null); + var filePath = ImageOutput.SaveToTmpFile(surface, outputSettings, null); - LOG.Debug("Saved tmp file to: " + filePath); + Log.Debug("Saved tmp file to: " + filePath); string text = ""; try { - ProcessStartInfo processStartInfo = new ProcessStartInfo(OCR_COMMAND, "\"" + filePath + "\" " + config.Language + " " + config.Orientimage + " " + config.StraightenImage); - processStartInfo.CreateNoWindow = true; - processStartInfo.RedirectStandardOutput = true; - processStartInfo.UseShellExecute = false; + ProcessStartInfo processStartInfo = new ProcessStartInfo(_ocrCommand, "\"" + filePath + "\" " + config.Language + " " + config.Orientimage + " " + config.StraightenImage) + { + CreateNoWindow = true, + RedirectStandardOutput = true, + UseShellExecute = false + }; using (Process process = Process.Start(processStartInfo)) { - process.WaitForExit(30 * 1000); - if (process.ExitCode == 0) { - text = process.StandardOutput.ReadToEnd(); + if (process != null) + { + process.WaitForExit(30 * 1000); + if (process.ExitCode == 0) { + text = process.StandardOutput.ReadToEnd(); + } } } } catch (Exception e) { - LOG.Error("Error while calling Microsoft Office Document Imaging (MODI) to OCR: ", e); + Log.Error("Error while calling Microsoft Office Document Imaging (MODI) to OCR: ", e); } finally { if (File.Exists(filePath)) { - LOG.Debug("Cleaning up tmp file: " + filePath); + Log.Debug("Cleaning up tmp file: " + filePath); File.Delete(filePath); } } - if (text == null || text.Trim().Length == 0) { - LOG.Info("No text returned"); + if (string.IsNullOrEmpty(text)) { + Log.Info("No text returned"); return null; } @@ -204,27 +211,30 @@ namespace GreenshotOCR { text = text.Trim(); try { - LOG.DebugFormat("Pasting OCR Text to Clipboard: {0}", text); + Log.DebugFormat("Pasting OCR Text to Clipboard: {0}", text); // 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) { - LOG.Error("Problem pasting text to clipboard: ", e); + Log.Error("Problem pasting text to clipboard: ", e); } return text; } - private bool HasMODI() { + private bool HasModi() { try { - using (Process process = Process.Start(OCR_COMMAND, "-c")) { - process.WaitForExit(); - return process.ExitCode == 0; + using (Process process = Process.Start(_ocrCommand, "-c")) { + if (process != null) + { + process.WaitForExit(); + return process.ExitCode == 0; + } } } catch(Exception e) { - LOG.DebugFormat("Error trying to initiate MODI: {0}", e.Message); + Log.DebugFormat("Error trying to initiate MODI: {0}", e.Message); } - LOG.InfoFormat("No Microsoft Office Document Imaging (MODI) found, disabling OCR"); + Log.InfoFormat("No Microsoft Office Document Imaging (MODI) found, disabling OCR"); return false; } } diff --git a/GreenshotOCRPlugin/SettingsForm.cs b/GreenshotOCRPlugin/SettingsForm.cs index 871da209e..e63ca4eb2 100644 --- a/GreenshotOCRPlugin/SettingsForm.cs +++ b/GreenshotOCRPlugin/SettingsForm.cs @@ -24,7 +24,7 @@ namespace GreenshotOCR { /// /// Description of SettingsForm. /// - public partial class SettingsForm : OCRForm { + public partial class SettingsForm : OcrForm { private readonly OCRConfiguration config; public SettingsForm(string [] languages, OCRConfiguration config) { diff --git a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs index 2da9e79fc..caa0bc37a 100644 --- a/GreenshotOfficePlugin/Destinations/ExcelDestination.cs +++ b/GreenshotOfficePlugin/Destinations/ExcelDestination.cs @@ -32,18 +32,17 @@ namespace GreenshotOfficePlugin { /// Description of PowerpointDestination. /// public class ExcelDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExcelDestination)); - private const int ICON_APPLICATION = 0; - private const int ICON_WORKBOOK = 1; - private static readonly string exePath = null; - private readonly string workbookName = null; + private const int IconApplication = 0; + private const int IconWorkbook = 1; + private static readonly string ExePath; + private readonly string _workbookName; static ExcelDestination() { - exePath = PluginUtils.GetExePath("EXCEL.EXE"); - if (exePath != null && File.Exists(exePath)) { + ExePath = PluginUtils.GetExePath("EXCEL.EXE"); + if (ExePath != null && File.Exists(ExePath)) { WindowDetails.AddProcessToExcludeFromFreeze("excel"); } else { - exePath = null; + ExePath = null; } } @@ -51,51 +50,20 @@ namespace GreenshotOfficePlugin { } public ExcelDestination(string workbookName) { - this.workbookName = workbookName; + _workbookName = workbookName; } - public override string Designation { - get { - return "Excel"; - } - } + public override string Designation => "Excel"; - public override string Description { - get { - if (workbookName == null) { - return "Microsoft Excel"; - } else { - return workbookName; - } - } - } + public override string Description => _workbookName ?? "Microsoft Excel"; - public override int Priority { - get { - return 5; - } - } - - public override bool isDynamic { - get { - return true; - } - } + public override int Priority => 5; - public override bool isActive { - get { - return base.isActive && exePath != null; - } - } + public override bool IsDynamic => true; - public override Image DisplayIcon { - get { - if (!string.IsNullOrEmpty(workbookName)) { - return PluginUtils.GetCachedExeIcon(exePath, ICON_WORKBOOK); - } - return PluginUtils.GetCachedExeIcon(exePath, ICON_APPLICATION); - } - } + public override bool IsActive => base.IsActive && ExePath != null; + + public override Image DisplayIcon => PluginUtils.GetCachedExeIcon(ExePath, !string.IsNullOrEmpty(_workbookName) ? IconWorkbook : IconApplication); public override IEnumerable DynamicDestinations() { foreach (string workbookName in ExcelExporter.GetWorkbooks()) { @@ -111,8 +79,8 @@ namespace GreenshotOfficePlugin { imageFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); createdFile = true; } - if (workbookName != null) { - ExcelExporter.InsertIntoExistingWorkbook(workbookName, imageFile, surface.Image.Size); + if (_workbookName != null) { + ExcelExporter.InsertIntoExistingWorkbook(_workbookName, imageFile, surface.Image.Size); } else { ExcelExporter.InsertIntoNewWorkbook(imageFile, surface.Image.Size); } diff --git a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs index a6656c3f3..e6b677596 100644 --- a/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OneNoteDestination.cs @@ -32,8 +32,8 @@ namespace GreenshotOfficePlugin { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordDestination)); private const int ICON_APPLICATION = 0; public const string DESIGNATION = "OneNote"; - private static readonly string exePath = null; - private readonly OneNotePage page = null; + private static readonly string exePath; + private readonly OneNotePage page; static OneNoteDestination() { exePath = PluginUtils.GetExePath("ONENOTE.EXE"); @@ -74,15 +74,15 @@ namespace GreenshotOfficePlugin { } } - public override bool isDynamic { + public override bool IsDynamic { get { return true; } } - public override bool isActive { + public override bool IsActive { get { - return base.isActive && exePath != null; + return base.IsActive && exePath != null; } } diff --git a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs index 6c8c81848..6474eb844 100644 --- a/GreenshotOfficePlugin/Destinations/OutlookDestination.cs +++ b/GreenshotOfficePlugin/Destinations/OutlookDestination.cs @@ -34,31 +34,30 @@ namespace GreenshotOfficePlugin { /// Description of OutlookDestination. /// public class OutlookDestination : AbstractDestination { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OutlookDestination)); - private const int ICON_APPLICATION = 0; - private const int ICON_MEETING = 2; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(OutlookDestination)); + private const int IconApplication = 0; + private const int IconMeeting = 2; - private static readonly Image mailIcon = GreenshotResources.getImage("Email.Image"); - private static readonly OfficeConfiguration conf = IniConfig.GetIniSection(); - private static readonly string exePath = null; - private static readonly bool isActiveFlag = false; - private static readonly string mapiClient = "Microsoft Outlook"; - public const string DESIGNATION = "Outlook"; - private readonly string outlookInspectorCaption; - private readonly OlObjectClass outlookInspectorType; + private static readonly Image MailIcon = GreenshotResources.getImage("Email.Image"); + private static readonly OfficeConfiguration OfficeConfig = IniConfig.GetIniSection(); + private static readonly string ExePath; + private static readonly bool IsActiveFlag; + private const string MapiClient = "Microsoft Outlook"; + private readonly string _outlookInspectorCaption; + private readonly OlObjectClass _outlookInspectorType; static OutlookDestination() { if (EmailConfigHelper.HasOutlook()) { - isActiveFlag = true; + IsActiveFlag = true; } - exePath = PluginUtils.GetExePath("OUTLOOK.EXE"); - if (exePath != null && File.Exists(exePath)) { + ExePath = PluginUtils.GetExePath("OUTLOOK.EXE"); + if (ExePath != null && File.Exists(ExePath)) { WindowDetails.AddProcessToExcludeFromFreeze("outlook"); } else { - exePath = null; + ExePath = null; } - if (exePath == null) { - isActiveFlag = false; + if (ExePath == null) { + IsActiveFlag = false; } } @@ -66,62 +65,34 @@ namespace GreenshotOfficePlugin { } public OutlookDestination(string outlookInspectorCaption, OlObjectClass outlookInspectorType) { - this.outlookInspectorCaption = outlookInspectorCaption; - this.outlookInspectorType = outlookInspectorType; + _outlookInspectorCaption = outlookInspectorCaption; + _outlookInspectorType = outlookInspectorType; } - public override string Designation { - get { - return DESIGNATION; - } - } + public override string Designation => "Outlook"; - public override string Description { - get { - if (outlookInspectorCaption == null) { - return mapiClient; - } else { - return outlookInspectorCaption; - } - } - } + public override string Description => _outlookInspectorCaption ?? MapiClient; - public override int Priority { - get { - return 3; - } - } + public override int Priority => 3; - public override bool isActive { - get { - return base.isActive && isActiveFlag; - } - } + public override bool IsActive => base.IsActive && IsActiveFlag; - public override bool isDynamic { - get { - return true; - } - } + public override bool IsDynamic => true; - public override Keys EditorShortcutKeys { - get { - return Keys.Control | Keys.E; - } - } + public override Keys EditorShortcutKeys => Keys.Control | Keys.E; public override Image DisplayIcon { - get { - if (outlookInspectorCaption != null) { - if (OlObjectClass.olAppointment.Equals(outlookInspectorType)) { - // Make sure we loaded the icon, maybe the configuration has been changed! - return PluginUtils.GetCachedExeIcon(exePath, ICON_MEETING); - } else { - return mailIcon; - } - } else { - return PluginUtils.GetCachedExeIcon(exePath, ICON_APPLICATION); + get + { + if (_outlookInspectorCaption == null) + { + return PluginUtils.GetCachedExeIcon(ExePath, IconApplication); } + if (OlObjectClass.olAppointment.Equals(_outlookInspectorType)) { + // Make sure we loaded the icon, maybe the configuration has been changed! + return PluginUtils.GetCachedExeIcon(ExePath, IconMeeting); + } + return MailIcon; } } @@ -148,7 +119,7 @@ namespace GreenshotOfficePlugin { if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); } else { - LOG.InfoFormat("Using already available file: {0}", tmpFile); + Log.InfoFormat("Using already available file: {0}", tmpFile); } // Create a attachment name for the image @@ -163,15 +134,17 @@ namespace GreenshotOfficePlugin { // Make sure it's "clean" so it doesn't corrupt the header attachmentName = Regex.Replace(attachmentName, @"[^\x20\d\w]", ""); - if (outlookInspectorCaption != null) { - OutlookEmailExporter.ExportToInspector(outlookInspectorCaption, tmpFile, attachmentName); + if (_outlookInspectorCaption != null) { + OutlookEmailExporter.ExportToInspector(_outlookInspectorCaption, tmpFile, attachmentName); exportInformation.ExportMade = true; } else { if (!manuallyInitiated) { - IDictionary inspectorCaptions = OutlookEmailExporter.RetrievePossibleTargets(); + var inspectorCaptions = OutlookEmailExporter.RetrievePossibleTargets(); if (inspectorCaptions != null && inspectorCaptions.Count > 0) { - List destinations = new List(); - destinations.Add(new OutlookDestination()); + var destinations = new List + { + new OutlookDestination() + }; foreach (string inspectorCaption in inspectorCaptions.Keys) { destinations.Add(new OutlookDestination(inspectorCaption, inspectorCaptions[inspectorCaption])); } @@ -179,7 +152,7 @@ namespace GreenshotOfficePlugin { return ShowPickerMenu(false, surface, captureDetails, destinations); } } else { - exportInformation.ExportMade = OutlookEmailExporter.ExportToOutlook(conf.OutlookEmailFormat, tmpFile, FilenameHelper.FillPattern(conf.EmailSubjectPattern, captureDetails, false), attachmentName, conf.EmailTo, conf.EmailCC, conf.EmailBCC, null); + exportInformation.ExportMade = OutlookEmailExporter.ExportToOutlook(OfficeConfig.OutlookEmailFormat, tmpFile, FilenameHelper.FillPattern(OfficeConfig.EmailSubjectPattern, captureDetails, false), attachmentName, OfficeConfig.EmailTo, OfficeConfig.EmailCC, OfficeConfig.EmailBCC, null); } } ProcessExport(exportInformation, surface); diff --git a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs index 9adeb0a2c..6ab1e1a54 100644 --- a/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs +++ b/GreenshotOfficePlugin/Destinations/PowerpointDestination.cs @@ -32,19 +32,18 @@ namespace GreenshotOfficePlugin { /// Description of PowerpointDestination. /// public class PowerpointDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PowerpointDestination)); - private const int ICON_APPLICATION = 0; - private const int ICON_PRESENTATION = 1; + private const int IconApplication = 0; + private const int IconPresentation = 1; - private static readonly string exePath = null; - private readonly string presentationName = null; + private static readonly string ExePath; + private readonly string _presentationName; static PowerpointDestination() { - exePath = PluginUtils.GetExePath("POWERPNT.EXE"); - if (exePath != null && File.Exists(exePath)) { + ExePath = PluginUtils.GetExePath("POWERPNT.EXE"); + if (ExePath != null && File.Exists(ExePath)) { WindowDetails.AddProcessToExcludeFromFreeze("powerpnt"); } else { - exePath = null; + ExePath = null; } } @@ -52,50 +51,34 @@ namespace GreenshotOfficePlugin { } public PowerpointDestination(string presentationName) { - this.presentationName = presentationName; + _presentationName = presentationName; } - public override string Designation { - get { - return "Powerpoint"; - } - } + public override string Designation => "Powerpoint"; public override string Description { - get { - if (presentationName == null) { + get + { + if (_presentationName == null) { return "Microsoft Powerpoint"; - } else { - return presentationName; } + return _presentationName; } } - public override int Priority { - get { - return 4; - } - } - - public override bool isDynamic { - get { - return true; - } - } + public override int Priority => 4; - public override bool isActive { - get { - return base.isActive && exePath != null; - } - } + public override bool IsDynamic => true; + + public override bool IsActive => base.IsActive && ExePath != null; public override Image DisplayIcon { get { - if (!string.IsNullOrEmpty(presentationName)) { - return PluginUtils.GetCachedExeIcon(exePath, ICON_PRESENTATION); + if (!string.IsNullOrEmpty(_presentationName)) { + return PluginUtils.GetCachedExeIcon(ExePath, IconPresentation); } - return PluginUtils.GetCachedExeIcon(exePath, ICON_APPLICATION); + return PluginUtils.GetCachedExeIcon(ExePath, IconApplication); } } @@ -113,14 +96,13 @@ namespace GreenshotOfficePlugin { tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); imageSize = surface.Image.Size; } - if (presentationName != null) { - exportInformation.ExportMade = PowerpointExporter.ExportToPresentation(presentationName, tmpFile, imageSize, captureDetails.Title); + if (_presentationName != null) { + exportInformation.ExportMade = PowerpointExporter.ExportToPresentation(_presentationName, tmpFile, imageSize, captureDetails.Title); } else { if (!manuallyInitiated) { - List presentations = PowerpointExporter.GetPowerpointPresentations(); + var presentations = PowerpointExporter.GetPowerpointPresentations(); if (presentations != null && presentations.Count > 0) { - List destinations = new List(); - destinations.Add(new PowerpointDestination()); + var destinations = new List {new PowerpointDestination()}; foreach (string presentation in presentations) { destinations.Add(new PowerpointDestination(presentation)); } diff --git a/GreenshotOfficePlugin/Destinations/WordDestination.cs b/GreenshotOfficePlugin/Destinations/WordDestination.cs index 68cbacf79..989dd0626 100644 --- a/GreenshotOfficePlugin/Destinations/WordDestination.cs +++ b/GreenshotOfficePlugin/Destinations/WordDestination.cs @@ -33,16 +33,16 @@ namespace GreenshotOfficePlugin { /// Description of EmailDestination. /// public class WordDestination : AbstractDestination { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordDestination)); - private const int ICON_APPLICATION = 0; - private const int ICON_DOCUMENT = 1; - private static readonly string exePath = null; - private readonly string documentCaption = null; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(WordDestination)); + private const int IconApplication = 0; + private const int IconDocument = 1; + private static readonly string ExePath; + private readonly string _documentCaption; static WordDestination() { - exePath = PluginUtils.GetExePath("WINWORD.EXE"); - if (exePath != null && !File.Exists(exePath)) { - exePath = null; + ExePath = PluginUtils.GetExePath("WINWORD.EXE"); + if (ExePath != null && !File.Exists(ExePath)) { + ExePath = null; } } @@ -51,51 +51,20 @@ namespace GreenshotOfficePlugin { } public WordDestination(string wordCaption) { - documentCaption = wordCaption; + _documentCaption = wordCaption; } - public override string Designation { - get { - return "Word"; - } - } + public override string Designation => "Word"; - public override string Description { - get { - if (documentCaption == null) { - return "Microsoft Word"; - } else { - return documentCaption; - } - } - } + public override string Description => _documentCaption ?? "Microsoft Word"; - public override int Priority { - get { - return 4; - } - } - - public override bool isDynamic { - get { - return true; - } - } + public override int Priority => 4; - public override bool isActive { - get { - return base.isActive && exePath != null; - } - } + public override bool IsDynamic => true; - public override Image DisplayIcon { - get { - if (!string.IsNullOrEmpty(documentCaption)) { - return PluginUtils.GetCachedExeIcon(exePath, ICON_DOCUMENT); - } - return PluginUtils.GetCachedExeIcon(exePath, ICON_APPLICATION); - } - } + public override bool IsActive => base.IsActive && ExePath != null; + + public override Image DisplayIcon => PluginUtils.GetCachedExeIcon(ExePath, !string.IsNullOrEmpty(_documentCaption) ? IconDocument : IconApplication); public override IEnumerable DynamicDestinations() { foreach (string wordCaption in WordExporter.GetWordDocuments()) { @@ -109,26 +78,28 @@ namespace GreenshotOfficePlugin { if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); } - if (documentCaption != null) { + if (_documentCaption != null) { try { - WordExporter.InsertIntoExistingDocument(documentCaption, tmpFile); + WordExporter.InsertIntoExistingDocument(_documentCaption, tmpFile); exportInformation.ExportMade = true; } catch (Exception) { try { - WordExporter.InsertIntoExistingDocument(documentCaption, tmpFile); + WordExporter.InsertIntoExistingDocument(_documentCaption, tmpFile); exportInformation.ExportMade = true; } catch (Exception ex) { - LOG.Error(ex); + Log.Error(ex); // TODO: Change to general logic in ProcessExport surface.SendMessageEvent(this, SurfaceMessageTyp.Error, Language.GetFormattedString("destination_exportfailed", Description)); } } } else { if (!manuallyInitiated) { - List documents = WordExporter.GetWordDocuments(); + var documents = WordExporter.GetWordDocuments(); if (documents != null && documents.Count > 0) { - List destinations = new List(); - destinations.Add(new WordDestination()); + var destinations = new List + { + new WordDestination() + }; foreach (string document in documents) { destinations.Add(new WordDestination(document)); } @@ -145,7 +116,7 @@ namespace GreenshotOfficePlugin { WordExporter.InsertIntoNewDocument(tmpFile, null, null); exportInformation.ExportMade = true; } catch (Exception ex) { - LOG.Error(ex); + Log.Error(ex); // TODO: Change to general logic in ProcessExport surface.SendMessageEvent(this, SurfaceMessageTyp.Error, Language.GetFormattedString("destination_exportfailed", Description)); } diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 7bcd88497..74fc732a0 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -22,14 +22,11 @@ using System; using System.Collections.Generic; using System.Reflection; using System.Drawing; -using GreenshotOfficePlugin; -using Greenshot.IniFile; namespace Greenshot.Interop.Office { public class ExcelExporter { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ExcelExporter)); - private static readonly OfficeConfiguration officeConfiguration = IniConfig.GetIniSection(); - private static Version excelVersion; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ExcelExporter)); + private static Version _excelVersion; /// /// Get all currently opened workbooks @@ -60,6 +57,7 @@ namespace Greenshot.Interop.Office { /// /// /// + /// public static void InsertIntoExistingWorkbook(string workbookName, string tmpFile, Size imageSize) { using (IExcelApplication excelApplication = GetExcelApplication()) { if (excelApplication == null) { @@ -147,16 +145,16 @@ namespace Greenshot.Interop.Office { /// /// private static void InitializeVariables(IExcelApplication excelApplication) { - if (excelApplication == null || excelVersion != null) { + if (excelApplication == null || _excelVersion != null) { return; } try { - excelVersion = new Version(excelApplication.Version); - LOG.InfoFormat("Using Excel {0}", excelVersion); + _excelVersion = new Version(excelApplication.Version); + Log.InfoFormat("Using Excel {0}", _excelVersion); } catch (Exception exVersion) { - LOG.Error(exVersion); - LOG.Warn("Assuming Excel version 1997."); - excelVersion = new Version((int)OfficeVersion.OFFICE_97, 0, 0, 0); + Log.Error(exVersion); + Log.Warn("Assuming Excel version 1997."); + _excelVersion = new Version((int)OfficeVersion.OFFICE_97, 0, 0, 0); } } } diff --git a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs index aed3eea01..68619db38 100644 --- a/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OneNoteExporter.cs @@ -30,11 +30,10 @@ using System.Xml; namespace Greenshot.Interop.Office { public class OneNoteExporter { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OneNoteExporter)); - private const string XML_IMAGE_CONTENT = "{0}"; - private const string XML_OUTLINE = "{0}"; - private const string ONENOTE_NAMESPACE_2007 = "http://schemas.microsoft.com/office/onenote/2007/onenote"; - private const string ONENOTE_NAMESPACE_2010 = "http://schemas.microsoft.com/office/onenote/2010/onenote"; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(OneNoteExporter)); + private const string XmlImageContent = "{0}"; + private const string XmlOutline = "{0}"; + private const string OnenoteNamespace2010 = "http://schemas.microsoft.com/office/onenote/2010/onenote"; /// /// Create a new page in the "unfiled notes section", with the title of the capture, and export the capture there. @@ -44,10 +43,10 @@ namespace Greenshot.Interop.Office { public static bool ExportToNewPage(ISurface surfaceToUpload) { using(IOneNoteApplication oneNoteApplication = COMWrapper.GetOrCreateInstance()) { OneNotePage newPage = new OneNotePage(); - string unfiledNotesSectionID = GetSectionID(oneNoteApplication, SpecialLocation.slUnfiledNotesSection); - if(unfiledNotesSectionID != null) { - string pageId = ""; - oneNoteApplication.CreateNewPage(unfiledNotesSectionID, out pageId, NewPageStyle.npsDefault); + string unfiledNotesSectionId = GetSectionId(oneNoteApplication, SpecialLocation.slUnfiledNotesSection); + if(unfiledNotesSectionId != null) { + string pageId; + oneNoteApplication.CreateNewPage(unfiledNotesSectionId, out pageId, NewPageStyle.npsDefault); newPage.ID = pageId; // Set the new name, this is automatically done in the export to page newPage.Name = surfaceToUpload.CaptureDetails.Title; @@ -57,30 +56,6 @@ namespace Greenshot.Interop.Office { return false; } - /// - /// Can be used to change the title of a page - /// - /// - /// - /// - private static void UpdatePageTitle(IOneNoteApplication oneNoteApplication, string pageId, string title) { - try { - string pageXML = ""; - oneNoteApplication.GetPageContent(pageId, out pageXML, PageInfo.piAll, XMLSchema.xsCurrent); - XmlDocument doc = new XmlDocument(); - doc.LoadXml(pageXML); - XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable); - namespaceManager.AddNamespace("one", ONENOTE_NAMESPACE_2010); - - doc.SelectSingleNode("//one:T", namespaceManager).InnerText = title; - // Update the page - oneNoteApplication.UpdatePageContent(doc.OuterXml, DateTime.MinValue, XMLSchema.xs2010, true); - - } catch(Exception ex) { - LOG.Warn("Couldn't set page title.", ex); - } - } - /// /// Export the capture to the specified page /// @@ -108,14 +83,14 @@ namespace Greenshot.Interop.Office { SurfaceOutputSettings pngOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); ImageOutput.SaveToStream(surfaceToUpload, pngStream, pngOutputSettings); string base64String = Convert.ToBase64String(pngStream.GetBuffer()); - string imageXmlStr = string.Format(XML_IMAGE_CONTENT, base64String, surfaceToUpload.Image.Width, surfaceToUpload.Image.Height); - string pageChangesXml = string.Format(XML_OUTLINE, new object[] { imageXmlStr, page.ID, ONENOTE_NAMESPACE_2010, page.Name }); - LOG.InfoFormat("Sending XML: {0}", pageChangesXml); + string imageXmlStr = string.Format(XmlImageContent, base64String, surfaceToUpload.Image.Width, surfaceToUpload.Image.Height); + string pageChangesXml = string.Format(XmlOutline, imageXmlStr, page.ID, OnenoteNamespace2010, page.Name); + Log.InfoFormat("Sending XML: {0}", pageChangesXml); oneNoteApplication.UpdatePageContent(pageChangesXml, DateTime.MinValue, XMLSchema.xs2010, false); try { oneNoteApplication.NavigateTo(page.ID, null, false); } catch(Exception ex) { - LOG.Warn("Unable to navigate to the target page", ex); + Log.Warn("Unable to navigate to the target page", ex); } return true; } @@ -127,17 +102,17 @@ namespace Greenshot.Interop.Office { /// /// SpecialLocation /// string with section ID - private static string GetSectionID(IOneNoteApplication oneNoteApplication, SpecialLocation specialLocation) { + private static string GetSectionId(IOneNoteApplication oneNoteApplication, SpecialLocation specialLocation) { if(oneNoteApplication == null) { return null; } - string unfiledNotesPath = ""; + string unfiledNotesPath; oneNoteApplication.GetSpecialLocation(specialLocation, out unfiledNotesPath); - string notebookXml = ""; + string notebookXml; oneNoteApplication.GetHierarchy("", HierarchyScope.hsPages, out notebookXml, XMLSchema.xs2010); if(!string.IsNullOrEmpty(notebookXml)) { - LOG.Debug(notebookXml); + Log.Debug(notebookXml); StringReader reader = null; try { reader = new StringReader(notebookXml); @@ -152,10 +127,9 @@ namespace Greenshot.Interop.Office { } } } - } finally { - if(reader != null) { - reader.Dispose(); - } + } finally + { + reader?.Dispose(); } } return null; @@ -170,10 +144,10 @@ namespace Greenshot.Interop.Office { try { using (IOneNoteApplication oneNoteApplication = COMWrapper.GetOrCreateInstance()) { if (oneNoteApplication != null) { - string notebookXml = ""; + string notebookXml; oneNoteApplication.GetHierarchy("", HierarchyScope.hsPages, out notebookXml, XMLSchema.xs2010); if (!string.IsNullOrEmpty(notebookXml)) { - LOG.Debug(notebookXml); + Log.Debug(notebookXml); StringReader reader = null; try { reader = new StringReader(notebookXml); @@ -185,18 +159,22 @@ namespace Greenshot.Interop.Office { if ("one:Notebook".Equals(xmlReader.Name)) { string id = xmlReader.GetAttribute("ID"); if (id != null && (currentNotebook == null || !id.Equals(currentNotebook.ID))) { - currentNotebook = new OneNoteNotebook(); - currentNotebook.ID = xmlReader.GetAttribute("ID"); - currentNotebook.Name = xmlReader.GetAttribute("name"); + currentNotebook = new OneNoteNotebook + { + ID = xmlReader.GetAttribute("ID"), + Name = xmlReader.GetAttribute("name") + }; } } if ("one:Section".Equals(xmlReader.Name)) { string id = xmlReader.GetAttribute("ID"); if (id != null && (currentSection == null || !id.Equals(currentSection.ID))) { - currentSection = new OneNoteSection(); - currentSection.ID = xmlReader.GetAttribute("ID"); - currentSection.Name = xmlReader.GetAttribute("name"); - currentSection.Parent = currentNotebook; + currentSection = new OneNoteSection + { + ID = xmlReader.GetAttribute("ID"), + Name = xmlReader.GetAttribute("name"), + Parent = currentNotebook + }; } } if ("one:Page".Equals(xmlReader.Name)) { @@ -204,10 +182,12 @@ namespace Greenshot.Interop.Office { if ("true".Equals(xmlReader.GetAttribute("isInRecycleBin"))) { continue; } - OneNotePage page = new OneNotePage(); - page.Parent = currentSection; - page.Name = xmlReader.GetAttribute("name"); - page.ID = xmlReader.GetAttribute("ID"); + OneNotePage page = new OneNotePage + { + Parent = currentSection, + Name = xmlReader.GetAttribute("name"), + ID = xmlReader.GetAttribute("ID") + }; if (page.ID == null || page.Name == null) { continue; } @@ -216,27 +196,26 @@ namespace Greenshot.Interop.Office { } } } - } finally { - if (reader != null) { - reader.Dispose(); - } + } finally + { + reader?.Dispose(); } } } } } catch (COMException cEx) { if (cEx.ErrorCode == unchecked((int)0x8002801D)) { - LOG.Warn("Wrong registry keys, to solve this remove the OneNote key as described here: http://microsoftmercenary.com/wp/outlook-excel-interop-calls-breaking-solved/"); + Log.Warn("Wrong registry keys, to solve this remove the OneNote key as described here: http://microsoftmercenary.com/wp/outlook-excel-interop-calls-breaking-solved/"); } - LOG.Warn("Problem retrieving onenote destinations, ignoring: ", cEx); + Log.Warn("Problem retrieving onenote destinations, ignoring: ", cEx); } catch (Exception ex) { - LOG.Warn("Problem retrieving onenote destinations, ignoring: ", ex); + Log.Warn("Problem retrieving onenote destinations, ignoring: ", ex); } pages.Sort(delegate(OneNotePage p1, OneNotePage p2) { if(p1.IsCurrentlyViewed || p2.IsCurrentlyViewed) { return p2.IsCurrentlyViewed.CompareTo(p1.IsCurrentlyViewed); } - return p1.DisplayName.CompareTo(p2.DisplayName); + return String.Compare(p1.DisplayName, p2.DisplayName, StringComparison.Ordinal); }); return pages; } diff --git a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs index 11768666b..4d0d724f2 100644 --- a/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/OutlookEmailExporter.cs @@ -33,18 +33,18 @@ namespace Greenshot.Interop.Office { /// Outlook exporter has all the functionality to export to outlook /// public class OutlookEmailExporter { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(OutlookEmailExporter)); - private static readonly OfficeConfiguration conf = IniConfig.GetIniSection(); - private static readonly string SIGNATURE_PATH = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Microsoft\Signatures"); - private static Version outlookVersion = null; - private static string currentUser = null; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(OutlookEmailExporter)); + private static readonly OfficeConfiguration OfficeConfig = IniConfig.GetIniSection(); + private static readonly string SignaturePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Microsoft\Signatures"); + private static Version _outlookVersion; + private static string _currentUser; // The signature key can be found at: // HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\\9375CFF0413111d3B88A00104B2A6676\ [New Signature] - private const string PROFILES_KEY = @"Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\"; - private const string ACCOUNT_KEY = "9375CFF0413111d3B88A00104B2A6676"; - private const string NEW_SIGNATURE_VALUE = "New Signature"; - private const string DEFAULT_PROFILE_VALUE = "DefaultProfile"; + private const string ProfilesKey = @"Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\"; + private const string AccountKey = "9375CFF0413111d3B88A00104B2A6676"; + private const string NewSignatureValue = "New Signature"; + private const string DefaultProfileValue = "DefaultProfile"; /// /// A method to retrieve all inspectors which can act as an export target @@ -58,12 +58,12 @@ namespace Greenshot.Interop.Office { return null; } - if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2013) { + if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2013) { // Check inline "panel" for Outlook 2013 using (var activeExplorer = outlookApplication.ActiveExplorer()) { if (activeExplorer != null) { using (var inlineResponse = activeExplorer.ActiveInlineResponse) { - if (canExportToInspector(inlineResponse)) { + if (CanExportToInspector(inlineResponse)) { OlObjectClass currentItemClass = inlineResponse.Class; inspectorCaptions.Add(activeExplorer.Caption, currentItemClass); } @@ -77,7 +77,7 @@ namespace Greenshot.Interop.Office { for (int i = 1; i <= inspectors.Count; i++) { using (IInspector inspector = outlookApplication.Inspectors[i]) { using (IItem currentItem = inspector.CurrentItem) { - if (canExportToInspector(currentItem)) { + if (CanExportToInspector(currentItem)) { OlObjectClass currentItemClass = currentItem.Class; inspectorCaptions.Add(inspector.Caption, currentItemClass); } @@ -88,7 +88,7 @@ namespace Greenshot.Interop.Office { } } } catch (Exception ex) { - LOG.Warn("Problem retrieving word destinations, ignoring: ", ex); + Log.Warn("Problem retrieving word destinations, ignoring: ", ex); } return inspectorCaptions; } @@ -98,29 +98,28 @@ namespace Greenshot.Interop.Office { /// /// the Item to check /// - private static bool canExportToInspector(IItem currentItem) { + private static bool CanExportToInspector(IItem currentItem) { try { if (currentItem != null) { OlObjectClass currentItemClass = currentItem.Class; if (OlObjectClass.olMail.Equals(currentItemClass)) { MailItem mailItem = (MailItem)currentItem; //MailItem mailItem = COMWrapper.Cast(currentItem); - LOG.DebugFormat("Mail sent: {0}", mailItem.Sent); + Log.DebugFormat("Mail sent: {0}", mailItem.Sent); if (!mailItem.Sent) { return true; } - } else if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2010 && conf.OutlookAllowExportInMeetings && OlObjectClass.olAppointment.Equals(currentItemClass)) { + } else if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2010 && OfficeConfig.OutlookAllowExportInMeetings && OlObjectClass.olAppointment.Equals(currentItemClass)) { //AppointmentItem appointmentItem = COMWrapper.Cast(currentItem); AppointmentItem appointmentItem = (AppointmentItem)currentItem; - if (string.IsNullOrEmpty(appointmentItem.Organizer) || (currentUser != null && currentUser.Equals(appointmentItem.Organizer))) { + if (string.IsNullOrEmpty(appointmentItem.Organizer) || (_currentUser != null && _currentUser.Equals(appointmentItem.Organizer))) { return true; - } else { - LOG.DebugFormat("Not exporting, as organizer is {1} and currentuser {2}", appointmentItem.Organizer, currentUser); } + Log.DebugFormat("Not exporting, as organizer is {0} and currentuser {1}", appointmentItem.Organizer, _currentUser); } } } catch (Exception ex) { - LOG.WarnFormat("Couldn't process item due to: {0}", ex.Message); + Log.WarnFormat("Couldn't process item due to: {0}", ex.Message); } return false; } @@ -138,7 +137,7 @@ namespace Greenshot.Interop.Office { if (outlookApplication == null) { return false; } - if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2013) { + if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2013) { // Check inline "panel" for Outlook 2013 using (var activeExplorer = outlookApplication.ActiveExplorer()) { if (activeExplorer == null) { @@ -148,11 +147,11 @@ namespace Greenshot.Interop.Office { if (currentCaption.StartsWith(inspectorCaption)) { using (var inlineResponse = activeExplorer.ActiveInlineResponse) { using (IItem currentItem = activeExplorer.ActiveInlineResponse) { - if (canExportToInspector(inlineResponse)) { + if (CanExportToInspector(inlineResponse)) { try { return ExportToInspector(activeExplorer, currentItem, tmpFile, attachmentName); } catch (Exception exExport) { - LOG.Error("Export to " + currentCaption + " failed.", exExport); + Log.Error("Export to " + currentCaption + " failed.", exExport); } } } @@ -165,17 +164,17 @@ namespace Greenshot.Interop.Office { if (inspectors == null || inspectors.Count == 0) { return false; } - LOG.DebugFormat("Got {0} inspectors to check", inspectors.Count); + Log.DebugFormat("Got {0} inspectors to check", inspectors.Count); for (int i = 1; i <= inspectors.Count; i++) { using (IInspector inspector = outlookApplication.Inspectors[i]) { string currentCaption = inspector.Caption; if (currentCaption.StartsWith(inspectorCaption)) { using (IItem currentItem = inspector.CurrentItem) { - if (canExportToInspector(currentItem)) { + if (CanExportToInspector(currentItem)) { try { return ExportToInspector(inspector, currentItem, tmpFile, attachmentName); } catch (Exception exExport) { - LOG.Error("Export to " + currentCaption + " failed.", exExport); + Log.Error("Export to " + currentCaption + " failed.", exExport); } } } @@ -190,21 +189,21 @@ namespace Greenshot.Interop.Office { /// /// Export the file to the supplied inspector /// - /// Inspector + /// ICommonExplorer /// Item /// /// /// private static bool ExportToInspector(ICommonExplorer inspectorOrExplorer, IItem currentItem, string tmpFile, string attachmentName) { if (currentItem == null) { - LOG.Warn("No current item."); + Log.Warn("No current item."); return false; } OlObjectClass itemClass = currentItem.Class; bool isMail = OlObjectClass.olMail.Equals(itemClass); bool isAppointment = OlObjectClass.olAppointment.Equals(itemClass); if (!isMail && !isAppointment) { - LOG.Warn("Item is no mail or appointment."); + Log.Warn("Item is no mail or appointment."); return false; } MailItem mailItem = null; @@ -213,7 +212,7 @@ namespace Greenshot.Interop.Office { //mailItem = COMWrapper.Cast(currentItem); mailItem = (MailItem)currentItem; if (mailItem.Sent) { - LOG.WarnFormat("Item already sent, can't export to {0}", currentItem.Subject); + Log.WarnFormat("Item already sent, can't export to {0}", currentItem.Subject); return false; } } @@ -230,41 +229,46 @@ namespace Greenshot.Interop.Office { // http://msdn.microsoft.com/en-us/library/dd492012%28v=office.12%29.aspx // Earlier versions of Outlook also supported an Inspector.HTMLEditor object property, but since Internet Explorer is no longer the rendering engine for HTML messages and posts, HTMLEditor is no longer supported. IWordDocument wordDocument = null; - if (inspectorOrExplorer is IExplorer) { - var explorer = inspectorOrExplorer as IExplorer; + var explorer = inspectorOrExplorer as IExplorer; + if (explorer != null) { wordDocument = explorer.ActiveInlineResponseWordEditor; - } else if (inspectorOrExplorer is IInspector) { - var inspector = inspectorOrExplorer as IInspector; - if (inspector.IsWordMail()) { - wordDocument = inspector.WordEditor; + } + else + { + var inspector1 = inspectorOrExplorer as IInspector; + if (inspector1 != null) { + var inspector = inspector1; + if (inspector.IsWordMail()) { + wordDocument = inspector.WordEditor; + } } } if (wordDocument != null) { try { if (WordExporter.InsertIntoExistingDocument(wordDocument.Application, wordDocument, tmpFile, null, null)) { - LOG.Info("Inserted into Wordmail"); + Log.Info("Inserted into Wordmail"); wordDocument.Dispose(); return true; } } catch (Exception exportException) { - LOG.Error("Error exporting to the word editor, trying to do it via another method", exportException); + Log.Error("Error exporting to the word editor, trying to do it via another method", exportException); } } else if (isAppointment) { - LOG.Info("Can't export to an appointment if no word editor is used"); + Log.Info("Can't export to an appointment if no word editor is used"); return false; } else { - LOG.Info("Trying export for outlook < 2007."); + Log.Info("Trying export for outlook < 2007."); } } // Only use mailitem as it should be filled!! - LOG.InfoFormat("Item '{0}' has format: {1}", mailItem.Subject, mailItem.BodyFormat); + Log.InfoFormat("Item '{0}' has format: {1}", mailItem?.Subject, mailItem?.BodyFormat); - string contentID; - if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { - contentID = Guid.NewGuid().ToString(); + string contentId; + if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { + contentId = Guid.NewGuid().ToString(); } else { - LOG.Info("Older Outlook (<2007) found, using filename as contentid."); - contentID = Path.GetFileName(tmpFile); + Log.Info("Older Outlook (<2007) found, using filename as contentid."); + contentId = Path.GetFileName(tmpFile); } // Use this to change the format, it will probably lose the current selection. @@ -274,7 +278,7 @@ namespace Greenshot.Interop.Office { //} bool inlinePossible = false; - if (inspectorOrExplorer is IInspector && OlBodyFormat.olFormatHTML.Equals(mailItem.BodyFormat)) { + if (inspectorOrExplorer is IInspector && OlBodyFormat.olFormatHTML.Equals(mailItem?.BodyFormat)) { // if html we can try to inline it // The following might cause a security popup... can't ignore it. try { @@ -285,46 +289,46 @@ namespace Greenshot.Interop.Office { IHTMLTxtRange range = selection.createRange(); if (range != null) { // First paste, than attach (otherwise the range is wrong!) - range.pasteHTML("
      \""
      "); + range.pasteHTML("
      \""
      "); inlinePossible = true; } else { - LOG.DebugFormat("No range for '{0}'", inspectorOrExplorer.Caption); + Log.DebugFormat("No range for '{0}'", inspectorOrExplorer.Caption); } } else { - LOG.DebugFormat("No selection for '{0}'", inspectorOrExplorer.Caption); + Log.DebugFormat("No selection for '{0}'", inspectorOrExplorer.Caption); } } else { - LOG.DebugFormat("No HTML editor for '{0}'", inspectorOrExplorer.Caption); + Log.DebugFormat("No HTML editor for '{0}'", inspectorOrExplorer.Caption); } } catch (Exception e) { // Continue with non inline image - LOG.Warn("Error pasting HTML, most likely due to an ACCESS_DENIED as the user clicked no.", e); + Log.Warn("Error pasting HTML, most likely due to an ACCESS_DENIED as the user clicked no.", e); } } // Create the attachment (if inlined the attachment isn't visible as attachment!) using (IAttachment attachment = mailItem.Attachments.Add(tmpFile, OlAttachmentType.olByValue, inlinePossible ? 0 : 1, attachmentName)) { - if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { + if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { // Add the content id to the attachment, this only works for Outlook >= 2007 try { IPropertyAccessor propertyAccessor = attachment.PropertyAccessor; - propertyAccessor.SetProperty(PropTag.ATTACHMENT_CONTENT_ID, contentID); + propertyAccessor.SetProperty(PropTag.ATTACHMENT_CONTENT_ID, contentId); } catch { // Ignore } } } } catch (Exception ex) { - LOG.WarnFormat("Problem while trying to add attachment to Item '{0}' : {1}", inspectorOrExplorer.Caption, ex); + Log.WarnFormat("Problem while trying to add attachment to Item '{0}' : {1}", inspectorOrExplorer.Caption, ex); return false; } try { inspectorOrExplorer.Activate(); } catch (Exception ex) { - LOG.Warn("Problem activating inspector/explorer: ", ex); + Log.Warn("Problem activating inspector/explorer: ", ex); return false; } - LOG.Debug("Finished!"); + Log.Debug("Finished!"); return true; } @@ -363,7 +367,7 @@ namespace Greenshot.Interop.Office { try { bodyString = GetOutlookSignature(format); } catch (Exception e) { - LOG.Error("Problem reading signature!", e); + Log.Error("Problem reading signature!", e); } switch (format) { case EmailFormat.Text: @@ -377,20 +381,19 @@ namespace Greenshot.Interop.Office { newMail.Body = bodyString; } break; - case EmailFormat.HTML: default: - string contentID = Path.GetFileName(tmpFile); + string contentId = Path.GetFileName(tmpFile); // Create the attachment (and dispose the COM object after using) using (IAttachment attachment = newMail.Attachments.Add(tmpFile, OlAttachmentType.olByValue, 0, attachmentName)) { // add content ID to the attachment - if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { + if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { try { - contentID = Guid.NewGuid().ToString(); + contentId = Guid.NewGuid().ToString(); IPropertyAccessor propertyAccessor = attachment.PropertyAccessor; - propertyAccessor.SetProperty(PropTag.ATTACHMENT_CONTENT_ID, contentID); + propertyAccessor.SetProperty(PropTag.ATTACHMENT_CONTENT_ID, contentId); } catch { - LOG.Info("Error working with the PropertyAccessor, using filename as contentid"); - contentID = Path.GetFileName(tmpFile); + Log.Info("Error working with the PropertyAccessor, using filename as contentid"); + contentId = Path.GetFileName(tmpFile); } } } @@ -399,22 +402,19 @@ namespace Greenshot.Interop.Office { string href = ""; string hrefEnd = ""; if (!string.IsNullOrEmpty(url)) { - href = string.Format("", url); + href = $""; hrefEnd = ""; } - string htmlImgEmbedded = string.Format("
      {0}\"{1}\"{3}
      ", href, attachmentName, contentID, hrefEnd); - string fallbackBody = string.Format("{0}", htmlImgEmbedded); + string htmlImgEmbedded = $"
      {href}\"{attachmentName}\"{hrefEnd}
      "; + string fallbackBody = $"{htmlImgEmbedded}"; if (bodyString == null) { bodyString = fallbackBody; } else { int bodyIndex = bodyString.IndexOf("= 0) { - bodyIndex = bodyString.IndexOf(">", bodyIndex) + 1; - if (bodyIndex >= 0) { - bodyString = bodyString.Insert(bodyIndex, htmlImgEmbedded); - } else { - bodyString = fallbackBody; - } + if (bodyIndex >= 0) + { + bodyIndex = bodyString.IndexOf(">", bodyIndex, StringComparison.Ordinal) + 1; + bodyString = bodyIndex >= 0 ? bodyString.Insert(bodyIndex, htmlImgEmbedded) : fallbackBody; } else { bodyString = fallbackBody; } @@ -460,7 +460,7 @@ namespace Greenshot.Interop.Office { } return exported; } catch (Exception e) { - LOG.Error("Error while creating an outlook mail item: ", e); + Log.Error("Error while creating an outlook mail item: ", e); } return exported; } @@ -470,46 +470,48 @@ namespace Greenshot.Interop.Office { /// /// private static string GetOutlookSignature(EmailFormat format) { - using (RegistryKey profilesKey = Registry.CurrentUser.OpenSubKey(PROFILES_KEY, false)) { + using (RegistryKey profilesKey = Registry.CurrentUser.OpenSubKey(ProfilesKey, false)) { if (profilesKey == null) { return null; } - string defaultProfile = (string)profilesKey.GetValue(DEFAULT_PROFILE_VALUE); - LOG.DebugFormat("defaultProfile={0}", defaultProfile); - using (RegistryKey profileKey = profilesKey.OpenSubKey(defaultProfile + @"\" + ACCOUNT_KEY, false)) { - if (profilesKey == null) { - return null; - } - string[] numbers = profileKey.GetSubKeyNames(); - foreach (string number in numbers) { - LOG.DebugFormat("Found subkey {0}", number); - using (RegistryKey numberKey = profileKey.OpenSubKey(number, false)) { - byte[] val = (byte[])numberKey.GetValue(NEW_SIGNATURE_VALUE); - if (val == null) { - continue; - } - string signatureName = ""; - foreach (byte b in val) { - if (b != 0) { - signatureName += (char)b; + string defaultProfile = (string)profilesKey.GetValue(DefaultProfileValue); + Log.DebugFormat("defaultProfile={0}", defaultProfile); + using (RegistryKey profileKey = profilesKey.OpenSubKey(defaultProfile + @"\" + AccountKey, false)) { + if (profileKey != null) + { + string[] numbers = profileKey.GetSubKeyNames(); + foreach (string number in numbers) { + Log.DebugFormat("Found subkey {0}", number); + using (RegistryKey numberKey = profileKey.OpenSubKey(number, false)) { + if (numberKey != null) + { + byte[] val = (byte[])numberKey.GetValue(NewSignatureValue); + if (val == null) { + continue; + } + string signatureName = ""; + foreach (byte b in val) { + if (b != 0) { + signatureName += (char)b; + } + } + Log.DebugFormat("Found email signature: {0}", signatureName); + string extension; + switch (format) { + case EmailFormat.Text: + extension = ".txt"; + break; + default: + extension = ".htm"; + break; + } + string signatureFile = Path.Combine(SignaturePath, signatureName + extension); + if (File.Exists(signatureFile)) { + Log.DebugFormat("Found email signature file: {0}", signatureFile); + return File.ReadAllText(signatureFile, Encoding.Default); + } } } - LOG.DebugFormat("Found email signature: {0}", signatureName); - string extension; - switch (format) { - case EmailFormat.Text: - extension = ".txt"; - break; - case EmailFormat.HTML: - default: - extension = ".htm"; - break; - } - string signatureFile = Path.Combine(SIGNATURE_PATH, signatureName + extension); - if (File.Exists(signatureFile)) { - LOG.DebugFormat("Found email signature file: {0}", signatureFile); - return File.ReadAllText(signatureFile, Encoding.Default); - } } } } @@ -522,25 +524,25 @@ namespace Greenshot.Interop.Office { /// /// private static void InitializeVariables(IOutlookApplication outlookApplication) { - if (outlookApplication == null || outlookVersion != null) { + if (outlookApplication == null || _outlookVersion != null) { return; } try { - outlookVersion = new Version(outlookApplication.Version); - LOG.InfoFormat("Using Outlook {0}", outlookVersion); + _outlookVersion = new Version(outlookApplication.Version); + Log.InfoFormat("Using Outlook {0}", _outlookVersion); } catch (Exception exVersion) { - LOG.Error(exVersion); - LOG.Warn("Assuming outlook version 1997."); - outlookVersion = new Version((int)OfficeVersion.OFFICE_97, 0, 0, 0); + Log.Error(exVersion); + Log.Warn("Assuming outlook version 1997."); + _outlookVersion = new Version((int)OfficeVersion.OFFICE_97, 0, 0, 0); } // Preventing retrieval of currentUser if Outlook is older than 2007 - if (outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { + if (_outlookVersion.Major >= (int)OfficeVersion.OFFICE_2007) { try { INameSpace mapiNamespace = outlookApplication.GetNameSpace("MAPI"); - currentUser = mapiNamespace.CurrentUser.Name; - LOG.InfoFormat("Current user: {0}", currentUser); - } catch (Exception exNS) { - LOG.Error(exNS); + _currentUser = mapiNamespace.CurrentUser.Name; + Log.InfoFormat("Current user: {0}", _currentUser); + } catch (Exception exNs) { + Log.Error(exNs); } } } diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index ba362f3cd..548914287 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -25,16 +25,16 @@ using Greenshot.IniFile; namespace Greenshot.Interop.Office { public class WordExporter { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(WordExporter)); - private static Version wordVersion = null; - private static readonly OfficeConfiguration config = IniConfig.GetIniSection(); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(WordExporter)); + private static Version _wordVersion; + private static readonly OfficeConfiguration OfficeConfig = IniConfig.GetIniSection(); /// /// Check if the used version is higher than Office 2003 /// /// - private static bool isAfter2003() { - return wordVersion.Major > (int)OfficeVersion.OFFICE_2003; + private static bool IsAfter2003() { + return _wordVersion.Major > (int)OfficeVersion.OFFICE_2003; } /// @@ -77,11 +77,14 @@ namespace Greenshot.Interop.Office { // Solution: Make sure the selected document is active, otherwise the insert will be made in a different document! try { wordDocument.Activate(); - } catch { + } + catch + { + // ignored } using (ISelection selection = wordApplication.Selection) { if (selection == null) { - LOG.InfoFormat("No selection to insert {0} into found.", tmpFile); + Log.InfoFormat("No selection to insert {0} into found.", tmpFile); return false; } // Add Picture @@ -96,7 +99,7 @@ namespace Greenshot.Interop.Office { hyperlinks.Add(shape, screentip, Type.Missing, screentip, Type.Missing, Type.Missing); } } catch (Exception e) { - LOG.WarnFormat("Couldn't add hyperlink for image: {0}", e.Message); + Log.WarnFormat("Couldn't add hyperlink for image: {0}", e.Message); } } } @@ -110,19 +113,21 @@ namespace Greenshot.Interop.Office { } } } catch (Exception e) { - if (e.InnerException != null) { - LOG.WarnFormat("Couldn't set zoom to 100, error: {0}", e.InnerException.Message); - } else { - LOG.WarnFormat("Couldn't set zoom to 100, error: {0}", e.Message); - } + Log.WarnFormat("Couldn't set zoom to 100, error: {0}", e.InnerException?.Message ?? e.Message); } try { wordApplication.Activate(); - } catch { + } + catch + { + // ignored } try { wordDocument.Activate(); - } catch { + } + catch + { + // ignored } return true; } @@ -138,7 +143,7 @@ namespace Greenshot.Interop.Office { using (IInlineShapes shapes = selection.InlineShapes) { IInlineShape shape = shapes.AddPicture(tmpFile, false, true, Type.Missing); // Lock aspect ratio - if (config.WordLockAspectRatio) { + if (OfficeConfig.WordLockAspectRatio) { shape.LockAspectRatio = MsoTriState.msoTrue; } selection.InsertAfter("\r\n"); @@ -174,18 +179,24 @@ namespace Greenshot.Interop.Office { hyperlinks.Add(shape, screentip, Type.Missing, screentip, Type.Missing, Type.Missing); } } catch (Exception e) { - LOG.WarnFormat("Couldn't add hyperlink for image: {0}", e.Message); + Log.WarnFormat("Couldn't add hyperlink for image: {0}", e.Message); } } } } try { wordDocument.Activate(); - } catch { + } + catch + { + // ignored } try { wordDocument.ActiveWindow.Activate(); - } catch { + } + catch + { + // ignored } } } @@ -209,7 +220,7 @@ namespace Greenshot.Interop.Office { if (document.ReadOnly) { continue; } - if (isAfter2003()) { + if (IsAfter2003()) { if (document.Final) { continue; } @@ -222,7 +233,7 @@ namespace Greenshot.Interop.Office { } } } catch (Exception ex) { - LOG.Warn("Problem retrieving word destinations, ignoring: ", ex); + Log.Warn("Problem retrieving word destinations, ignoring: ", ex); } openDocuments.Sort(); return openDocuments; @@ -253,16 +264,16 @@ namespace Greenshot.Interop.Office { /// /// private static void InitializeVariables(IWordApplication wordApplication) { - if (wordApplication == null || wordVersion != null) { + if (wordApplication == null || _wordVersion != null) { return; } try { - wordVersion = new Version(wordApplication.Version); - LOG.InfoFormat("Using Word {0}", wordVersion); + _wordVersion = new Version(wordApplication.Version); + Log.InfoFormat("Using Word {0}", _wordVersion); } catch (Exception exVersion) { - LOG.Error(exVersion); - LOG.Warn("Assuming Word version 1997."); - wordVersion = new Version((int)OfficeVersion.OFFICE_97, 0, 0, 0); + Log.Error(exVersion); + Log.Warn("Assuming Word version 1997."); + _wordVersion = new Version((int)OfficeVersion.OFFICE_97, 0, 0, 0); } } } diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs index ee22eb68c..f91390271 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs @@ -253,8 +253,8 @@ namespace Greenshot.Interop.Office { // See: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.propertyaccessor_members.aspx public interface IPropertyAccessor : ICommon { - void SetProperty(string SchemaName, Object Value); - Object GetProperty(string SchemaName); + void SetProperty(string SchemaName, object Value); + object GetProperty(string SchemaName); } // Schema definitions for the MAPI properties @@ -363,7 +363,7 @@ namespace Greenshot.Interop.Office { // See: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook._application.inspectors.aspx public interface IInspectors : ICommon, ICollection, IEnumerable { // Use index + 1!! - IInspector this[Object Index] { + IInspector this[object Index] { get; } } @@ -374,7 +374,7 @@ namespace Greenshot.Interop.Office { /// public interface IExplorers : ICommon, ICollection, IEnumerable { // Use index + 1!! - IExplorer this[Object Index] { + IExplorer this[object Index] { get; } } diff --git a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs index 9997c273c..49b237289 100644 --- a/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/PhotobucketForm.cs @@ -24,7 +24,5 @@ namespace GreenshotPhotobucketPlugin { /// This class is needed for design-time resolving of the language files /// public class PhotobucketForm : GreenshotPlugin.Controls.GreenshotForm { - public PhotobucketForm() : base() { - } } } diff --git a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs index d2a59e4e4..4fc578463 100644 --- a/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs +++ b/GreenshotPhotobucketPlugin/Forms/SettingsForm.cs @@ -24,7 +24,8 @@ namespace GreenshotPhotobucketPlugin { /// Description of PasswordRequestForm. /// public partial class SettingsForm : PhotobucketForm { - public SettingsForm(PhotobucketConfiguration config) : base() { + public SettingsForm() + { // // The InitializeComponent() call is required for Windows Forms designer support. // diff --git a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs index 5b284689b..4eed1bcdd 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketConfiguration.cs @@ -59,8 +59,8 @@ namespace GreenshotPhotobucketPlugin { SettingsForm settingsForm = null; new PleaseWaitForm().ShowAndWait(PhotobucketPlugin.Attributes.Name, Language.GetString("photobucket", LangKey.communication_wait), - delegate() { - settingsForm = new SettingsForm(this); + delegate { + settingsForm = new SettingsForm(); } ); DialogResult result = settingsForm.ShowDialog(); diff --git a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs index fd35a3fca..d2b484342 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketDestination.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketDestination.cs @@ -21,8 +21,6 @@ using System.ComponentModel; using System.Collections.Generic; using System.Drawing; - -using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; @@ -31,10 +29,8 @@ namespace GreenshotPhotobucketPlugin { /// Description of PhotobucketDestination. /// public class PhotobucketDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PhotobucketDestination)); - private static PhotobucketConfiguration config = IniConfig.GetIniSection(); - private readonly PhotobucketPlugin plugin = null; - private readonly string albumPath = null; + private readonly PhotobucketPlugin _plugin; + private readonly string _albumPath; /// /// Create a Photobucket destination, which also has the path to the album in it @@ -42,20 +38,16 @@ namespace GreenshotPhotobucketPlugin { /// /// path to the album, null for default public PhotobucketDestination(PhotobucketPlugin plugin, string albumPath) { - this.plugin = plugin; - this.albumPath = albumPath; + _plugin = plugin; + _albumPath = albumPath; } - public override string Designation { - get { - return "Photobucket"; - } - } + public override string Designation => "Photobucket"; public override string Description { get { - if (albumPath != null) { - return albumPath; + if (_albumPath != null) { + return _albumPath; } return Language.GetString("photobucket", LangKey.upload_menu_item); } @@ -68,24 +60,23 @@ namespace GreenshotPhotobucketPlugin { } } - public override bool isDynamic { - get { - return true; - } - } + public override bool IsDynamic => true; public override IEnumerable DynamicDestinations() { - List albums = null; + IList albums = null; try { albums = PhotobucketUtils.RetrievePhotobucketAlbums(); - } catch { + } + catch + { + // ignored } if (albums == null || albums.Count == 0) { yield break; } foreach (string album in albums) { - yield return new PhotobucketDestination(plugin, album); + yield return new PhotobucketDestination(_plugin, album); } } @@ -98,11 +89,11 @@ namespace GreenshotPhotobucketPlugin { /// public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); - string uploadURL = null; - bool uploaded = plugin.Upload(captureDetails, surface, albumPath, out uploadURL); + string uploadUrl; + bool uploaded = _plugin.Upload(captureDetails, surface, _albumPath, out uploadUrl); if (uploaded) { exportInformation.ExportMade = true; - exportInformation.Uri = uploadURL; + exportInformation.Uri = uploadUrl; } ProcessExport(exportInformation, surface); return exportInformation; diff --git a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs index 2fa2883a2..cd66992fb 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketInfo.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketInfo.cs @@ -27,28 +27,13 @@ namespace GreenshotPhotobucketPlugin /// Description of PhotobucketInfo. /// public class PhotobucketInfo { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PhotobucketInfo)); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(PhotobucketInfo)); - private string original; - public string Original { - get {return original;} - set {original = value;} - } + public string Original { get; set; } - private string page; - public string Page { - get {return page;} - set {page = value;} - } + public string Page { get; set; } - private string thumbnail; - public string Thumbnail { - get {return thumbnail;} - set {thumbnail = value;} - } - - public PhotobucketInfo() { - } + public string Thumbnail { get; set; } /// /// Parse the upload response @@ -56,28 +41,27 @@ namespace GreenshotPhotobucketPlugin /// XML /// PhotobucketInfo object public static PhotobucketInfo FromUploadResponse(string response) { - LOG.Debug(response); - PhotobucketInfo PhotobucketInfo = new PhotobucketInfo(); + Log.Debug(response); + PhotobucketInfo photobucketInfo = new PhotobucketInfo(); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(response); - XmlNodeList nodes; - nodes = doc.GetElementsByTagName("url"); + var nodes = doc.GetElementsByTagName("url"); if(nodes.Count > 0) { - PhotobucketInfo.Original = nodes.Item(0).InnerText; + photobucketInfo.Original = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("browseurl"); if(nodes.Count > 0) { - PhotobucketInfo.Page = nodes.Item(0).InnerText; + photobucketInfo.Page = nodes.Item(0)?.InnerText; } nodes = doc.GetElementsByTagName("thumb"); if(nodes.Count > 0) { - PhotobucketInfo.Thumbnail = nodes.Item(0).InnerText; + photobucketInfo.Thumbnail = nodes.Item(0)?.InnerText; } } catch(Exception e) { - LOG.ErrorFormat("Could not parse Photobucket response due to error {0}, response was: {1}", e.Message, response); + Log.ErrorFormat("Could not parse Photobucket response due to error {0}, response was: {1}", e.Message, response); } - return PhotobucketInfo; + return photobucketInfo; } } } diff --git a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs index 531681a35..6d7402319 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketPlugin.cs @@ -55,9 +55,6 @@ namespace GreenshotPhotobucketPlugin { } } - public PhotobucketPlugin() { - } - public IEnumerable Destinations() { yield return new PhotobucketDestination(this, null); } diff --git a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs index 69613eb3d..6738c0086 100644 --- a/GreenshotPhotobucketPlugin/PhotobucketUtils.cs +++ b/GreenshotPhotobucketPlugin/PhotobucketUtils.cs @@ -19,6 +19,7 @@ * along with this program. If not, see . */ using System; +using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Xml; @@ -31,9 +32,9 @@ namespace GreenshotPhotobucketPlugin { /// Description of PhotobucketUtils. /// public static class PhotobucketUtils { - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PhotobucketUtils)); - private static readonly PhotobucketConfiguration config = IniConfig.GetIniSection(); - private static List albumsCache = null; + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(PhotobucketUtils)); + private static readonly PhotobucketConfiguration PhotobucketConfig = IniConfig.GetIniSection(); + private static List _albumsCache; /// /// Do the actual upload to Photobucket @@ -43,18 +44,15 @@ namespace GreenshotPhotobucketPlugin { public static PhotobucketInfo UploadToPhotobucket(ISurface surfaceToUpload, SurfaceOutputSettings outputSettings, string albumPath, string title, string filename) { string responseString; - if (string.IsNullOrEmpty(albumPath)) { - albumPath = "!"; - } - - OAuthSession oAuth = createSession(true); + var oAuth = CreateSession(true); if (oAuth == null) { return null; } IDictionary signedParameters = new Dictionary(); // add album - if (albumPath == null) { - signedParameters.Add("id", config.Username); + if (string.IsNullOrEmpty(albumPath)) + { + signedParameters.Add("id", string.IsNullOrEmpty(PhotobucketConfig.Username) ? "!" : PhotobucketConfig.Username); } else { signedParameters.Add("id", albumPath); } @@ -73,47 +71,49 @@ namespace GreenshotPhotobucketPlugin { unsignedParameters.Add("uploadfile", new SurfaceContainer(surfaceToUpload, outputSettings, filename)); try { string apiUrl = "http://api.photobucket.com/album/!/upload"; - responseString = oAuth.MakeOAuthRequest(HTTPMethod.POST, apiUrl, apiUrl.Replace("api.photobucket.com", config.SubDomain), signedParameters, unsignedParameters, null); + responseString = oAuth.MakeOAuthRequest(HTTPMethod.POST, apiUrl, apiUrl.Replace("api.photobucket.com", PhotobucketConfig.SubDomain), signedParameters, unsignedParameters, null); } catch (Exception ex) { - LOG.Error("Error uploading to Photobucket.", ex); + Log.Error("Error uploading to Photobucket.", ex); throw; } finally { if (!string.IsNullOrEmpty(oAuth.Token)) { - config.Token = oAuth.Token; + PhotobucketConfig.Token = oAuth.Token; } if (!string.IsNullOrEmpty(oAuth.TokenSecret)) { - config.TokenSecret = oAuth.TokenSecret; + PhotobucketConfig.TokenSecret = oAuth.TokenSecret; } } if (responseString == null) { return null; } - LOG.Info(responseString); - PhotobucketInfo PhotobucketInfo = PhotobucketInfo.FromUploadResponse(responseString); - LOG.Debug("Upload to Photobucket was finished"); - return PhotobucketInfo; + Log.Info(responseString); + var photobucketInfo = PhotobucketInfo.FromUploadResponse(responseString); + Log.Debug("Upload to Photobucket was finished"); + return photobucketInfo; } /// /// Helper method to create an OAuth session object for contacting the Photobucket API /// /// OAuthSession - private static OAuthSession createSession(bool autoLogin) { - OAuthSession oAuth = new OAuthSession(PhotobucketCredentials.ConsumerKey, PhotobucketCredentials.ConsumerSecret); - oAuth.AutoLogin = autoLogin; - oAuth.CheckVerifier = false; + private static OAuthSession CreateSession(bool autoLogin) { + var oAuth = new OAuthSession(PhotobucketCredentials.ConsumerKey, PhotobucketCredentials.ConsumerSecret) + { + AutoLogin = autoLogin, + CheckVerifier = false, + CallbackUrl = "http://getgreenshot.org", + AccessTokenUrl = "http://api.photobucket.com/login/access", + AuthorizeUrl = "http://photobucket.com/apilogin/login", + RequestTokenUrl = "http://api.photobucket.com/login/request", + BrowserSize = new Size(1010, 400), + RequestTokenMethod = HTTPMethod.POST, + AccessTokenMethod = HTTPMethod.POST, + LoginTitle = "Photobucket authorization" + }; // This url is configured in the Photobucket API settings in the Photobucket site!! - oAuth.CallbackUrl = "http://getgreenshot.org"; - oAuth.AccessTokenUrl = "http://api.photobucket.com/login/access"; - oAuth.AuthorizeUrl = "http://photobucket.com/apilogin/login"; - oAuth.RequestTokenUrl = "http://api.photobucket.com/login/request"; - oAuth.BrowserSize = new Size(1010, 400); // Photobucket is very particular about the used methods! - oAuth.RequestTokenMethod = HTTPMethod.POST; - oAuth.AccessTokenMethod = HTTPMethod.POST; - oAuth.LoginTitle = "Photobucket authorization"; - if (string.IsNullOrEmpty(config.SubDomain) || string.IsNullOrEmpty(config.Token) || string.IsNullOrEmpty(config.Username)) { + if (string.IsNullOrEmpty(PhotobucketConfig.SubDomain) || string.IsNullOrEmpty(PhotobucketConfig.Token) || string.IsNullOrEmpty(PhotobucketConfig.Username)) { if (!autoLogin) { return null; } @@ -121,21 +121,21 @@ namespace GreenshotPhotobucketPlugin { return null; } if (!string.IsNullOrEmpty(oAuth.Token)) { - config.Token = oAuth.Token; + PhotobucketConfig.Token = oAuth.Token; } if (!string.IsNullOrEmpty(oAuth.TokenSecret)) { - config.TokenSecret = oAuth.TokenSecret; + PhotobucketConfig.TokenSecret = oAuth.TokenSecret; } - if (oAuth.AccessTokenResponseParameters != null && oAuth.AccessTokenResponseParameters["subdomain"] != null) { - config.SubDomain = oAuth.AccessTokenResponseParameters["subdomain"]; + if (oAuth.AccessTokenResponseParameters?["subdomain"] != null) { + PhotobucketConfig.SubDomain = oAuth.AccessTokenResponseParameters["subdomain"]; } - if (oAuth.AccessTokenResponseParameters != null && oAuth.AccessTokenResponseParameters["username"] != null) { - config.Username = oAuth.AccessTokenResponseParameters["username"]; + if (oAuth.AccessTokenResponseParameters?["username"] != null) { + PhotobucketConfig.Username = oAuth.AccessTokenResponseParameters["username"]; } IniConfig.Save(); } - oAuth.Token = config.Token; - oAuth.TokenSecret = config.TokenSecret; + oAuth.Token = PhotobucketConfig.Token; + oAuth.TokenSecret = PhotobucketConfig.TokenSecret; return oAuth; } @@ -143,29 +143,29 @@ namespace GreenshotPhotobucketPlugin { /// Get list of photobucket albums /// /// List of string - public static List RetrievePhotobucketAlbums() { - if (albumsCache != null) { - return albumsCache; + public static IList RetrievePhotobucketAlbums() { + if (_albumsCache != null) { + return _albumsCache; } string responseString; - OAuthSession oAuth = createSession(false); + OAuthSession oAuth = CreateSession(false); if (oAuth == null) { return null; } IDictionary signedParameters = new Dictionary(); try { - string apiUrl = string.Format("http://api.photobucket.com/album/{0}", config.Username); - responseString = oAuth.MakeOAuthRequest(HTTPMethod.GET, apiUrl, apiUrl.Replace("api.photobucket.com", config.SubDomain), signedParameters, null, null); + string apiUrl = $"http://api.photobucket.com/album/{PhotobucketConfig.Username}"; + responseString = oAuth.MakeOAuthRequest(HTTPMethod.GET, apiUrl, apiUrl.Replace("api.photobucket.com", PhotobucketConfig.SubDomain), signedParameters, null, null); } catch (Exception ex) { - LOG.Error("Error uploading to Photobucket.", ex); + Log.Error("Error uploading to Photobucket.", ex); throw; } finally { if (!string.IsNullOrEmpty(oAuth.Token)) { - config.Token = oAuth.Token; + PhotobucketConfig.Token = oAuth.Token; } if (!string.IsNullOrEmpty(oAuth.TokenSecret)) { - config.TokenSecret = oAuth.TokenSecret; + PhotobucketConfig.TokenSecret = oAuth.TokenSecret; } } if (responseString == null) { @@ -175,15 +175,19 @@ namespace GreenshotPhotobucketPlugin { XmlDocument doc = new XmlDocument(); doc.LoadXml(responseString); List albums = new List(); - recurseAlbums(albums, null, doc.GetElementsByTagName("content").Item(0).ChildNodes); - LOG.DebugFormat("Albums: {0}", string.Join(",", albums.ToArray())); - albumsCache = albums; + var xmlNode = doc.GetElementsByTagName("content").Item(0); + if (xmlNode != null) + { + RecurseAlbums(albums, null, xmlNode.ChildNodes); + } + Log.DebugFormat("Albums: {0}", string.Join(",", albums.ToArray())); + _albumsCache = albums; return albums; } catch(Exception e) { - LOG.Error("Error while Reading albums: ", e); + Log.Error("Error while Reading albums: ", e); } - LOG.Debug("Upload to Photobucket was finished"); + Log.Debug("Upload to Photobucket was finished"); return null; } @@ -193,20 +197,23 @@ namespace GreenshotPhotobucketPlugin { /// /// /// - private static void recurseAlbums(Listalbums, string path, XmlNodeList nodes) { + private static void RecurseAlbums(ICollection albums, string path, IEnumerable nodes) { foreach(XmlNode node in nodes) { if (node.Name != "album") { continue; } - string currentAlbum = node.Attributes["name"].Value; - string currentPath = currentAlbum; - if (path != null && path.Length > 0) { - currentPath = string.Format("{0}/{1}", path, currentAlbum); - } + if (node.Attributes != null) + { + string currentAlbum = node.Attributes["name"].Value; + string currentPath = currentAlbum; + if (!string.IsNullOrEmpty(path)) { + currentPath = $"{path}/{currentAlbum}"; + } - albums.Add(currentPath); - if (node.Attributes["subalbum_count"] != null && node.Attributes["subalbum_count"].Value != "0") { - recurseAlbums(albums, currentPath, node.ChildNodes); + albums.Add(currentPath); + if (node.Attributes["subalbum_count"] != null && node.Attributes["subalbum_count"].Value != "0") { + RecurseAlbums(albums, currentPath, node.ChildNodes); + } } } } diff --git a/GreenshotPicasaPlugin/Forms/SettingsForm.cs b/GreenshotPicasaPlugin/Forms/SettingsForm.cs index 1ee8f5594..734559762 100644 --- a/GreenshotPicasaPlugin/Forms/SettingsForm.cs +++ b/GreenshotPicasaPlugin/Forms/SettingsForm.cs @@ -24,7 +24,8 @@ namespace GreenshotPicasaPlugin { /// public partial class SettingsForm : PicasaForm { - public SettingsForm(PicasaConfiguration config) : base() { + public SettingsForm() + { // // The InitializeComponent() call is required for Windows Forms designer support. // diff --git a/GreenshotPicasaPlugin/PicasaConfiguration.cs b/GreenshotPicasaPlugin/PicasaConfiguration.cs index dc906d8c9..17e44efee 100644 --- a/GreenshotPicasaPlugin/PicasaConfiguration.cs +++ b/GreenshotPicasaPlugin/PicasaConfiguration.cs @@ -81,7 +81,7 @@ namespace GreenshotPicasaPlugin { /// /// bool true if OK was pressed, false if cancel public bool ShowConfigDialog() { - DialogResult result = new SettingsForm(this).ShowDialog(); + DialogResult result = new SettingsForm().ShowDialog(); if (result == DialogResult.OK) { return true; } diff --git a/GreenshotPicasaPlugin/PicasaDestination.cs b/GreenshotPicasaPlugin/PicasaDestination.cs index aaced6491..cb2206f13 100644 --- a/GreenshotPicasaPlugin/PicasaDestination.cs +++ b/GreenshotPicasaPlugin/PicasaDestination.cs @@ -19,31 +19,19 @@ */ using System.ComponentModel; using System.Drawing; -using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; namespace GreenshotPicasaPlugin { public class PicasaDestination : AbstractDestination { - private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PicasaDestination)); - private static PicasaConfiguration config = IniConfig.GetIniSection(); - - private readonly PicasaPlugin plugin = null; + private readonly PicasaPlugin _plugin; public PicasaDestination(PicasaPlugin plugin) { - this.plugin = plugin; + _plugin = plugin; } - public override string Designation { - get { - return "Picasa"; - } - } + public override string Designation => "Picasa"; - public override string Description { - get { - return Language.GetString("picasa", LangKey.upload_menu_item); - } - } + public override string Description => Language.GetString("picasa", LangKey.upload_menu_item); public override Image DisplayIcon { get { @@ -55,7 +43,7 @@ namespace GreenshotPicasaPlugin { public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { ExportInformation exportInformation = new ExportInformation(Designation, Description); string uploadUrl; - bool uploaded = plugin.Upload(captureDetails, surface, out uploadUrl); + bool uploaded = _plugin.Upload(captureDetails, surface, out uploadUrl); if (uploaded) { exportInformation.ExportMade = true; exportInformation.Uri = uploadUrl; diff --git a/GreenshotPicasaPlugin/PicasaPlugin.cs b/GreenshotPicasaPlugin/PicasaPlugin.cs index 84ba7547e..76bd80250 100644 --- a/GreenshotPicasaPlugin/PicasaPlugin.cs +++ b/GreenshotPicasaPlugin/PicasaPlugin.cs @@ -54,9 +54,6 @@ namespace GreenshotPicasaPlugin { } } - public PicasaPlugin() { - } - public IEnumerable Destinations() { yield return new PicasaDestination(this); } @@ -79,10 +76,12 @@ namespace GreenshotPicasaPlugin { _config = IniConfig.GetIniSection(); _resources = new ComponentResourceManager(typeof(PicasaPlugin)); - _itemPlugInRoot = new ToolStripMenuItem(); - _itemPlugInRoot.Text = Language.GetString("picasa", LangKey.Configure); - _itemPlugInRoot.Tag = _host; - _itemPlugInRoot.Image = (Image)_resources.GetObject("Picasa"); + _itemPlugInRoot = new ToolStripMenuItem + { + Text = Language.GetString("picasa", LangKey.Configure), + Tag = _host, + Image = (Image) _resources.GetObject("Picasa") + }; _itemPlugInRoot.Click += ConfigMenuClick; PluginUtils.AddToContextMenu(_host, _itemPlugInRoot); Language.LanguageChanged += OnLanguageChanged; diff --git a/GreenshotPicasaPlugin/PicasaUtils.cs b/GreenshotPicasaPlugin/PicasaUtils.cs index 4aef53b5c..39519915c 100644 --- a/GreenshotPicasaPlugin/PicasaUtils.cs +++ b/GreenshotPicasaPlugin/PicasaUtils.cs @@ -30,7 +30,7 @@ namespace GreenshotPicasaPlugin { /// public static class PicasaUtils { private const string PicasaScope = "https://picasaweb.google.com/data/"; - private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(PicasaUtils)); + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(PicasaUtils)); private static readonly PicasaConfiguration Config = IniConfig.GetIniSection(); private const string AuthUrl = "https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={ClientId}&redirect_uri={RedirectUrl}&state={State}&scope=" + PicasaScope; private const string TokenUrl = "https://www.googleapis.com/oauth2/v3/token"; @@ -46,18 +46,20 @@ namespace GreenshotPicasaPlugin { /// PicasaResponse public static string UploadToPicasa(ISurface surfaceToUpload, SurfaceOutputSettings outputSettings, string title, string filename) { // Fill the OAuth2Settings - OAuth2Settings settings = new OAuth2Settings(); - settings.AuthUrlPattern = AuthUrl; - settings.TokenUrl = TokenUrl; - settings.CloudServiceName = "Picasa"; - settings.ClientId = PicasaCredentials.ClientId; - settings.ClientSecret = PicasaCredentials.ClientSecret; - settings.AuthorizeMode = OAuth2AuthorizeMode.LocalServer; + var settings = new OAuth2Settings + { + AuthUrlPattern = AuthUrl, + TokenUrl = TokenUrl, + CloudServiceName = "Picasa", + ClientId = PicasaCredentials.ClientId, + ClientSecret = PicasaCredentials.ClientSecret, + AuthorizeMode = OAuth2AuthorizeMode.LocalServer, + RefreshToken = Config.RefreshToken, + AccessToken = Config.AccessToken, + AccessTokenExpires = Config.AccessTokenExpires + }; // Copy the settings from the config, which is kept in memory and on the disk - settings.RefreshToken = Config.RefreshToken; - settings.AccessToken = Config.AccessToken; - settings.AccessTokenExpires = Config.AccessTokenExpires; try { var webRequest = OAuth2Helper.CreateOAuth2WebRequest(HTTPMethod.POST, string.Format(UploadUrl, Config.UploadUser, Config.UploadAlbum), settings); @@ -108,7 +110,7 @@ namespace GreenshotPicasaPlugin { return url; } } catch(Exception e) { - LOG.ErrorFormat("Could not parse Picasa response due to error {0}, response was: {1}", e.Message, response); + Log.ErrorFormat("Could not parse Picasa response due to error {0}, response was: {1}", e.Message, response); } return null; } diff --git a/GreenshotPlugin/Controls/AnimatingForm.cs b/GreenshotPlugin/Controls/AnimatingForm.cs index c1e6bedc3..db6fc8c59 100644 --- a/GreenshotPlugin/Controls/AnimatingForm.cs +++ b/GreenshotPlugin/Controls/AnimatingForm.cs @@ -29,7 +29,7 @@ namespace GreenshotPlugin.Controls { /// Extend this Form to have the possibility for animations on your form /// public class AnimatingForm : GreenshotForm { - private static readonly ILog LOG = LogManager.GetLogger(typeof(AnimatingForm)); + private static readonly ILog Log = LogManager.GetLogger(typeof(AnimatingForm)); private const int DEFAULT_VREFRESH = 60; private int _vRefresh; private Timer _timer; @@ -49,7 +49,7 @@ namespace GreenshotPlugin.Controls { get { if (_vRefresh == 0) { // get te hDC of the desktop to get the VREFRESH - using (SafeWindowDCHandle desktopHandle = SafeWindowDCHandle.FromDesktop()) { + using (SafeWindowDcHandle desktopHandle = SafeWindowDcHandle.FromDesktop()) { _vRefresh = GDI32.GetDeviceCaps(desktopHandle, DeviceCaps.VREFRESH); } } @@ -65,11 +65,7 @@ namespace GreenshotPlugin.Controls { /// /// Check if we are in a Terminal Server session OR need to optimize for RDP / remote desktop connections /// - protected bool IsTerminalServerSession { - get { - return !coreConfiguration.DisableRDPOptimizing && (coreConfiguration.OptimizeForRDP || SystemInformation.TerminalServerSession); - } - } + protected bool IsTerminalServerSession => !coreConfiguration.DisableRDPOptimizing && (coreConfiguration.OptimizeForRDP || SystemInformation.TerminalServerSession); /// /// Calculate the amount of frames that an animation takes @@ -89,19 +85,22 @@ namespace GreenshotPlugin.Controls { /// protected AnimatingForm() { Load += delegate { - if (EnableAnimation) { - _timer = new Timer(); - _timer.Interval = 1000 / VRefresh; - _timer.Tick += timer_Tick; - _timer.Start(); + if (!EnableAnimation) + { + return; } + _timer = new Timer + { + Interval = 1000/VRefresh + }; + _timer.Tick += timer_Tick; + _timer.Start(); }; // Unregister at close - FormClosing += delegate { - if (_timer != null) { - _timer.Stop(); - } + FormClosing += delegate + { + _timer?.Stop(); }; } @@ -114,7 +113,7 @@ namespace GreenshotPlugin.Controls { try { Animate(); } catch (Exception ex) { - LOG.Warn("An exception occured while animating:", ex); + Log.Warn("An exception occured while animating:", ex); } } diff --git a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs index 5fae94edd..6a0d52418 100644 --- a/GreenshotPlugin/Controls/ExtendedWebBrowser.cs +++ b/GreenshotPlugin/Controls/ExtendedWebBrowser.cs @@ -59,8 +59,5 @@ namespace GreenshotPlugin.Controls { protected override WebBrowserSiteBase CreateWebBrowserSiteBase() { return new ExtendedWebBrowserSite(this); } - - public ExtendedWebBrowser() { - } } } \ No newline at end of file diff --git a/GreenshotPlugin/Controls/GreenshotComboBox.cs b/GreenshotPlugin/Controls/GreenshotComboBox.cs index 139ecac5e..262309410 100644 --- a/GreenshotPlugin/Controls/GreenshotComboBox.cs +++ b/GreenshotPlugin/Controls/GreenshotComboBox.cs @@ -83,7 +83,7 @@ namespace GreenshotPlugin.Controls { foreach (Enum enumValue in availableValues) { string enumKey = enumTypeName + "." + enumValue; - if (Language.hasKey(enumKey)) { + if (Language.HasKey(enumKey)) { string translation = Language.GetString(enumTypeName + "." + enumValue); if (translation.Equals(selectedValue)) { returnValue = enumValue; diff --git a/GreenshotPlugin/Controls/GreenshotForm.cs b/GreenshotPlugin/Controls/GreenshotForm.cs index f26605e83..e30f7e674 100644 --- a/GreenshotPlugin/Controls/GreenshotForm.cs +++ b/GreenshotPlugin/Controls/GreenshotForm.cs @@ -107,13 +107,16 @@ namespace GreenshotPlugin.Controls { // this "type" Assembly currentAssembly = GetType().Assembly; - string assemblyPath = typeResService.GetPathOfAssembly(currentAssembly.GetName()); - string assemblyDirectory = Path.GetDirectoryName(assemblyPath); - if (!Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\Greenshot\Languages\"))) { - Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\..\Greenshot\Languages\")); - } - if (!Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\Languages\"))) { - Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\..\Languages\")); + if (typeResService != null) + { + string assemblyPath = typeResService.GetPathOfAssembly(currentAssembly.GetName()); + string assemblyDirectory = Path.GetDirectoryName(assemblyPath); + if (assemblyDirectory != null && !Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\Greenshot\Languages\"))) { + Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\..\Greenshot\Languages\")); + } + if (assemblyDirectory != null && !Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\Languages\"))) { + Language.AddLanguageFilePath(Path.Combine(assemblyDirectory, @"..\..\..\Languages\")); + } } } catch (Exception ex) { MessageBox.Show(ex.Message); @@ -131,7 +134,10 @@ namespace GreenshotPlugin.Controls { _isDesignModeLanguageSet = true; try { ApplyLanguage(); - } catch (Exception) { + } + catch (Exception) + { + // ignored } } } @@ -229,7 +235,7 @@ namespace GreenshotPlugin.Controls { /// /// private void OnComponentChanged(object sender, ComponentChangedEventArgs ce) { - if (ce.Component != null && ((IComponent)ce.Component).Site != null && ce.Member != null) { + if (((IComponent) ce.Component)?.Site != null && ce.Member != null) { if ("LanguageKey".Equals(ce.Member.Name)) { Control control = ce.Component as Control; if (control != null) { @@ -249,7 +255,7 @@ namespace GreenshotPlugin.Controls { } private void OnComponentAdded(object sender, ComponentEventArgs ce) { - if (ce.Component != null && ((IComponent)ce.Component).Site != null) { + if (ce.Component?.Site != null) { Control control = ce.Component as Control; if (control != null) { if (!_designTimeControls.ContainsKey(control.Name)) { @@ -257,12 +263,17 @@ namespace GreenshotPlugin.Controls { } else { _designTimeControls[control.Name] = control; } - } else if (ce.Component is ToolStripItem) { - ToolStripItem item = ce.Component as ToolStripItem; - if (!_designTimeControls.ContainsKey(item.Name)) { - _designTimeToolStripItems.Add(item.Name, item); - } else { - _designTimeToolStripItems[item.Name] = item; + } + else + { + var stripItem = ce.Component as ToolStripItem; + if (stripItem != null) { + ToolStripItem item = stripItem; + if (!_designTimeControls.ContainsKey(item.Name)) { + _designTimeToolStripItems.Add(item.Name, item); + } else { + _designTimeToolStripItems[item.Name] = item; + } } } } @@ -308,10 +319,12 @@ namespace GreenshotPlugin.Controls { if (languageBindable == null) { // check if it's a menu! ToolStrip toolStrip = applyTo as ToolStrip; - if (toolStrip != null) { - foreach (ToolStripItem item in toolStrip.Items) { - ApplyLanguage(item); - } + if (toolStrip == null) + { + return; + } + foreach (ToolStripItem item in toolStrip.Items) { + ApplyLanguage(item); } return; } @@ -327,7 +340,7 @@ namespace GreenshotPlugin.Controls { IniSection section = IniConfig.GetIniSection(configBindable.SectionName); if (section != null) { // Only update the language, so get the actual value and than repopulate - Enum currentValue = (Enum)comboxBox.GetSelectedEnum(); + Enum currentValue = comboxBox.GetSelectedEnum(); comboxBox.Populate(section.Values[configBindable.PropertyName].ValueType); comboxBox.SetValue(currentValue); } @@ -341,7 +354,7 @@ namespace GreenshotPlugin.Controls { /// /// private static FieldInfo[] GetCachedFields(Type typeToGetFieldsFor) { - FieldInfo[] fields = null; + FieldInfo[] fields; if (!reflectionCache.TryGetValue(typeToGetFieldsFor, out fields)) { fields = typeToGetFieldsFor.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); reflectionCache.Add(typeToGetFieldsFor, fields); @@ -353,17 +366,17 @@ namespace GreenshotPlugin.Controls { /// Apply all the language settings to the "Greenshot" Controls on this form /// protected void ApplyLanguage() { - string langString = null; SuspendLayout(); try { // Set title of the form + string langString; if (!string.IsNullOrEmpty(LanguageKey) && Language.TryGetString(LanguageKey, out langString)) { Text = langString; } // Reset the text values for all GreenshotControls foreach (FieldInfo field in GetCachedFields(GetType())) { - Object controlObject = field.GetValue(this); + object controlObject = field.GetValue(this); if (controlObject == null) { LOG.DebugFormat("No value: {0}", field.Name); continue; @@ -398,7 +411,7 @@ namespace GreenshotPlugin.Controls { /// Apply the language text to supplied control /// protected void ApplyLanguage(Control applyTo, string languageKey) { - string langString = null; + string langString; if (!string.IsNullOrEmpty(languageKey)) { if (!Language.TryGetString(languageKey, out langString)) { LOG.WarnFormat("Wrong language key '{0}' configured for control '{1}'", languageKey, applyTo.Name); @@ -422,18 +435,12 @@ namespace GreenshotPlugin.Controls { /// protected void FillFields() { foreach (FieldInfo field in GetCachedFields(GetType())) { - Object controlObject = field.GetValue(this); - if (controlObject == null) { - continue; - } + var controlObject = field.GetValue(this); IGreenshotConfigBindable configBindable = controlObject as IGreenshotConfigBindable; - if (configBindable == null) { - continue; - } - if (!string.IsNullOrEmpty(configBindable.SectionName) && !string.IsNullOrEmpty(configBindable.PropertyName)) { + if (!string.IsNullOrEmpty(configBindable?.SectionName) && !string.IsNullOrEmpty(configBindable.PropertyName)) { IniSection section = IniConfig.GetIniSection(configBindable.SectionName); if (section != null) { - IniValue iniValue = null; + IniValue iniValue; if (!section.Values.TryGetValue(configBindable.PropertyName, out iniValue)) { LOG.DebugFormat("Wrong property '{0}' configured for field '{1}'",configBindable.PropertyName,field.Name); continue; @@ -445,7 +452,7 @@ namespace GreenshotPlugin.Controls { checkBox.Enabled = !iniValue.IsFixed; continue; } - RadioButton radíoButton = controlObject as RadioButton; + RadioButton radíoButton = controlObject as RadioButton; if (radíoButton != null) { radíoButton.Checked = (bool)iniValue.Value; radíoButton.Enabled = !iniValue.IsFixed; @@ -477,11 +484,11 @@ namespace GreenshotPlugin.Controls { } } } - OnFieldsFilled(); + OnFieldsFilled(); } - protected virtual void OnFieldsFilled() { - } + protected virtual void OnFieldsFilled() { + } /// /// Store all GreenshotControl values to the configuration @@ -489,19 +496,13 @@ namespace GreenshotPlugin.Controls { protected void StoreFields() { bool iniDirty = false; foreach (FieldInfo field in GetCachedFields(GetType())) { - Object controlObject = field.GetValue(this); - if (controlObject == null) { - continue; - } + var controlObject = field.GetValue(this); IGreenshotConfigBindable configBindable = controlObject as IGreenshotConfigBindable; - if (configBindable == null) { - continue; - } - if (!string.IsNullOrEmpty(configBindable.SectionName) && !string.IsNullOrEmpty(configBindable.PropertyName)) { + if (!string.IsNullOrEmpty(configBindable?.SectionName) && !string.IsNullOrEmpty(configBindable.PropertyName)) { IniSection section = IniConfig.GetIniSection(configBindable.SectionName); if (section != null) { - IniValue iniValue = null; + IniValue iniValue; if (!section.Values.TryGetValue(configBindable.PropertyName, out iniValue)) { continue; } @@ -511,7 +512,7 @@ namespace GreenshotPlugin.Controls { iniDirty = true; continue; } - RadioButton radioButton = controlObject as RadioButton; + RadioButton radioButton = controlObject as RadioButton; if (radioButton != null) { iniValue.Value = radioButton.Checked; iniDirty = true; @@ -519,12 +520,12 @@ namespace GreenshotPlugin.Controls { } TextBox textBox = controlObject as TextBox; if (textBox != null) { - HotkeyControl hotkeyControl = controlObject as HotkeyControl; - if (hotkeyControl != null) { - iniValue.Value = hotkeyControl.ToString(); - iniDirty = true; - continue; - } + HotkeyControl hotkeyControl = controlObject as HotkeyControl; + if (hotkeyControl != null) { + iniValue.Value = hotkeyControl.ToString(); + iniDirty = true; + continue; + } iniValue.UseValueOrDefault(textBox.Text); iniDirty = true; continue; @@ -533,7 +534,6 @@ namespace GreenshotPlugin.Controls { if (comboxBox != null) { iniValue.Value = comboxBox.GetSelectedEnum(); iniDirty = true; - continue; } } diff --git a/GreenshotPlugin/Controls/GreenshotRadioButton.cs b/GreenshotPlugin/Controls/GreenshotRadioButton.cs index 90ca3a531..010378da2 100644 --- a/GreenshotPlugin/Controls/GreenshotRadioButton.cs +++ b/GreenshotPlugin/Controls/GreenshotRadioButton.cs @@ -33,16 +33,8 @@ namespace GreenshotPlugin.Controls { set; } - private string sectionName = "Core"; [Category("Greenshot"), DefaultValue("Core"), Description("Specifies the Ini-Section to map this control with.")] - public string SectionName { - get { - return sectionName; - } - set { - sectionName = value; - } - } + public string SectionName { get; set; } = "Core"; [Category("Greenshot"), DefaultValue(null), Description("Specifies the property name to map the configuration.")] public string PropertyName { diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index fb9674ec8..0e40a9cbc 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -37,17 +37,17 @@ namespace GreenshotPlugin.Controls { /// See: http://www.codeproject.com/KB/buttons/hotkeycontrol.aspx /// But is modified to fit in Greenshot, and have localized support /// - public class HotkeyControl : GreenshotTextBox { - private static readonly ILog LOG = LogManager.GetLogger(typeof(HotkeyControl)); + public sealed class HotkeyControl : GreenshotTextBox { + private static readonly ILog Log = LogManager.GetLogger(typeof(HotkeyControl)); - private static readonly EventDelay eventDelay = new EventDelay(TimeSpan.FromMilliseconds(600).Ticks); - private static readonly bool isWindows7OrOlder = Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 1; + private static readonly EventDelay EventDelay = new EventDelay(TimeSpan.FromMilliseconds(600).Ticks); + private static readonly bool IsWindows7OrOlder = Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 1; // Holds the list of hotkeys - private static readonly IDictionary keyHandlers = new Dictionary(); - private static int hotKeyCounter = 1; + private static readonly IDictionary KeyHandlers = new Dictionary(); + private static int _hotKeyCounter = 1; private const uint WM_HOTKEY = 0x312; - private static IntPtr hotkeyHWND; + private static IntPtr _hotkeyHwnd; // static HotkeyControl() { // StringBuilder keyName = new StringBuilder(); @@ -96,20 +96,20 @@ namespace GreenshotPlugin.Controls { // ArrayLists used to enforce the use of proper modifiers. // Shift+A isn't a valid hotkey, for instance, as it would screw up when the user is typing. - private readonly ArrayList needNonShiftModifier; - private readonly ArrayList needNonAltGrModifier; + private readonly ArrayList _needNonShiftModifier; + private readonly ArrayList _needNonAltGrModifier; - private readonly ContextMenu dummy = new ContextMenu(); + private readonly ContextMenu _dummy = new ContextMenu(); /// /// Used to make sure that there is no right-click menu available /// public override ContextMenu ContextMenu { get { - return dummy; + return _dummy; } set { - base.ContextMenu = dummy; + base.ContextMenu = _dummy; } } @@ -130,7 +130,7 @@ namespace GreenshotPlugin.Controls { /// Creates a new HotkeyControl /// public HotkeyControl() { - ContextMenu = dummy; // Disable right-clicking + ContextMenu = _dummy; // Disable right-clicking Text = "None"; // Handle events that occurs when keys are pressed @@ -139,8 +139,8 @@ namespace GreenshotPlugin.Controls { KeyDown += HotkeyControl_KeyDown; // Fill the ArrayLists that contain all invalid hotkey combinations - needNonShiftModifier = new ArrayList(); - needNonAltGrModifier = new ArrayList(); + _needNonShiftModifier = new ArrayList(); + _needNonAltGrModifier = new ArrayList(); PopulateModifierLists(); } @@ -151,41 +151,41 @@ namespace GreenshotPlugin.Controls { private void PopulateModifierLists() { // Shift + 0 - 9, A - Z for (Keys k = Keys.D0; k <= Keys.Z; k++) { - needNonShiftModifier.Add((int)k); + _needNonShiftModifier.Add((int)k); } // Shift + Numpad keys for (Keys k = Keys.NumPad0; k <= Keys.NumPad9; k++) { - needNonShiftModifier.Add((int)k); + _needNonShiftModifier.Add((int)k); } // Shift + Misc (,;<./ etc) for (Keys k = Keys.Oem1; k <= Keys.OemBackslash; k++) { - needNonShiftModifier.Add((int)k); + _needNonShiftModifier.Add((int)k); } // Shift + Space, PgUp, PgDn, End, Home for (Keys k = Keys.Space; k <= Keys.Home; k++) { - needNonShiftModifier.Add((int)k); + _needNonShiftModifier.Add((int)k); } // Misc keys that we can't loop through - needNonShiftModifier.Add((int)Keys.Insert); - needNonShiftModifier.Add((int)Keys.Help); - needNonShiftModifier.Add((int)Keys.Multiply); - needNonShiftModifier.Add((int)Keys.Add); - needNonShiftModifier.Add((int)Keys.Subtract); - needNonShiftModifier.Add((int)Keys.Divide); - needNonShiftModifier.Add((int)Keys.Decimal); - needNonShiftModifier.Add((int)Keys.Return); - needNonShiftModifier.Add((int)Keys.Escape); - needNonShiftModifier.Add((int)Keys.NumLock); - needNonShiftModifier.Add((int)Keys.Scroll); - needNonShiftModifier.Add((int)Keys.Pause); + _needNonShiftModifier.Add((int)Keys.Insert); + _needNonShiftModifier.Add((int)Keys.Help); + _needNonShiftModifier.Add((int)Keys.Multiply); + _needNonShiftModifier.Add((int)Keys.Add); + _needNonShiftModifier.Add((int)Keys.Subtract); + _needNonShiftModifier.Add((int)Keys.Divide); + _needNonShiftModifier.Add((int)Keys.Decimal); + _needNonShiftModifier.Add((int)Keys.Return); + _needNonShiftModifier.Add((int)Keys.Escape); + _needNonShiftModifier.Add((int)Keys.NumLock); + _needNonShiftModifier.Add((int)Keys.Scroll); + _needNonShiftModifier.Add((int)Keys.Pause); // Ctrl+Alt + 0 - 9 for (Keys k = Keys.D0; k <= Keys.D9; k++) { - needNonAltGrModifier.Add((int)k); + _needNonAltGrModifier.Add((int)k); } } @@ -205,7 +205,6 @@ namespace GreenshotPlugin.Controls { // Clear the current hotkey if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete) { ResetHotkey(); - return; } else { _modifiers = e.Modifiers; _hotkey = e.KeyCode; @@ -227,7 +226,6 @@ namespace GreenshotPlugin.Controls { if (_hotkey == Keys.None && ModifierKeys == Keys.None) { ResetHotkey(); - return; } } @@ -301,18 +299,11 @@ namespace GreenshotPlugin.Controls { } } - /// - /// Helper function - /// - private void Redraw() { - Redraw(false); - } - /// /// Redraws the TextBox when necessary. /// /// Specifies whether this function was called by the Hotkey/HotkeyModifiers properties or by the user. - private void Redraw(bool bCalledProgramatically) { + private void Redraw(bool bCalledProgramatically = false) { // No hotkey set if (_hotkey == Keys.None) { Text = ""; @@ -328,10 +319,10 @@ namespace GreenshotPlugin.Controls { // Only validate input if it comes from the user if (bCalledProgramatically == false) { // No modifier or shift only, AND a hotkey that needs another modifier - if ((_modifiers == Keys.Shift || _modifiers == Keys.None) && needNonShiftModifier.Contains((int)_hotkey)) { + if ((_modifiers == Keys.Shift || _modifiers == Keys.None) && _needNonShiftModifier.Contains((int)_hotkey)) { if (_modifiers == Keys.None) { // Set Ctrl+Alt as the modifier unless Ctrl+Alt+ won't work... - if (needNonAltGrModifier.Contains((int)_hotkey) == false) { + if (_needNonAltGrModifier.Contains((int)_hotkey) == false) { _modifiers = Keys.Alt | Keys.Control; } else { // ... in that case, use Shift+Alt instead. @@ -346,7 +337,7 @@ namespace GreenshotPlugin.Controls { } } // Check all Ctrl+Alt keys - if ((_modifiers == (Keys.Alt | Keys.Control)) && needNonAltGrModifier.Contains((int)_hotkey)) { + if ((_modifiers == (Keys.Alt | Keys.Control)) && _needNonAltGrModifier.Contains((int)_hotkey)) { // Ctrl+Alt+4 etc won't work; reset hotkey and tell the user _hotkey = Keys.None; Text = ""; @@ -373,7 +364,7 @@ namespace GreenshotPlugin.Controls { } public static string HotkeyToString(Keys modifierKeyCode, Keys virtualKeyCode) { - return HotkeyModifiersToString(modifierKeyCode) + virtualKeyCode.ToString(); + return HotkeyModifiersToString(modifierKeyCode) + virtualKeyCode; } public static string HotkeyModifiersToString(Keys modifierKeyCode) { @@ -446,8 +437,8 @@ namespace GreenshotPlugin.Controls { return key; } - public static void RegisterHotkeyHWND(IntPtr hWnd) { - hotkeyHWND = hWnd; + public static void RegisterHotkeyHwnd(IntPtr hWnd) { + _hotkeyHwnd = hWnd; } public static int RegisterHotKey(string hotkey, HotKeyHandler handler) { @@ -463,7 +454,7 @@ namespace GreenshotPlugin.Controls { /// the hotkey number, -1 if failed public static int RegisterHotKey(Keys modifierKeyCode, Keys virtualKeyCode, HotKeyHandler handler) { if (virtualKeyCode == Keys.None) { - LOG.Warn("Trying to register a Keys.none hotkey, ignoring"); + Log.Warn("Trying to register a Keys.none hotkey, ignoring"); return 0; } // Convert Modifiers to fit HKM_SETHOTKEY @@ -481,37 +472,37 @@ namespace GreenshotPlugin.Controls { modifiers |= (uint)Modifiers.WIN; } // Disable repeating hotkey for Windows 7 and beyond, as described in #1559 - if (isWindows7OrOlder) { + if (IsWindows7OrOlder) { modifiers |= (uint)Modifiers.NO_REPEAT; } - if (RegisterHotKey(hotkeyHWND, hotKeyCounter, modifiers, (uint)virtualKeyCode)) { - keyHandlers.Add(hotKeyCounter, handler); - return hotKeyCounter++; + if (RegisterHotKey(_hotkeyHwnd, _hotKeyCounter, modifiers, (uint)virtualKeyCode)) { + KeyHandlers.Add(_hotKeyCounter, handler); + return _hotKeyCounter++; } else { - LOG.Warn(String.Format("Couldn't register hotkey modifier {0} virtualKeyCode {1}", modifierKeyCode, virtualKeyCode)); + Log.Warn($"Couldn't register hotkey modifier {modifierKeyCode} virtualKeyCode {virtualKeyCode}"); return -1; } } public static void UnregisterHotkeys() { - foreach(int hotkey in keyHandlers.Keys) { - UnregisterHotKey(hotkeyHWND, hotkey); + foreach(int hotkey in KeyHandlers.Keys) { + UnregisterHotKey(_hotkeyHwnd, hotkey); } // Remove all key handlers - keyHandlers.Clear(); + KeyHandlers.Clear(); } public static void UnregisterHotkey(int hotkey) { bool removeHotkey = false; - foreach(int availableHotkey in keyHandlers.Keys) { + foreach(int availableHotkey in KeyHandlers.Keys) { if (availableHotkey == hotkey) { - UnregisterHotKey(hotkeyHWND, hotkey); + UnregisterHotKey(_hotkeyHwnd, hotkey); removeHotkey = true; } } if (removeHotkey) { // Remove key handler - keyHandlers.Remove(hotkey); + KeyHandlers.Remove(hotkey); } } @@ -523,11 +514,11 @@ namespace GreenshotPlugin.Controls { public static bool HandleMessages(ref Message m) { if (m.Msg == WM_HOTKEY) { // Call handler - if (isWindows7OrOlder) { - keyHandlers[(int)m.WParam](); + if (IsWindows7OrOlder) { + KeyHandlers[(int)m.WParam](); } else { - if (eventDelay.Check()) { - keyHandlers[(int)m.WParam](); + if (EventDelay.Check()) { + KeyHandlers[(int)m.WParam](); } } return true; @@ -537,10 +528,10 @@ namespace GreenshotPlugin.Controls { public static string GetKeyName(Keys givenKey) { StringBuilder keyName = new StringBuilder(); - const uint NUMPAD = 55; + const uint numpad = 55; Keys virtualKey = givenKey; - string keyString = ""; + string keyString; // Make VC's to real keys switch(virtualKey) { case Keys.Alt: @@ -553,17 +544,17 @@ namespace GreenshotPlugin.Controls { virtualKey = Keys.LShiftKey; break; case Keys.Multiply: - GetKeyNameText(NUMPAD << 16, keyName, 100); + GetKeyNameText(numpad << 16, keyName, 100); keyString = keyName.ToString().Replace("*","").Trim().ToLower(); - if (keyString.IndexOf("(") >= 0) { + if (keyString.IndexOf("(", StringComparison.Ordinal) >= 0) { return "* " + keyString; } keyString = keyString.Substring(0,1).ToUpper() + keyString.Substring(1).ToLower(); return keyString + " *"; case Keys.Divide: - GetKeyNameText(NUMPAD << 16, keyName, 100); + GetKeyNameText(numpad << 16, keyName, 100); keyString = keyName.ToString().Replace("*","").Trim().ToLower(); - if (keyString.IndexOf("(") >= 0) { + if (keyString.IndexOf("(", StringComparison.Ordinal) >= 0) { return "/ " + keyString; } keyString = keyString.Substring(0,1).ToUpper() + keyString.Substring(1).ToLower(); @@ -578,7 +569,7 @@ namespace GreenshotPlugin.Controls { case Keys.End: case Keys.Home: case Keys.Insert: case Keys.Delete: case Keys.NumLock: - LOG.Debug("Modifying Extended bit"); + Log.Debug("Modifying Extended bit"); scanCode |= 0x100; // set extended bit break; case Keys.PrintScreen: // PrintScreen diff --git a/GreenshotPlugin/Controls/ThumbnailForm.cs b/GreenshotPlugin/Controls/ThumbnailForm.cs index 72152185a..c0ca8435b 100644 --- a/GreenshotPlugin/Controls/ThumbnailForm.cs +++ b/GreenshotPlugin/Controls/ThumbnailForm.cs @@ -77,10 +77,10 @@ namespace GreenshotPlugin.Controls { SIZE sourceSize; DWM.DwmQueryThumbnailSourceSize(_thumbnailHandle, out sourceSize); int thumbnailHeight = 200; - int thumbnailWidth = (int)(thumbnailHeight * ((float)sourceSize.Width / (float)sourceSize.Height)); + int thumbnailWidth = (int)(thumbnailHeight * (sourceSize.Width / (float)sourceSize.Height)); if (parentControl != null && thumbnailWidth > parentControl.Width) { thumbnailWidth = parentControl.Width; - thumbnailHeight = (int)(thumbnailWidth * ((float)sourceSize.Height / (float)sourceSize.Width)); + thumbnailHeight = (int)(thumbnailWidth * (sourceSize.Height / (float)sourceSize.Width)); } Width = thumbnailWidth; Height = thumbnailHeight; diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index b0a0bd965..1980e2614 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -33,8 +33,8 @@ namespace GreenshotPlugin.Core { /// Description of AbstractDestination. /// public abstract class AbstractDestination : IDestination { - private static readonly ILog LOG = LogManager.GetLogger(typeof(AbstractDestination)); - private static readonly CoreConfiguration configuration = IniConfig.GetIniSection(); + private static readonly ILog Log = LogManager.GetLogger(typeof(AbstractDestination)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); public virtual int CompareTo(object obj) { IDestination other = obj as IDestination; @@ -42,7 +42,7 @@ namespace GreenshotPlugin.Core { return 1; } if (Priority == other.Priority) { - return Description.CompareTo(other.Description); + return String.Compare(Description, other.Description, StringComparison.Ordinal); } return Priority - other.Priority; } @@ -55,23 +55,11 @@ namespace GreenshotPlugin.Core { get; } - public virtual int Priority { - get { - return 10; - } - } - - public virtual Image DisplayIcon { - get { - return null; - } - } + public virtual int Priority => 10; - public virtual Keys EditorShortcutKeys { - get { - return Keys.None; - } - } + public virtual Image DisplayIcon => null; + + public virtual Keys EditorShortcutKeys => Keys.None; public virtual IEnumerable DynamicDestinations() { yield break; @@ -86,27 +74,15 @@ namespace GreenshotPlugin.Core { //if (disposing) {} } - public virtual bool isDynamic { - get { - return false; - } - } + public virtual bool IsDynamic => false; - public virtual bool useDynamicsOnly { - get { - return false; - } - } + public virtual bool UseDynamicsOnly => false; - public virtual bool isLinkable { - get { - return false; - } - } + public virtual bool IsLinkable => false; - public virtual bool isActive { + public virtual bool IsActive { get { - if (configuration.ExcludeDestinations != null && configuration.ExcludeDestinations.Contains(Designation)) { + if (CoreConfig.ExcludeDestinations != null && CoreConfig.ExcludeDestinations.Contains(Designation)) { return false; } return true; @@ -132,7 +108,7 @@ namespace GreenshotPlugin.Core { surface.SendMessageEvent(this, SurfaceMessageTyp.Info, Language.GetFormattedString("exported_to", exportInformation.DestinationDescription)); } surface.Modified = false; - } else if (exportInformation != null && !string.IsNullOrEmpty(exportInformation.ErrorMessage)) { + } else if (!string.IsNullOrEmpty(exportInformation?.ErrorMessage)) { surface.SendMessageEvent(this, SurfaceMessageTyp.Error, Language.GetFormattedString("exported_to_error", exportInformation.DestinationDescription) + " " + exportInformation.ErrorMessage); } } @@ -149,12 +125,14 @@ namespace GreenshotPlugin.Core { /// Value for the tag private void AddTagEvents(ToolStripMenuItem menuItem, ContextMenuStrip menu, string tagValue) { if (menuItem != null && menu != null) { - menuItem.MouseDown += delegate(object source, MouseEventArgs eventArgs) { - LOG.DebugFormat("Setting tag to '{0}'", tagValue); + menuItem.MouseDown += delegate + { + Log.DebugFormat("Setting tag to '{0}'", tagValue); menu.Tag = tagValue; }; - menuItem.MouseUp += delegate(object source, MouseEventArgs eventArgs) { - LOG.Debug("Deleting tag"); + menuItem.MouseUp += delegate + { + Log.Debug("Deleting tag"); menu.Tag = null; }; } @@ -171,19 +149,21 @@ namespace GreenshotPlugin.Core { public ExportInformation ShowPickerMenu(bool addDynamics, ISurface surface, ICaptureDetails captureDetails, IEnumerable destinations) { // Generate an empty ExportInformation object, for when nothing was selected. ExportInformation exportInformation = new ExportInformation(Designation, Language.GetString("settings_destination_picker")); - ContextMenuStrip menu = new ContextMenuStrip(); - menu.ImageScalingSize = configuration.IconSize; - menu.Tag = null; + var menu = new ContextMenuStrip + { + ImageScalingSize = CoreConfig.IconSize, + Tag = null + }; menu.Closing += delegate(object source, ToolStripDropDownClosingEventArgs eventArgs) { - LOG.DebugFormat("Close reason: {0}", eventArgs.CloseReason); + Log.DebugFormat("Close reason: {0}", eventArgs.CloseReason); switch (eventArgs.CloseReason) { case ToolStripDropDownCloseReason.AppFocusChange: if (menu.Tag == null) { // Do not allow the close if the tag is not set, this means the user clicked somewhere else. eventArgs.Cancel = true; } else { - LOG.DebugFormat("Letting the menu 'close' as the tag is set to '{0}'", menu.Tag); + Log.DebugFormat("Letting the menu 'close' as the tag is set to '{0}'", menu.Tag); } break; case ToolStripDropDownCloseReason.ItemClicked: @@ -202,7 +182,8 @@ namespace GreenshotPlugin.Core { break; } }; - menu.MouseEnter += delegate(object source, EventArgs eventArgs) { + menu.MouseEnter += delegate + { // in case the menu has been unfocused, focus again so that dropdown menus will still open on mouseenter if(!menu.ContainsFocus) menu.Focus(); }; @@ -211,10 +192,7 @@ namespace GreenshotPlugin.Core { ToolStripMenuItem item = destination.GetMenuItem(addDynamics, menu, delegate(object sender, EventArgs e) { ToolStripMenuItem toolStripMenuItem = sender as ToolStripMenuItem; - if (toolStripMenuItem == null) { - return; - } - IDestination clickedDestination = (IDestination)toolStripMenuItem.Tag; + IDestination clickedDestination = (IDestination) toolStripMenuItem?.Tag; if (clickedDestination == null) { return; } @@ -222,7 +200,7 @@ namespace GreenshotPlugin.Core { // Export exportInformation = clickedDestination.ExportCapture(true, surface, captureDetails); if (exportInformation != null && exportInformation.ExportMade) { - LOG.InfoFormat("Export to {0} success, closing menu", exportInformation.DestinationDescription); + Log.InfoFormat("Export to {0} success, closing menu", exportInformation.DestinationDescription); // close menu if the destination wasn't the editor menu.Close(); @@ -232,7 +210,7 @@ namespace GreenshotPlugin.Core { surface = null; } } else { - LOG.Info("Export cancelled or failed, showing menu again"); + Log.Info("Export cancelled or failed, showing menu again"); // Make sure a click besides the menu don't close it. menu.Tag = null; @@ -248,8 +226,10 @@ namespace GreenshotPlugin.Core { } // Close menu.Items.Add(new ToolStripSeparator()); - ToolStripMenuItem closeItem = new ToolStripMenuItem(Language.GetString("editor_close")); - closeItem.Image = GreenshotResources.getImage("Close.Image"); + ToolStripMenuItem closeItem = new ToolStripMenuItem(Language.GetString("editor_close")) + { + Image = GreenshotResources.getImage("Close.Image") + }; closeItem.Click += delegate { // This menu entry is the close itself, we can dispose the surface menu.Close(); @@ -314,7 +294,7 @@ namespace GreenshotPlugin.Core { basisMenuItem.Click -= destinationClickHandler; basisMenuItem.Click += destinationClickHandler; - if (isDynamic && addDynamics) { + if (IsDynamic && addDynamics) { basisMenuItem.DropDownOpening += delegate { if (basisMenuItem.DropDownItems.Count == 0) { @@ -323,21 +303,21 @@ namespace GreenshotPlugin.Core { try { subDestinations.AddRange(DynamicDestinations()); } catch (Exception ex) { - LOG.ErrorFormat("Skipping {0}, due to the following error: {1}", Description, ex.Message); + Log.ErrorFormat("Skipping {0}, due to the following error: {1}", Description, ex.Message); } if (subDestinations.Count > 0) { - ToolStripMenuItem destinationMenuItem = null; - - if (useDynamicsOnly && subDestinations.Count == 1) { + if (UseDynamicsOnly && subDestinations.Count == 1) { basisMenuItem.Tag = subDestinations[0]; basisMenuItem.Text = subDestinations[0].Description; basisMenuItem.Click -= destinationClickHandler; basisMenuItem.Click += destinationClickHandler; } else { foreach (IDestination subDestination in subDestinations) { - destinationMenuItem = new ToolStripMenuItem(subDestination.Description); - destinationMenuItem.Tag = subDestination; - destinationMenuItem.Image = subDestination.DisplayIcon; + var destinationMenuItem = new ToolStripMenuItem(subDestination.Description) + { + Tag = subDestination, + Image = subDestination.DisplayIcon + }; destinationMenuItem.Click += destinationClickHandler; AddTagEvents(destinationMenuItem, menu, subDestination.Description); basisMenuItem.DropDownItems.Add(destinationMenuItem); diff --git a/GreenshotPlugin/Core/AccessibleHelper.cs b/GreenshotPlugin/Core/AccessibleHelper.cs index 704ecd60e..9b6064f30 100644 --- a/GreenshotPlugin/Core/AccessibleHelper.cs +++ b/GreenshotPlugin/Core/AccessibleHelper.cs @@ -33,11 +33,11 @@ namespace GreenshotPlugin.Core { /// Maybe move the basic Accessible functions to WindowDetails!? /// public class Accessible { - private static ILog LOG = LogManager.GetLogger(typeof(Accessible)); + private static readonly ILog Log = LogManager.GetLogger(typeof(Accessible)); #region Interop private static int AccessibleObjectFromWindow(IntPtr hWnd, OBJID idObject, ref IAccessible acc) { - Guid guid = new Guid("{618736e0-3c3d-11cf-810c-00aa00389b71}"); // IAccessible + var guid = new Guid("{618736e0-3c3d-11cf-810c-00aa00389b71}"); // IAccessible object obj = null; int num = AccessibleObjectFromWindow(hWnd, (uint)idObject, ref guid, ref obj); acc = (IAccessible)obj; diff --git a/GreenshotPlugin/Core/Cache.cs b/GreenshotPlugin/Core/Cache.cs index 0c5c09a78..61604c23b 100644 --- a/GreenshotPlugin/Core/Cache.cs +++ b/GreenshotPlugin/Core/Cache.cs @@ -30,11 +30,11 @@ namespace GreenshotPlugin.Core { /// Type of key /// Type of value public class Cache { - private static readonly ILog LOG = LogManager.GetLogger(typeof(Cache)); - private readonly IDictionary internalCache = new Dictionary(); - private readonly object lockObject = new object(); - private readonly int secondsToExpire = 10; - private readonly CacheObjectExpired expiredCallback; + private static readonly ILog Log = LogManager.GetLogger(typeof(Cache)); + private readonly IDictionary _internalCache = new Dictionary(); + private readonly object _lockObject = new object(); + private readonly int _secondsToExpire = 10; + private readonly CacheObjectExpired _expiredCallback; public delegate void CacheObjectExpired(TK key, TV cacheValue); /// @@ -47,7 +47,7 @@ namespace GreenshotPlugin.Core { /// /// public Cache(CacheObjectExpired expiredCallback) : this() { - this.expiredCallback = expiredCallback; + _expiredCallback = expiredCallback; } /// @@ -55,7 +55,7 @@ namespace GreenshotPlugin.Core { /// /// public Cache(int secondsToExpire) : this() { - this.secondsToExpire = secondsToExpire; + _secondsToExpire = secondsToExpire; } /// @@ -64,7 +64,7 @@ namespace GreenshotPlugin.Core { /// /// public Cache(int secondsToExpire, CacheObjectExpired expiredCallback) : this(expiredCallback) { - this.secondsToExpire = secondsToExpire; + _secondsToExpire = secondsToExpire; } /// @@ -74,9 +74,9 @@ namespace GreenshotPlugin.Core { get { List elements = new List(); - lock (lockObject) + lock (_lockObject) { - foreach (TV element in internalCache.Values) { + foreach (TV element in _internalCache.Values) { elements.Add(element); } } @@ -94,9 +94,9 @@ namespace GreenshotPlugin.Core { public TV this[TK key] { get { TV result = default(TV); - lock (lockObject) { - if (internalCache.ContainsKey(key)) { - result = internalCache[key]; + lock (_lockObject) { + if (_internalCache.ContainsKey(key)) { + result = _internalCache[key]; } } return result; @@ -110,9 +110,9 @@ namespace GreenshotPlugin.Core { /// true if the cache contains the key public bool Contains(TK key) { - lock (lockObject) + lock (_lockObject) { - return internalCache.ContainsKey(key); + return _internalCache.ContainsKey(key); } } @@ -130,28 +130,26 @@ namespace GreenshotPlugin.Core { /// /// /// - /// optional value for the seconds to expire + /// optional value for the seconds to expire public void Add(TK key, TV value, int? secondsToExpire) { - lock (lockObject) { - var cachedItem = new CachedItem(key, value, secondsToExpire.HasValue ? secondsToExpire.Value : this.secondsToExpire); + lock (_lockObject) { + var cachedItem = new CachedItem(key, value, secondsToExpire ?? _secondsToExpire); cachedItem.Expired += delegate(TK cacheKey, TV cacheValue) { - if (internalCache.ContainsKey(cacheKey)) { - LOG.DebugFormat("Expiring object with Key: {0}", cacheKey); - if (expiredCallback != null) { - expiredCallback(cacheKey, cacheValue); - } + if (_internalCache.ContainsKey(cacheKey)) { + Log.DebugFormat("Expiring object with Key: {0}", cacheKey); + _expiredCallback?.Invoke(cacheKey, cacheValue); Remove(cacheKey); } else { - LOG.DebugFormat("Expired old object with Key: {0}", cacheKey); + Log.DebugFormat("Expired old object with Key: {0}", cacheKey); } }; - if (internalCache.ContainsKey(key)) { - internalCache[key] = value; - LOG.DebugFormat("Updated item with Key: {0}", key); + if (_internalCache.ContainsKey(key)) { + _internalCache[key] = value; + Log.DebugFormat("Updated item with Key: {0}", key); } else { - internalCache.Add(key, cachedItem); - LOG.DebugFormat("Added item with Key: {0}", key); + _internalCache.Add(key, cachedItem); + Log.DebugFormat("Added item with Key: {0}", key); } } } @@ -161,12 +159,12 @@ namespace GreenshotPlugin.Core { /// /// public void Remove(TK key) { - lock (lockObject) { - if (!internalCache.ContainsKey(key)) { - throw new ApplicationException(String.Format("An object with key ‘{0}’ does not exists in cache", key)); + lock (_lockObject) { + if (!_internalCache.ContainsKey(key)) { + throw new ApplicationException($"An object with key ‘{key}’ does not exists in cache"); } - internalCache.Remove(key); - LOG.DebugFormat("Removed item with Key: {0}", key); + _internalCache.Remove(key); + Log.DebugFormat("Removed item with Key: {0}", key); } } @@ -175,27 +173,29 @@ namespace GreenshotPlugin.Core { /// private class CachedItem { public event CacheObjectExpired Expired; - private readonly int secondsToExpire; + private readonly int _secondsToExpire; private readonly Timer _timerEvent; public CachedItem(TK key, TV item, int secondsToExpire) { if (key == null) { - throw new ArgumentNullException("key is not valid"); + throw new ArgumentNullException(nameof(key)); } Key = key; Item = item; - this.secondsToExpire = secondsToExpire; - if (secondsToExpire > 0) { - _timerEvent = new Timer(secondsToExpire * 1000) { AutoReset = false }; - _timerEvent.Elapsed += timerEvent_Elapsed; - _timerEvent.Start(); + _secondsToExpire = secondsToExpire; + if (secondsToExpire <= 0) + { + return; } + _timerEvent = new Timer(secondsToExpire * 1000) { AutoReset = false }; + _timerEvent.Elapsed += timerEvent_Elapsed; + _timerEvent.Start(); } private void ExpireNow() { _timerEvent.Stop(); - if (secondsToExpire > 0 && Expired != null) { - Expired(Key, Item); + if (_secondsToExpire > 0) { + Expired?.Invoke(Key, Item); } } diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 93984853c..6e9162f19 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -352,7 +352,7 @@ EndSelection:<<<<<<<4 retrieveFormats = new[] { FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_GIF }; } foreach (string currentFormat in retrieveFormats) { - if (formats.Contains(currentFormat)) { + if (formats != null && formats.Contains(currentFormat)) { Log.InfoFormat("Found {0}, trying to retrieve.", currentFormat); returnImage = GetImageForFormat(currentFormat, dataObject); } else { @@ -385,54 +385,57 @@ EndSelection:<<<<<<<4 if (format == FORMAT_17 || format == DataFormats.Dib) { Log.Info("Found DIB stream, trying to process it."); try { - byte[] dibBuffer = new byte[imageStream.Length]; - imageStream.Read(dibBuffer, 0, dibBuffer.Length); - BITMAPINFOHEADER infoHeader = BinaryStructHelper.FromByteArray(dibBuffer); - if (!infoHeader.IsDibV5) { - Log.InfoFormat("Using special DIB (dibBuffer); + if (!infoHeader.IsDibV5) { + Log.InfoFormat("Using special DIB ") + "".Length).ToString("D8")); - sb.Replace("<<<<<<<2", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); - sb.Replace("<<<<<<<3", (utf8EncodedHtmlString.IndexOf("")+"".Length).ToString("D8")); - sb.Replace("<<<<<<<4", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); + sb.Replace("<<<<<<<1", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal) + "".Length).ToString("D8")); + sb.Replace("<<<<<<<2", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal)).ToString("D8")); + sb.Replace("<<<<<<<3", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal)+"".Length).ToString("D8")); + sb.Replace("<<<<<<<4", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal)).ToString("D8")); return sb.ToString(); } @@ -510,13 +513,14 @@ EndSelection:<<<<<<<4 utf8EncodedHtmlString = utf8EncodedHtmlString.Replace("${data}", Convert.ToBase64String(pngStream.GetBuffer(),0, (int)pngStream.Length)); StringBuilder sb=new StringBuilder(); sb.Append(utf8EncodedHtmlString); - sb.Replace("<<<<<<<1", (utf8EncodedHtmlString.IndexOf("") + "".Length).ToString("D8")); - sb.Replace("<<<<<<<2", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); - sb.Replace("<<<<<<<3", (utf8EncodedHtmlString.IndexOf("")+"".Length).ToString("D8")); - sb.Replace("<<<<<<<4", (utf8EncodedHtmlString.IndexOf("")).ToString("D8")); + sb.Replace("<<<<<<<1", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal) + "".Length).ToString("D8")); + sb.Replace("<<<<<<<2", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal)).ToString("D8")); + sb.Replace("<<<<<<<3", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal)+"".Length).ToString("D8")); + sb.Replace("<<<<<<<4", (utf8EncodedHtmlString.IndexOf("", StringComparison.Ordinal)).ToString("D8")); return sb.ToString(); } + private const int BITMAPFILEHEADER_LENGTH = 14; /// /// Set an Image to the clipboard /// This method will place images to the clipboard depending on the ClipboardFormats setting. @@ -526,7 +530,6 @@ EndSelection:<<<<<<<4 /// When pasting a Dib in PP 2003 the Bitmap is somehow shifted left! /// For this problem the user should not use the direct paste (=Dib), but select Bitmap /// - private const int BITMAPFILEHEADER_LENGTH = 14; public static void SetClipboardData(ISurface surface) { DataObject dataObject = new DataObject(); @@ -553,8 +556,8 @@ EndSelection:<<<<<<<4 // Set the PNG stream dataObject.SetData(FORMAT_PNG, false, pngStream); } - } catch (Exception pngEX) { - Log.Error("Error creating PNG for the Clipboard.", pngEX); + } catch (Exception pngEx) { + Log.Error("Error creating PNG for the Clipboard.", pngEx); } try { @@ -650,20 +653,10 @@ EndSelection:<<<<<<<4 // Place the DataObject to the clipboard SetDataObject(dataObject, true); } - - if (pngStream != null) { - pngStream.Dispose(); - pngStream = null; - } - if (dibStream != null) { - dibStream.Dispose(); - dibStream = null; - } - if (dibV5Stream != null) { - dibV5Stream.Dispose(); - dibV5Stream = null; - } + pngStream?.Dispose(); + dibStream?.Dispose(); + dibV5Stream?.Dispose(); // cleanup if needed if (disposeImage) { imageToSave?.Dispose(); diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index a667fa349..57de57088 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -287,9 +287,7 @@ namespace GreenshotPlugin.Core { } if (_iconSize != newSize) { _iconSize = value; - if (PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs("IconSize")); - } + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IconSize")); } } } @@ -317,18 +315,14 @@ namespace GreenshotPlugin.Core { } } - public bool UseLargeIcons { - get { - return IconSize.Width >= 32 || IconSize.Height >= 32; - } - } + public bool UseLargeIcons => IconSize.Width >= 32 || IconSize.Height >= 32; /// /// A helper method which returns true if the supplied experimental feature is enabled /// /// /// - public bool isExperimentalFeatureEnabled(string experimentalFeature) { + public bool IsExperimentalFeatureEnabled(string experimentalFeature) { return (ExperimentalFeatures != null && ExperimentalFeatures.Contains(experimentalFeature)); } @@ -367,23 +361,11 @@ namespace GreenshotPlugin.Core { case "DWMBackgroundColor": return Color.Transparent; case "ActiveTitleFixes": - List activeDefaults = new List(); - activeDefaults.Add("Firefox"); - activeDefaults.Add("IE"); - activeDefaults.Add("Chrome"); - return activeDefaults; + return new List {"Firefox", "IE", "Chrome"}; case "TitleFixMatcher": - Dictionary matcherDefaults = new Dictionary(); - matcherDefaults.Add("Firefox", " - Mozilla Firefox.*"); - matcherDefaults.Add("IE", " - (Microsoft|Windows) Internet Explorer.*"); - matcherDefaults.Add("Chrome", " - Google Chrome.*"); - return matcherDefaults; + return new Dictionary {{"Firefox", " - Mozilla Firefox.*"}, {"IE", " - (Microsoft|Windows) Internet Explorer.*"}, {"Chrome", " - Google Chrome.*"}}; case "TitleFixReplacer": - Dictionary replacerDefaults = new Dictionary(); - replacerDefaults.Add("Firefox", ""); - replacerDefaults.Add("IE", ""); - replacerDefaults.Add("Chrome", ""); - return replacerDefaults; + return new Dictionary {{"Firefox", ""}, {"IE", ""}, {"Chrome", ""}}; } return null; } @@ -417,7 +399,10 @@ namespace GreenshotPlugin.Core { try { // Store version, this can be used later to fix settings after an update LastSaveWithVersion = Assembly.GetEntryAssembly().GetName().Version.ToString(); - } catch { + } + catch + { + // ignored } } @@ -432,8 +417,10 @@ namespace GreenshotPlugin.Core { try { // Store version, this can be used later to fix settings after an update LastSaveWithVersion = Assembly.GetEntryAssembly().GetName().Version.ToString(); - } catch { - + } + catch + { + // ignored } // Disable the AutoReduceColors as it causes issues with Mozzila applications and some others OutputFileAutoReduceColors = false; @@ -465,10 +452,7 @@ namespace GreenshotPlugin.Core { // Make sure we have clipboard formats, otherwise a paste doesn't make sense! if (ClipboardFormats == null || ClipboardFormats.Count == 0) { - ClipboardFormats = new List(); - ClipboardFormats.Add(ClipboardFormat.PNG); - ClipboardFormats.Add(ClipboardFormat.HTML); - ClipboardFormats.Add(ClipboardFormat.DIB); + ClipboardFormats = new List {ClipboardFormat.PNG, ClipboardFormat.HTML, ClipboardFormat.DIB}; } // Make sure the lists are lowercase, to speedup the check diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index 6aa8d2bff..bffce88e5 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -114,7 +114,7 @@ namespace GreenshotPlugin.Core { /// Gets or sets if the credentials are to be persisted in the credential manager. public bool Persist { get; set; } = true; - /// Gets or sets if the incorrect password balloontip needs to be shown. Introduced AFTER Windows XPGets> + /// Gets or sets if the incorrect password balloontip needs to be shown. Introduced AFTER Windows XP public bool IncorrectPassword { get; set; } /// Gets or sets if the name is read-only. @@ -127,14 +127,12 @@ namespace GreenshotPlugin.Core { return _name; } set { - if (value != null) { - if (value.Length > CREDUI.MAX_USERNAME_LENGTH) { - string message = string.Format( - Thread.CurrentThread.CurrentUICulture, - "The name has a maximum length of {0} characters.", - CREDUI.MAX_USERNAME_LENGTH); - throw new ArgumentException(message, nameof(Name)); - } + if (value?.Length > CredUi.MAX_USERNAME_LENGTH) { + string message = string.Format( + Thread.CurrentThread.CurrentUICulture, + "The name has a maximum length of {0} characters.", + CredUi.MAX_USERNAME_LENGTH); + throw new ArgumentException(message, nameof(Name)); } _name = value; } @@ -147,14 +145,12 @@ namespace GreenshotPlugin.Core { return _password; } set { - if (value != null) { - if (value.Length > CREDUI.MAX_PASSWORD_LENGTH) { - string message = string.Format( - Thread.CurrentThread.CurrentUICulture, - "The password has a maximum length of {0} characters.", - CREDUI.MAX_PASSWORD_LENGTH); - throw new ArgumentException(message, nameof(Password)); - } + if (value?.Length > CredUi.MAX_PASSWORD_LENGTH) { + string message = string.Format( + Thread.CurrentThread.CurrentUICulture, + "The password has a maximum length of {0} characters.", + CredUi.MAX_PASSWORD_LENGTH); + throw new ArgumentException(message, nameof(Password)); } _password = value; } @@ -175,13 +171,13 @@ namespace GreenshotPlugin.Core { } set { if (value == null) { - throw new ArgumentException("The target cannot be a null value.", "Target"); + throw new ArgumentException("The target cannot be a null value.", nameof(Target)); } - if (value.Length > CREDUI.MAX_GENERIC_TARGET_LENGTH) { + if (value.Length > CredUi.MAX_GENERIC_TARGET_LENGTH) { string message = string.Format( Thread.CurrentThread.CurrentUICulture, "The target has a maximum length of {0} characters.", - CREDUI.MAX_GENERIC_TARGET_LENGTH); + CredUi.MAX_GENERIC_TARGET_LENGTH); throw new ArgumentException(message, nameof(Target)); } _target = value; @@ -196,14 +192,12 @@ namespace GreenshotPlugin.Core { return _caption; } set { - if (value != null) { - if (value.Length > CREDUI.MAX_CAPTION_LENGTH) { - string message = string.Format( - Thread.CurrentThread.CurrentUICulture, - "The caption has a maximum length of {0} characters.", - CREDUI.MAX_CAPTION_LENGTH); - throw new ArgumentException(message, nameof(Caption)); - } + if (value?.Length > CredUi.MAX_CAPTION_LENGTH) { + string message = string.Format( + Thread.CurrentThread.CurrentUICulture, + "The caption has a maximum length of {0} characters.", + CredUi.MAX_CAPTION_LENGTH); + throw new ArgumentException(message, nameof(Caption)); } _caption = value; } @@ -217,14 +211,12 @@ namespace GreenshotPlugin.Core { return _message; } set { - if (value != null) { - if (value.Length > CREDUI.MAX_MESSAGE_LENGTH) { - string message = string.Format( - Thread.CurrentThread.CurrentUICulture, - "The message has a maximum length of {0} characters.", - CREDUI.MAX_MESSAGE_LENGTH); - throw new ArgumentException(message, nameof(Message)); - } + if (value?.Length > CredUi.MAX_MESSAGE_LENGTH) { + string message = string.Format( + Thread.CurrentThread.CurrentUICulture, + "The message has a maximum length of {0} characters.", + CredUi.MAX_MESSAGE_LENGTH); + throw new ArgumentException(message, nameof(Message)); } _message = value; } @@ -331,11 +323,11 @@ namespace GreenshotPlugin.Core { /// Confirmation action to be applied. /// True if the credentials should be persisted. public void Confirm(bool value) { - switch (CREDUI.CredUIConfirmCredentials(Target, value)) { - case CREDUI.ReturnCodes.NO_ERROR: + switch (CredUi.CredUIConfirmCredentials(Target, value)) { + case CredUi.ReturnCodes.NO_ERROR: break; - case CREDUI.ReturnCodes.ERROR_INVALID_PARAMETER: + case CredUi.ReturnCodes.ERROR_INVALID_PARAMETER: // for some reason, this is encountered when credentials are overwritten break; @@ -351,26 +343,26 @@ namespace GreenshotPlugin.Core { /// private DialogResult ShowDialog(IWin32Window owner) { // set the api call parameters - StringBuilder name = new StringBuilder(CREDUI.MAX_USERNAME_LENGTH); + StringBuilder name = new StringBuilder(CredUi.MAX_USERNAME_LENGTH); name.Append(Name); - StringBuilder password = new StringBuilder(CREDUI.MAX_PASSWORD_LENGTH); + StringBuilder password = new StringBuilder(CredUi.MAX_PASSWORD_LENGTH); password.Append(Password); int saveChecked = Convert.ToInt32(SaveChecked); - CREDUI.INFO info = GetInfo(owner); - CREDUI.FLAGS flags = GetFlags(); + CredUi.INFO info = GetInfo(owner); + CredUi.CredFlags credFlags = GetFlags(); // make the api call - CREDUI.ReturnCodes code = CREDUI.CredUIPromptForCredentials( + CredUi.ReturnCodes code = CredUi.CredUIPromptForCredentials( ref info, Target, IntPtr.Zero, 0, - name, CREDUI.MAX_USERNAME_LENGTH, - password, CREDUI.MAX_PASSWORD_LENGTH, + name, CredUi.MAX_USERNAME_LENGTH, + password, CredUi.MAX_PASSWORD_LENGTH, ref saveChecked, - flags + credFlags ); // clean up resources @@ -388,8 +380,8 @@ namespace GreenshotPlugin.Core { /// Returns the info structure for dialog display settings. /// The System.Windows.Forms.IWin32Window the dialog will display in front of. - private CREDUI.INFO GetInfo(IWin32Window owner) { - CREDUI.INFO info = new CREDUI.INFO(); + private CredUi.INFO GetInfo(IWin32Window owner) { + CredUi.INFO info = new CredUi.INFO(); if (owner != null) info.hwndParent = owner.Handle; info.pszCaptionText = Caption; info.pszMessageText = Message; @@ -401,61 +393,61 @@ namespace GreenshotPlugin.Core { } /// Returns the flags for dialog display options. - private CREDUI.FLAGS GetFlags() { - CREDUI.FLAGS flags = CREDUI.FLAGS.GENERIC_CREDENTIALS; + private CredUi.CredFlags GetFlags() { + CredUi.CredFlags credFlags = CredUi.CredFlags.GENERIC_CREDENTIALS; if (IncorrectPassword) { - flags = flags | CREDUI.FLAGS.INCORRECT_PASSWORD; + credFlags = credFlags | CredUi.CredFlags.INCORRECT_PASSWORD; } if (AlwaysDisplay) { - flags = flags | CREDUI.FLAGS.ALWAYS_SHOW_UI; + credFlags = credFlags | CredUi.CredFlags.ALWAYS_SHOW_UI; } if (ExcludeCertificates) { - flags = flags | CREDUI.FLAGS.EXCLUDE_CERTIFICATES; + credFlags = credFlags | CredUi.CredFlags.EXCLUDE_CERTIFICATES; } if (Persist) { - flags = flags | CREDUI.FLAGS.EXPECT_CONFIRMATION; + credFlags = credFlags | CredUi.CredFlags.EXPECT_CONFIRMATION; if (SaveDisplayed) { - flags = flags | CREDUI.FLAGS.SHOW_SAVE_CHECK_BOX; + credFlags = credFlags | CredUi.CredFlags.SHOW_SAVE_CHECK_BOX; } else { - flags = flags | CREDUI.FLAGS.PERSIST; + credFlags = credFlags | CredUi.CredFlags.PERSIST; } } else { - flags = flags | CREDUI.FLAGS.DO_NOT_PERSIST; + credFlags = credFlags | CredUi.CredFlags.DO_NOT_PERSIST; } if (KeepName) { - flags = flags | CREDUI.FLAGS.KEEP_USERNAME; + credFlags = credFlags | CredUi.CredFlags.KEEP_USERNAME; } - return flags; + return credFlags; } /// Returns a DialogResult from the specified code. /// The credential return code. - private DialogResult GetDialogResult(CREDUI.ReturnCodes code) { + private DialogResult GetDialogResult(CredUi.ReturnCodes code) { DialogResult result; switch (code) { - case CREDUI.ReturnCodes.NO_ERROR: + case CredUi.ReturnCodes.NO_ERROR: result = DialogResult.OK; break; - case CREDUI.ReturnCodes.ERROR_CANCELLED: + case CredUi.ReturnCodes.ERROR_CANCELLED: result = DialogResult.Cancel; break; - case CREDUI.ReturnCodes.ERROR_NO_SUCH_LOGON_SESSION: + case CredUi.ReturnCodes.ERROR_NO_SUCH_LOGON_SESSION: throw new ApplicationException("No such logon session."); - case CREDUI.ReturnCodes.ERROR_NOT_FOUND: + case CredUi.ReturnCodes.ERROR_NOT_FOUND: throw new ApplicationException("Not found."); - case CREDUI.ReturnCodes.ERROR_INVALID_ACCOUNT_NAME: + case CredUi.ReturnCodes.ERROR_INVALID_ACCOUNT_NAME: throw new ApplicationException("Invalid account name."); - case CREDUI.ReturnCodes.ERROR_INSUFFICIENT_BUFFER: + case CredUi.ReturnCodes.ERROR_INSUFFICIENT_BUFFER: throw new ApplicationException("Insufficient buffer."); - case CREDUI.ReturnCodes.ERROR_INVALID_PARAMETER: + case CredUi.ReturnCodes.ERROR_INVALID_PARAMETER: throw new ApplicationException("Invalid parameter."); - case CREDUI.ReturnCodes.ERROR_INVALID_FLAGS: + case CredUi.ReturnCodes.ERROR_INVALID_FLAGS: throw new ApplicationException("Invalid flags."); default: throw new ApplicationException("Unknown credential result encountered."); @@ -464,10 +456,7 @@ namespace GreenshotPlugin.Core { } } - internal sealed class CREDUI { - private CREDUI() { - } - + internal static class CredUi { /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/authentication_constants.asp public const int MAX_MESSAGE_LENGTH = 100; public const int MAX_CAPTION_LENGTH = 100; @@ -481,7 +470,8 @@ namespace GreenshotPlugin.Core { /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/dpapiusercredentials.asp /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/creduipromptforcredentials.asp /// - [Flags] public enum FLAGS { + [Flags] + public enum CredFlags { INCORRECT_PASSWORD = 0x1, DO_NOT_PERSIST = 0x2, REQUEST_ADMINISTRATOR = 0x4, @@ -540,7 +530,7 @@ namespace GreenshotPlugin.Core { StringBuilder password, int maxPassword, ref int iSave, - FLAGS flags + CredFlags credFlags ); /// diff --git a/GreenshotPlugin/Core/DisplayKeyAttribute.cs b/GreenshotPlugin/Core/DisplayKeyAttribute.cs index fffd72c36..f8b1c4408 100644 --- a/GreenshotPlugin/Core/DisplayKeyAttribute.cs +++ b/GreenshotPlugin/Core/DisplayKeyAttribute.cs @@ -23,13 +23,10 @@ using System; namespace GreenshotPlugin.Core { [AttributeUsage(AttributeTargets.Field)] public sealed class DisplayKeyAttribute : Attribute { - private readonly string value; - public string Value { - get { return value; } - } - + public string Value { get; } + public DisplayKeyAttribute(string v) { - value = v; + Value = v; } public DisplayKeyAttribute() { diff --git a/GreenshotPlugin/Core/EffectConverter.cs b/GreenshotPlugin/Core/EffectConverter.cs new file mode 100644 index 000000000..1d41b8086 --- /dev/null +++ b/GreenshotPlugin/Core/EffectConverter.cs @@ -0,0 +1,180 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.Text; +using GreenshotPlugin.Effects; + +namespace Greenshot.Core +{ + public class EffectConverter : TypeConverter { + // Fix to prevent BUG-1753 + private readonly NumberFormatInfo _numberFormatInfo = new NumberFormatInfo(); + + public EffectConverter() + { + _numberFormatInfo.NumberDecimalSeparator = "."; + _numberFormatInfo.NumberGroupSeparator = ","; + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { + if (sourceType == typeof(string)) { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { + if (destinationType == typeof(string)) { + return true; + } + if (destinationType == typeof(DropShadowEffect)) { + return true; + } + if (destinationType == typeof(TornEdgeEffect)) { + return true; + } + return base.CanConvertTo(context, destinationType); + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { + // to string + if (destinationType == typeof(string)) { + StringBuilder sb = new StringBuilder(); + if (value.GetType() == typeof(DropShadowEffect)) { + DropShadowEffect effect = value as DropShadowEffect; + RetrieveDropShadowEffectValues(effect, sb); + return sb.ToString(); + } + if (value.GetType() == typeof(TornEdgeEffect)) { + TornEdgeEffect effect = value as TornEdgeEffect; + RetrieveDropShadowEffectValues(effect, sb); + sb.Append("|"); + RetrieveTornEdgeEffectValues(effect, sb); + return sb.ToString(); + } + } + // from string + if (value is string) { + string settings = value as string; + if (destinationType == typeof(DropShadowEffect)) { + DropShadowEffect effect = new DropShadowEffect(); + ApplyDropShadowEffectValues(settings, effect); + return effect; + } + if (destinationType == typeof(TornEdgeEffect)) { + TornEdgeEffect effect = new TornEdgeEffect(); + ApplyDropShadowEffectValues(settings, effect); + ApplyTornEdgeEffectValues(settings, effect); + return effect; + } + } + return base.ConvertTo(context, culture, value, destinationType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { + var settings = value as string; + if (settings != null) { + if (settings.Contains("ToothHeight")) { + return ConvertTo(context, culture, settings, typeof(TornEdgeEffect)); + } + return ConvertTo(context, culture, settings, typeof(DropShadowEffect)); + } + return base.ConvertFrom(context, culture, value); + } + + private void ApplyDropShadowEffectValues(string valuesString, DropShadowEffect effect) { + string[] values = valuesString.Split('|'); + foreach(string nameValuePair in values) { + string[] pair = nameValuePair.Split(':'); + switch (pair[0]) { + case "Darkness" : + float darkness; + // Fix to prevent BUG-1753 + if (pair[1] != null && float.TryParse(pair[1], NumberStyles.Float, _numberFormatInfo, out darkness)) { + if (darkness <= 1.0) { + effect.Darkness = darkness; + } + } + break; + case "ShadowSize": + int shadowSize; + if (int.TryParse(pair[1], out shadowSize)) { + effect.ShadowSize = shadowSize; + } + break; + case "ShadowOffset": + Point shadowOffset = new Point(); + int shadowOffsetX; + int shadowOffsetY; + string[] coordinates = pair[1].Split(','); + if (int.TryParse(coordinates[0], out shadowOffsetX)) { + shadowOffset.X = shadowOffsetX; + } + if (int.TryParse(coordinates[1], out shadowOffsetY)) { + shadowOffset.Y = shadowOffsetY; + } + effect.ShadowOffset = shadowOffset; + break; + } + } + } + + private void ApplyTornEdgeEffectValues(string valuesString, TornEdgeEffect effect) { + string[] values = valuesString.Split('|'); + foreach (string nameValuePair in values) { + string[] pair = nameValuePair.Split(':'); + switch (pair[0]) { + case "GenerateShadow": + bool generateShadow; + if (bool.TryParse(pair[1], out generateShadow)) { + effect.GenerateShadow = generateShadow; + } + break; + case "ToothHeight": + int toothHeight; + if (int.TryParse(pair[1], out toothHeight)) { + effect.ToothHeight = toothHeight; + } + break; + case "HorizontalToothRange": + int horizontalToothRange; + if (int.TryParse(pair[1], out horizontalToothRange)) { + effect.HorizontalToothRange = horizontalToothRange; + } + break; + case "VerticalToothRange": + int verticalToothRange; + if (int.TryParse(pair[1], out verticalToothRange)) { + effect.VerticalToothRange = verticalToothRange; + } + break; + case "Edges": + string[] edges = pair[1].Split(','); + bool edge; + if (bool.TryParse(edges[0], out edge)) { + effect.Edges[0] = edge; + } + if (bool.TryParse(edges[1], out edge)) { + effect.Edges[1] = edge; + } + if (bool.TryParse(edges[2], out edge)) { + effect.Edges[2] = edge; + } + if (bool.TryParse(edges[3], out edge)) { + effect.Edges[3] = edge; + } + break; + } + } + } + + private void RetrieveDropShadowEffectValues(DropShadowEffect effect, StringBuilder sb) { + // Fix to prevent BUG-1753 is to use the numberFormatInfo + sb.AppendFormat("Darkness:{0}|ShadowSize:{1}|ShadowOffset:{2},{3}", effect.Darkness.ToString("F2", _numberFormatInfo), effect.ShadowSize, effect.ShadowOffset.X, effect.ShadowOffset.Y); + } + private void RetrieveTornEdgeEffectValues(TornEdgeEffect effect, StringBuilder sb) { + sb.AppendFormat("GenerateShadow:{0}|ToothHeight:{1}|HorizontalToothRange:{2}|VerticalToothRange:{3}|Edges:{4},{5},{6},{7}", effect.GenerateShadow, effect.ToothHeight, effect.HorizontalToothRange, effect.VerticalToothRange, effect.Edges[0], effect.Edges[1], effect.Edges[2], effect.Edges[3]); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs deleted file mode 100644 index 30924a9a2..000000000 --- a/GreenshotPlugin/Core/Effects.cs +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotPlugin.Core; -using log4net; -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Globalization; -using System.Text; - -namespace Greenshot.Core { - /// - /// Interface to describe an effect - /// - public interface IEffect { - /// - /// Apply this IEffect to the supplied sourceImage. - /// In the process of applying the supplied matrix will be modified to represent the changes. - /// - /// Image to apply the effect to - /// Matrix with the modifications like rotate, translate etc. this can be used to calculate the new location of elements on a canvas - /// new image with applied effect - Image Apply(Image sourceImage, Matrix matrix); - - /// - /// Reset all values to their defaults - /// - void Reset(); - } - - /// - /// DropShadowEffect - /// - [TypeConverter(typeof(EffectConverter))] - public class DropShadowEffect : IEffect { - public DropShadowEffect() { - Reset(); - } - public float Darkness { - get; - set; - } - public int ShadowSize { - get; - set; - } - public Point ShadowOffset { - get; - set; - } - - public virtual void Reset() { - Darkness = 0.6f; - ShadowSize = 7; - ShadowOffset = new Point(-1, -1); - } - - public virtual Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.CreateShadow(sourceImage, Darkness, ShadowSize, ShadowOffset, matrix, PixelFormat.Format32bppArgb); - } - } - - /// - /// TornEdgeEffect extends on DropShadowEffect - /// - [TypeConverter(typeof(EffectConverter))] - public class TornEdgeEffect : DropShadowEffect { - public TornEdgeEffect() - { - Reset(); - } - public int ToothHeight { - get; - set; - } - public int HorizontalToothRange { - get; - set; - } - public int VerticalToothRange { - get; - set; - } - public bool[] Edges { - get; - set; - } - public bool GenerateShadow { - get; - set; - } - - public override void Reset() { - base.Reset(); - ShadowSize = 7; - ToothHeight = 12; - HorizontalToothRange = 20; - VerticalToothRange = 20; - Edges = new[] { true, true, true, true }; - GenerateShadow = true; - } - public override Image Apply(Image sourceImage, Matrix matrix) { - Image tmpTornImage = ImageHelper.CreateTornEdge(sourceImage, ToothHeight, HorizontalToothRange, VerticalToothRange, Edges); - if (GenerateShadow) { - using (tmpTornImage) { - return ImageHelper.CreateShadow(tmpTornImage, Darkness, ShadowSize, ShadowOffset, matrix, PixelFormat.Format32bppArgb); - } - } - return tmpTornImage; - } - } - - /// - /// GrayscaleEffect - /// - public class GrayscaleEffect : IEffect { - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.CreateGrayscale(sourceImage); - } - public void Reset() { - // No settings to reset - } - } - - /// - /// MonochromeEffect - /// - public class MonochromeEffect : IEffect { - private readonly byte _threshold; - /// Threshold for monochrome filter (0 - 255), lower value means less black - public MonochromeEffect(byte threshold) { - _threshold = threshold; - } - public void Reset() { - // TODO: Modify the threshold to have a default, which is reset here - } - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.CreateMonochrome(sourceImage, _threshold); - } - } - - /// - /// AdjustEffect - /// - public class AdjustEffect : IEffect { - public AdjustEffect() - { - Reset(); - } - public float Contrast { - get; - set; - } - public float Brightness { - get; - set; - } - public float Gamma { - get; - set; - } - public void Reset() { - Contrast = 1f; - Brightness = 1f; - Gamma = 1f; - } - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.Adjust(sourceImage, Brightness, Contrast, Gamma); - } - } - - /// - /// ReduceColorsEffect - /// - public class ReduceColorsEffect : IEffect { - private static readonly ILog LOG = LogManager.GetLogger(typeof(ReduceColorsEffect)); - public ReduceColorsEffect() - { - Reset(); - } - public int Colors { - get; - set; - } - public void Reset() { - Colors = 256; - } - public Image Apply(Image sourceImage, Matrix matrix) { - using (WuQuantizer quantizer = new WuQuantizer((Bitmap)sourceImage)) { - int colorCount = quantizer.GetColorCount(); - if (colorCount > Colors) { - try { - return quantizer.GetQuantizedImage(Colors); - } catch (Exception e) { - LOG.Warn("Error occurred while Quantizing the image, ignoring and using original. Error: ", e); - } - } - } - return null; - } - } - - /// - /// InvertEffect - /// - public class InvertEffect : IEffect { - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.CreateNegative(sourceImage); - } - public void Reset() { - // No settings to reset - } - } - - /// - /// BorderEffect - /// - public class BorderEffect : IEffect { - public BorderEffect() { - Reset(); - } - public Color Color { - get; - set; - } - public int Width { - get; - set; - } - public void Reset() { - Width = 2; - Color = Color.Black; - } - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.CreateBorder(sourceImage, Width, Color, sourceImage.PixelFormat, matrix); - } - } - - /// - /// RotateEffect - /// - public class RotateEffect : IEffect { - public RotateEffect(int angle) { - Angle = angle; - } - public int Angle { - get; - set; - } - public void Reset() { - // Angle doesn't have a default value - } - public Image Apply(Image sourceImage, Matrix matrix) { - RotateFlipType flipType; - if (Angle == 90) { - matrix.Rotate(90, MatrixOrder.Append); - matrix.Translate(sourceImage.Height, 0, MatrixOrder.Append); - flipType = RotateFlipType.Rotate90FlipNone; - } else if (Angle == -90 || Angle == 270) { - flipType = RotateFlipType.Rotate270FlipNone; - matrix.Rotate(-90, MatrixOrder.Append); - matrix.Translate(0, sourceImage.Width, MatrixOrder.Append); - } else { - throw new NotSupportedException("Currently only an angle of 90 or -90 (270) is supported."); - } - return ImageHelper.RotateFlip(sourceImage, flipType); - } - } - - /// - /// ResizeEffect - /// - public class ResizeEffect : IEffect { - public ResizeEffect(int width, int height, bool maintainAspectRatio) { - Width = width; - Height = height; - MaintainAspectRatio = maintainAspectRatio; - } - public int Width { - get; - set; - } - public int Height { - get; - set; - } - public bool MaintainAspectRatio { - get; - set; - } - public void Reset() { - // values don't have a default value - } - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.ResizeImage(sourceImage, MaintainAspectRatio, Width, Height, matrix); - } - } - - /// - /// ResizeCanvasEffect - /// - public class ResizeCanvasEffect : IEffect { - public ResizeCanvasEffect(int left, int right, int top, int bottom) { - Left = left; - Right = right; - Top = top; - Bottom = bottom; - BackgroundColor = Color.Empty; // Uses the default background color depending on the format - } - public int Left { - get; - set; - } - public int Right { - get; - set; - } - public int Top { - get; - set; - } - public int Bottom { - get; - set; - } - public Color BackgroundColor { - get; - set; - } - public void Reset() { - // values don't have a default value - } - public Image Apply(Image sourceImage, Matrix matrix) { - return ImageHelper.ResizeCanvas(sourceImage, BackgroundColor, Left, Right, Top, Bottom, matrix); - } - } - - public class EffectConverter : TypeConverter { - // Fix to prevent BUG-1753 - private readonly NumberFormatInfo numberFormatInfo = new NumberFormatInfo(); - - public EffectConverter() - { - numberFormatInfo.NumberDecimalSeparator = "."; - numberFormatInfo.NumberGroupSeparator = ","; - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { - if (sourceType == typeof(string)) { - return true; - } - return base.CanConvertFrom(context, sourceType); - } - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { - if (destinationType == typeof(string)) { - return true; - } - if (destinationType == typeof(DropShadowEffect)) { - return true; - } - if (destinationType == typeof(TornEdgeEffect)) { - return true; - } - return base.CanConvertTo(context, destinationType); - } - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { - // to string - if (destinationType == typeof(string)) { - StringBuilder sb = new StringBuilder(); - if (value.GetType() == typeof(DropShadowEffect)) { - DropShadowEffect effect = value as DropShadowEffect; - RetrieveDropShadowEffectValues(effect, sb); - return sb.ToString(); - } - if (value.GetType() == typeof(TornEdgeEffect)) { - TornEdgeEffect effect = value as TornEdgeEffect; - RetrieveDropShadowEffectValues(effect, sb); - sb.Append("|"); - RetrieveTornEdgeEffectValues(effect, sb); - return sb.ToString(); - } - } - // from string - if (value is string) { - string settings = value as string; - if (destinationType == typeof(DropShadowEffect)) { - DropShadowEffect effect = new DropShadowEffect(); - ApplyDropShadowEffectValues(settings, effect); - return effect; - } - if (destinationType == typeof(TornEdgeEffect)) { - TornEdgeEffect effect = new TornEdgeEffect(); - ApplyDropShadowEffectValues(settings, effect); - ApplyTornEdgeEffectValues(settings, effect); - return effect; - } - } - return base.ConvertTo(context, culture, value, destinationType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - if (value != null && value is string) { - string settings = value as string; - if (settings.Contains("ToothHeight")) { - return ConvertTo(context, culture, value, typeof(TornEdgeEffect)); - } - return ConvertTo(context, culture, value, typeof(DropShadowEffect)); - } - return base.ConvertFrom(context, culture, value); - } - - private void ApplyDropShadowEffectValues(string valuesString, DropShadowEffect effect) { - string[] values = valuesString.Split('|'); - foreach(string nameValuePair in values) { - string[] pair = nameValuePair.Split(':'); - switch (pair[0]) { - case "Darkness" : - float darkness; - // Fix to prevent BUG-1753 - if (pair[1] != null && float.TryParse(pair[1], NumberStyles.Float, numberFormatInfo, out darkness)) { - if (darkness <= 1.0) { - effect.Darkness = darkness; - } - } - break; - case "ShadowSize": - int shadowSize; - if (int.TryParse(pair[1], out shadowSize)) { - effect.ShadowSize = shadowSize; - } - break; - case "ShadowOffset": - Point shadowOffset = new Point(); - int shadowOffsetX; - int shadowOffsetY; - string[] coordinates = pair[1].Split(','); - if (int.TryParse(coordinates[0], out shadowOffsetX)) { - shadowOffset.X = shadowOffsetX; - } - if (int.TryParse(coordinates[1], out shadowOffsetY)) { - shadowOffset.Y = shadowOffsetY; - } - effect.ShadowOffset = shadowOffset; - break; - } - } - } - - private void ApplyTornEdgeEffectValues(string valuesString, TornEdgeEffect effect) { - string[] values = valuesString.Split('|'); - foreach (string nameValuePair in values) { - string[] pair = nameValuePair.Split(':'); - switch (pair[0]) { - case "GenerateShadow": - bool generateShadow; - if (bool.TryParse(pair[1], out generateShadow)) { - effect.GenerateShadow = generateShadow; - } - break; - case "ToothHeight": - int toothHeight; - if (int.TryParse(pair[1], out toothHeight)) { - effect.ToothHeight = toothHeight; - } - break; - case "HorizontalToothRange": - int horizontalToothRange; - if (int.TryParse(pair[1], out horizontalToothRange)) { - effect.HorizontalToothRange = horizontalToothRange; - } - break; - case "VerticalToothRange": - int verticalToothRange; - if (int.TryParse(pair[1], out verticalToothRange)) { - effect.VerticalToothRange = verticalToothRange; - } - break; - case "Edges": - string[] edges = pair[1].Split(','); - bool edge; - if (bool.TryParse(edges[0], out edge)) { - effect.Edges[0] = edge; - } - if (bool.TryParse(edges[1], out edge)) { - effect.Edges[1] = edge; - } - if (bool.TryParse(edges[2], out edge)) { - effect.Edges[2] = edge; - } - if (bool.TryParse(edges[3], out edge)) { - effect.Edges[3] = edge; - } - break; - } - } - } - - private void RetrieveDropShadowEffectValues(DropShadowEffect effect, StringBuilder sb) { - // Fix to prevent BUG-1753 is to use the numberFormatInfo - sb.AppendFormat("Darkness:{0}|ShadowSize:{1}|ShadowOffset:{2},{3}", effect.Darkness.ToString("F2", numberFormatInfo), effect.ShadowSize, effect.ShadowOffset.X, effect.ShadowOffset.Y); - } - private void RetrieveTornEdgeEffectValues(TornEdgeEffect effect, StringBuilder sb) { - sb.AppendFormat("GenerateShadow:{0}|ToothHeight:{1}|HorizontalToothRange:{2}|VerticalToothRange:{3}|Edges:{4},{5},{6},{7}", effect.GenerateShadow, effect.ToothHeight, effect.HorizontalToothRange, effect.VerticalToothRange, effect.Edges[0], effect.Edges[1], effect.Edges[2], effect.Edges[3]); - } - } -} \ No newline at end of file diff --git a/GreenshotPlugin/Core/EmailConfigHelper.cs b/GreenshotPlugin/Core/EmailConfigHelper.cs index c5ce92d0b..14ae354f2 100644 --- a/GreenshotPlugin/Core/EmailConfigHelper.cs +++ b/GreenshotPlugin/Core/EmailConfigHelper.cs @@ -26,38 +26,32 @@ namespace GreenshotPlugin.Core { /// Description of EmailConfigHelper. /// public static class EmailConfigHelper { - private const string OUTLOOK_PATH_KEY = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\OUTLOOK.EXE"; - private const string MAPI_CLIENT_KEY = @"SOFTWARE\Clients\Mail"; - private const string MAPI_LOCATION_KEY = @"SOFTWARE\Microsoft\Windows Messaging Subsystem"; - private const string MAPI_KEY = @"MAPI"; + private const string OutlookPathKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\OUTLOOK.EXE"; + private const string MapiClientKey = @"SOFTWARE\Clients\Mail"; + private const string MapiLocationKey = @"SOFTWARE\Microsoft\Windows Messaging Subsystem"; + private const string MapiKey = @"MAPI"; public static string GetMapiClient() { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(MAPI_CLIENT_KEY, false)) { + using (RegistryKey key = Registry.CurrentUser.OpenSubKey(MapiClientKey, false)) { if (key != null) { return (string)key.GetValue(""); } } - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(MAPI_CLIENT_KEY, false)) { - if (key != null) { - return (string)key.GetValue(""); - } else { - return null; - } + using (RegistryKey key = Registry.LocalMachine.OpenSubKey(MapiClientKey, false)) + { + return (string) key?.GetValue(""); } } - public static bool HasMAPI() { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(MAPI_LOCATION_KEY, false)) { - if (key != null) { - return "1".Equals(key.GetValue(MAPI_KEY, "0")); - } else { - return false; - } + public static bool HasMapi() { + using (RegistryKey key = Registry.LocalMachine.OpenSubKey(MapiLocationKey, false)) + { + return key != null && "1".Equals(key.GetValue(MapiKey, "0")); } } public static string GetOutlookExePath() { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(OUTLOOK_PATH_KEY, false)) { + using (RegistryKey key = Registry.LocalMachine.OpenSubKey(OutlookPathKey, false)) { if (key != null) { // "" is the default key, which should point to the outlook location return (string)key.GetValue(""); diff --git a/GreenshotPlugin/Core/EnumExtensions.cs b/GreenshotPlugin/Core/EnumExtensions.cs index 26d8e0c16..1201f28f9 100644 --- a/GreenshotPlugin/Core/EnumExtensions.cs +++ b/GreenshotPlugin/Core/EnumExtensions.cs @@ -20,8 +20,8 @@ */ using System; namespace GreenshotPlugin.Core { - public static class EnumerationExtensions { - public static bool Has(this Enum type, T value) { + public static class EnumerationExtensions { + public static bool Has(this Enum type, T value) { Type underlyingType = Enum.GetUnderlyingType(value.GetType()); try { if (underlyingType == typeof(int)) { @@ -29,23 +29,31 @@ namespace GreenshotPlugin.Core { } else if (underlyingType == typeof(uint)) { return (((uint)(object)type & (uint)(object)value) == (uint)(object)value); } - } catch { - } + } + catch + { + // ignored + } return false; - } + } - public static bool Is(this Enum type, T value) { + public static bool Is(this Enum type, T value) { Type underlyingType = Enum.GetUnderlyingType(value.GetType()); - try { + try + { if (underlyingType == typeof(int)) { return (int)(object)type == (int)(object)value; - } else if (underlyingType == typeof(uint)) { + } + if (underlyingType == typeof(uint)) { return (uint)(object)type == (uint)(object)value; } - } catch { - } + } + catch + { + // ignored + } return false; - } + } /// /// Add a flag to an enum @@ -53,19 +61,21 @@ namespace GreenshotPlugin.Core { /// /// /// - public static T Add(this Enum type, T value) { + public static T Add(this Enum type, T value) { Type underlyingType = Enum.GetUnderlyingType(value.GetType()); - try { + try + { if (underlyingType == typeof(int)) { return (T)(object)(((int)(object)type | (int)(object)value)); - } else if (underlyingType == typeof(uint)) { + } + if (underlyingType == typeof(uint)) { return (T)(object)(((uint)(object)type | (uint)(object)value)); } } catch(Exception ex) { - throw new ArgumentException(string.Format("Could not append value '{0}' to enumerated type '{1}'.", value, typeof(T).Name), ex); + throw new ArgumentException($"Could not append value '{value}' to enumerated type '{typeof(T).Name}'.", ex); } - throw new ArgumentException(string.Format("Could not append value '{0}' to enumerated type '{1}'.", value, typeof(T).Name)); - } + throw new ArgumentException($"Could not append value '{value}' to enumerated type '{typeof(T).Name}'."); + } /// /// Remove a flag from an enum type @@ -73,18 +83,20 @@ namespace GreenshotPlugin.Core { /// /// /// - public static T Remove(this Enum type, T value) { + public static T Remove(this Enum type, T value) { Type underlyingType = Enum.GetUnderlyingType(value.GetType()); - try { + try + { if (underlyingType == typeof(int)) { return (T)(object)(((int)(object)type & ~(int)(object)value)); - } else if (underlyingType == typeof(uint)) { + } + if (underlyingType == typeof(uint)) { return (T)(object)(((uint)(object)type & ~(uint)(object)value)); } } catch(Exception ex) { - throw new ArgumentException(string.Format("Could not remove value '{0}' from enumerated type '{1}'.", value, typeof(T).Name), ex); + throw new ArgumentException($"Could not remove value '{value}' from enumerated type '{typeof(T).Name}'.", ex); } - throw new ArgumentException(string.Format("Could not remove value '{0}' from enumerated type '{1}'.", value, typeof(T).Name)); - } - } + throw new ArgumentException($"Could not remove value '{value}' from enumerated type '{typeof(T).Name}'."); + } + } } diff --git a/GreenshotPlugin/Core/FastBitmap.cs b/GreenshotPlugin/Core/FastBitmap.cs index 564a4e4d4..8bc3b3313 100644 --- a/GreenshotPlugin/Core/FastBitmap.cs +++ b/GreenshotPlugin/Core/FastBitmap.cs @@ -22,7 +22,6 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; -using log4net; namespace GreenshotPlugin.Core { @@ -285,9 +284,7 @@ namespace GreenshotPlugin.Core { /// /// The base class for the fast bitmap implementation /// - public abstract unsafe class FastBitmap : IFastBitmap, IFastBitmapWithClip, IFastBitmapWithOffset { - private static ILog _log = LogManager.GetLogger(typeof(FastBitmap)); - + public abstract unsafe class FastBitmap : IFastBitmapWithClip, IFastBitmapWithOffset { protected const int PixelformatIndexA = 3; protected const int PixelformatIndexR = 2; protected const int PixelformatIndexG = 1; @@ -298,7 +295,7 @@ namespace GreenshotPlugin.Core { public const int ColorIndexB = 2; public const int ColorIndexA = 3; - protected Rectangle Area = Rectangle.Empty; + protected Rectangle Area; /// /// If this is set to true, the bitmap will be disposed when disposing the IFastBitmap /// @@ -354,7 +351,7 @@ namespace GreenshotPlugin.Core { case PixelFormat.Format32bppPArgb: return new Fast32ArgbBitmap(source, area); default: - throw new NotSupportedException(string.Format("Not supported Pixelformat {0}", source.PixelFormat)); + throw new NotSupportedException($"Not supported Pixelformat {source.PixelFormat}"); } } @@ -396,9 +393,12 @@ namespace GreenshotPlugin.Core { public static IFastBitmap CreateCloneOf(Image source, PixelFormat pixelFormat, Rectangle area) { Bitmap destination = ImageHelper.CloneArea(source, area, pixelFormat); FastBitmap fastBitmap = Create(destination) as FastBitmap; - fastBitmap.NeedsDispose = true; - fastBitmap.Left = area.Left; - fastBitmap.Top = area.Top; + if (fastBitmap != null) + { + fastBitmap.NeedsDispose = true; + fastBitmap.Left = area.Left; + fastBitmap.Top = area.Top; + } return fastBitmap; } @@ -529,20 +529,12 @@ namespace GreenshotPlugin.Core { /// /// Return the right of the fastbitmap /// - public int Right { - get { - return Left + Width; - } - } + public int Right => Left + Width; /// /// Return the bottom of the fastbitmap /// - public int Bottom { - get { - return Top + Height; - } - } + public int Bottom => Top + Height; /// /// Returns the underlying bitmap, unlocks it and prevents that it will be disposed @@ -555,11 +547,7 @@ namespace GreenshotPlugin.Core { return Bitmap; } - public virtual bool HasAlphaChannel { - get { - return false; - } - } + public virtual bool HasAlphaChannel => false; /// /// Destructor @@ -600,14 +588,16 @@ namespace GreenshotPlugin.Core { /// Lock the bitmap so we have direct access to the memory /// public void Lock() { - if (Width > 0 && Height > 0 && !BitsLocked) { - BmData = Bitmap.LockBits(Area, ImageLockMode.ReadWrite, Bitmap.PixelFormat); - BitsLocked = true; - - IntPtr scan0 = BmData.Scan0; - Pointer = (byte*)(void*)scan0; - Stride = BmData.Stride; + if (Width <= 0 || Height <= 0 || BitsLocked) + { + return; } + BmData = Bitmap.LockBits(Area, ImageLockMode.ReadWrite, Bitmap.PixelFormat); + BitsLocked = true; + + IntPtr scan0 = BmData.Scan0; + Pointer = (byte*)(void*)scan0; + Stride = BmData.Stride; } /// @@ -635,7 +625,6 @@ namespace GreenshotPlugin.Core { /// /// /// - /// public void DrawTo(Graphics graphics, Rectangle destinationRect) { // Make sure this.bitmap is unlocked, if it was locked bool isLocked = BitsLocked; @@ -944,11 +933,7 @@ namespace GreenshotPlugin.Core { /// This is the implementation of the IFastBitmap for 32 bit images with Alpha /// public unsafe class Fast32ArgbBitmap : FastBitmap, IFastBitmapWithBlend { - public override bool HasAlphaChannel { - get { - return true; - } - } + public override bool HasAlphaChannel => true; public Color BackgroundBlendColor { get; diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index 9e890ce76..b3ed50181 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -30,27 +30,27 @@ using System.Collections.Generic; namespace GreenshotPlugin.Core { public static class FilenameHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(FilenameHelper)); + private static readonly ILog Log = LogManager.GetLogger(typeof(FilenameHelper)); // Specify the regular expression for the filename formatting: // Starting with ${ // than the varname, which ends with a : or } // If a parameters needs to be supplied, than a ":" should follow the name... everything from the : until the } is considered to be part of the parameters. // The parameter format is a single alpha followed by the value belonging to the parameter, e.g. : // ${capturetime:d"yyyy-MM-dd HH_mm_ss"} - private static readonly Regex VAR_REGEXP = new Regex(@"\${(?[^:}]+)[:]?(?[^}]*)}", RegexOptions.Compiled); - private static readonly Regex CMD_VAR_REGEXP = new Regex(@"%(?[^%]+)%", RegexOptions.Compiled); + private static readonly Regex VarRegexp = new Regex(@"\${(?[^:}]+)[:]?(?[^}]*)}", RegexOptions.Compiled); + private static readonly Regex CmdVarRegexp = new Regex(@"%(?[^%]+)%", RegexOptions.Compiled); - private static readonly Regex SPLIT_REGEXP = new Regex(";(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", RegexOptions.Compiled); - private const int MAX_TITLE_LENGTH = 80; - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); - private const string UNSAFE_REPLACEMENT = "_"; + private static readonly Regex SplitRegexp = new Regex(";(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", RegexOptions.Compiled); + private const int MaxTitleLength = 80; + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private const string UnsafeReplacement = "_"; /// /// Remove invalid characters from the fully qualified filename /// /// string with the full path to a file /// string with the full path to a file, without invalid characters - public static string MakeFQFilenameSafe(string fullPath) { + public static string MakeFqFilenameSafe(string fullPath) { string path = MakePathSafe(Path.GetDirectoryName(fullPath)); string filename = MakeFilenameSafe(Path.GetFileName(fullPath)); // Make the fullpath again and return @@ -66,7 +66,7 @@ namespace GreenshotPlugin.Core { // Make the filename save! if (filename != null) { foreach (char disallowed in Path.GetInvalidFileNameChars()) { - filename = filename.Replace(disallowed.ToString(), UNSAFE_REPLACEMENT); + filename = filename.Replace(disallowed.ToString(), UnsafeReplacement); } } return filename; @@ -81,7 +81,7 @@ namespace GreenshotPlugin.Core { // Make the path save! if (path != null) { foreach (char disallowed in Path.GetInvalidPathChars()) { - path = path.Replace(disallowed.ToString(), UNSAFE_REPLACEMENT); + path = path.Replace(disallowed.ToString(), UnsafeReplacement); } } return path; @@ -108,15 +108,16 @@ namespace GreenshotPlugin.Core { /// that is specified in the configuration /// /// A string with the format + /// /// The filename which should be used to save the image public static string GetFilename(OutputFormat format, ICaptureDetails captureDetails) { - string pattern = conf.OutputFileFilenamePattern; - if (pattern == null || string.IsNullOrEmpty(pattern.Trim())) { + string pattern = CoreConfig.OutputFileFilenamePattern; + if (string.IsNullOrEmpty(pattern?.Trim())) { pattern = "greenshot ${capturetime}"; } return GetFilenameFromPattern(pattern, format, captureDetails); } - + /// /// This method will be called by the regexp.replace as a MatchEvaluator delegate! @@ -127,14 +128,15 @@ namespace GreenshotPlugin.Core { /// Variables from the process /// Variables from the user /// Variables from the machine + /// /// string with the match replacement private static string MatchVarEvaluator(Match match, ICaptureDetails captureDetails, IDictionary processVars, IDictionary userVars, IDictionary machineVars, bool filenameSafeMode) { try { return MatchVarEvaluatorInternal(match, captureDetails, processVars, userVars, machineVars, filenameSafeMode); } catch (Exception e) { - LOG.Error("Error in MatchVarEvaluatorInternal", e); + Log.Error("Error in MatchVarEvaluatorInternal", e); } - return ""; + return string.Empty; } /// @@ -159,17 +161,20 @@ namespace GreenshotPlugin.Core { string variable = match.Groups["variable"].Value; string parameters = match.Groups["parameters"].Value; - if (parameters != null && parameters.Length > 0) { - string[] parms = SPLIT_REGEXP.Split(parameters); + if (parameters.Length > 0) { + string[] parms = SplitRegexp.Split(parameters); foreach (string parameter in parms) { switch (parameter.Substring(0, 1)) { // Padding p[,pad-character] case "p": - string[] padParams = parameter.Substring(1).Split(new[] { ',' }); + string[] padParams = parameter.Substring(1).Split(','); try { padWidth = int.Parse(padParams[0]); - } catch { - }; + } + catch + { + // ignored + } if (padParams.Length > 1) { padChar = padParams[1][0]; } @@ -177,7 +182,7 @@ namespace GreenshotPlugin.Core { // replace // r, case "r": - string[] replaceParameters = parameter.Substring(1).Split(new[] { ',' }); + string[] replaceParameters = parameter.Substring(1).Split(','); if (replaceParameters != null && replaceParameters.Length == 2) { replacements.Add(replaceParameters[0], replaceParameters[1]); } @@ -197,7 +202,7 @@ namespace GreenshotPlugin.Core { // s[,length] case "s": string range = parameter.Substring(1); - string[] rangelist = range.Split(new[] { ',' }); + string[] rangelist = range.Split(','); if (rangelist.Length > 0) { try { startIndex = int.Parse(rangelist[0]); @@ -231,7 +236,7 @@ namespace GreenshotPlugin.Core { if (filenameSafeMode) { replaceValue = MakePathSafe(replaceValue); } - } else if (captureDetails != null && captureDetails.MetaData != null && captureDetails.MetaData.ContainsKey(variable)) { + } else if (captureDetails?.MetaData != null && captureDetails.MetaData.ContainsKey(variable)) { replaceValue = captureDetails.MetaData[variable]; if (filenameSafeMode) { replaceValue = MakePathSafe(replaceValue); @@ -248,8 +253,8 @@ namespace GreenshotPlugin.Core { capturetime = captureDetails.DateTime; if (captureDetails.Title != null) { title = captureDetails.Title; - if (title.Length > MAX_TITLE_LENGTH) { - title = title.Substring(0, MAX_TITLE_LENGTH); + if (title.Length > MaxTitleLength) { + title = title.Substring(0, MaxTitleLength); } } } @@ -318,9 +323,9 @@ namespace GreenshotPlugin.Core { } break; case "NUM": - conf.OutputFileIncrementingNumber++; + CoreConfig.OutputFileIncrementingNumber++; IniConfig.Save(); - replaceValue = conf.OutputFileIncrementingNumber.ToString(); + replaceValue = CoreConfig.OutputFileIncrementingNumber.ToString(); if (padWidth == 0) { padWidth = -6; padChar = '0'; @@ -412,7 +417,7 @@ namespace GreenshotPlugin.Core { } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.Process", e); + Log.Error("Error retrieving EnvironmentVariableTarget.Process", e); } try @@ -421,7 +426,7 @@ namespace GreenshotPlugin.Core { } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.User", e); + Log.Error("Error retrieving EnvironmentVariableTarget.User", e); } try @@ -430,13 +435,11 @@ namespace GreenshotPlugin.Core { } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.Machine", e); + Log.Error("Error retrieving EnvironmentVariableTarget.Machine", e); } - return CMD_VAR_REGEXP.Replace(pattern, - delegate (Match m) { - return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); - } + return CmdVarRegexp.Replace(pattern, + m => MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode) ); } @@ -453,25 +456,23 @@ namespace GreenshotPlugin.Core { try { processVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process); } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.Process", e); + Log.Error("Error retrieving EnvironmentVariableTarget.Process", e); } try { userVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User); } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.User", e); + Log.Error("Error retrieving EnvironmentVariableTarget.User", e); } try { machineVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.Machine", e); + Log.Error("Error retrieving EnvironmentVariableTarget.Machine", e); } - return VAR_REGEXP.Replace(pattern, - delegate(Match m) { - return MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode); - } + return VarRegexp.Replace(pattern, + m => MatchVarEvaluator(m, null, processVars, userVars, machineVars, filenameSafeMode) ); } @@ -489,26 +490,24 @@ namespace GreenshotPlugin.Core { try { processVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process); } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.Process", e); + Log.Error("Error retrieving EnvironmentVariableTarget.Process", e); } try { userVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User); } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.User", e); + Log.Error("Error retrieving EnvironmentVariableTarget.User", e); } try { machineVars = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); } catch (Exception e) { - LOG.Error("Error retrieving EnvironmentVariableTarget.Machine", e); + Log.Error("Error retrieving EnvironmentVariableTarget.Machine", e); } try { - return VAR_REGEXP.Replace(pattern, - delegate(Match m) { - return MatchVarEvaluator(m, captureDetails, processVars, userVars, machineVars, filenameSafeMode); - } + return VarRegexp.Replace(pattern, + m => MatchVarEvaluator(m, captureDetails, processVars, userVars, machineVars, filenameSafeMode) ); } catch (Exception e) { // adding additional data for bug tracking diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 44e0fd7b6..a9169d097 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -29,6 +29,7 @@ using Greenshot.IniFile; using GreenshotPlugin.UnmanagedHelpers; using Greenshot.Core; using Greenshot.Plugin; +using GreenshotPlugin.Effects; using log4net; namespace GreenshotPlugin.Core { diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 3b1803e95..7a2e40f37 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -167,7 +167,6 @@ namespace GreenshotPlugin.Core { AddTag(nonAlphaImage); nonAlphaImage.Save(targetStream, imageCodec, parameters); nonAlphaImage.Dispose(); - nonAlphaImage = null; } else { @@ -205,7 +204,6 @@ namespace GreenshotPlugin.Core { } if (needsDispose) { imageToSave.Dispose(); - imageToSave = null; } } @@ -221,7 +219,7 @@ namespace GreenshotPlugin.Core { using (BinaryWriter writer = new BinaryWriter(tmpStream)) { writer.Write(bytesWritten); Version v = Assembly.GetExecutingAssembly().GetName().Version; - byte[] marker = Encoding.ASCII.GetBytes(String.Format("Greenshot{0:00}.{1:00}", v.Major, v.Minor)); + byte[] marker = Encoding.ASCII.GetBytes($"Greenshot{v.Major:00}.{v.Minor:00}"); writer.Write(marker); tmpStream.WriteTo(stream); } @@ -407,7 +405,7 @@ namespace GreenshotPlugin.Core { /// Saves image to specific path with specified quality /// public static void Save(ISurface surface, string fullPath, bool allowOverwrite, SurfaceOutputSettings outputSettings, bool copyPathToClipboard) { - fullPath = FilenameHelper.MakeFQFilenameSafe(fullPath); + fullPath = FilenameHelper.MakeFqFilenameSafe(fullPath); string path = Path.GetDirectoryName(fullPath); // check whether path exists - if not create it @@ -549,7 +547,7 @@ namespace GreenshotPlugin.Core { /// /// public static string SaveToTmpFile(ISurface surface, SurfaceOutputSettings outputSettings, string destinationPath) { - string tmpFile = Path.GetRandomFileName() + "." + outputSettings.Format.ToString(); + string tmpFile = Path.GetRandomFileName() + "." + outputSettings.Format; // Prevent problems with "other characters", which could cause problems tmpFile = Regex.Replace(tmpFile, @"[^\d\w\.]", ""); if (destinationPath == null) { diff --git a/GreenshotPlugin/Core/JSONHelper.cs b/GreenshotPlugin/Core/JSONHelper.cs index 5e44585b7..57293726c 100644 --- a/GreenshotPlugin/Core/JSONHelper.cs +++ b/GreenshotPlugin/Core/JSONHelper.cs @@ -7,7 +7,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -using System; + using System.Collections.Generic; using System.Globalization; using System.Text; @@ -173,12 +173,11 @@ namespace GreenshotPlugin.Core { protected static string ParseString(char[] json, ref int index, ref bool success) { StringBuilder s = new StringBuilder(BUILDER_CAPACITY); - char c; EatWhitespace(json, ref index); // " - c = json[index++]; + var c = json[index++]; bool complete = false; while (!complete) { @@ -218,11 +217,11 @@ namespace GreenshotPlugin.Core { if (remainingLength >= 4) { // parse the 32 bit hex into an integer codepoint uint codePoint; - if (!(success = UInt32.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) { + if (!(success = uint.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) { return ""; } // convert the integer codepoint to a unicode char and add to string - s.Append(Char.ConvertFromUtf32((int)codePoint)); + s.Append(char.ConvertFromUtf32((int)codePoint)); // skip 4 chars index += 4; } else { @@ -251,7 +250,7 @@ namespace GreenshotPlugin.Core { int charLength = (lastIndex - index) + 1; double number; - success = Double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + success = double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); index = lastIndex + 1; return number; diff --git a/GreenshotPlugin/Core/Language.cs b/GreenshotPlugin/Core/Language.cs index 1f174260b..79c32c19c 100644 --- a/GreenshotPlugin/Core/Language.cs +++ b/GreenshotPlugin/Core/Language.cs @@ -35,21 +35,20 @@ namespace GreenshotPlugin.Core { /// The language resources are loaded from the language files found on fixed or supplied paths /// public class Language { - private static readonly ILog LOG = LogManager.GetLogger(typeof(Language)); - private static readonly List languagePaths = new List(); - private static readonly IDictionary> languageFiles = new Dictionary>(); - private static readonly IDictionary helpFiles = new Dictionary(); - private const string DEFAULT_LANGUAGE = "en-US"; - private const string HELP_FILENAME_PATTERN = @"help-*.html"; - private const string LANGUAGE_FILENAME_PATTERN = @"language*.xml"; - private static readonly Regex PREFIX_REGEXP = new Regex(@"language_([a-zA-Z0-9]+).*"); - private static readonly Regex IETF_CLEAN_REGEXP = new Regex(@"[^a-zA-Z]+"); - private static readonly Regex IETF_REGEXP = new Regex(@"^.*([a-zA-Z]{2}-[a-zA-Z]{2})\.xml$"); - private const string LANGUAGE_GROUPS_KEY = @"SYSTEM\CurrentControlSet\Control\Nls\Language Groups"; - private static readonly List unsupportedLanguageGroups = new List(); - private static readonly IDictionary resources = new Dictionary(); - private static string currentLanguage; - private static readonly CoreConfiguration coreConfig; + private static readonly ILog Log = LogManager.GetLogger(typeof(Language)); + private static readonly IList LanguagePaths = new List(); + private static readonly IDictionary> LanguageFiles = new Dictionary>(); + private static readonly IDictionary HelpFiles = new Dictionary(); + private const string DefaultLanguage = "en-US"; + private const string HelpFilenamePattern = @"help-*.html"; + private const string LanguageFilenamePattern = @"language*.xml"; + private static readonly Regex PrefixRegexp = new Regex(@"language_([a-zA-Z0-9]+).*"); + private static readonly Regex IetfCleanRegexp = new Regex(@"[^a-zA-Z]+"); + private static readonly Regex IetfRegexp = new Regex(@"^.*([a-zA-Z]{2}-[a-zA-Z]{2})\.xml$"); + private const string LanguageGroupsKey = @"SYSTEM\CurrentControlSet\Control\Nls\Language Groups"; + private static readonly IList UnsupportedLanguageGroups = new List(); + private static readonly IDictionary Resources = new Dictionary(); + private static string _currentLanguage; public static event LanguageChangedHandler LanguageChanged; @@ -57,49 +56,55 @@ namespace GreenshotPlugin.Core { /// Static initializer for the language code /// static Language() { - if (!IniConfig.isInitialized) { - LOG.Warn("IniConfig hasn't been initialized yet! (Design mode?)"); + if (!IniConfig.IsInitialized) { + Log.Warn("IniConfig hasn't been initialized yet! (Design mode?)"); IniConfig.Init("greenshot", "greenshot"); } if (!LogHelper.IsInitialized) { - LOG.Warn("Log4net hasn't been initialized yet! (Design mode?)"); - LogHelper.InitializeLog4NET(); + Log.Warn("Log4net hasn't been initialized yet! (Design mode?)"); + LogHelper.InitializeLog4Net(); } try { - string applicationDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string applicationFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // PAF Path - AddPath(Path.Combine(applicationFolder, @"App\Greenshot\Languages")); - + if (applicationFolder != null) + { + AddPath(Path.Combine(applicationFolder, @"App\Greenshot\Languages")); + } // Application data path + string applicationDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); AddPath(Path.Combine(applicationDataFolder, @"Greenshot\Languages\")); - + // Startup path - AddPath(Path.Combine(applicationFolder, @"Languages")); - } catch (Exception pathException) { - LOG.Error(pathException); + if (applicationFolder != null) + { + AddPath(Path.Combine(applicationFolder, @"Languages")); + } + } + catch (Exception pathException) { + Log.Error(pathException); } try { - using (RegistryKey languageGroupsKey = Registry.LocalMachine.OpenSubKey(LANGUAGE_GROUPS_KEY, false)) { + using (RegistryKey languageGroupsKey = Registry.LocalMachine.OpenSubKey(LanguageGroupsKey, false)) { if (languageGroupsKey != null) { string [] groups = languageGroupsKey.GetValueNames(); foreach(string group in groups) { string groupValue = (string)languageGroupsKey.GetValue(group); bool isGroupNotInstalled = "0".Equals(groupValue); if (isGroupNotInstalled) { - unsupportedLanguageGroups.Add(group.ToLower()); + UnsupportedLanguageGroups.Add(group.ToLower()); } } } } } catch(Exception e) { - LOG.Warn("Couldn't read the installed language groups.", e); + Log.Warn("Couldn't read the installed language groups.", e); } - coreConfig = IniConfig.GetIniSection(); + var coreConfig = IniConfig.GetIniSection(); ScanFiles(); if (!string.IsNullOrEmpty(coreConfig.Language)) { CurrentLanguage = coreConfig.Language; @@ -109,15 +114,15 @@ namespace GreenshotPlugin.Core { } if (CurrentLanguage == null) { - LOG.Warn("Couldn't set language from configuration, changing to default. Installation problem?"); - CurrentLanguage = DEFAULT_LANGUAGE; + Log.Warn("Couldn't set language from configuration, changing to default. Installation problem?"); + CurrentLanguage = DefaultLanguage; if (CurrentLanguage != null) { coreConfig.Language = CurrentLanguage; } } if (CurrentLanguage == null) { - LOG.Error("Couldn't set language, installation problem?"); + Log.Error("Couldn't set language, installation problem?"); } } @@ -127,13 +132,13 @@ namespace GreenshotPlugin.Core { /// /// true if the path exists and is added private static bool AddPath(string path) { - if (!languagePaths.Contains(path)) { + if (!LanguagePaths.Contains(path)) { if (Directory.Exists(path)) { - LOG.DebugFormat("Adding language path {0}", path); - languagePaths.Add(path); + Log.DebugFormat("Adding language path {0}", path); + LanguagePaths.Add(path); return true; } else { - LOG.InfoFormat("Not adding non existing language path {0}", path); + Log.InfoFormat("Not adding non existing language path {0}", path); } } return false; @@ -145,8 +150,8 @@ namespace GreenshotPlugin.Core { /// /// true if the path exists and is added public static bool AddLanguageFilePath(string path) { - if (!languagePaths.Contains(path)) { - LOG.DebugFormat("New language path {0}", path); + if (!LanguagePaths.Contains(path)) { + Log.DebugFormat("New language path {0}", path); if (AddPath(path)) { ScanFiles(); Reload(); @@ -163,11 +168,11 @@ namespace GreenshotPlugin.Core { /// private static void LoadFiles(string ietf) { ietf = ReformatIETF(ietf); - if (!languageFiles.ContainsKey(ietf)) { - LOG.ErrorFormat("No language {0} available.", ietf); + if (!LanguageFiles.ContainsKey(ietf)) { + Log.ErrorFormat("No language {0} available.", ietf); return; } - List filesToLoad = languageFiles[ietf]; + List filesToLoad = LanguageFiles[ietf]; foreach (LanguageFile fileToLoad in filesToLoad) { LoadResources(fileToLoad); } @@ -177,10 +182,10 @@ namespace GreenshotPlugin.Core { /// Load the language resources from the scanned files /// private static void Reload() { - resources.Clear(); - LoadFiles(DEFAULT_LANGUAGE); - if (currentLanguage != null && !currentLanguage.Equals(DEFAULT_LANGUAGE)) { - LoadFiles(currentLanguage); + Resources.Clear(); + LoadFiles(DefaultLanguage); + if (_currentLanguage != null && !_currentLanguage.Equals(DefaultLanguage)) { + LoadFiles(_currentLanguage); } } @@ -189,26 +194,31 @@ namespace GreenshotPlugin.Core { /// public static string CurrentLanguage { get { - return currentLanguage; + return _currentLanguage; } set { string ietf = FindBestIETFMatch(value); - if (!languageFiles.ContainsKey(ietf)) { - LOG.WarnFormat("No match for language {0} found!", ietf); + if (!LanguageFiles.ContainsKey(ietf)) { + Log.WarnFormat("No match for language {0} found!", ietf); } else { - if (currentLanguage == null || !currentLanguage.Equals(ietf)) { - currentLanguage = ietf; + if (_currentLanguage == null || !_currentLanguage.Equals(ietf)) { + _currentLanguage = ietf; Reload(); - if (LanguageChanged != null) { - try { - LanguageChanged(null, null); - } catch { - } + if (LanguageChanged == null) + { + return; + } + try { + LanguageChanged(null, null); + } + catch + { + // ignored } return; } } - LOG.Debug("CurrentLanguage not changed!"); + Log.Debug("CurrentLanguage not changed!"); } } @@ -220,17 +230,17 @@ namespace GreenshotPlugin.Core { private static string FindBestIETFMatch(string inputIETF) { string returnIETF = inputIETF; if (string.IsNullOrEmpty(returnIETF)) { - returnIETF = DEFAULT_LANGUAGE; + returnIETF = DefaultLanguage; } returnIETF = ReformatIETF(returnIETF); - if (!languageFiles.ContainsKey(returnIETF)) { - LOG.WarnFormat("Unknown language {0}, trying best match!", returnIETF); + if (!LanguageFiles.ContainsKey(returnIETF)) { + Log.WarnFormat("Unknown language {0}, trying best match!", returnIETF); if (returnIETF.Length == 5) { returnIETF = returnIETF.Substring(0, 2); } - foreach (string availableIETF in languageFiles.Keys) { + foreach (string availableIETF in LanguageFiles.Keys) { if (availableIETF.StartsWith(returnIETF)) { - LOG.InfoFormat("Found language {0}, best match for {1}!", availableIETF, returnIETF); + Log.InfoFormat("Found language {0}, best match for {1}!", availableIETF, returnIETF); returnIETF = availableIETF; break; } @@ -249,7 +259,7 @@ namespace GreenshotPlugin.Core { string returnIETF = null; if (!string.IsNullOrEmpty(inputIETF)) { returnIETF = inputIETF.ToLower(); - returnIETF = IETF_CLEAN_REGEXP.Replace(returnIETF, ""); + returnIETF = IetfCleanRegexp.Replace(returnIETF, ""); if (returnIETF.Length == 4) { returnIETF = returnIETF.Substring(0, 2) + "-" + returnIETF.Substring(2, 2).ToUpper(); } @@ -264,7 +274,7 @@ namespace GreenshotPlugin.Core { get { IList languages = new List(); // Loop over all languages with all the files in there - foreach (List langs in languageFiles.Values) { + foreach (List langs in LanguageFiles.Values) { // Loop over all the files for a language foreach (LanguageFile langFile in langs) { // Only take the ones without prefix, these are the "base" language files @@ -283,10 +293,10 @@ namespace GreenshotPlugin.Core { /// public static string HelpFilePath { get { - if (helpFiles.ContainsKey(currentLanguage)) { - return helpFiles[currentLanguage]; + if (HelpFiles.ContainsKey(_currentLanguage)) { + return HelpFiles[_currentLanguage]; } - return helpFiles[DEFAULT_LANGUAGE]; + return HelpFiles[DefaultLanguage]; } } @@ -295,7 +305,7 @@ namespace GreenshotPlugin.Core { /// /// File to load from private static void LoadResources(LanguageFile languageFile) { - LOG.InfoFormat("Loading language file {0}", languageFile.Filepath); + Log.InfoFormat("Loading language file {0}", languageFile.Filepath); try { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(languageFile.Filepath); @@ -309,14 +319,14 @@ namespace GreenshotPlugin.Core { if (!string.IsNullOrEmpty(text)) { text = text.Trim(); } - if (!resources.ContainsKey(key)) { - resources.Add(key, text); + if (!Resources.ContainsKey(key)) { + Resources.Add(key, text); } else { - resources[key] = text; + Resources[key] = text; } } } catch (Exception e) { - LOG.Error("Could not load language file " + languageFile.Filepath, e); + Log.Error("Could not load language file " + languageFile.Filepath, e); } } @@ -334,26 +344,28 @@ namespace GreenshotPlugin.Core { LanguageFile languageFile = new LanguageFile(); languageFile.Filepath = languageFilePath; XmlNode node = nodes.Item(0); - languageFile.Description = node.Attributes["description"].Value; - if (node.Attributes["ietf"] != null) { - languageFile.Ietf = ReformatIETF(node.Attributes["ietf"].Value); - } - if (node.Attributes["version"] != null) { - languageFile.Version = new Version(node.Attributes["version"].Value); - } - if (node.Attributes["prefix"] != null) { - languageFile.Prefix = node.Attributes["prefix"].Value.ToLower(); - } - if (node.Attributes["languagegroup"] != null) { - string languageGroup = node.Attributes["languagegroup"].Value; - languageFile.LanguageGroup = languageGroup.ToLower(); + if (node?.Attributes != null) + { + languageFile.Description = node.Attributes["description"].Value; + if (node.Attributes["ietf"] != null) { + languageFile.Ietf = ReformatIETF(node.Attributes["ietf"].Value); + } + if (node.Attributes["version"] != null) { + languageFile.Version = new Version(node.Attributes["version"].Value); + } + if (node.Attributes["prefix"] != null) { + languageFile.Prefix = node.Attributes["prefix"].Value.ToLower(); + } + if (node.Attributes["languagegroup"] != null) { + string languageGroup = node.Attributes["languagegroup"].Value; + languageFile.LanguageGroup = languageGroup.ToLower(); + } } return languageFile; - } else { - throw new XmlException("Root element is missing"); } + throw new XmlException("Root element is missing"); } catch (Exception e) { - LOG.Error("Could not load language file " + languageFilePath, e); + Log.Error("Could not load language file " + languageFilePath, e); } return null; } @@ -362,63 +374,63 @@ namespace GreenshotPlugin.Core { /// Scan the files in all directories /// private static void ScanFiles() { - languageFiles.Clear(); - helpFiles.Clear(); - foreach (string languagePath in languagePaths) { + LanguageFiles.Clear(); + HelpFiles.Clear(); + foreach (string languagePath in LanguagePaths) { if (!Directory.Exists(languagePath)) { - LOG.InfoFormat("Skipping non existing language path {0}", languagePath); + Log.InfoFormat("Skipping non existing language path {0}", languagePath); continue; } - LOG.InfoFormat("Searching language directory '{0}' for language files with pattern '{1}'", languagePath, LANGUAGE_FILENAME_PATTERN); + Log.InfoFormat("Searching language directory '{0}' for language files with pattern '{1}'", languagePath, LanguageFilenamePattern); try { - foreach (string languageFilepath in Directory.GetFiles(languagePath, LANGUAGE_FILENAME_PATTERN, SearchOption.AllDirectories)) { + foreach (string languageFilepath in Directory.GetFiles(languagePath, LanguageFilenamePattern, SearchOption.AllDirectories)) { //LOG.DebugFormat("Found language file: {0}", languageFilepath); LanguageFile languageFile = LoadFileInfo(languageFilepath); if (languageFile == null) { continue; } if (string.IsNullOrEmpty(languageFile.Ietf)) { - LOG.WarnFormat("Fixing missing ietf in language-file {0}", languageFilepath); + Log.WarnFormat("Fixing missing ietf in language-file {0}", languageFilepath); string languageFilename = Path.GetFileName(languageFilepath); - if (IETF_REGEXP.IsMatch(languageFilename)) { - string replacementIETF = IETF_REGEXP.Replace(languageFilename, "$1"); + if (IetfRegexp.IsMatch(languageFilename)) { + string replacementIETF = IetfRegexp.Replace(languageFilename, "$1"); languageFile.Ietf = ReformatIETF(replacementIETF); - LOG.InfoFormat("Fixed IETF to {0}", languageFile.Ietf); + Log.InfoFormat("Fixed IETF to {0}", languageFile.Ietf); } else { - LOG.ErrorFormat("Missing ietf , no recover possible... skipping language-file {0}!", languageFilepath); + Log.ErrorFormat("Missing ietf , no recover possible... skipping language-file {0}!", languageFilepath); continue; } } // Check if we can display the file - if (!string.IsNullOrEmpty(languageFile.LanguageGroup) && unsupportedLanguageGroups.Contains(languageFile.LanguageGroup)) { - LOG.InfoFormat("Skipping unsuported (not able to display) language {0} from file {1}", languageFile.Description, languageFilepath); + if (!string.IsNullOrEmpty(languageFile.LanguageGroup) && UnsupportedLanguageGroups.Contains(languageFile.LanguageGroup)) { + Log.InfoFormat("Skipping unsuported (not able to display) language {0} from file {1}", languageFile.Description, languageFilepath); continue; } // build prefix, based on the filename, but only if it's not set in the file itself. if (string.IsNullOrEmpty(languageFile.Prefix)) { string languageFilename = Path.GetFileNameWithoutExtension(languageFilepath); - if (PREFIX_REGEXP.IsMatch(languageFilename)) { - languageFile.Prefix = PREFIX_REGEXP.Replace(languageFilename, "$1"); + if (PrefixRegexp.IsMatch(languageFilename)) { + languageFile.Prefix = PrefixRegexp.Replace(languageFilename, "$1"); if (!string.IsNullOrEmpty(languageFile.Prefix)) { languageFile.Prefix = languageFile.Prefix.Replace("plugin", "").ToLower(); } } } List currentFiles = null; - if (languageFiles.ContainsKey(languageFile.Ietf)) { - currentFiles = languageFiles[languageFile.Ietf]; + if (LanguageFiles.ContainsKey(languageFile.Ietf)) { + currentFiles = LanguageFiles[languageFile.Ietf]; bool needToAdd = true; List deleteList = new List(); foreach (LanguageFile compareWithLangfile in currentFiles) { if ((languageFile.Prefix == null && compareWithLangfile.Prefix == null) || (languageFile.Prefix != null && languageFile.Prefix.Equals(compareWithLangfile.Prefix))) { if (compareWithLangfile.Version > languageFile.Version) { - LOG.WarnFormat("Skipping {0}:{1}:{2} as {3}:{4}:{5} is newer", languageFile.Filepath, languageFile.Prefix, languageFile.Version, compareWithLangfile.Filepath, compareWithLangfile.Prefix, compareWithLangfile.Version); + Log.WarnFormat("Skipping {0}:{1}:{2} as {3}:{4}:{5} is newer", languageFile.Filepath, languageFile.Prefix, languageFile.Version, compareWithLangfile.Filepath, compareWithLangfile.Prefix, compareWithLangfile.Version); needToAdd = false; break; } else { - LOG.WarnFormat("Found {0}:{1}:{2} and deleting {3}:{4}:{5}", languageFile.Filepath, languageFile.Prefix, languageFile.Version, compareWithLangfile.Filepath, compareWithLangfile.Prefix, compareWithLangfile.Version); + Log.WarnFormat("Found {0}:{1}:{2} and deleting {3}:{4}:{5}", languageFile.Filepath, languageFile.Prefix, languageFile.Version, compareWithLangfile.Filepath, compareWithLangfile.Prefix, compareWithLangfile.Version); deleteList.Add(compareWithLangfile); } } @@ -427,39 +439,38 @@ namespace GreenshotPlugin.Core { foreach (LanguageFile deleteFile in deleteList) { currentFiles.Remove(deleteFile); } - LOG.InfoFormat("Added language definition {0} from: {1}", languageFile.Description, languageFile.Filepath); + Log.InfoFormat("Added language definition {0} from: {1}", languageFile.Description, languageFile.Filepath); currentFiles.Add(languageFile); } } else { - currentFiles = new List(); - currentFiles.Add(languageFile); - languageFiles.Add(languageFile.Ietf, currentFiles); - LOG.InfoFormat("Added language definition {0} from: {1}", languageFile.Description, languageFile.Filepath); + currentFiles = new List {languageFile}; + LanguageFiles.Add(languageFile.Ietf, currentFiles); + Log.InfoFormat("Added language definition {0} from: {1}", languageFile.Description, languageFile.Filepath); } } } catch (DirectoryNotFoundException) { - LOG.InfoFormat("Non existing language directory: {0}", languagePath); + Log.InfoFormat("Non existing language directory: {0}", languagePath); } catch (Exception e) { - LOG.Error("Error trying for read directory " + languagePath, e); + Log.Error("Error trying for read directory " + languagePath, e); } // Now find the help files - LOG.InfoFormat("Searching language directory '{0}' for help files with pattern '{1}'", languagePath, HELP_FILENAME_PATTERN); + Log.InfoFormat("Searching language directory '{0}' for help files with pattern '{1}'", languagePath, HelpFilenamePattern); try { - foreach (string helpFilepath in Directory.GetFiles(languagePath, HELP_FILENAME_PATTERN, SearchOption.AllDirectories)) { - LOG.DebugFormat("Found help file: {0}", helpFilepath); + foreach (string helpFilepath in Directory.GetFiles(languagePath, HelpFilenamePattern, SearchOption.AllDirectories)) { + Log.DebugFormat("Found help file: {0}", helpFilepath); string helpFilename = Path.GetFileName(helpFilepath); string ietf = ReformatIETF(helpFilename.Replace(".html", "").Replace("help-", "")); - if (!helpFiles.ContainsKey(ietf)) { - helpFiles.Add(ietf, helpFilepath); + if (!HelpFiles.ContainsKey(ietf)) { + HelpFiles.Add(ietf, helpFilepath); } else { - LOG.WarnFormat("skipping help file {0}, already a file with the same IETF {1} found!", helpFilepath, ietf); + Log.WarnFormat("skipping help file {0}, already a file with the same IETF {1} found!", helpFilepath, ietf); } } } catch (DirectoryNotFoundException) { - LOG.InfoFormat("Non existing language directory: {0}", languagePath); + Log.InfoFormat("Non existing language directory: {0}", languagePath); } catch (Exception e) { - LOG.Error("Error trying for read directory " + languagePath, e); + Log.Error("Error trying for read directory " + languagePath, e); } } } @@ -470,11 +481,11 @@ namespace GreenshotPlugin.Core { /// /// /// true if available - public static bool hasKey(string prefix, Enum key) { + public static bool HasKey(string prefix, Enum key) { if (key == null) { return false; } - return hasKey(prefix + "." + key); + return HasKey(prefix + "." + key); } /// @@ -482,11 +493,11 @@ namespace GreenshotPlugin.Core { /// /// /// true if available - public static bool hasKey(Enum key) { + public static bool HasKey(Enum key) { if (key == null) { return false; } - return hasKey(key.ToString()); + return HasKey(key.ToString()); } /// @@ -495,8 +506,8 @@ namespace GreenshotPlugin.Core { /// /// /// true if available - public static bool hasKey(string prefix, string key) { - return hasKey(prefix + "." + key); + public static bool HasKey(string prefix, string key) { + return HasKey(prefix + "." + key); } /// @@ -504,36 +515,36 @@ namespace GreenshotPlugin.Core { /// /// /// true if available - public static bool hasKey(string key) { + public static bool HasKey(string key) { if (key == null) { return false; } - return resources.ContainsKey(key); + return Resources.ContainsKey(key); } /// - /// TryGet method which combines hasKey & GetString + /// TryGet method which combines HasKey & GetString /// /// /// out string /// public static bool TryGetString(string key, out string languageString) { - return resources.TryGetValue(key, out languageString); + return Resources.TryGetValue(key, out languageString); } /// - /// TryGet method which combines hasKey & GetString + /// TryGet method which combines HasKey & GetString /// /// string with prefix /// string with key /// out string /// public static bool TryGetString(string prefix, string key, out string languageString) { - return resources.TryGetValue(prefix + "." + key, out languageString); + return Resources.TryGetValue(prefix + "." + key, out languageString); } /// - /// TryGet method which combines hasKey & GetString + /// TryGet method which combines HasKey & GetString /// /// string with prefix /// Enum with key @@ -541,14 +552,14 @@ namespace GreenshotPlugin.Core { /// public static bool TryGetString(string prefix, Enum key, out string languageString) { - return resources.TryGetValue(prefix + "." + key, out languageString); + return Resources.TryGetValue(prefix + "." + key, out languageString); } public static string Translate(object key) { string typename = key.GetType().Name; string enumKey = typename + "." + key; - if (hasKey(enumKey)) { + if (HasKey(enumKey)) { return GetString(enumKey); } return key.ToString(); @@ -599,7 +610,7 @@ namespace GreenshotPlugin.Core { return null; } string returnValue; - if (!resources.TryGetValue(key, out returnValue)) { + if (!Resources.TryGetValue(key, out returnValue)) { return "string ###" + key + "### not found"; } return returnValue; @@ -645,7 +656,7 @@ namespace GreenshotPlugin.Core { /// formatted resource or a "string ###key### not found" public static string GetFormattedString(string key, object param) { string returnValue; - if (!resources.TryGetValue(key, out returnValue)) { + if (!Resources.TryGetValue(key, out returnValue)) { return "string ###" + key + "### not found"; } return string.Format(returnValue, param); @@ -693,31 +704,31 @@ namespace GreenshotPlugin.Core { /// public bool Equals(LanguageFile other) { if (Prefix != null) { - if (!Prefix.Equals(other.Prefix)) { + if (other != null && !Prefix.Equals(other.Prefix)) { return false; } - } else if (other.Prefix != null) { + } else if (other?.Prefix != null) { return false; } if (Ietf != null) { - if (!Ietf.Equals(other.Ietf)) { + if (other != null && !Ietf.Equals(other.Ietf)) { return false; } - } else if (other.Ietf != null) { + } else if (other?.Ietf != null) { return false; } if (Version != null) { - if (!Version.Equals(other.Version)) { + if (other != null && !Version.Equals(other.Version)) { return false; } - } else if (other.Version != null) { + } else if (other != null && other.Version != null) { return false; } if (Filepath != null) { - if (!Filepath.Equals(other.Filepath)) { + if (other != null && !Filepath.Equals(other.Filepath)) { return false; } - } else if (other.Filepath != null) { + } else if (other?.Filepath != null) { return false; } return true; diff --git a/GreenshotPlugin/Core/LogHelper.cs b/GreenshotPlugin/Core/LogHelper.cs index 306d4cbf0..8d7ab2368 100644 --- a/GreenshotPlugin/Core/LogHelper.cs +++ b/GreenshotPlugin/Core/LogHelper.cs @@ -37,16 +37,12 @@ namespace GreenshotPlugin.Core { /// public class LogHelper { private static bool _isLog4NetConfigured; - private const string INIT_MESSAGE = "Greenshot initialization of log system failed"; + private const string InitMessage = "Greenshot initialization of log system failed"; - public static bool IsInitialized { - get { - return _isLog4NetConfigured; - } - } + public static bool IsInitialized => _isLog4NetConfigured; // Initialize Log4J - public static string InitializeLog4NET() { + public static string InitializeLog4Net() { // Setup log4j, currently the file is called log4net.xml foreach (var logName in new[] { "log4net.xml" , @"App\Greenshot\log4net-portable.xml"}) { @@ -60,7 +56,7 @@ namespace GreenshotPlugin.Core { } catch (Exception ex) { - MessageBox.Show(ex.Message, INIT_MESSAGE, MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show(ex.Message, InitMessage, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } @@ -74,7 +70,7 @@ namespace GreenshotPlugin.Core { IniConfig.ForceIniInStartupPath(); } } catch (Exception ex){ - MessageBox.Show(ex.Message, INIT_MESSAGE, MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show(ex.Message, InitMessage, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } @@ -82,13 +78,19 @@ namespace GreenshotPlugin.Core { // Get the logfile name try { if (((Hierarchy)LogManager.GetRepository()).Root.Appenders.Count > 0) { - foreach (IAppender appender in ((Hierarchy)LogManager.GetRepository()).Root.Appenders) { - if (appender is FileAppender) { - return ((FileAppender)appender).File; + foreach (IAppender appender in ((Hierarchy)LogManager.GetRepository()).Root.Appenders) + { + var fileAppender = appender as FileAppender; + if (fileAppender != null) { + return fileAppender.File; } } } - } catch {} + } + catch + { + // ignored + } } return null; } diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 65f54baf6..d8874cc65 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -47,7 +47,7 @@ namespace GreenshotPlugin.Core { /// Description of NetworkHelper. /// public static class NetworkHelper { - private static readonly ILog LOG = LogManager.GetLogger(typeof(NetworkHelper)); + private static readonly ILog Log = LogManager.GetLogger(typeof(NetworkHelper)); private static readonly CoreConfiguration Config = IniConfig.GetIniSection(); static NetworkHelper() { @@ -60,7 +60,7 @@ namespace GreenshotPlugin.Core { } catch (Exception ex) { - LOG.Warn("An error has occured while allowing self-signed certificates:", ex); + Log.Warn("An error has occured while allowing self-signed certificates:", ex); } } @@ -99,7 +99,7 @@ namespace GreenshotPlugin.Core { } } } catch (Exception e) { - LOG.Error("Problem downloading the FavIcon from: " + baseUri, e); + Log.Error("Problem downloading the FavIcon from: " + baseUri, e); } return null; } @@ -114,9 +114,7 @@ namespace GreenshotPlugin.Core { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { MemoryStream memoryStream = new MemoryStream(); using (Stream responseStream = response.GetResponseStream()) { - if (responseStream != null) { - responseStream.CopyTo(memoryStream); - } + responseStream?.CopyTo(memoryStream); // Make sure it can be used directly memoryStream.Seek(0, SeekOrigin.Begin); } @@ -178,7 +176,7 @@ namespace GreenshotPlugin.Core { } catch (Exception e) { - LOG.Error("Problem downloading the image from: " + url, e); + Log.Error("Problem downloading the image from: " + url, e); } return null; } @@ -246,21 +244,21 @@ namespace GreenshotPlugin.Core { proxyToUse = WebRequest.DefaultWebProxy; if (proxyToUse != null) { proxyToUse.Credentials = CredentialCache.DefaultCredentials; - if (LOG.IsDebugEnabled) { + if (Log.IsDebugEnabled) { // check the proxy for the Uri if (!proxyToUse.IsBypassed(uri)) { Uri proxyUri = proxyToUse.GetProxy(uri); if (proxyUri != null) { - LOG.Debug("Using proxy: " + proxyUri + " for " + uri); + Log.Debug("Using proxy: " + proxyUri + " for " + uri); } else { - LOG.Debug("No proxy found!"); + Log.Debug("No proxy found!"); } } else { - LOG.Debug("Proxy bypass for: " + uri); + Log.Debug("Proxy bypass for: " + uri); } } } else { - LOG.Debug("No proxy found!"); + Log.Debug("No proxy found!"); } } return proxyToUse; @@ -350,7 +348,7 @@ namespace GreenshotPlugin.Core { StringBuilder sb = new StringBuilder(); foreach(string key in queryParameters.Keys) { - sb.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", key, UrlEncode(string.Format("{0}",queryParameters[key]))); + sb.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", key, UrlEncode($"{queryParameters[key]}")); } sb.Remove(sb.Length-1,1); @@ -363,7 +361,7 @@ namespace GreenshotPlugin.Core { /// HttpWebRequest to write the multipart form data to /// Parameters to include in the multipart form data public static void WriteMultipartFormData(HttpWebRequest webRequest, IDictionary postParameters) { - string boundary = string.Format("----------{0:N}", Guid.NewGuid()); + string boundary = $"----------{Guid.NewGuid():N}"; webRequest.ContentType = "multipart/form-data; boundary=" + boundary; using (Stream formDataStream = webRequest.GetRequestStream()) { WriteMultipartFormData(formDataStream, boundary, postParameters); @@ -376,7 +374,7 @@ namespace GreenshotPlugin.Core { /// HttpListenerResponse /// Parameters to include in the multipart form data public static void WriteMultipartFormData(HttpListenerResponse response, IDictionary postParameters) { - string boundary = string.Format("----------{0:N}", Guid.NewGuid()); + string boundary = $"----------{Guid.NewGuid():N}"; response.ContentType = "multipart/form-data; boundary=" + boundary; WriteMultipartFormData(response.OutputStream, boundary, postParameters); } @@ -398,14 +396,11 @@ namespace GreenshotPlugin.Core { needsClrf = true; - if (param.Value is IBinaryContainer) { - IBinaryContainer binaryParameter = (IBinaryContainer)param.Value; - binaryParameter.WriteFormDataToStream(boundary, param.Key, formDataStream); + var binaryContainer = param.Value as IBinaryContainer; + if (binaryContainer != null) { + binaryContainer.WriteFormDataToStream(boundary, param.Key, formDataStream); } else { - string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}", - boundary, - param.Key, - param.Value); + string postData = $"--{boundary}\r\nContent-Disposition: form-data; name=\"{param.Key}\"\r\n\r\n{param.Value}"; formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); } } @@ -435,12 +430,12 @@ namespace GreenshotPlugin.Core { /// /// WebResponse private static void DebugHeaders(WebResponse response) { - if (!LOG.IsDebugEnabled) { + if (!Log.IsDebugEnabled) { return; } - LOG.DebugFormat("Debug information on the response from {0} :", response.ResponseUri); + Log.DebugFormat("Debug information on the response from {0} :", response.ResponseUri); foreach (string key in response.Headers.AllKeys) { - LOG.DebugFormat("Reponse-header: {0}={1}", key, response.Headers[key]); + Log.DebugFormat("Reponse-header: {0}={1}", key, response.Headers[key]); } } @@ -492,17 +487,17 @@ namespace GreenshotPlugin.Core { bool isHttpError = false; try { response = (HttpWebResponse)webRequest.GetResponse(); - LOG.InfoFormat("Response status: {0}", response.StatusCode); + Log.InfoFormat("Response status: {0}", response.StatusCode); isHttpError = (int)response.StatusCode >= 300; if (isHttpError) { - LOG.ErrorFormat("HTTP error {0}", response.StatusCode); + Log.ErrorFormat("HTTP error {0}", response.StatusCode); } DebugHeaders(response); responseData = GetResponseAsString(response); if (isHttpError) { - LOG.ErrorFormat("HTTP response {0}", responseData); + Log.ErrorFormat("HTTP response {0}", responseData); } } catch (WebException e) { @@ -510,15 +505,15 @@ namespace GreenshotPlugin.Core { HttpStatusCode statusCode = HttpStatusCode.Unused; if (response != null) { statusCode = response.StatusCode; - LOG.ErrorFormat("HTTP error {0}", statusCode); + Log.ErrorFormat("HTTP error {0}", statusCode); string errorContent = GetResponseAsString(response); if (alsoReturnContentOnError) { return errorContent; } - LOG.ErrorFormat("Content: {0}", errorContent); + Log.ErrorFormat("Content: {0}", errorContent); } - LOG.Error("WebException: ", e); + Log.Error("WebException: ", e); if (statusCode == HttpStatusCode.Unauthorized) { throw new UnauthorizedAccessException(e.Message); @@ -531,7 +526,7 @@ namespace GreenshotPlugin.Core { { if (isHttpError) { - LOG.ErrorFormat("HTTP error {0} with content: {1}", response.StatusCode, responseData); + Log.ErrorFormat("HTTP error {0} with content: {1}", response.StatusCode, responseData); } response.Close(); } @@ -550,12 +545,12 @@ namespace GreenshotPlugin.Core { webRequest.Method = HTTPMethod.HEAD.ToString(); using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) { - LOG.DebugFormat("RSS feed was updated at {0}", webResponse.LastModified); + Log.DebugFormat("RSS feed was updated at {0}", webResponse.LastModified); return webResponse.LastModified; } } catch (Exception wE) { - LOG.WarnFormat("Problem requesting HTTP - HEAD on uri {0}", uri); - LOG.Warn(wE.Message); + Log.WarnFormat("Problem requesting HTTP - HEAD on uri {0}", uri); + Log.Warn(wE.Message); // Pretend it is old return DateTime.MinValue; } @@ -620,11 +615,7 @@ namespace GreenshotPlugin.Core { /// Stream to write to public void WriteFormDataToStream(string boundary, string name, Stream formDataStream) { // Add just the first part of this param, since we will write the file data directly to the Stream - string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", - boundary, - name, - Filename ?? name, - _contentType ?? "application/octet-stream"); + string header = $"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"; filename=\"{Filename ?? name}\";\r\nContent-Type: {_contentType ?? "application/octet-stream"}\r\n\r\n"; formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); @@ -702,11 +693,7 @@ namespace GreenshotPlugin.Core { /// Stream to write to public void WriteFormDataToStream(string boundary, string name, Stream formDataStream) { // Add just the first part of this param, since we will write the file data directly to the Stream - string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", - boundary, - name, - Filename ?? name, - ContentType); + string header = $"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"; filename=\"{Filename ?? name}\";\r\nContent-Type: {ContentType}\r\n\r\n"; formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); ImageOutput.SaveToStream(_bitmap, null, formDataStream, _outputSettings); @@ -782,11 +769,7 @@ namespace GreenshotPlugin.Core { /// Stream to write to public void WriteFormDataToStream(string boundary, string name, Stream formDataStream) { // Add just the first part of this param, since we will write the file data directly to the Stream - string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n", - boundary, - name, - Filename ?? name, - ContentType); + string header = $"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"; filename=\"{Filename ?? name}\";\r\nContent-Type: {ContentType}\r\n\r\n"; formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); ImageOutput.SaveToStream(_surface, formDataStream, _outputSettings); diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index 9cf5d8876..6a34c58d9 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -30,7 +30,6 @@ using System.Globalization; using System.Net; using System.Net.Sockets; using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; @@ -41,7 +40,6 @@ namespace GreenshotPlugin.Core { public enum OAuthSignatureTypes { HMACSHA1, PLAINTEXT, - RSASHA1 } /// @@ -124,11 +122,7 @@ namespace GreenshotPlugin.Core { /// /// Get formatted Auth url (this will call a FormatWith(this) on the AuthUrlPattern /// - public string FormattedAuthUrl { - get { - return AuthUrlPattern.FormatWith(this); - } - } + public string FormattedAuthUrl => AuthUrlPattern.FormatWith(this); /// /// The URL to get a Token @@ -170,7 +164,7 @@ namespace GreenshotPlugin.Core { public bool IsAccessTokenExpired { get { bool expired = true; - if (!string.IsNullOrEmpty(AccessToken) && AccessTokenExpires != null) { + if (!string.IsNullOrEmpty(AccessToken)) { expired = DateTimeOffset.Now.AddSeconds(60) > AccessTokenExpires; } // Make sure the token is not usable @@ -211,7 +205,7 @@ namespace GreenshotPlugin.Core { /// An OAuth 1 session object /// public class OAuthSession { - private static readonly ILog LOG = LogManager.GetLogger(typeof(OAuthSession)); + private static readonly ILog Log = LogManager.GetLogger(typeof(OAuthSession)); protected const string OAUTH_VERSION = "1.0"; protected const string OAUTH_PARAMETER_PREFIX = "oauth_"; @@ -231,47 +225,30 @@ namespace GreenshotPlugin.Core { protected const string HMACSHA1SignatureType = "HMAC-SHA1"; protected const string PlainTextSignatureType = "PLAINTEXT"; - protected const string RSASHA1SignatureType = "RSA-SHA1"; - protected static Random random = new Random(); - protected const string UNRESERVED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; + protected const string UnreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; private string _userAgent = "Greenshot"; - private string _callbackUrl = "http://getgreenshot.org"; - private bool _checkVerifier = true; - private bool _useHttpHeadersForAuthorization = true; - private IDictionary _accessTokenResponseParameters; private IDictionary _requestTokenResponseParameters; - private readonly IDictionary _requestTokenParameters = new Dictionary(); - - public IDictionary RequestTokenParameters { - get { return _requestTokenParameters; } - } + + public IDictionary RequestTokenParameters { get; } = new Dictionary(); /// /// Parameters of the last called getAccessToken /// - public IDictionary AccessTokenResponseParameters { - get { - return _accessTokenResponseParameters; - } - } + public IDictionary AccessTokenResponseParameters { get; private set; } + /// /// Parameters of the last called getRequestToken /// - public IDictionary RequestTokenResponseParameters { - get { - return _requestTokenResponseParameters; - } - } + public IDictionary RequestTokenResponseParameters => _requestTokenResponseParameters; + private readonly string _consumerKey; private readonly string _consumerSecret; // default _browser size - private Size _browserSize = new Size(864, 587); - private string _loginTitle = "Authorize Greenshot access"; #region PublicProperties public HTTPMethod RequestTokenMethod { @@ -320,48 +297,15 @@ namespace GreenshotPlugin.Core { _userAgent = value; } } - public string CallbackUrl { - get { - return _callbackUrl; - } - set { - _callbackUrl = value; - } - } - public bool CheckVerifier { - get { - return _checkVerifier; - } - set { - _checkVerifier = value; - } - } + public string CallbackUrl { get; set; } = "http://getgreenshot.org"; - public Size BrowserSize { - get { - return _browserSize; - } - set { - _browserSize = value; - } - } + public bool CheckVerifier { get; set; } = true; - public string LoginTitle { - get { - return _loginTitle; - } - set { - _loginTitle = value; - } - } - public bool UseHTTPHeadersForAuthorization { - get { - return _useHttpHeadersForAuthorization; - } - set { - _useHttpHeadersForAuthorization = value; - } - } + public Size BrowserSize { get; set; } = new Size(864, 587); + + public string LoginTitle { get; set; } = "Authorize Greenshot access"; + + public bool UseHttpHeadersForAuthorization { get; set; } = true; public bool AutoLogin { get; @@ -393,11 +337,11 @@ namespace GreenshotPlugin.Core { /// a Base64 string of the hash value private static string ComputeHash(HashAlgorithm hashAlgorithm, string data) { if (hashAlgorithm == null) { - throw new ArgumentNullException("hashAlgorithm"); + throw new ArgumentNullException(nameof(hashAlgorithm)); } if (string.IsNullOrEmpty(data)) { - throw new ArgumentNullException("data"); + throw new ArgumentNullException(nameof(data)); } byte[] dataBuffer = Encoding.UTF8.GetBytes(data); @@ -421,7 +365,7 @@ namespace GreenshotPlugin.Core { StringBuilder sb = new StringBuilder(); foreach (string key in queryParameters.Keys) { if (queryParameters[key] is string) { - sb.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", key, UrlEncode3986(string.Format("{0}",queryParameters[key]))); + sb.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", key, UrlEncode3986($"{queryParameters[key]}")); } } sb.Remove(sb.Length - 1, 1); @@ -440,7 +384,7 @@ namespace GreenshotPlugin.Core { StringBuilder result = new StringBuilder(); foreach (char symbol in value) { - if (UNRESERVED_CHARS.IndexOf(symbol) != -1) { + if (UnreservedChars.IndexOf(symbol) != -1) { result.Append(symbol); } else { byte[] utf8Bytes = Encoding.UTF8.GetBytes(symbol.ToString()); @@ -478,14 +422,14 @@ namespace GreenshotPlugin.Core { /// response, this doesn't need to be used!! private string GetRequestToken() { IDictionary parameters = new Dictionary(); - foreach(var value in _requestTokenParameters) { + foreach(var value in RequestTokenParameters) { parameters.Add(value); } Sign(RequestTokenMethod, RequestTokenUrl, parameters); string response = MakeRequest(RequestTokenMethod, RequestTokenUrl, null, parameters, null); if (!string.IsNullOrEmpty(response)) { response = NetworkHelper.UrlDecode(response); - LOG.DebugFormat("Request token response: {0}", response); + Log.DebugFormat("Request token response: {0}", response); _requestTokenResponseParameters = NetworkHelper.ParseQueryString(response); string value; if (_requestTokenResponseParameters.TryGetValue(OAUTH_TOKEN_KEY, out value)) { @@ -506,7 +450,7 @@ namespace GreenshotPlugin.Core { Exception e = new Exception("The request token is not set, service responded with: " + requestTokenResponse); throw e; } - LOG.DebugFormat("Opening AuthorizationLink: {0}", AuthorizationLink); + Log.DebugFormat("Opening AuthorizationLink: {0}", AuthorizationLink); OAuthLoginForm oAuthLoginForm = new OAuthLoginForm(LoginTitle, BrowserSize, AuthorizationLink, CallbackUrl); oAuthLoginForm.ShowDialog(); if (oAuthLoginForm.IsOk) { @@ -545,14 +489,14 @@ namespace GreenshotPlugin.Core { string response = MakeRequest(AccessTokenMethod, AccessTokenUrl, null, parameters, null); if (!string.IsNullOrEmpty(response)) { response = NetworkHelper.UrlDecode(response); - LOG.DebugFormat("Access token response: {0}", response); - _accessTokenResponseParameters = NetworkHelper.ParseQueryString(response); + Log.DebugFormat("Access token response: {0}", response); + AccessTokenResponseParameters = NetworkHelper.ParseQueryString(response); string tokenValue; - if (_accessTokenResponseParameters.TryGetValue(OAUTH_TOKEN_KEY, out tokenValue) && tokenValue != null) { + if (AccessTokenResponseParameters.TryGetValue(OAUTH_TOKEN_KEY, out tokenValue) && tokenValue != null) { Token = tokenValue; } string secretValue; - if (_accessTokenResponseParameters.TryGetValue(OAUTH_TOKEN_SECRET_KEY, out secretValue) && secretValue != null) { + if (AccessTokenResponseParameters.TryGetValue(OAUTH_TOKEN_SECRET_KEY, out secretValue) && secretValue != null) { TokenSecret = secretValue; } } @@ -568,23 +512,23 @@ namespace GreenshotPlugin.Core { Token = null; TokenSecret = null; Verifier = null; - LOG.Debug("Creating Token"); + Log.Debug("Creating Token"); string requestTokenResponse; - try { + try { requestTokenResponse = GetRequestToken(); } catch (Exception ex) { - LOG.Error(ex); + Log.Error(ex); throw new NotSupportedException("Service is not available: " + ex.Message); } if (string.IsNullOrEmpty(GetAuthorizeToken(requestTokenResponse))) { - LOG.Debug("User didn't authenticate!"); + Log.Debug("User didn't authenticate!"); return false; } try { Thread.Sleep(1000); return GetAccessToken() != null; } catch (Exception ex) { - LOG.Error(ex); + Log.Error(ex); throw; } } @@ -593,37 +537,33 @@ namespace GreenshotPlugin.Core { /// Get the link to the authorization page for this application. /// /// The url with a valid request token, or a null string. - private string AuthorizationLink { - get { - return AuthorizeUrl + "?" + OAUTH_TOKEN_KEY + "=" + Token + "&" + OAUTH_CALLBACK_KEY + "=" + UrlEncode3986(CallbackUrl); - } - } + private string AuthorizationLink => AuthorizeUrl + "?" + OAUTH_TOKEN_KEY + "=" + Token + "&" + OAUTH_CALLBACK_KEY + "=" + UrlEncode3986(CallbackUrl); /// /// Submit a web request using oAuth. /// /// GET or POST - /// The full url, including the querystring for the signing/request + /// The full url, including the querystring for the signing/request /// Parameters for the request, which need to be signed /// Parameters for the request, which do not need to be signed /// Data to post (MemoryStream) /// The web server response. - public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { - return MakeOAuthRequest(method, requestURL, requestURL, null, parametersToSign, additionalParameters, postData); + public string MakeOAuthRequest(HTTPMethod method, string requestUrl, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { + return MakeOAuthRequest(method, requestUrl, requestUrl, null, parametersToSign, additionalParameters, postData); } /// /// Submit a web request using oAuth. /// /// GET or POST - /// The full url, including the querystring for the signing/request + /// The full url, including the querystring for the signing/request /// Header values /// Parameters for the request, which need to be signed /// Parameters for the request, which do not need to be signed /// Data to post (MemoryStream) /// The web server response. - public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary headers, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { - return MakeOAuthRequest(method, requestURL, requestURL, headers, parametersToSign, additionalParameters, postData); + public string MakeOAuthRequest(HTTPMethod method, string requestUrl, IDictionary headers, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { + return MakeOAuthRequest(method, requestUrl, requestUrl, headers, parametersToSign, additionalParameters, postData); } /// @@ -631,13 +571,13 @@ namespace GreenshotPlugin.Core { /// /// GET or POST /// The full url, including the querystring for the signing - /// The full url, including the querystring for the request + /// The full url, including the querystring for the request /// Parameters for the request, which need to be signed /// Parameters for the request, which do not need to be signed /// Data to post (MemoryStream) /// The web server response. - public string MakeOAuthRequest(HTTPMethod method, string signUrl, string requestURL, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { - return MakeOAuthRequest(method, signUrl, requestURL, null, parametersToSign, additionalParameters, postData); + public string MakeOAuthRequest(HTTPMethod method, string signUrl, string requestUrl, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { + return MakeOAuthRequest(method, signUrl, requestUrl, null, parametersToSign, additionalParameters, postData); } /// @@ -645,13 +585,13 @@ namespace GreenshotPlugin.Core { /// /// GET or POST /// The full url, including the querystring for the signing - /// The full url, including the querystring for the request + /// The full url, including the querystring for the request /// Headers for the request /// Parameters for the request, which need to be signed /// Parameters for the request, which do not need to be signed /// Data to post (MemoryStream) /// The web server response. - public string MakeOAuthRequest(HTTPMethod method, string signUrl, string requestURL, IDictionary headers, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { + public string MakeOAuthRequest(HTTPMethod method, string signUrl, string requestUrl, IDictionary headers, IDictionary parametersToSign, IDictionary additionalParameters, IBinaryContainer postData) { if (parametersToSign == null) { parametersToSign = new Dictionary(); } @@ -677,7 +617,7 @@ namespace GreenshotPlugin.Core { newParameters.Add(parameter); } } - return MakeRequest(method, requestURL, headers, newParameters, postData); + return MakeRequest(method, requestUrl, headers, newParameters, postData); } catch (UnauthorizedAccessException uaEx) { lastException = uaEx; Token = null; @@ -695,7 +635,6 @@ namespace GreenshotPlugin.Core { { parametersToSign.Remove(keyToDelete); } - continue; } } if (lastException != null) { @@ -735,13 +674,9 @@ namespace GreenshotPlugin.Core { parameters.Add(OAUTH_NONCE_KEY, GenerateNonce()); parameters.Add(OAUTH_TIMESTAMP_KEY, GenerateTimeStamp()); switch(SignatureType) { - case OAuthSignatureTypes.RSASHA1: - parameters.Add(OAUTH_SIGNATURE_METHOD_KEY, RSASHA1SignatureType); - break; case OAuthSignatureTypes.PLAINTEXT: parameters.Add(OAUTH_SIGNATURE_METHOD_KEY, PlainTextSignatureType); break; - case OAuthSignatureTypes.HMACSHA1: default: parameters.Add(OAUTH_SIGNATURE_METHOD_KEY, HMACSHA1SignatureType); break; @@ -757,41 +692,15 @@ namespace GreenshotPlugin.Core { parameters.Add(OAUTH_TOKEN_KEY, Token); } signatureBase.Append(UrlEncode3986(GenerateNormalizedParametersString(parameters))); - LOG.DebugFormat("Signature base: {0}", signatureBase); + Log.DebugFormat("Signature base: {0}", signatureBase); string key = string.Format(CultureInfo.InvariantCulture, "{0}&{1}", UrlEncode3986(_consumerSecret), string.IsNullOrEmpty(TokenSecret) ? string.Empty : UrlEncode3986(TokenSecret)); switch (SignatureType) { - case OAuthSignatureTypes.RSASHA1: - // Code comes from here: http://www.dotnetfunda.com/articles/article1932-rest-service-call-using-oauth-10-authorization-with-rsa-sha1.aspx - // Read the .P12 file to read Private/Public key Certificate - string certFilePath = _consumerKey; // The .P12 certificate file path Example: "C:/mycertificate/MCOpenAPI.p12 - string password = _consumerSecret; // password to read certificate .p12 file - // Read the Certification from .P12 file. - X509Certificate2 cert = new X509Certificate2(certFilePath.ToString(), password); - // Retrieve the Private key from Certificate. - RSACryptoServiceProvider RSAcrypt = (RSACryptoServiceProvider)cert.PrivateKey; - // Create a RSA-SHA1 Hash object - using (SHA1Managed shaHASHObject = new SHA1Managed()) { - // Create Byte Array of Signature base string - byte[] data = Encoding.ASCII.GetBytes(signatureBase.ToString()); - // Create Hashmap of Signature base string - byte[] hash = shaHASHObject.ComputeHash(data); - // Create Sign Hash of base string - // NOTE - 'SignHash' gives correct data. Don't use SignData method - byte[] rsaSignature = RSAcrypt.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")); - // Convert to Base64 string - string base64string = Convert.ToBase64String(rsaSignature); - // Return the Encoded UTF8 string - parameters.Add(OAUTH_SIGNATURE_KEY, UrlEncode3986(base64string)); - } - break; case OAuthSignatureTypes.PLAINTEXT: parameters.Add(OAUTH_SIGNATURE_KEY, key); break; - case OAuthSignatureTypes.HMACSHA1: default: // Generate Signature and add it to the parameters - HMACSHA1 hmacsha1 = new HMACSHA1(); - hmacsha1.Key = Encoding.UTF8.GetBytes(key); + HMACSHA1 hmacsha1 = new HMACSHA1 {Key = Encoding.UTF8.GetBytes(key)}; string signature = ComputeHash(hmacsha1, signatureBase.ToString()); parameters.Add(OAUTH_SIGNATURE_KEY, signature); break; @@ -803,24 +712,24 @@ namespace GreenshotPlugin.Core { /// Any additional parameters added after the Sign call are not in the signature, this could be by design! /// /// - /// + /// /// /// /// IBinaryParameter /// Response from server - private string MakeRequest(HTTPMethod method, string requestURL, IDictionary headers, IDictionary parameters, IBinaryContainer postData) { + private string MakeRequest(HTTPMethod method, string requestUrl, IDictionary headers, IDictionary parameters, IBinaryContainer postData) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } IDictionary requestParameters; // Add oAuth values as HTTP headers, if this is allowed StringBuilder authHeader = null; - if (UseHTTPHeadersForAuthorization) { + if (UseHttpHeadersForAuthorization) { authHeader = new StringBuilder(); requestParameters = new Dictionary(); foreach (string parameterKey in parameters.Keys) { if (parameterKey.StartsWith(OAUTH_PARAMETER_PREFIX)) { - authHeader.AppendFormat(CultureInfo.InvariantCulture, "{0}=\"{1}\", ", parameterKey, UrlEncode3986(string.Format("{0}",parameters[parameterKey]))); + authHeader.AppendFormat(CultureInfo.InvariantCulture, "{0}=\"{1}\", ", parameterKey, UrlEncode3986($"{parameters[parameterKey]}")); } else if (!requestParameters.ContainsKey(parameterKey)) { requestParameters.Add(parameterKey, parameters[parameterKey]); } @@ -836,16 +745,16 @@ namespace GreenshotPlugin.Core { if (HTTPMethod.GET == method || postData != null) { if (requestParameters.Count > 0) { // Add the parameters to the request - requestURL += "?" + NetworkHelper.GenerateQueryParameters(requestParameters); + requestUrl += "?" + NetworkHelper.GenerateQueryParameters(requestParameters); } } // Create webrequest - HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(requestURL, method); + HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(requestUrl, method); webRequest.ServicePoint.Expect100Continue = false; webRequest.UserAgent = _userAgent; - if (UseHTTPHeadersForAuthorization && authHeader != null) { - LOG.DebugFormat("Authorization: OAuth {0}", authHeader); + if (UseHttpHeadersForAuthorization && authHeader != null) { + Log.DebugFormat("Authorization: OAuth {0}", authHeader); webRequest.Headers.Add("Authorization: OAuth " + authHeader); } @@ -860,13 +769,10 @@ namespace GreenshotPlugin.Core { NetworkHelper.WriteMultipartFormData(webRequest, requestParameters); } else { StringBuilder form = new StringBuilder(); - foreach (string parameterKey in requestParameters.Keys) { - if (parameters[parameterKey] is IBinaryContainer) { - IBinaryContainer binaryParameter = parameters[parameterKey] as IBinaryContainer; - form.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", UrlEncode3986(parameterKey), UrlEncode3986(binaryParameter.ToBase64String(Base64FormattingOptions.None))); - } else { - form.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", UrlEncode3986(parameterKey), UrlEncode3986(string.Format("{0}",parameters[parameterKey]))); - } + foreach (string parameterKey in requestParameters.Keys) + { + var binaryParameter = parameters[parameterKey] as IBinaryContainer; + form.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", UrlEncode3986(parameterKey), binaryParameter != null ? UrlEncode3986(binaryParameter.ToBase64String(Base64FormattingOptions.None)) : UrlEncode3986($"{parameters[parameterKey]}")); } // Remove trailing & if (form.Length > 0) { @@ -887,12 +793,10 @@ namespace GreenshotPlugin.Core { string responseData; try { responseData = NetworkHelper.GetResponseAsString(webRequest); - LOG.DebugFormat("Response: {0}", responseData); + Log.DebugFormat("Response: {0}", responseData); } catch (Exception ex) { - LOG.Error("Couldn't retrieve response: ", ex); + Log.Error("Couldn't retrieve response: ", ex); throw; - } finally { - webRequest = null; } return responseData; @@ -904,52 +808,34 @@ namespace GreenshotPlugin.Core { /// and waits for a call with the authorization verification code. /// public class LocalServerCodeReceiver { - private static readonly ILog LOG = LogManager.GetLogger(typeof(LocalServerCodeReceiver)); + private static readonly ILog Log = LogManager.GetLogger(typeof(LocalServerCodeReceiver)); private readonly ManualResetEvent _ready = new ManualResetEvent(true); - private string _loopbackCallback = "http://localhost:{0}/authorize/"; /// /// The call back format. Expects one port parameter. /// Default: http://localhost:{0}/authorize/ /// - public string LoopbackCallbackUrl { - get { - return _loopbackCallback; - } - set { - _loopbackCallback = value; - } - } - - private string _closePageResponse = -@" -OAuth 2.0 Authentication CloudServiceName - -Greenshot received information from CloudServiceName. You can close this browser / tab if it is not closed itself... - - -"; + public string LoopbackCallbackUrl { get; set; } = "http://localhost:{0}/authorize/"; /// /// HTML code to to return the _browser, default it will try to close the _browser / tab, this won't always work. /// You can use CloudServiceName where you want to show the CloudServiceName from your OAuth2 settings /// - public string ClosePageResponse { - get { - return _closePageResponse; - } - set { - _closePageResponse = value; - } - } + public string ClosePageResponse { get; set; } = @" +OAuth 2.0 Authentication CloudServiceName + +Greenshot received information from CloudServiceName. You can close this browser / tab if it is not closed itself... + + +"; private string _redirectUri; /// @@ -961,7 +847,7 @@ Greenshot received information from CloudServiceName. You can close this browser return _redirectUri; } - return _redirectUri = string.Format(_loopbackCallback, GetRandomUnusedPort()); + return _redirectUri = string.Format(LoopbackCallbackUrl, GetRandomUnusedPort()); } } @@ -973,7 +859,7 @@ Greenshot received information from CloudServiceName. You can close this browser /// /// The OAuth code receiver /// - /// + /// /// Dictionary with values public IDictionary ReceiveCode(OAuth2Settings oauth2Settings) { // Set the redirect URL on the settings @@ -986,7 +872,7 @@ Greenshot received information from CloudServiceName. You can close this browser // Get the formatted FormattedAuthUrl string authorizationUrl = oauth2Settings.FormattedAuthUrl; - LOG.DebugFormat("Open a browser with: {0}", authorizationUrl); + Log.DebugFormat("Open a browser with: {0}", authorizationUrl); Process.Start(authorizationUrl); // Wait to get the authorization code response. @@ -994,7 +880,7 @@ Greenshot received information from CloudServiceName. You can close this browser _ready.Reset(); while (!context.AsyncWaitHandle.WaitOne(1000, true)) { - LOG.Debug("Waiting for response"); + Log.Debug("Waiting for response"); } } catch (Exception) { // Make sure we can clean up, also if the thead is aborted @@ -1072,15 +958,15 @@ Greenshot received information from CloudServiceName. You can close this browser /// Code to simplify OAuth 2 /// public static class OAuth2Helper { - private const string REFRESH_TOKEN = "refresh_token"; - private const string ACCESS_TOKEN = "access_token"; - private const string CODE = "code"; - private const string CLIENT_ID = "client_id"; - private const string CLIENT_SECRET = "client_secret"; - private const string GRANT_TYPE = "grant_type"; - private const string AUTHORIZATION_CODE = "authorization_code"; - private const string REDIRECT_URI = "redirect_uri"; - private const string EXPIRES_IN = "expires_in"; + private const string RefreshToken = "refresh_token"; + private const string AccessToken = "access_token"; + private const string Code = "code"; + private const string ClientId = "client_id"; + private const string ClientSecret = "client_secret"; + private const string GrantType = "grant_type"; + private const string AuthorizationCode = "authorization_code"; + private const string RedirectUri = "redirect_uri"; + private const string ExpiresIn = "expires_in"; /// /// Generate an OAuth 2 Token by using the supplied code @@ -1089,11 +975,11 @@ Greenshot received information from CloudServiceName. You can close this browser public static void GenerateRefreshToken(OAuth2Settings settings) { IDictionary data = new Dictionary(); // Use the returned code to get a refresh code - data.Add(CODE, settings.Code); - data.Add(CLIENT_ID, settings.ClientId); - data.Add(REDIRECT_URI, settings.RedirectUrl); - data.Add(CLIENT_SECRET, settings.ClientSecret); - data.Add(GRANT_TYPE, AUTHORIZATION_CODE); + data.Add(Code, settings.Code); + data.Add(ClientId, settings.ClientId); + data.Add(RedirectUri, settings.RedirectUrl); + data.Add(ClientSecret, settings.ClientSecret); + data.Add(GrantType, AuthorizationCode); foreach (string key in settings.AdditionalAttributes.Keys) { data.Add(key, settings.AdditionalAttributes[key]); } @@ -1103,12 +989,12 @@ Greenshot received information from CloudServiceName. You can close this browser string accessTokenJsonResult = NetworkHelper.GetResponseAsString(webRequest, true); IDictionary refreshTokenResult = JSONHelper.JsonDecode(accessTokenJsonResult); - if (refreshTokenResult.ContainsKey("error")) { + if (refreshTokenResult.ContainsKey("error")) + { if (refreshTokenResult.ContainsKey("error_description")) { - throw new Exception(string.Format("{0} - {1}", refreshTokenResult["error"], refreshTokenResult["error_description"])); - } else { - throw new Exception((string)refreshTokenResult["error"]); + throw new Exception($"{refreshTokenResult["error"]} - {refreshTokenResult["error_description"]}"); } + throw new Exception((string)refreshTokenResult["error"]); } // gives as described here: https://developers.google.com/identity/protocols/OAuth2InstalledApp @@ -1116,10 +1002,10 @@ Greenshot received information from CloudServiceName. You can close this browser // "expires_in":3920, // "token_type":"Bearer", // "refresh_token":"1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" - settings.AccessToken = (string)refreshTokenResult[ACCESS_TOKEN] as string; - settings.RefreshToken = (string)refreshTokenResult[REFRESH_TOKEN] as string; + settings.AccessToken = (string)refreshTokenResult[AccessToken]; + settings.RefreshToken = (string)refreshTokenResult[RefreshToken]; - object seconds = refreshTokenResult[EXPIRES_IN]; + object seconds = refreshTokenResult[ExpiresIn]; if (seconds != null) { settings.AccessTokenExpires = DateTimeOffset.Now.AddSeconds((double)seconds); } @@ -1133,10 +1019,10 @@ Greenshot received information from CloudServiceName. You can close this browser /// public static void GenerateAccessToken(OAuth2Settings settings) { IDictionary data = new Dictionary(); - data.Add(REFRESH_TOKEN, settings.RefreshToken); - data.Add(CLIENT_ID, settings.ClientId); - data.Add(CLIENT_SECRET, settings.ClientSecret); - data.Add(GRANT_TYPE, REFRESH_TOKEN); + data.Add(RefreshToken, settings.RefreshToken); + data.Add(ClientId, settings.ClientId); + data.Add(ClientSecret, settings.ClientSecret); + data.Add(GrantType, RefreshToken); foreach (string key in settings.AdditionalAttributes.Keys) { data.Add(key, settings.AdditionalAttributes[key]); } @@ -1161,19 +1047,19 @@ Greenshot received information from CloudServiceName. You can close this browser return; } else { if (accessTokenResult.ContainsKey("error_description")) { - throw new Exception(string.Format("{0} - {1}", accessTokenResult["error"], accessTokenResult["error_description"])); + throw new Exception($"{accessTokenResult["error"]} - {accessTokenResult["error_description"]}"); } else { throw new Exception((string)accessTokenResult["error"]); } } } - settings.AccessToken = (string)accessTokenResult[ACCESS_TOKEN] as string; - if (accessTokenResult.ContainsKey(REFRESH_TOKEN)) { + settings.AccessToken = (string)accessTokenResult[AccessToken]; + if (accessTokenResult.ContainsKey(RefreshToken)) { // Refresh the refresh token :) - settings.RefreshToken = (string)accessTokenResult[REFRESH_TOKEN] as string; + settings.RefreshToken = (string)accessTokenResult[RefreshToken]; } - object seconds = accessTokenResult[EXPIRES_IN]; + object seconds = accessTokenResult[ExpiresIn]; if (seconds != null) { settings.AccessTokenExpires = DateTimeOffset.Now.AddSeconds((double)seconds); } else { @@ -1187,7 +1073,7 @@ Greenshot received information from CloudServiceName. You can close this browser /// OAuth2Settings /// false if it was canceled, true if it worked, exception if not public static bool Authenticate(OAuth2Settings settings) { - bool completed = true; + bool completed; switch (settings.AuthorizeMode) { case OAuth2AuthorizeMode.LocalServer: completed = AuthenticateViaLocalServer(settings); @@ -1196,7 +1082,7 @@ Greenshot received information from CloudServiceName. You can close this browser completed = AuthenticateViaEmbeddedBrowser(settings); break; default: - throw new NotImplementedException(string.Format("Authorize mode '{0}' is not 'yet' implemented.", settings.AuthorizeMode)); + throw new NotImplementedException($"Authorize mode '{settings.AuthorizeMode}' is not 'yet' implemented."); } return completed; } @@ -1209,16 +1095,16 @@ Greenshot received information from CloudServiceName. You can close this browser /// true if completed, false if canceled private static bool AuthenticateViaEmbeddedBrowser(OAuth2Settings settings) { if (string.IsNullOrEmpty(settings.CloudServiceName)) { - throw new ArgumentNullException("CloudServiceName"); + throw new ArgumentNullException(nameof(settings.CloudServiceName)); } if (settings.BrowserSize == Size.Empty) { - throw new ArgumentNullException("BrowserSize"); + throw new ArgumentNullException(nameof(settings.BrowserSize)); } - OAuthLoginForm loginForm = new OAuthLoginForm(string.Format("Authorize {0}", settings.CloudServiceName), settings.BrowserSize, settings.FormattedAuthUrl, settings.RedirectUrl); + OAuthLoginForm loginForm = new OAuthLoginForm($"Authorize {settings.CloudServiceName}", settings.BrowserSize, settings.FormattedAuthUrl, settings.RedirectUrl); loginForm.ShowDialog(); if (loginForm.IsOk) { string code; - if (loginForm.CallbackParameters.TryGetValue(CODE, out code) && !string.IsNullOrEmpty(code)) { + if (loginForm.CallbackParameters.TryGetValue(Code, out code) && !string.IsNullOrEmpty(code)) { settings.Code = code; GenerateRefreshToken(settings); return true; @@ -1238,7 +1124,7 @@ Greenshot received information from CloudServiceName. You can close this browser IDictionary result = codeReceiver.ReceiveCode(settings); string code; - if (result.TryGetValue(CODE, out code) && !string.IsNullOrEmpty(code)) { + if (result.TryGetValue(Code, out code) && !string.IsNullOrEmpty(code)) { settings.Code = code; GenerateRefreshToken(settings); return true; @@ -1251,9 +1137,8 @@ Greenshot received information from CloudServiceName. You can close this browser } if ("access_denied" == error) { throw new UnauthorizedAccessException("Access denied"); - } else { - throw new Exception(error); } + throw new Exception(error); } return false; } diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 0758215a8..78d0f1cd5 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -36,13 +36,13 @@ namespace GreenshotPlugin.Core { /// Description of PluginUtils. /// public static class PluginUtils { - private static readonly ILog LOG = LogManager.GetLogger(typeof(PluginUtils)); - private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); - private const string PATH_KEY = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\"; - private static readonly IDictionary exeIconCache = new Dictionary(); + private static readonly ILog Log = LogManager.GetLogger(typeof(PluginUtils)); + private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); + private const string PathKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\"; + private static readonly IDictionary ExeIconCache = new Dictionary(); static PluginUtils() { - conf.PropertyChanged += OnIconSizeChanged; + CoreConfig.PropertyChanged += OnIconSizeChanged; } /// @@ -61,16 +61,15 @@ namespace GreenshotPlugin.Core { private static void OnIconSizeChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "IconSize") { List cachedImages = new List(); - lock (exeIconCache) { - foreach (string key in exeIconCache.Keys) { - cachedImages.Add(exeIconCache[key]); + lock (ExeIconCache) { + foreach (string key in ExeIconCache.Keys) { + cachedImages.Add(ExeIconCache[key]); } - exeIconCache.Clear(); + ExeIconCache.Clear(); } - foreach (Image cachedImage in cachedImages) { - if (cachedImage != null) { - cachedImage.Dispose(); - } + foreach (Image cachedImage in cachedImages) + { + cachedImage?.Dispose(); } } @@ -82,7 +81,7 @@ namespace GreenshotPlugin.Core { /// e.g. cmd.exe /// Path to file public static string GetExePath(string exeName) { - using (RegistryKey key = Registry.LocalMachine.OpenSubKey(PATH_KEY + exeName, false)) { + using (RegistryKey key = Registry.LocalMachine.OpenSubKey(PathKey + exeName, false)) { if (key != null) { // "" is the default key, which should point to the requested location return (string)key.GetValue(""); @@ -91,11 +90,11 @@ namespace GreenshotPlugin.Core { foreach (string pathEntry in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(';')) { try { string path = pathEntry.Trim(); - if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exeName))) { + if (!string.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exeName))) { return Path.GetFullPath(path); } } catch (Exception) { - LOG.WarnFormat("Problem with path entry '{0}'.", pathEntry); + Log.WarnFormat("Problem with path entry '{0}'.", pathEntry); } } return null; @@ -108,18 +107,22 @@ namespace GreenshotPlugin.Core { /// index of the icon /// Bitmap with the icon or null if something happended public static Image GetCachedExeIcon(string path, int index) { - string cacheKey = string.Format("{0}:{1}", path, index); + string cacheKey = $"{path}:{index}"; Image returnValue; - lock (exeIconCache) + lock (ExeIconCache) { - if (!exeIconCache.TryGetValue(cacheKey, out returnValue)) { - lock (exeIconCache) { - if (!exeIconCache.TryGetValue(cacheKey, out returnValue)) { - returnValue = GetExeIcon(path, index); - if (returnValue != null) { - exeIconCache.Add(cacheKey, returnValue); - } - } + if (ExeIconCache.TryGetValue(cacheKey, out returnValue)) + { + return returnValue; + } + lock (ExeIconCache) { + if (ExeIconCache.TryGetValue(cacheKey, out returnValue)) + { + return returnValue; + } + returnValue = GetExeIcon(path, index); + if (returnValue != null) { + ExeIconCache.Add(cacheKey, returnValue); } } } @@ -137,18 +140,18 @@ namespace GreenshotPlugin.Core { return null; } try { - using (Icon appIcon = ImageHelper.ExtractAssociatedIcon(path, index, conf.UseLargeIcons)) { + using (Icon appIcon = ImageHelper.ExtractAssociatedIcon(path, index, CoreConfig.UseLargeIcons)) { if (appIcon != null) { return appIcon.ToBitmap(); } } - using (Icon appIcon = Shell32.GetFileIcon(path, conf.UseLargeIcons ? Shell32.IconSize.Large : Shell32.IconSize.Small, false)) { + using (Icon appIcon = Shell32.GetFileIcon(path, CoreConfig.UseLargeIcons ? Shell32.IconSize.Large : Shell32.IconSize.Small, false)) { if (appIcon != null) { return appIcon.ToBitmap(); } } } catch (Exception exIcon) { - LOG.Error("error retrieving icon: ", exIcon); + Log.Error("error retrieving icon: ", exIcon); } return null; } @@ -163,10 +166,12 @@ namespace GreenshotPlugin.Core { /// Keys which can be used as shortcut /// The onclick handler public static void AddToFileMenu(IImageEditor imageEditor, Image image, string text, object tag, Keys? shortcutKeys, EventHandler handler) { - ToolStripMenuItem item = new ToolStripMenuItem(); - item.Image = image; - item.Text = text; - item.Tag = tag; + var item = new ToolStripMenuItem + { + Image = image, + Text = text, + Tag = tag + }; if (shortcutKeys.HasValue) { item.ShortcutKeys = shortcutKeys.Value; } @@ -228,9 +233,11 @@ namespace GreenshotPlugin.Core { if (contextMenu.Items[i].GetType() == typeof(ToolStripSeparator)) { // Check if we need to add a new separator, which is done if the first found has a Tag with the value "PluginsAreAddedBefore" if ("PluginsAreAddedBefore".Equals(contextMenu.Items[i].Tag)) { - ToolStripSeparator separator = new ToolStripSeparator(); - separator.Tag = "PluginsAreAddedAfter"; - separator.Size = new Size(305, 6); + var separator = new ToolStripSeparator + { + Tag = "PluginsAreAddedAfter", + Size = new Size(305, 6) + }; contextMenu.Items.Insert(i, separator); } else if (!"PluginsAreAddedAfter".Equals(contextMenu.Items[i].Tag)) { continue; diff --git a/GreenshotPlugin/Core/QuantizerHelper.cs b/GreenshotPlugin/Core/QuantizerHelper.cs index 09b1ee0d2..4b3267726 100644 --- a/GreenshotPlugin/Core/QuantizerHelper.cs +++ b/GreenshotPlugin/Core/QuantizerHelper.cs @@ -337,7 +337,6 @@ namespace GreenshotPlugin.Core { using (IFastBitmap src = FastBitmap.Create(sourceBitmap)) { IFastBitmapWithBlend srcBlend = src as IFastBitmapWithBlend; Dictionary lookup = new Dictionary(); - byte bestMatch; for (int y = 0; y < src.Height; y++) { for (int x = 0; x < src.Width; x++) { Color color; @@ -349,6 +348,7 @@ namespace GreenshotPlugin.Core { } // Check if we already matched the color + byte bestMatch; if (!lookup.ContainsKey(color)) { // If not we need to find the best match @@ -678,5 +678,5 @@ namespace GreenshotPlugin.Core { } } } - } + } } \ No newline at end of file diff --git a/GreenshotPlugin/Core/RssHelper.cs b/GreenshotPlugin/Core/RssHelper.cs index d4480b877..445f5fd53 100644 --- a/GreenshotPlugin/Core/RssHelper.cs +++ b/GreenshotPlugin/Core/RssHelper.cs @@ -29,65 +29,49 @@ using log4net; namespace GreenshotPlugin.Core { public class RssFile { - private readonly string _file; - public string File { - get {return _file;} - } + public string File { get; } private readonly DateTime _pubdate; - public DateTime Pubdate { - get {return _pubdate;} - } - private readonly string _link; - public string Link { - get {return _link;} - } - private Version _version; - public Version Version { - get {return _version;} - set { - _version = value; - } - } - private string _language; - public string Language { - get {return _language;} - set {_language = value;} - } + public DateTime Pubdate => _pubdate; - public bool isExe { + public string Link { get; } + public Version Version { get; set; } + + public string Language { get; set; } + + public bool IsExe { get { - if (_file != null) { - return _file.ToLower().EndsWith(".exe"); + if (File != null) { + return File.ToLower().EndsWith(".exe"); } return false; } } - public bool isUnstable { + public bool IsUnstable { get { - if (_file != null) { - return _file.ToLower().Contains("unstable"); + if (File != null) { + return File.ToLower().Contains("unstable"); } return false; } } - public bool isReleaseCandidate { + public bool IsReleaseCandidate { get { - if (_file != null) { - return Regex.IsMatch(_file.ToLower(), "rc[0-9]+"); + if (File != null) { + return Regex.IsMatch(File.ToLower(), "rc[0-9]+"); } return false; } } public RssFile(string file, string pubdate, string link) { - _file = file; + File = file; if (!DateTime.TryParse(pubdate, out _pubdate)) { DateTime.TryParseExact(pubdate.Replace(" UT", ""), "ddd, dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out _pubdate); } - _link = link; + Link = link; } } @@ -95,16 +79,16 @@ namespace GreenshotPlugin.Core { /// Description of RssHelper. /// public class RssHelper { - private static ILog LOG = LogManager.GetLogger(typeof(RssHelper)); - private const string RSSFEED = "http://getgreenshot.org/project-feed/"; + private static readonly ILog Log = LogManager.GetLogger(typeof(RssHelper)); + private const string Rssfeed = "http://getgreenshot.org/project-feed/"; /// /// This is using the HTTP HEAD Method to check if the RSS Feed is modified after the supplied date /// /// DateTime /// true if the feed is newer - public static bool IsRSSModifiedAfter(DateTime updateTime) { - DateTime lastModified = NetworkHelper.GetLastModified(new Uri(RSSFEED)); + public static bool IsRssModifiedAfter(DateTime updateTime) { + DateTime lastModified = NetworkHelper.GetLastModified(new Uri(Rssfeed)); if (lastModified == DateTime.MinValue) { // Time could not be read, just take now and add one hour to it. @@ -118,17 +102,17 @@ namespace GreenshotPlugin.Core { /// Read the Greenshot RSS feed, so we can use this information to check for updates /// /// List with RssFile(s) - public static IList readRSS() { + public static IList ReadRss() { XmlDocument rssDoc = new XmlDocument(); try { - HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(RSSFEED); + HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(Rssfeed); XmlTextReader rssReader = new XmlTextReader(webRequest.GetResponse().GetResponseStream()); // Load the XML content into a XmlDocument rssDoc.Load(rssReader); } catch (Exception wE) { - LOG.WarnFormat("Problem reading RSS from {0}", RSSFEED); - LOG.Warn(wE.Message); + Log.WarnFormat("Problem reading RSS from {0}", Rssfeed); + Log.Warn(wE.Message); return null; } @@ -143,7 +127,7 @@ namespace GreenshotPlugin.Core { } if (nodeRss == null) { - LOG.Debug("No RSS Feed!"); + Log.Debug("No RSS Feed!"); return null; } @@ -158,7 +142,7 @@ namespace GreenshotPlugin.Core { } if (nodeChannel == null) { - LOG.Debug("No channel in RSS feed!"); + Log.Debug("No channel in RSS feed!"); return null; } @@ -168,41 +152,49 @@ namespace GreenshotPlugin.Core { for (int i = 0; i < nodeChannel.ChildNodes.Count; i++) { // If it is the item tag, then it has children tags which we will add as items to the ListView - if (nodeChannel.ChildNodes[i].Name == "item") { - XmlNode nodeItem = nodeChannel.ChildNodes[i]; - string link = nodeItem["link"].InnerText; - string pubdate = nodeItem["pubDate"].InnerText; - try { - Match match= Regex.Match(Uri.UnescapeDataString(link), @"^.*\/(Greenshot.+)\/download$"); - if (match.Success) { - string file = match.Groups[1].Value; + if (nodeChannel.ChildNodes[i].Name != "item") + { + continue; + } + XmlNode nodeItem = nodeChannel.ChildNodes[i]; + string link = nodeItem["link"]?.InnerText; + string pubdate = nodeItem["pubDate"]?.InnerText; + try { + if (link == null) + { + continue; + } + Match match = Regex.Match(Uri.UnescapeDataString(link), @"^.*\/(Greenshot.+)\/download$"); + if (!match.Success) + { + continue; + } + string file = match.Groups[1].Value; - RssFile rssFile = new RssFile(file, pubdate, link); - if (file.EndsWith(".exe") ||file.EndsWith(".zip")) { - string version = Regex.Replace(file, @".*[a-zA-Z_]\-", ""); - version = version.Replace(@"\-[a-zA-Z]+.*",""); - version = Regex.Replace(version, @"\.exe$", ""); - version = Regex.Replace(version, @"\.zip$", ""); - version = Regex.Replace(version, @"RC[0-9]+", ""); - if (version.Trim().Length > 0) { - version = version.Replace('-','.'); - version = version.Replace(',','.'); - version = Regex.Replace(version, @"^[a-zA-Z_]*\.", ""); - version = Regex.Replace(version, @"\.[a-zA-Z_]*$", ""); + RssFile rssFile = new RssFile(file, pubdate, link); + if (file.EndsWith(".exe") ||file.EndsWith(".zip")) { + string version = Regex.Replace(file, @".*[a-zA-Z_]\-", ""); + version = version.Replace(@"\-[a-zA-Z]+.*",""); + version = Regex.Replace(version, @"\.exe$", ""); + version = Regex.Replace(version, @"\.zip$", ""); + version = Regex.Replace(version, @"RC[0-9]+", ""); + if (version.Trim().Length > 0) { + version = version.Replace('-','.'); + version = version.Replace(',','.'); + version = Regex.Replace(version, @"^[a-zA-Z_]*\.", ""); + version = Regex.Replace(version, @"\.[a-zA-Z_]*$", ""); - try { - rssFile.Version = new Version(version); - } catch (Exception) { - LOG.DebugFormat("Found invalid version {0} in file {1}", version, file); - } - } - rssFiles.Add(rssFile); + try { + rssFile.Version = new Version(version); + } catch (Exception) { + Log.DebugFormat("Found invalid version {0} in file {1}", version, file); } } - } catch (Exception ex) { - LOG.WarnFormat("Couldn't read RSS entry for: {0}", nodeChannel["title"].InnerText); - LOG.Warn("Reason: ", ex); + rssFiles.Add(rssFile); } + } catch (Exception ex) { + Log.WarnFormat("Couldn't read RSS entry for: {0}", nodeChannel["title"]?.InnerText); + Log.Warn("Reason: ", ex); } } diff --git a/GreenshotPlugin/Core/StringExtensions.cs b/GreenshotPlugin/Core/StringExtensions.cs index 832acb07b..7483fc967 100644 --- a/GreenshotPlugin/Core/StringExtensions.cs +++ b/GreenshotPlugin/Core/StringExtensions.cs @@ -52,7 +52,7 @@ namespace GreenshotPlugin.Core { /// Formatted string public static string FormatWith(this string format, IFormatProvider provider, object source) { if (format == null) { - throw new ArgumentNullException("format"); + throw new ArgumentNullException(nameof(format)); } IDictionary properties = new Dictionary(); @@ -80,11 +80,7 @@ namespace GreenshotPlugin.Core { Group endGroup = m.Groups["end"]; object value; - if (properties.TryGetValue(propertyGroup.Value, out value)) { - values.Add(value); - } else { - values.Add(source); - } + values.Add(properties.TryGetValue(propertyGroup.Value, out value) ? value : source); return new string('{', startGroup.Captures.Count) + (values.Count - 1) + formatGroup.Value + new string('}', endGroup.Captures.Count); }); @@ -94,12 +90,12 @@ namespace GreenshotPlugin.Core { /// /// A simply rijndael aes encryption, can be used to store passwords /// - /// the string to call upon + /// the string to call upon /// an encryped string in base64 form - public static string Encrypt(this string ClearText) { - string returnValue = ClearText; + public static string Encrypt(this string clearText) { + string returnValue = clearText; try { - byte[] clearTextBytes = Encoding.ASCII.GetBytes(ClearText); + byte[] clearTextBytes = Encoding.ASCII.GetBytes(clearText); SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); using (MemoryStream ms = new MemoryStream()) { @@ -113,7 +109,7 @@ namespace GreenshotPlugin.Core { } } } catch (Exception ex) { - LOG.ErrorFormat("Error encrypting, error: ", ex.Message); + LOG.ErrorFormat("Error encrypting, error: {0}", ex.Message); } return returnValue; } @@ -121,12 +117,12 @@ namespace GreenshotPlugin.Core { /// /// A simply rijndael aes decryption, can be used to store passwords /// - /// a base64 encoded rijndael encrypted string + /// a base64 encoded rijndael encrypted string /// Decrypeted text - public static string Decrypt(this string EncryptedText) { - string returnValue = EncryptedText; + public static string Decrypt(this string encryptedText) { + string returnValue = encryptedText; try { - byte[] encryptedTextBytes = Convert.FromBase64String(EncryptedText); + byte[] encryptedTextBytes = Convert.FromBase64String(encryptedText); using (MemoryStream ms = new MemoryStream()) { SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); @@ -142,7 +138,7 @@ namespace GreenshotPlugin.Core { } } catch (Exception ex) { - LOG.ErrorFormat("Error decrypting {0}, error: ", EncryptedText, ex.Message); + LOG.ErrorFormat("Error decrypting {0}, error: {1}", encryptedText, ex.Message); } return returnValue; diff --git a/GreenshotPlugin/Core/WindowCapture.cs b/GreenshotPlugin/Core/WindowCapture.cs index eae9ba0ec..2fa0aded5 100644 --- a/GreenshotPlugin/Core/WindowCapture.cs +++ b/GreenshotPlugin/Core/WindowCapture.cs @@ -62,16 +62,13 @@ namespace GreenshotPlugin.Core { set; } - private readonly Dictionary metaData = new Dictionary(); - public Dictionary MetaData { - get {return metaData;} - } - + public Dictionary MetaData { get; } = new Dictionary(); + public void AddMetaData(string key, string value) { - if (metaData.ContainsKey(key)) { - metaData[key] = value; + if (MetaData.ContainsKey(key)) { + MetaData[key] = value; } else { - metaData.Add(key, value); + MetaData.Add(key, value); } } @@ -117,10 +114,10 @@ namespace GreenshotPlugin.Core { /// Having the Bitmap, eventually the Windows Title and cursor all together. /// public class Capture : ICapture { - private static readonly ILog LOG = LogManager.GetLogger(typeof(Capture)); + private static readonly ILog Log = LogManager.GetLogger(typeof(Capture)); private List _elements = new List(); - private Rectangle _screenBounds = Rectangle.Empty; + private Rectangle _screenBounds; /// /// Get/Set the Screenbounds /// @@ -141,13 +138,11 @@ namespace GreenshotPlugin.Core { public Image Image { get {return _image;} set { - if (_image != null) { - _image.Dispose(); - } + _image?.Dispose(); _image = value; if (value != null) { if (value.PixelFormat.Equals(PixelFormat.Format8bppIndexed) || value.PixelFormat.Equals(PixelFormat.Format1bppIndexed) || value.PixelFormat.Equals(PixelFormat.Format4bppIndexed)) { - LOG.Debug("Converting Bitmap to PixelFormat.Format32bppArgb as we don't support: " + value.PixelFormat); + Log.Debug("Converting Bitmap to PixelFormat.Format32bppArgb as we don't support: " + value.PixelFormat); try { // Default Bitmap PixelFormat is Format32bppArgb _image = new Bitmap(value); @@ -156,9 +151,9 @@ namespace GreenshotPlugin.Core { value.Dispose(); } } - LOG.DebugFormat("Image is set with the following specifications: {0} - {1}", _image.Size, _image.PixelFormat); + Log.DebugFormat("Image is set with the following specifications: {0} - {1}", _image.Size, _image.PixelFormat); } else { - LOG.Debug("Image is removed."); + Log.Debug("Image is removed."); } } } @@ -174,21 +169,15 @@ namespace GreenshotPlugin.Core { public Icon Cursor { get {return _cursor;} set { - if (_cursor != null) { - _cursor.Dispose(); - } + _cursor?.Dispose(); _cursor = (Icon)value.Clone(); } } - - private bool _cursorVisible; + /// /// Set if the cursor is visible /// - public bool CursorVisible { - get {return _cursorVisible;} - set {_cursorVisible = value;} - } + public bool CursorVisible { get; set; } private Point _cursorLocation = Point.Empty; /// @@ -257,12 +246,8 @@ namespace GreenshotPlugin.Core { /// protected virtual void Dispose(bool disposing) { if (disposing) { - if (_image != null) { - _image.Dispose(); - } - if (_cursor != null) { - _cursor.Dispose(); - } + _image?.Dispose(); + _cursor?.Dispose(); } _image = null; _cursor = null; @@ -273,27 +258,28 @@ namespace GreenshotPlugin.Core { /// /// Rectangle with bitmap coordinates public bool Crop(Rectangle cropRectangle) { - LOG.Debug("Cropping to: " + cropRectangle.ToString()); - if (ImageHelper.Crop(ref _image, ref cropRectangle)) { - _location = cropRectangle.Location; - // Change mouse location according to the cropRegtangle (including screenbounds) offset - MoveMouseLocation(-cropRectangle.Location.X, -cropRectangle.Location.Y); - // Move all the elements - // TODO: Enable when the elements are usable again. - // MoveElements(-cropRectangle.Location.X, -cropRectangle.Location.Y); - - // Remove invisible elements - List newElements = new List(); - foreach(ICaptureElement captureElement in _elements) { - if (captureElement.Bounds.IntersectsWith(cropRectangle)) { - newElements.Add(captureElement); - } - } - _elements = newElements; - - return true; + Log.Debug("Cropping to: " + cropRectangle); + if (!ImageHelper.Crop(ref _image, ref cropRectangle)) + { + return false; } - return false; + _location = cropRectangle.Location; + // Change mouse location according to the cropRegtangle (including screenbounds) offset + MoveMouseLocation(-cropRectangle.Location.X, -cropRectangle.Location.Y); + // Move all the elements + // TODO: Enable when the elements are usable again. + // MoveElements(-cropRectangle.Location.X, -cropRectangle.Location.Y); + + // Remove invisible elements + var newElements = new List(); + foreach(var captureElement in _elements) { + if (captureElement.Bounds.IntersectsWith(cropRectangle)) { + newElements.Add(captureElement); + } + } + _elements = newElements; + + return true; } /// @@ -370,17 +356,9 @@ namespace GreenshotPlugin.Core { Name = name; Bounds = bounds; } - - private List _children = new List(); - public List Children { - get { - return _children; - } - set { - _children = value; - } - } - + + public List Children { get; set; } = new List(); + public string Name { get; set; @@ -392,17 +370,16 @@ namespace GreenshotPlugin.Core { // CaptureElements are regarded equal if their bounds are equal. this should be sufficient. public override bool Equals(object obj) { - bool ret = false; - if (obj != null && GetType() == obj.GetType()) { - CaptureElement other = obj as CaptureElement; - if (other != null && Bounds.Equals(other.Bounds)) { - ret = true; - } + if (obj == null || GetType() != obj.GetType()) + { + return false; } - return ret; + CaptureElement other = obj as CaptureElement; + return other != null && Bounds.Equals(other.Bounds); } public override int GetHashCode() { + // TODO: Fix this, this is not right... return Bounds.GetHashCode(); } } @@ -410,7 +387,7 @@ namespace GreenshotPlugin.Core { /// The Window Capture code /// public class WindowCapture { - private static readonly ILog LOG = LogManager.GetLogger(typeof(WindowCapture)); + private static readonly ILog Log = LogManager.GetLogger(typeof(WindowCapture)); private static readonly CoreConfiguration Configuration = IniConfig.GetIniSection(); /// @@ -472,22 +449,22 @@ namespace GreenshotPlugin.Core { /// /// A Capture Object with the Mouse Cursor information in it. public static ICapture CaptureCursor(ICapture capture) { - LOG.Debug("Capturing the mouse cursor."); + Log.Debug("Capturing the mouse cursor."); if (capture == null) { capture = new Capture(); } - int x,y; - CursorInfo cursorInfo = new CursorInfo(); - IconInfo iconInfo; + CursorInfo cursorInfo = new CursorInfo(); cursorInfo.cbSize = Marshal.SizeOf(cursorInfo); if (User32.GetCursorInfo(out cursorInfo)) { if (cursorInfo.flags == User32.CURSOR_SHOWING) { - using (SafeIconHandle safeIcon = User32.CopyIcon(cursorInfo.hCursor)) { + using (SafeIconHandle safeIcon = User32.CopyIcon(cursorInfo.hCursor)) + { + IconInfo iconInfo; if (User32.GetIconInfo(safeIcon, out iconInfo)) { Point cursorLocation = User32.GetCursorLocation(); // Allign cursor location to Bitmap coordinates (instead of Screen coordinates) - x = cursorLocation.X - iconInfo.xHotspot - capture.ScreenBounds.X; - y = cursorLocation.Y - iconInfo.yHotspot - capture.ScreenBounds.Y; + var x = cursorLocation.X - iconInfo.xHotspot - capture.ScreenBounds.X; + var y = cursorLocation.Y - iconInfo.yHotspot - capture.ScreenBounds.Y; // Set the location capture.CursorLocation = new Point(x, y); @@ -548,7 +525,7 @@ namespace GreenshotPlugin.Core { return false; } } catch (Exception ex) { - LOG.Warn(ex.Message); + Log.Warn(ex.Message); } } } @@ -569,7 +546,7 @@ namespace GreenshotPlugin.Core { return false; } } catch (Exception ex) { - LOG.Warn(ex.Message); + Log.Warn(ex.Message); } } } @@ -591,7 +568,10 @@ namespace GreenshotPlugin.Core { if (CaptureHandler.CaptureScreenRectangle != null) { try { capturedImage = CaptureHandler.CaptureScreenRectangle(captureBounds); - } catch { + } + catch + { + // ignored } } // If no capture, use the normal screen capture @@ -626,10 +606,10 @@ namespace GreenshotPlugin.Core { public static Bitmap CaptureRectangle(Rectangle captureBounds) { Bitmap returnBitmap = null; if (captureBounds.Height <= 0 || captureBounds.Width <= 0) { - LOG.Warn("Nothing to capture, ignoring!"); + Log.Warn("Nothing to capture, ignoring!"); return null; } - LOG.Debug("CaptureRectangle Called!"); + Log.Debug("CaptureRectangle Called!"); // .NET GDI+ Solution, according to some post this has a GDI+ leak... // See http://connect.microsoft.com/VisualStudio/feedback/details/344752/gdi-object-leak-when-calling-graphics-copyfromscreen @@ -640,8 +620,8 @@ namespace GreenshotPlugin.Core { // capture.Image = capturedBitmap; // capture.Location = captureBounds.Location; - using (SafeWindowDCHandle desktopDCHandle = SafeWindowDCHandle.FromDesktop()) { - if (desktopDCHandle.IsInvalid) { + using (var desktopDcHandle = SafeWindowDcHandle.FromDesktop()) { + if (desktopDcHandle.IsInvalid) { // Get Exception before the error is lost Exception exceptionToThrow = CreateCaptureException("desktopDCHandle", captureBounds); // throw exception @@ -649,9 +629,9 @@ namespace GreenshotPlugin.Core { } // create a device context we can copy to - using (SafeCompatibleDCHandle safeCompatibleDCHandle = GDI32.CreateCompatibleDC(desktopDCHandle)) { + using (SafeCompatibleDCHandle safeCompatibleDcHandle = GDI32.CreateCompatibleDC(desktopDcHandle)) { // Check if the device context is there, if not throw an error with as much info as possible! - if (safeCompatibleDCHandle.IsInvalid) { + if (safeCompatibleDcHandle.IsInvalid) { // Get Exception before the error is lost Exception exceptionToThrow = CreateCaptureException("CreateCompatibleDC", captureBounds); // throw exception @@ -665,20 +645,21 @@ namespace GreenshotPlugin.Core { // create a bitmap we can copy it to, using GetDeviceCaps to get the width/height IntPtr bits0; // not used for our purposes. It returns a pointer to the raw bits that make up the bitmap. - using (SafeDibSectionHandle safeDibSectionHandle = GDI32.CreateDIBSection(desktopDCHandle, ref bmi, BITMAPINFOHEADER.DIB_RGB_COLORS, out bits0, IntPtr.Zero, 0)) { + using (SafeDibSectionHandle safeDibSectionHandle = GDI32.CreateDIBSection(desktopDcHandle, ref bmi, BITMAPINFOHEADER.DIB_RGB_COLORS, out bits0, IntPtr.Zero, 0)) { if (safeDibSectionHandle.IsInvalid) { // Get Exception before the error is lost Exception exceptionToThrow = CreateCaptureException("CreateDIBSection", captureBounds); - exceptionToThrow.Data.Add("hdcDest", safeCompatibleDCHandle.DangerousGetHandle().ToInt32()); - exceptionToThrow.Data.Add("hdcSrc", desktopDCHandle.DangerousGetHandle().ToInt32()); + exceptionToThrow.Data.Add("hdcDest", safeCompatibleDcHandle.DangerousGetHandle().ToInt32()); + exceptionToThrow.Data.Add("hdcSrc", desktopDcHandle.DangerousGetHandle().ToInt32()); // Throw so people can report the problem throw exceptionToThrow; } // select the bitmap object and store the old handle - using (safeCompatibleDCHandle.SelectObject(safeDibSectionHandle)) { + using (safeCompatibleDcHandle.SelectObject(safeDibSectionHandle)) { // bitblt over (make copy) - GDI32.BitBlt(safeCompatibleDCHandle, 0, 0, captureBounds.Width, captureBounds.Height, desktopDCHandle, captureBounds.X, captureBounds.Y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); + // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags + GDI32.BitBlt(safeCompatibleDcHandle, 0, 0, captureBounds.Width, captureBounds.Height, desktopDcHandle, captureBounds.X, captureBounds.Y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); } // get a .NET image object for it @@ -731,12 +712,12 @@ namespace GreenshotPlugin.Core { success = true; break; } catch (ExternalException ee) { - LOG.Warn("Problem getting bitmap at try " + i + " : ", ee); + Log.Warn("Problem getting bitmap at try " + i + " : ", ee); exception = ee; } } if (!success) { - LOG.Error("Still couldn't create Bitmap!"); + Log.Error("Still couldn't create Bitmap!"); if (exception != null) { throw exception; } diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index fb7624bbf..54ac58240 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -680,12 +680,10 @@ namespace GreenshotPlugin.Core { RECT rect = new RECT(screen.Bounds); IntPtr monitor = User32.MonitorFromRect(ref rect, User32.MONITOR_DEFAULTTONULL); if (monitor != IntPtr.Zero) { - if (AppVisibility != null) { - MONITOR_APP_VISIBILITY monitorAppVisibility = AppVisibility.GetAppVisibilityOnMonitor(monitor); - //LOG.DebugFormat("App {0} visible: {1} on {2}", Text, monitorAppVisibility, screen.Bounds); - if (monitorAppVisibility == MONITOR_APP_VISIBILITY.MAV_APP_VISIBLE) { - return true; - } + MONITOR_APP_VISIBILITY? monitorAppVisibility = AppVisibility?.GetAppVisibilityOnMonitor(monitor); + //LOG.DebugFormat("App {0} visible: {1} on {2}", Text, monitorAppVisibility, screen.Bounds); + if (monitorAppVisibility == MONITOR_APP_VISIBILITY.MAV_APP_VISIBLE) { + return true; } } } else { diff --git a/GreenshotPlugin/Effects/AdjustEffect.cs b/GreenshotPlugin/Effects/AdjustEffect.cs new file mode 100644 index 000000000..9dd4da68e --- /dev/null +++ b/GreenshotPlugin/Effects/AdjustEffect.cs @@ -0,0 +1,57 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// AdjustEffect + /// + public class AdjustEffect : IEffect { + public AdjustEffect() + { + Reset(); + } + public float Contrast { + get; + set; + } + public float Brightness { + get; + set; + } + public float Gamma { + get; + set; + } + public void Reset() { + Contrast = 1f; + Brightness = 1f; + Gamma = 1f; + } + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.Adjust(sourceImage, Brightness, Contrast, Gamma); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/BorderEffect.cs b/GreenshotPlugin/Effects/BorderEffect.cs new file mode 100644 index 000000000..cfc36ca44 --- /dev/null +++ b/GreenshotPlugin/Effects/BorderEffect.cs @@ -0,0 +1,51 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// BorderEffect + /// + public class BorderEffect : IEffect { + public BorderEffect() { + Reset(); + } + public Color Color { + get; + set; + } + public int Width { + get; + set; + } + public void Reset() { + Width = 2; + Color = Color.Black; + } + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.CreateBorder(sourceImage, Width, Color, sourceImage.PixelFormat, matrix); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/DropShadowEffect.cs b/GreenshotPlugin/Effects/DropShadowEffect.cs new file mode 100644 index 000000000..8d3516303 --- /dev/null +++ b/GreenshotPlugin/Effects/DropShadowEffect.cs @@ -0,0 +1,64 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using Greenshot.Core; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects { + /// + /// DropShadowEffect + /// + [TypeConverter(typeof(EffectConverter))] + public class DropShadowEffect : IEffect { + public DropShadowEffect() { + Reset(); + } + + public float Darkness { + get; + set; + } + + public int ShadowSize { + get; + set; + } + + public Point ShadowOffset { + get; + set; + } + + public virtual void Reset() { + Darkness = 0.6f; + ShadowSize = 7; + ShadowOffset = new Point(-1, -1); + } + + public virtual Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.CreateShadow(sourceImage, Darkness, ShadowSize, ShadowOffset, matrix, PixelFormat.Format32bppArgb); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/GrayscaleEffect.cs b/GreenshotPlugin/Effects/GrayscaleEffect.cs new file mode 100644 index 000000000..9e3b8f9b6 --- /dev/null +++ b/GreenshotPlugin/Effects/GrayscaleEffect.cs @@ -0,0 +1,39 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// GrayscaleEffect + /// + public class GrayscaleEffect : IEffect { + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.CreateGrayscale(sourceImage); + } + public void Reset() { + // No settings to reset + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/IEffect.cs b/GreenshotPlugin/Effects/IEffect.cs new file mode 100644 index 000000000..2226ff91b --- /dev/null +++ b/GreenshotPlugin/Effects/IEffect.cs @@ -0,0 +1,45 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; + +namespace GreenshotPlugin.Effects +{ + /// + /// Interface to describe an effect + /// + public interface IEffect { + /// + /// Apply this IEffect to the supplied sourceImage. + /// In the process of applying the supplied matrix will be modified to represent the changes. + /// + /// Image to apply the effect to + /// Matrix with the modifications like rotate, translate etc. this can be used to calculate the new location of elements on a canvas + /// new image with applied effect + Image Apply(Image sourceImage, Matrix matrix); + + /// + /// Reset all values to their defaults + /// + void Reset(); + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/InvertEffect.cs b/GreenshotPlugin/Effects/InvertEffect.cs new file mode 100644 index 000000000..4b2c6b395 --- /dev/null +++ b/GreenshotPlugin/Effects/InvertEffect.cs @@ -0,0 +1,39 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// InvertEffect + /// + public class InvertEffect : IEffect { + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.CreateNegative(sourceImage); + } + public void Reset() { + // No settings to reset + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/MonochromeEffect.cs b/GreenshotPlugin/Effects/MonochromeEffect.cs new file mode 100644 index 000000000..568fe0dad --- /dev/null +++ b/GreenshotPlugin/Effects/MonochromeEffect.cs @@ -0,0 +1,44 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// MonochromeEffect + /// + public class MonochromeEffect : IEffect { + private readonly byte _threshold; + /// Threshold for monochrome filter (0 - 255), lower value means less black + public MonochromeEffect(byte threshold) { + _threshold = threshold; + } + public void Reset() { + // TODO: Modify the threshold to have a default, which is reset here + } + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.CreateMonochrome(sourceImage, _threshold); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/ReduceColorsEffect.cs b/GreenshotPlugin/Effects/ReduceColorsEffect.cs new file mode 100644 index 000000000..5c9ea936f --- /dev/null +++ b/GreenshotPlugin/Effects/ReduceColorsEffect.cs @@ -0,0 +1,60 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotPlugin.Core; +using log4net; + +namespace GreenshotPlugin.Effects +{ + /// + /// ReduceColorsEffect + /// + public class ReduceColorsEffect : IEffect { + private static readonly ILog Log = LogManager.GetLogger(typeof(ReduceColorsEffect)); + public ReduceColorsEffect() + { + Reset(); + } + public int Colors { + get; + set; + } + public void Reset() { + Colors = 256; + } + public Image Apply(Image sourceImage, Matrix matrix) { + using (WuQuantizer quantizer = new WuQuantizer((Bitmap)sourceImage)) { + int colorCount = quantizer.GetColorCount(); + if (colorCount > Colors) { + try { + return quantizer.GetQuantizedImage(Colors); + } catch (Exception e) { + Log.Warn("Error occurred while Quantizing the image, ignoring and using original. Error: ", e); + } + } + } + return null; + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/ResizeCanvasEffect.cs b/GreenshotPlugin/Effects/ResizeCanvasEffect.cs new file mode 100644 index 000000000..7103508ca --- /dev/null +++ b/GreenshotPlugin/Effects/ResizeCanvasEffect.cs @@ -0,0 +1,66 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// ResizeCanvasEffect + /// + public class ResizeCanvasEffect : IEffect { + public ResizeCanvasEffect(int left, int right, int top, int bottom) { + Left = left; + Right = right; + Top = top; + Bottom = bottom; + BackgroundColor = Color.Empty; // Uses the default background color depending on the format + } + public int Left { + get; + set; + } + public int Right { + get; + set; + } + public int Top { + get; + set; + } + public int Bottom { + get; + set; + } + public Color BackgroundColor { + get; + set; + } + public void Reset() { + // values don't have a default value + } + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.ResizeCanvas(sourceImage, BackgroundColor, Left, Right, Top, Bottom, matrix); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/ResizeEffect.cs b/GreenshotPlugin/Effects/ResizeEffect.cs new file mode 100644 index 000000000..f6702db74 --- /dev/null +++ b/GreenshotPlugin/Effects/ResizeEffect.cs @@ -0,0 +1,56 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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; +using System.Drawing.Drawing2D; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// ResizeEffect + /// + public class ResizeEffect : IEffect { + public ResizeEffect(int width, int height, bool maintainAspectRatio) { + Width = width; + Height = height; + MaintainAspectRatio = maintainAspectRatio; + } + public int Width { + get; + set; + } + public int Height { + get; + set; + } + public bool MaintainAspectRatio { + get; + set; + } + public void Reset() { + // values don't have a default value + } + public Image Apply(Image sourceImage, Matrix matrix) { + return ImageHelper.ResizeImage(sourceImage, MaintainAspectRatio, Width, Height, matrix); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/RotateEffect.cs b/GreenshotPlugin/Effects/RotateEffect.cs new file mode 100644 index 000000000..bbf37e351 --- /dev/null +++ b/GreenshotPlugin/Effects/RotateEffect.cs @@ -0,0 +1,59 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// RotateEffect + /// + public class RotateEffect : IEffect { + public RotateEffect(int angle) { + Angle = angle; + } + public int Angle { + get; + set; + } + public void Reset() { + // Angle doesn't have a default value + } + public Image Apply(Image sourceImage, Matrix matrix) { + RotateFlipType flipType; + if (Angle == 90) { + matrix.Rotate(90, MatrixOrder.Append); + matrix.Translate(sourceImage.Height, 0, MatrixOrder.Append); + flipType = RotateFlipType.Rotate90FlipNone; + } else if (Angle == -90 || Angle == 270) { + flipType = RotateFlipType.Rotate270FlipNone; + matrix.Rotate(-90, MatrixOrder.Append); + matrix.Translate(0, sourceImage.Width, MatrixOrder.Append); + } else { + throw new NotSupportedException("Currently only an angle of 90 or -90 (270) is supported."); + } + return ImageHelper.RotateFlip(sourceImage, flipType); + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/Effects/TornEdgeEffect.cs b/GreenshotPlugin/Effects/TornEdgeEffect.cs new file mode 100644 index 000000000..aab04d619 --- /dev/null +++ b/GreenshotPlugin/Effects/TornEdgeEffect.cs @@ -0,0 +1,80 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using Greenshot.Core; +using GreenshotPlugin.Core; + +namespace GreenshotPlugin.Effects +{ + /// + /// TornEdgeEffect extends on DropShadowEffect + /// + [TypeConverter(typeof(EffectConverter))] + public sealed class TornEdgeEffect : DropShadowEffect { + public TornEdgeEffect() + { + Reset(); + } + public int ToothHeight { + get; + set; + } + public int HorizontalToothRange { + get; + set; + } + public int VerticalToothRange { + get; + set; + } + public bool[] Edges { + get; + set; + } + public bool GenerateShadow { + get; + set; + } + + public override void Reset() { + base.Reset(); + ShadowSize = 7; + ToothHeight = 12; + HorizontalToothRange = 20; + VerticalToothRange = 20; + Edges = new[] { true, true, true, true }; + GenerateShadow = true; + } + public override Image Apply(Image sourceImage, Matrix matrix) { + Image tmpTornImage = ImageHelper.CreateTornEdge(sourceImage, ToothHeight, HorizontalToothRange, VerticalToothRange, Edges); + if (GenerateShadow) { + using (tmpTornImage) { + return ImageHelper.CreateShadow(tmpTornImage, Darkness, ShadowSize, ShadowOffset, matrix, PixelFormat.Format32bppArgb); + } + } + return tmpTornImage; + } + } +} \ No newline at end of file diff --git a/GreenshotPlugin/GlobalSuppressions.cs b/GreenshotPlugin/GlobalSuppressions.cs index 691d5bdece11f0918b96cf2f03101a372ba9fb84..c050f5d980bbaf4f7f04fa6cb01422c0eebd5458 100644 GIT binary patch delta 273 zcmZ4YiEZB}whe5uoJ9<&3@Hqu44ISpWut}RJO*tBPX<2*HwOR7jK#v6C&+3rqDVS3 zfR%2JzmUv0*+Gzt8!7-YX|uJ$!t;#DoA18A%m}15e!R*}p*54^FD#xOAi{V8-Kxpf v3co=TuO=t(3rzM=c>w2ZmQ#yjg!3lP)8g4&reTI6at$Q?WBUg#M!R(Yxuj1u delta 165 zcmdn@iEZ5{whe5uoIwn(3@!|z44#wuWup Component
      + + + + + + + + + + + + @@ -172,7 +184,7 @@ - + diff --git a/GreenshotPlugin/IniFile/IniAttributes.cs b/GreenshotPlugin/IniFile/IniAttributes.cs index 801d42994..5243b0fe2 100644 --- a/GreenshotPlugin/IniFile/IniAttributes.cs +++ b/GreenshotPlugin/IniFile/IniAttributes.cs @@ -24,23 +24,19 @@ namespace Greenshot.IniFile { /// /// Attribute for telling that this class is linked to a section in the ini-configuration /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + [AttributeUsage(AttributeTargets.Class)] public class IniSectionAttribute : Attribute { - private string name; public IniSectionAttribute(string name) { - this.name = name; + Name = name; } public string Description; - public string Name { - get { return name; } - set { name = value; } - } + public string Name { get; set; } } /// /// Attribute for telling that a field is linked to a property in the ini-configuration selection /// - [AttributeUsage(AttributeTargets.Field|AttributeTargets.Property, AllowMultiple = false)] + [AttributeUsage(AttributeTargets.Field|AttributeTargets.Property)] public class IniPropertyAttribute : Attribute { public IniPropertyAttribute() { Separator = ","; diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index 2ada973d9..3869640f0 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -28,55 +28,50 @@ using log4net; namespace Greenshot.IniFile { public class IniConfig { - private static readonly ILog LOG = LogManager.GetLogger(typeof(IniConfig)); - private const string INI_EXTENSION = ".ini"; - private const string DEFAULTS_POSTFIX = "-defaults"; - private const string FIXED_POSTFIX = "-fixed"; + private static readonly ILog Log = LogManager.GetLogger(typeof(IniConfig)); + private const string IniExtension = ".ini"; + private const string DefaultsPostfix = "-defaults"; + private const string FixedPostfix = "-fixed"; /// /// A lock object for the ini file saving /// - private static readonly object iniLock = new object(); + private static readonly object IniLock = new object(); /// /// As the ini implementation is kept someone generic, for reusing, this holds the name of the application /// - private static string applicationName; + private static string _applicationName; /// /// As the ini implementation is kept someone generic, for reusing, this holds the name of the configuration /// - private static string configName; + private static string _configName; /// /// A Dictionary with all the sections stored by section name /// - private static readonly Dictionary sectionMap = new Dictionary(); + private static readonly Dictionary SectionMap = new Dictionary(); /// /// A Dictionary with the properties for a section stored by section name /// - private static Dictionary> sections = new Dictionary>(); + private static Dictionary> _sections = new Dictionary>(); /// /// A Dictionary with the fixed-properties for a section stored by section name /// - private static Dictionary> fixedProperties; + private static Dictionary> _fixedProperties; /// /// Stores if we checked for portable /// - private static bool portableCheckMade; + private static bool _portableCheckMade; /// /// Is the configuration portable (meaning we don't store it in the AppData directory) /// - private static bool portable; - public static bool IsPortable { - get { - return portable; - } - } + public static bool IsPortable { get; private set; } /// /// Config directory when set from external @@ -92,34 +87,34 @@ namespace Greenshot.IniFile { /// /// public static void Init(string appName, string configName) { - applicationName = appName; - IniConfig.configName = configName; + _applicationName = appName; + _configName = configName; Reload(); } /// /// Checks if we initialized the ini /// - public static bool isInitialized { - get { - return applicationName != null && configName != null && sectionMap.Count > 0; - } - } + public static bool IsInitialized => _applicationName != null && _configName != null && SectionMap.Count > 0; /// /// This forces the ini to be stored in the startup path, used for portable applications /// public static void ForceIniInStartupPath() { - if (portableCheckMade) { + if (_portableCheckMade) { throw new Exception("ForceLocal should be called before any file is read"); } - portable = false; - portableCheckMade = true; + IsPortable = false; + _portableCheckMade = true; string applicationStartupPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); - if (applicationName == null || configName == null) { + if (_applicationName == null || _configName == null) { Init(); } - string forcedIni = Path.Combine(applicationStartupPath, applicationName + INI_EXTENSION); + if (applicationStartupPath == null) + { + return; + } + string forcedIni = Path.Combine(applicationStartupPath, _applicationName + IniExtension); if (!File.Exists(forcedIni)) { using (File.Create(forcedIni)) {} } @@ -130,9 +125,9 @@ namespace Greenshot.IniFile { /// public static void Init() { AssemblyProductAttribute[] assemblyProductAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false) as AssemblyProductAttribute[]; - if (assemblyProductAttributes.Length > 0) { + if (assemblyProductAttributes != null && assemblyProductAttributes.Length > 0) { string productName = assemblyProductAttributes[0].Product; - LOG.InfoFormat("Using ProductName {0}", productName); + Log.InfoFormat("Using ProductName {0}", productName); Init(productName, productName); } else { throw new InvalidOperationException("Assembly ProductName not set."); @@ -144,8 +139,8 @@ namespace Greenshot.IniFile { /// public static string ConfigLocation { get { - if (isInitialized) { - return CreateIniLocation(configName + INI_EXTENSION, false); + if (IsInitialized) { + return CreateIniLocation(_configName + IniExtension, false); } throw new InvalidOperationException("Ini configuration was not initialized!"); } @@ -155,7 +150,7 @@ namespace Greenshot.IniFile { /// Create the location of the configuration file /// private static string CreateIniLocation(string configFilename, bool isReadOnly) { - if (applicationName == null || configName == null) { + if (_applicationName == null || _configName == null) { throw new InvalidOperationException("IniConfig.Init not called!"); } string iniFilePath = null; @@ -174,53 +169,60 @@ namespace Greenshot.IniFile { iniFilePath = null; } } catch (Exception exception) { - LOG.WarnFormat("The ini-directory {0} can't be used due to: {1}", IniDirectory, exception.Message); + Log.WarnFormat("The ini-directory {0} can't be used due to: {1}", IniDirectory, exception.Message); } - string applicationStartupPath = ""; + string applicationStartupPath; try { applicationStartupPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); } catch (Exception exception) { - LOG.WarnFormat("Problem retrieving the AssemblyLocation: {0} (Designer mode?)", exception.Message); + Log.WarnFormat("Problem retrieving the AssemblyLocation: {0} (Designer mode?)", exception.Message); applicationStartupPath = @"."; } - string pafPath = Path.Combine(applicationStartupPath, @"App\" + applicationName); + if (applicationStartupPath != null) + { + string pafPath = Path.Combine(applicationStartupPath, @"App\" + _applicationName); - if (portable || !portableCheckMade) { - if (!portable) { - LOG.Info("Checking for portable mode."); - portableCheckMade = true; - if (Directory.Exists(pafPath)) { - portable = true; - LOG.Info("Portable mode active!"); - } - } - if (portable) { - string pafConfigPath = Path.Combine(applicationStartupPath, @"Data\Settings"); - try { - if (!Directory.Exists(pafConfigPath)) { - Directory.CreateDirectory(pafConfigPath); + if (IsPortable || !_portableCheckMade) { + if (!IsPortable) { + Log.Info("Checking for portable mode."); + _portableCheckMade = true; + if (Directory.Exists(pafPath)) { + IsPortable = true; + Log.Info("Portable mode active!"); + } + } + if (IsPortable) { + string pafConfigPath = Path.Combine(applicationStartupPath, @"Data\Settings"); + try { + if (!Directory.Exists(pafConfigPath)) { + Directory.CreateDirectory(pafConfigPath); + } + iniFilePath = Path.Combine(pafConfigPath, configFilename); + } catch(Exception e) { + Log.InfoFormat("Portable mode NOT possible, couldn't create directory '{0}'! Reason: {1}", pafConfigPath, e.Message); } - iniFilePath = Path.Combine(pafConfigPath, configFilename); - } catch(Exception e) { - LOG.InfoFormat("Portable mode NOT possible, couldn't create directory '{0}'! Reason: {1}", pafConfigPath, e.Message); } } } - if (iniFilePath == null) { + if (iniFilePath == null) + { // check if file is in the same location as started from, if this is the case // we will use this file instead of the ApplicationData folder // Done for Feature Request #2741508 - iniFilePath = Path.Combine(applicationStartupPath, configFilename); + if (applicationStartupPath != null) + { + iniFilePath = Path.Combine(applicationStartupPath, configFilename); + } if (!File.Exists(iniFilePath)) { - string iniDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), applicationName); + string iniDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), _applicationName); if (!Directory.Exists(iniDirectory)) { Directory.CreateDirectory(iniDirectory); } iniFilePath = Path.Combine(iniDirectory, configFilename); } } - LOG.InfoFormat("Using ini file {0}", iniFilePath); + Log.InfoFormat("Using ini file {0}", iniFilePath); return iniFilePath; } @@ -229,25 +231,25 @@ namespace Greenshot.IniFile { /// public static void Reload() { // Clear the current properties - sections = new Dictionary>(); + _sections = new Dictionary>(); // Load the defaults - Read(CreateIniLocation(configName + DEFAULTS_POSTFIX + INI_EXTENSION, true)); + Read(CreateIniLocation(_configName + DefaultsPostfix + IniExtension, true)); // Load the normal - Read(CreateIniLocation(configName + INI_EXTENSION, false)); + Read(CreateIniLocation(_configName + IniExtension, false)); // Load the fixed settings - fixedProperties = Read(CreateIniLocation(configName + FIXED_POSTFIX + INI_EXTENSION, true)); + _fixedProperties = Read(CreateIniLocation(_configName + FixedPostfix + IniExtension, true)); - foreach (IniSection section in sectionMap.Values) { + foreach (IniSection section in SectionMap.Values) { try { section.Fill(PropertiesForSection(section)); FixProperties(section); } catch (Exception ex) { string sectionName = "unknown"; - if (section != null && section.IniSectionAttribute != null && section.IniSectionAttribute.Name != null) { + if (section?.IniSectionAttribute?.Name != null) { sectionName = section.IniSectionAttribute.Name; } - LOG.WarnFormat("Problem reading the ini section {0}", sectionName); - LOG.Warn("Exception", ex); + Log.WarnFormat("Problem reading the ini section {0}", sectionName); + Log.Warn("Exception", ex); } } } @@ -258,14 +260,18 @@ namespace Greenshot.IniFile { /// IniSection private static void FixProperties(IniSection section) { // Make properties unchangeable - if (fixedProperties != null) { - Dictionary fixedPropertiesForSection = null; - if (fixedProperties.TryGetValue(section.IniSectionAttribute.Name, out fixedPropertiesForSection)) { - foreach (string fixedPropertyKey in fixedPropertiesForSection.Keys) { - if (section.Values.ContainsKey(fixedPropertyKey)) { - section.Values[fixedPropertyKey].IsFixed = true; - } - } + if (_fixedProperties == null) + { + return; + } + Dictionary fixedPropertiesForSection; + if (!_fixedProperties.TryGetValue(section.IniSectionAttribute.Name, out fixedPropertiesForSection)) + { + return; + } + foreach (string fixedPropertyKey in fixedPropertiesForSection.Keys) { + if (section.Values.ContainsKey(fixedPropertyKey)) { + section.Values[fixedPropertyKey].IsFixed = true; } } } @@ -276,21 +282,21 @@ namespace Greenshot.IniFile { /// Path & Filename of ini file private static Dictionary> Read(string iniLocation) { if (!File.Exists(iniLocation)) { - LOG.Info("Can't find file: " + iniLocation); + Log.Info("Can't find file: " + iniLocation); return null; } - LOG.InfoFormat("Loading ini-file: {0}", iniLocation); + Log.InfoFormat("Loading ini-file: {0}", iniLocation); //LOG.Info("Reading ini-properties from file: " + iniLocation); Dictionary> newSections = IniReader.read(iniLocation, Encoding.UTF8); // Merge the newly loaded properties to the already available foreach(string section in newSections.Keys) { Dictionary newProperties = newSections[section]; - if (!sections.ContainsKey(section)) { + if (!_sections.ContainsKey(section)) { // This section is not yet loaded, simply add the complete section - sections.Add(section, newProperties); + _sections.Add(section, newProperties); } else { // Overwrite or add every property from the newly loaded section to the available one - Dictionary currentProperties = sections[section]; + Dictionary currentProperties = _sections[section]; foreach(string propertyName in newProperties.Keys) { string propertyValue = newProperties[propertyName]; if (currentProperties.ContainsKey(propertyName)) { @@ -308,7 +314,7 @@ namespace Greenshot.IniFile { public static IEnumerable IniSectionNames { get { - foreach (string sectionName in sectionMap.Keys) { + foreach (string sectionName in SectionMap.Keys) { yield return sectionName; } } @@ -321,7 +327,7 @@ namespace Greenshot.IniFile { /// public static IniSection GetIniSection(string sectionName) { IniSection returnValue; - sectionMap.TryGetValue(sectionName, out returnValue); + SectionMap.TryGetValue(sectionName, out returnValue); return returnValue; } @@ -345,20 +351,20 @@ namespace Greenshot.IniFile { Type iniSectionType = typeof(T); string sectionName = IniSection.GetIniSectionAttribute(iniSectionType).Name; - if (sectionMap.ContainsKey(sectionName)) { + if (SectionMap.ContainsKey(sectionName)) { //LOG.Debug("Returning pre-mapped section " + sectionName); - section = (T)sectionMap[sectionName]; + section = (T)SectionMap[sectionName]; } else { // Create instance of this type section = (T)Activator.CreateInstance(iniSectionType); // Store for later save & retrieval - sectionMap.Add(sectionName, section); + SectionMap.Add(sectionName, section); section.Fill(PropertiesForSection(section)); FixProperties(section); } if (allowSave && section.IsDirty) { - LOG.DebugFormat("Section {0} is marked dirty, saving!", sectionName); + Log.DebugFormat("Section {0} is marked dirty, saving!", sectionName); Save(); } return section; @@ -373,11 +379,11 @@ namespace Greenshot.IniFile { string sectionName = section.IniSectionAttribute.Name; // Get the properties for the section IDictionary properties; - if (sections.ContainsKey(sectionName)) { - properties = sections[sectionName]; + if (_sections.ContainsKey(sectionName)) { + properties = _sections[sectionName]; } else { - sections.Add(sectionName, new Dictionary()); - properties = sections[sectionName]; + _sections.Add(sectionName, new Dictionary()); + properties = _sections[sectionName]; } return properties; } @@ -388,23 +394,23 @@ namespace Greenshot.IniFile { public static void Save() { bool acquiredLock = false; try { - acquiredLock = Monitor.TryEnter(iniLock, TimeSpan.FromMilliseconds(200)); + acquiredLock = Monitor.TryEnter(IniLock, TimeSpan.FromMilliseconds(200)); if (acquiredLock) { // Code that accesses resources that are protected by the lock. - string iniLocation = CreateIniLocation(configName + INI_EXTENSION, false); + string iniLocation = CreateIniLocation(_configName + IniExtension, false); try { SaveInternally(iniLocation); } catch (Exception ex) { - LOG.Error("A problem occured while writing the configuration file to: " + iniLocation); - LOG.Error(ex); + Log.Error("A problem occured while writing the configuration file to: " + iniLocation); + Log.Error(ex); } } else { // Code to deal with the fact that the lock was not acquired. - LOG.Warn("A second thread tried to save the ini-file, we blocked as the first took too long."); + Log.Warn("A second thread tried to save the ini-file, we blocked as the first took too long."); } } finally { if (acquiredLock) { - Monitor.Exit(iniLock); + Monitor.Exit(IniLock); } } } @@ -414,13 +420,15 @@ namespace Greenshot.IniFile { /// /// private static void SaveInternally(string iniLocation) { - LOG.Info("Saving configuration to: " + iniLocation); - if (!Directory.Exists(Path.GetDirectoryName(iniLocation))) { - Directory.CreateDirectory(Path.GetDirectoryName(iniLocation)); + Log.Info("Saving configuration to: " + iniLocation); + var iniPath = Path.GetDirectoryName(iniLocation); + if (iniPath != null && !Directory.Exists(iniPath)) + { + Directory.CreateDirectory(iniPath); } - using (MemoryStream memoryStream = new MemoryStream()) { + using (var memoryStream = new MemoryStream()) { using (TextWriter writer = new StreamWriter(memoryStream, Encoding.UTF8)) { - foreach (IniSection section in sectionMap.Values) { + foreach (var section in SectionMap.Values) { section.Write(writer, false); // Add empty line after section writer.WriteLine(); @@ -428,20 +436,22 @@ namespace Greenshot.IniFile { } writer.WriteLine(); // Write left over properties - foreach (string sectionName in sections.Keys) { + foreach (string sectionName in _sections.Keys) { // Check if the section is one that is "registered", if so skip it! - if (!sectionMap.ContainsKey(sectionName)) { - writer.WriteLine("; The section {0} hasn't been 'claimed' since the last start of Greenshot, therefor it doesn't have additional information here!", sectionName); - writer.WriteLine("; The reason could be that the section {0} just hasn't been used, a plugin has an error and can't claim it or maybe the whole section {0} is obsolete.", sectionName); - // Write section name - writer.WriteLine("[{0}]", sectionName); - Dictionary properties = sections[sectionName]; - // Loop and write properties - foreach (string propertyName in properties.Keys) { - writer.WriteLine("{0}={1}", propertyName, properties[propertyName]); - } - writer.WriteLine(); + if (SectionMap.ContainsKey(sectionName)) + { + continue; } + writer.WriteLine("; The section {0} hasn't been 'claimed' since the last start of Greenshot, therefor it doesn't have additional information here!", sectionName); + writer.WriteLine("; The reason could be that the section {0} just hasn't been used, a plugin has an error and can't claim it or maybe the whole section {0} is obsolete.", sectionName); + // Write section name + writer.WriteLine("[{0}]", sectionName); + Dictionary properties = _sections[sectionName]; + // Loop and write properties + foreach (string propertyName in properties.Keys) { + writer.WriteLine("{0}={1}", propertyName, properties[propertyName]); + } + writer.WriteLine(); } // Don't forget to flush the buffer writer.Flush(); diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index 227ec0c3a..21d61644d 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -31,22 +31,22 @@ namespace Greenshot.IniFile { /// A container to be able to pass the value from a IniSection around. /// public class IniValue { - private static readonly ILog LOG = LogManager.GetLogger(typeof(IniValue)); - private readonly PropertyInfo propertyInfo; - private readonly FieldInfo fieldInfo; - private readonly IniSection containingIniSection; - private readonly IniPropertyAttribute attributes; + private static readonly ILog Log = LogManager.GetLogger(typeof(IniValue)); + private readonly PropertyInfo _propertyInfo; + private readonly FieldInfo _fieldInfo; + private readonly IniSection _containingIniSection; + private readonly IniPropertyAttribute _attributes; public IniValue(IniSection containingIniSection, PropertyInfo propertyInfo, IniPropertyAttribute iniPropertyAttribute) { - this.containingIniSection = containingIniSection; - this.propertyInfo = propertyInfo; - attributes = iniPropertyAttribute; + _containingIniSection = containingIniSection; + _propertyInfo = propertyInfo; + _attributes = iniPropertyAttribute; } public IniValue(IniSection containingIniSection, FieldInfo fieldInfo, IniPropertyAttribute iniPropertyAttribute) { - this.containingIniSection = containingIniSection; - this.fieldInfo = fieldInfo; - attributes = iniPropertyAttribute; + _containingIniSection = containingIniSection; + _fieldInfo = fieldInfo; + _attributes = iniPropertyAttribute; } /// @@ -54,14 +54,14 @@ namespace Greenshot.IniFile { /// public bool IsFixed { get { - if (attributes != null) { - return attributes.FixedValue; + if (_attributes != null) { + return _attributes.FixedValue; } return false; } set { - if (attributes != null) { - attributes.FixedValue = value; + if (_attributes != null) { + _attributes.FixedValue = value; } } } @@ -71,14 +71,14 @@ namespace Greenshot.IniFile { /// public bool IsExpert { get { - if (attributes != null) { - return attributes.Expert; + if (_attributes != null) { + return _attributes.Expert; } return false; } set { - if (attributes != null) { - attributes.Expert = value; + if (_attributes != null) { + _attributes.Expert = value; } } } @@ -87,65 +87,49 @@ namespace Greenshot.IniFile { /// /// Return true when the value is can be changed by the GUI /// - public bool IsEditable { - get { - return !IsFixed; - } - } + public bool IsEditable => !IsFixed; /// /// Return true when the value is visible in the GUI /// - public bool IsVisible { - get { - return !IsExpert; - } - } + public bool IsVisible => !IsExpert; public MemberInfo MemberInfo { - get { - if (propertyInfo == null) { - return fieldInfo; - } else { - return propertyInfo; + get + { + if (_propertyInfo == null) { + return _fieldInfo; } + return _propertyInfo; } } /// /// Returns the IniSection this value is contained in /// - public IniSection ContainingIniSection { - get { - return containingIniSection; - } - } - + public IniSection ContainingIniSection => _containingIniSection; + /// /// Get the in the ini file defined attributes /// - public IniPropertyAttribute Attributes { - get { - return attributes; - } - } - + public IniPropertyAttribute Attributes => _attributes; + /// /// Get the value for this IniValue /// public object Value { - get { - if (propertyInfo == null) { - return fieldInfo.GetValue(containingIniSection); - } else { - return propertyInfo.GetValue(containingIniSection, null); + get + { + if (_propertyInfo == null) { + return _fieldInfo.GetValue(_containingIniSection); } + return _propertyInfo.GetValue(_containingIniSection, null); } set { - if (propertyInfo == null) { - fieldInfo.SetValue(containingIniSection, value); + if (_propertyInfo == null) { + _fieldInfo.SetValue(_containingIniSection, value); } else { - propertyInfo.SetValue(containingIniSection, value, null); + _propertyInfo.SetValue(_containingIniSection, value, null); } } } @@ -155,13 +139,9 @@ namespace Greenshot.IniFile { /// public Type ValueType { get { - Type valueType = null; - if (propertyInfo == null) { - valueType = fieldInfo.FieldType; - } else { - valueType = propertyInfo.PropertyType; - } - if (valueType.IsGenericType && valueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { + var valueType = _propertyInfo?.PropertyType ?? _fieldInfo.FieldType; + var genericTypeDefinition = valueType.GetGenericTypeDefinition(); + if (genericTypeDefinition != null && (valueType.IsGenericType && genericTypeDefinition == typeof(Nullable<>))) { // We are dealing with a generic type that is nullable valueType = Nullable.GetUnderlyingType(valueType); } @@ -178,29 +158,29 @@ namespace Greenshot.IniFile { object myValue = Value; Type valueType = ValueType; if (myValue == null) { - if (attributes.ExcludeIfNull) { + if (_attributes.ExcludeIfNull) { return; } - if (attributes.DefaultValue != null) { - myValue = attributes.DefaultValue; + if (_attributes.DefaultValue != null) { + myValue = _attributes.DefaultValue; valueType = typeof(string); } else { - myValue = containingIniSection.GetDefault(attributes.Name); + myValue = _containingIniSection.GetDefault(_attributes.Name); if (myValue != null) { valueType = myValue.GetType(); } } } if (myValue == null) { - if (attributes.ExcludeIfNull) { + if (_attributes.ExcludeIfNull) { return; } } if (!onlyProperties) { - writer.WriteLine("; {0}", attributes.Description); + writer.WriteLine("; {0}", _attributes.Description); } if (myValue == null) { - writer.WriteLine("{0}=", attributes.Name); + writer.WriteLine("{0}=", _attributes.Name); return; } if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Dictionary<,>)) { @@ -218,10 +198,10 @@ namespace Greenshot.IniFile { var key = current.Invoke(enumerator, null); var valueObject = item.GetValue(myValue, new[] { key }); // Write to ini file! - writer.WriteLine("{0}.{1}={2}", attributes.Name, ConvertValueToString(valueType1, key, attributes.Separator), ConvertValueToString(valueType2, valueObject, attributes.Separator)); + writer.WriteLine("{0}.{1}={2}", _attributes.Name, ConvertValueToString(valueType1, key, _attributes.Separator), ConvertValueToString(valueType2, valueObject, _attributes.Separator)); } } else { - writer.WriteLine("{0}={1}", attributes.Name, ConvertValueToString(valueType, myValue, attributes.Separator)); + writer.WriteLine("{0}={1}", _attributes.Name, ConvertValueToString(valueType, myValue, _attributes.Separator)); } } @@ -230,10 +210,10 @@ namespace Greenshot.IniFile { /// /// public void SetValueFromProperties(IDictionary properties) { - string propertyName = attributes.Name; + string propertyName = _attributes.Name; string propertyValue = null; if (properties.ContainsKey(propertyName) && properties[propertyName] != null) { - propertyValue = containingIniSection.PreCheckValue(propertyName, properties[propertyName]); + propertyValue = _containingIniSection.PreCheckValue(propertyName, properties[propertyName]); } UseValueOrDefault(propertyValue); } @@ -244,23 +224,23 @@ namespace Greenshot.IniFile { /// public void UseValueOrDefault(string propertyValue) { Type valueType = ValueType; - string propertyName = attributes.Name; - string defaultValue = attributes.DefaultValue; + string propertyName = _attributes.Name; + string defaultValue = _attributes.DefaultValue; bool defaultUsed = false; - object defaultValueFromConfig = containingIniSection.GetDefault(propertyName); + object defaultValueFromConfig = _containingIniSection.GetDefault(propertyName); if (string.IsNullOrEmpty(propertyValue)) { if (defaultValue != null && defaultValue.Trim().Length != 0) { propertyValue = defaultValue; defaultUsed = true; } else if (defaultValueFromConfig != null) { - LOG.DebugFormat("Default for Property {0} implemented!", propertyName); + Log.DebugFormat("Default for Property {0} implemented!", propertyName); } else { - if (attributes.ExcludeIfNull) { + if (_attributes.ExcludeIfNull) { Value = null; return; } - LOG.DebugFormat("Property {0} has no value or default value!", propertyName); + Log.DebugFormat("Property {0} has no value or default value!", propertyName); } } // Now set the value @@ -272,7 +252,7 @@ namespace Greenshot.IniFile { object dictionary = Activator.CreateInstance(valueType); MethodInfo addMethodInfo = valueType.GetMethod("Add"); bool addedElements = false; - IDictionary properties = IniConfig.PropertiesForSection(containingIniSection); + IDictionary properties = IniConfig.PropertiesForSection(_containingIniSection); foreach (string key in properties.Keys) { if (key != null && key.StartsWith(propertyName + ".")) { // What "key" do we need to store it under? @@ -281,15 +261,15 @@ namespace Greenshot.IniFile { object newValue1 = null; object newValue2 = null; try { - newValue1 = ConvertStringToValueType(type1, subPropertyName, attributes.Separator); + newValue1 = ConvertStringToValueType(type1, subPropertyName, _attributes.Separator); } catch (Exception ex) { - LOG.Warn(ex); + Log.Warn(ex); //LOG.Error("Problem converting " + subPropertyName + " to type " + type1.FullName, e); } try { - newValue2 = ConvertStringToValueType(type2, stringValue, attributes.Separator); + newValue2 = ConvertStringToValueType(type2, stringValue, _attributes.Separator); } catch (Exception ex) { - LOG.Warn(ex); + Log.Warn(ex); //LOG.Error("Problem converting " + stringValue + " to type " + type2.FullName, e); } addMethodInfo.Invoke(dictionary, new[] { newValue1, newValue2 }); @@ -300,31 +280,33 @@ namespace Greenshot.IniFile { if (addedElements) { Value = dictionary; return; - } else if (defaultValueFromConfig != null) { + } + if (defaultValueFromConfig != null) { Value = defaultValueFromConfig; return; } } else if (!string.IsNullOrEmpty(propertyValue)) { - if (valueType.IsGenericType && valueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { + var genericTypeDefinition = valueType.GetGenericTypeDefinition(); + if (genericTypeDefinition != null && (valueType.IsGenericType && genericTypeDefinition == typeof(Nullable<>))) { // We are dealing with a generic type that is nullable valueType = Nullable.GetUnderlyingType(valueType); } - object newValue = null; + object newValue; try { - newValue = ConvertStringToValueType(valueType, propertyValue, attributes.Separator); + newValue = ConvertStringToValueType(valueType, propertyValue, _attributes.Separator); } catch (Exception ex1) { newValue = null; if (!defaultUsed) { try { - LOG.WarnFormat("Problem '{0}' while converting {1} to type {2} trying fallback...", ex1.Message, propertyValue, valueType.FullName); - newValue = ConvertStringToValueType(valueType, defaultValue, attributes.Separator); + Log.WarnFormat("Problem '{0}' while converting {1} to type {2} trying fallback...", ex1.Message, propertyValue, valueType.FullName); + newValue = ConvertStringToValueType(valueType, defaultValue, _attributes.Separator); ContainingIniSection.IsDirty = true; - LOG.InfoFormat("Used default value {0} for property {1}", defaultValue, propertyName); + Log.InfoFormat("Used default value {0} for property {1}", defaultValue, propertyName); } catch (Exception ex2) { - LOG.Warn("Problem converting fallback value " + defaultValue + " to type " + valueType.FullName, ex2); + Log.Warn("Problem converting fallback value " + defaultValue + " to type " + valueType.FullName, ex2); } } else { - LOG.Warn("Problem converting " + propertyValue + " to type " + valueType.FullName, ex1); + Log.Warn("Problem converting " + propertyValue + " to type " + valueType.FullName, ex1); } } Value = newValue; @@ -340,7 +322,7 @@ namespace Greenshot.IniFile { try { Value = Activator.CreateInstance(ValueType); } catch (Exception) { - LOG.WarnFormat("Couldn't create instance of {0} for {1}, using default value.", ValueType.FullName, attributes.Name); + Log.WarnFormat("Couldn't create instance of {0} for {1}, using default value.", ValueType.FullName, _attributes.Name); Value = default(ValueType); } } else { @@ -371,18 +353,18 @@ namespace Greenshot.IniFile { object list = Activator.CreateInstance(valueType); // Logic for List<> string[] arrayValues = valueString.Split(new[] { arraySeparator }, StringSplitOptions.None); - if (arrayValues == null || arrayValues.Length == 0) { + if (arrayValues.Length == 0) { return list; } MethodInfo addMethodInfo = valueType.GetMethod("Add"); foreach (string arrayValue in arrayValues) { - if (arrayValue != null && arrayValue.Length > 0) { + if (!string.IsNullOrEmpty(arrayValue)) { object newValue = null; try { newValue = ConvertStringToValueType(valueType.GetGenericArguments()[0], arrayValue, separator); } catch (Exception ex) { - LOG.Warn("Problem converting " + arrayValue + " to type " + valueType.FullName, ex); + Log.Warn("Problem converting " + arrayValue + " to type " + valueType.FullName, ex); } if (newValue != null) { addMethodInfo.Invoke(list, new[] { newValue }); @@ -394,7 +376,7 @@ namespace Greenshot.IniFile { //LOG.Debug("No convertor for " + fieldType.ToString()); if (valueType == typeof(object) && valueString.Length > 0) { //LOG.Debug("Parsing: " + valueString); - string[] values = valueString.Split(new[] { ':' }); + string[] values = valueString.Split(':'); //LOG.Debug("Type: " + values[0]); //LOG.Debug("Value: " + values[1]); Type fieldTypeForValue = Type.GetType(values[0], true); @@ -402,25 +384,7 @@ namespace Greenshot.IniFile { return ConvertStringToValueType(fieldTypeForValue, values[1], separator); } TypeConverter converter = TypeDescriptor.GetConverter(valueType); - if (converter != null) { - return converter.ConvertFromInvariantString(valueString); - } else if (valueType.IsEnum) { - if (valueString.Length > 0) { - try { - return Enum.Parse(valueType, valueString); - } catch (ArgumentException) { - //LOG.InfoFormat("Couldn't match {0} to {1}, trying case-insentive match", valueString, fieldType); - foreach (Enum enumValue in Enum.GetValues(valueType)) { - if (enumValue.ToString().Equals(valueString, StringComparison.InvariantCultureIgnoreCase)) { - //LOG.Info("Match found..."); - return enumValue; - } - } - throw; - } - } - } - return null; + return converter.ConvertFromInvariantString(valueString); } /// @@ -428,7 +392,7 @@ namespace Greenshot.IniFile { /// /// string representation of this public override string ToString() { - return ConvertValueToString(ValueType, Value, attributes.Separator); + return ConvertValueToString(ValueType, Value, _attributes.Separator); } /// @@ -479,14 +443,10 @@ namespace Greenshot.IniFile { if (assemblyName.StartsWith("Green")) { assemblyName = assemblyName.Substring(0, assemblyName.IndexOf(',')); } - return string.Format("{0},{1}:{2}", valueTypeName, assemblyName, ourValue); + return $"{valueTypeName},{assemblyName}:{ourValue}"; } TypeConverter converter = TypeDescriptor.GetConverter(valueType); - if (converter != null) { - return converter.ConvertToInvariantString(valueObject); - } - // All other types - return valueObject.ToString(); + return converter.ConvertToInvariantString(valueObject); } } } \ No newline at end of file diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 6f63972fb..afb835df2 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -25,6 +25,7 @@ using System; using System.Drawing; using System.IO; using System.Windows.Forms; +using GreenshotPlugin.Effects; namespace Greenshot.Plugin { diff --git a/GreenshotPlugin/Interfaces/IDestination.cs b/GreenshotPlugin/Interfaces/IDestination.cs index 08fc85f57..18d2b26ef 100644 --- a/GreenshotPlugin/Interfaces/IDestination.cs +++ b/GreenshotPlugin/Interfaces/IDestination.cs @@ -25,75 +25,28 @@ using System.Windows.Forms; namespace Greenshot.Plugin { public class ExportInformation { - private string uri; - private string filepath; - - private bool exportMade; - private readonly string destinationDesignation; - private string destinationDescription; - - private string errorMessage; - public ExportInformation(string destinationDesignation, string destinationDescription) { - this.destinationDesignation = destinationDesignation; - this.destinationDescription = destinationDescription; + DestinationDesignation = destinationDesignation; + DestinationDescription = destinationDescription; } public ExportInformation(string destinationDesignation, string destinationDescription, bool exportMade): this(destinationDesignation, destinationDescription) { - this.exportMade = exportMade; + ExportMade = exportMade; } - public string DestinationDesignation { - get { - return destinationDesignation; - } - } - public string DestinationDescription { - get { - return destinationDescription; - } - set { - destinationDescription = value; - } - } + public string DestinationDesignation { get; } + + public string DestinationDescription { get; set; } /// /// Set to true to specify if the export worked. /// - public bool ExportMade { - get { - return exportMade; - } - set { - exportMade = value; - } - } + public bool ExportMade { get; set; } - public string Uri { - get { - return uri; - } - set { - uri = value; - } - } + public string Uri { get; set; } - public string ErrorMessage { - get { - return errorMessage; - } - set { - errorMessage = value; - } - } + public string ErrorMessage { get; set; } - public string Filepath { - get { - return filepath; - } - set { - filepath = value; - } - } + public string Filepath { get; set; } } /// @@ -131,7 +84,7 @@ namespace Greenshot.Plugin { /// /// Returns if the destination is active /// - bool isActive { + bool IsActive { get; } @@ -159,21 +112,21 @@ namespace Greenshot.Plugin { /// /// Returns true if this destination can be dynamic /// - bool isDynamic { + bool IsDynamic { get; } /// /// Returns if the destination is active /// - bool useDynamicsOnly { + bool UseDynamicsOnly { get; } /// /// Returns true if this destination returns a link /// - bool isLinkable { + bool IsLinkable { get; } diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index c56cc6570..7a19d4e4a 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -26,6 +26,7 @@ using System.Windows.Forms; using GreenshotPlugin.Core; using Greenshot.IniFile; using Greenshot.Core; +using GreenshotPlugin.Effects; namespace Greenshot.Plugin { [Serializable] diff --git a/GreenshotPlugin/Interop/COMWrapper.cs b/GreenshotPlugin/Interop/COMWrapper.cs index 243180939..48671c940 100644 --- a/GreenshotPlugin/Interop/COMWrapper.cs +++ b/GreenshotPlugin/Interop/COMWrapper.cs @@ -34,7 +34,7 @@ namespace Greenshot.Interop { /// Wraps a late-bound COM server. /// public sealed class COMWrapper : RealProxy, IDisposable, IRemotingTypeInfo { - private static readonly ILog LOG = LogManager.GetLogger(typeof(COMWrapper)); + private static readonly ILog Log = LogManager.GetLogger(typeof(COMWrapper)); private const int MK_E_UNAVAILABLE = -2147221021; private const int CO_E_CLASSSTRING = -2147221005; public const int RPC_E_CALL_REJECTED = unchecked((int)0x80010001); @@ -105,13 +105,13 @@ namespace Greenshot.Interop { try { GetActiveObject(ref guid, IntPtr.Zero, out comObject); } catch (Exception) { - LOG.WarnFormat("Error {0} getting instance for class id {1}", result, progIdAttribute.Value); + Log.WarnFormat("Error {0} getting instance for class id {1}", result, progIdAttribute.Value); } if (comObject == null) { - LOG.WarnFormat("Error {0} getting progId {1}", result, progIdAttribute.Value); + Log.WarnFormat("Error {0} getting progId {1}", result, progIdAttribute.Value); } } else { - LOG.InfoFormat("Mapped {0} to progId {1}", progIdAttribute.Value, progId); + Log.InfoFormat("Mapped {0} to progId {1}", progIdAttribute.Value, progId); } } @@ -120,14 +120,14 @@ namespace Greenshot.Interop { comObject = Marshal.GetActiveObject(progId); } catch (COMException comE) { if (comE.ErrorCode == MK_E_UNAVAILABLE) { - LOG.DebugFormat("No current instance of {0} object available.", progId); + Log.DebugFormat("No current instance of {0} object available.", progId); } else if (comE.ErrorCode == CO_E_CLASSSTRING) { - LOG.WarnFormat("Unknown progId {0}", progId); + Log.WarnFormat("Unknown progId {0}", progId); } else { - LOG.Warn("Error getting active object for " + progIdAttribute.Value, comE); + Log.Warn("Error getting active object for " + progIdAttribute.Value, comE); } } catch (Exception e) { - LOG.Warn("Error getting active object for " + progIdAttribute.Value, e); + Log.Warn("Error getting active object for " + progIdAttribute.Value, e); } } @@ -166,13 +166,13 @@ namespace Greenshot.Interop { try { comType = Type.GetTypeFromCLSID(guid); } catch (Exception ex) { - LOG.WarnFormat("Error {1} type for {0}", progId, ex.Message); + Log.WarnFormat("Error {1} type for {0}", progId, ex.Message); } } else { try { comType = Type.GetTypeFromProgID(progId, true); } catch (Exception ex) { - LOG.WarnFormat("Error {1} type for {0}", progId, ex.Message); + Log.WarnFormat("Error {1} type for {0}", progId, ex.Message); } } object comObject = null; @@ -180,10 +180,10 @@ namespace Greenshot.Interop { try { comObject = Activator.CreateInstance(comType); if (comObject != null) { - LOG.DebugFormat("Created new instance of {0} object.", progId); + Log.DebugFormat("Created new instance of {0} object.", progId); } } catch (Exception e) { - LOG.WarnFormat("Error {1} creating object for {0}", progId, e.Message); + Log.WarnFormat("Error {1} creating object for {0}", progId, e.Message); throw; } } @@ -229,13 +229,13 @@ namespace Greenshot.Interop { try { GetActiveObject(ref guid, IntPtr.Zero, out comObject); } catch (Exception) { - LOG.WarnFormat("Error {0} getting instance for class id {1}", result, progIdAttribute.Value); + Log.WarnFormat("Error {0} getting instance for class id {1}", result, progIdAttribute.Value); } if (comObject == null) { - LOG.WarnFormat("Error {0} getting progId {1}", result, progIdAttribute.Value); + Log.WarnFormat("Error {0} getting progId {1}", result, progIdAttribute.Value); } } else { - LOG.InfoFormat("Mapped {0} to progId {1}", progIdAttribute.Value, progId); + Log.InfoFormat("Mapped {0} to progId {1}", progIdAttribute.Value, progId); } } @@ -245,15 +245,15 @@ namespace Greenshot.Interop { comObject = Marshal.GetActiveObject(progId); } catch (COMException comE) { if (comE.ErrorCode == MK_E_UNAVAILABLE) { - LOG.DebugFormat("No current instance of {0} object available.", progId); + Log.DebugFormat("No current instance of {0} object available.", progId); } else if (comE.ErrorCode == CO_E_CLASSSTRING) { - LOG.WarnFormat("Unknown progId {0} (application not installed)", progId); + Log.WarnFormat("Unknown progId {0} (application not installed)", progId); return default(T); } else { - LOG.Warn("Error getting active object for " + progId, comE); + Log.Warn("Error getting active object for " + progId, comE); } } catch (Exception e) { - LOG.Warn("Error getting active object for " + progId, e); + Log.Warn("Error getting active object for " + progId, e); } } } @@ -266,7 +266,7 @@ namespace Greenshot.Interop { if (Guid.Empty != guid) { comType = Type.GetTypeFromCLSID(guid); } else { - LOG.Warn("Error type for " + progId, ex); + Log.Warn("Error type for " + progId, ex); } } @@ -274,10 +274,10 @@ namespace Greenshot.Interop { try { comObject = Activator.CreateInstance(comType); if (comObject != null) { - LOG.DebugFormat("Created new instance of {0} object.", progId); + Log.DebugFormat("Created new instance of {0} object.", progId); } } catch (Exception e) { - LOG.Warn("Error creating object for " + progId, e); + Log.Warn("Error creating object for " + progId, e); } } } @@ -356,7 +356,7 @@ namespace Greenshot.Interop { /// sure that the COM object is still cleaned up. /// ~COMWrapper() { - LOG.DebugFormat("Finalize {0}", _interceptType); + Log.DebugFormat("Finalize {0}", _interceptType); Dispose(false); } @@ -377,20 +377,20 @@ namespace Greenshot.Interop { /// private void Dispose(bool disposing) { if (null != _comObject) { - LOG.DebugFormat("Disposing {0}", _interceptType); + Log.DebugFormat("Disposing {0}", _interceptType); if (Marshal.IsComObject(_comObject)) { try { int count; do { count = Marshal.ReleaseComObject(_comObject); - LOG.DebugFormat("RCW count for {0} now is {1}", _interceptType, count); + Log.DebugFormat("RCW count for {0} now is {1}", _interceptType, count); } while (count > 0); } catch (Exception ex) { - LOG.WarnFormat("Problem releasing COM object {0}", _comType); - LOG.Warn("Error: ", ex); + Log.WarnFormat("Problem releasing COM object {0}", _comType); + Log.Warn("Error: ", ex); } } else { - LOG.WarnFormat("{0} is not a COM object", _comType); + Log.WarnFormat("{0} is not a COM object", _comType); } } } @@ -479,13 +479,13 @@ namespace Greenshot.Interop { public override IMessage Invoke(IMessage myMessage) { IMethodCallMessage callMessage = myMessage as IMethodCallMessage; if (null == callMessage) { - LOG.DebugFormat("Message type not implemented: {0}", myMessage.GetType()); + Log.DebugFormat("Message type not implemented: {0}", myMessage.GetType()); return null; } MethodInfo method = callMessage.MethodBase as MethodInfo; if (null == method) { - LOG.DebugFormat("Unrecognized Invoke call: {0}", callMessage.MethodBase); + Log.DebugFormat("Unrecognized Invoke call: {0}", callMessage.MethodBase); return null; } @@ -598,7 +598,7 @@ namespace Greenshot.Interop { break; } catch (InvalidComObjectException icoEx) { // Should assist BUG-1616 and others - LOG.WarnFormat("COM object {0} has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.", _interceptType.FullName); + Log.WarnFormat("COM object {0} has been separated from its underlying RCW cannot be used. The COM object was released while it was still in use on another thread.", _interceptType.FullName); return new ReturnMessage(icoEx, callMessage); } catch (Exception ex) { // Test for rejected diff --git a/GreenshotPlugin/Interop/ComProgIdAttribute.cs b/GreenshotPlugin/Interop/ComProgIdAttribute.cs index 620ad8e0d..58e3d3c6a 100644 --- a/GreenshotPlugin/Interop/ComProgIdAttribute.cs +++ b/GreenshotPlugin/Interop/ComProgIdAttribute.cs @@ -24,10 +24,8 @@ namespace Greenshot.Interop { /// /// An attribute to specifiy the ProgID of the COM class to create. (As suggested by Kristen Wegner) /// - [AttributeUsage(AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] + [AttributeUsage(AttributeTargets.Interface)] public sealed class ComProgIdAttribute : Attribute { - private readonly string _value; - /// /// Extracts the attribute from the specified type. /// @@ -42,24 +40,26 @@ namespace Greenshot.Interop { /// public static ComProgIdAttribute GetAttribute(Type interfaceType) { if (null == interfaceType) { - throw new ArgumentNullException("interfaceType"); + throw new ArgumentNullException(nameof(interfaceType)); } Type attributeType = typeof(ComProgIdAttribute); object[] attributes = interfaceType.GetCustomAttributes(attributeType, false); - if (null == attributes || 0 == attributes.Length) { + if (0 == attributes.Length) + { Type[] interfaces = interfaceType.GetInterfaces(); - for (int i = 0; i < interfaces.Length; i++) { - interfaceType = interfaces[i]; + foreach (Type t in interfaces) + { + interfaceType = t; attributes = interfaceType.GetCustomAttributes(attributeType, false); - if (null != attributes && 0 != attributes.Length) { + if (0 != attributes.Length) { break; } } } - if (null == attributes || 0 == attributes.Length) { + if (0 == attributes.Length) { return null; } return (ComProgIdAttribute)attributes[0]; @@ -68,14 +68,12 @@ namespace Greenshot.Interop { /// Constructor /// The COM ProgID. public ComProgIdAttribute(string value) { - _value = value; + Value = value; } /// /// Returns the COM ProgID /// - public string Value { - get { return _value; } - } + public string Value { get; } } } diff --git a/GreenshotPlugin/Interop/IUnknown.cs b/GreenshotPlugin/Interop/IUnknown.cs index a5781e647..e3f153ff8 100644 --- a/GreenshotPlugin/Interop/IUnknown.cs +++ b/GreenshotPlugin/Interop/IUnknown.cs @@ -28,9 +28,9 @@ namespace Greenshot.Interop { IntPtr QueryInterface(ref Guid riid); [PreserveSig] - UInt32 AddRef(); + uint AddRef(); [PreserveSig] - UInt32 Release(); + uint Release(); } } diff --git a/GreenshotPlugin/UnmanagedHelpers/DWM.cs b/GreenshotPlugin/UnmanagedHelpers/DWM.cs index 3a809713a..64638eec1 100644 --- a/GreenshotPlugin/UnmanagedHelpers/DWM.cs +++ b/GreenshotPlugin/UnmanagedHelpers/DWM.cs @@ -148,11 +148,9 @@ namespace GreenshotPlugin.UnmanagedHelpers { public static Color ColorizationColor { get { using (RegistryKey key = Registry.CurrentUser.OpenSubKey(COLORIZATION_COLOR_KEY, false)) { - if (key != null) { - object dwordValue = key.GetValue("ColorizationColor"); - if (dwordValue != null) { - return Color.FromArgb((Int32)dwordValue); - } + object dwordValue = key?.GetValue("ColorizationColor"); + if (dwordValue != null) { + return Color.FromArgb((int)dwordValue); } } return Color.White; diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index 036bc33a2..f3411e245 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -168,7 +168,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { public class SafeCompatibleDCHandle : SafeDCHandle { [DllImport("gdi32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool DeleteDC(IntPtr hDC); + private static extern bool DeleteDC(IntPtr hDC); /// /// Needed for marshalling return values @@ -367,7 +367,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { // V5 bV5RedMask = (uint)255 << 16; bV5GreenMask = (uint)255 << 8; - bV5BlueMask = (uint)255; + bV5BlueMask = 255; bV5AlphaMask = (uint)255 << 24; bV5CSType = 1934772034; // sRGB bV5Endpoints = new CIEXYZTRIPLE diff --git a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs index fa62f1224..f8671f335 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDIplus.cs @@ -92,7 +92,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// GDIplus Helpers /// public static class GDIplus { - private static readonly ILog LOG = LogManager.GetLogger(typeof(GDIplus)); + private static readonly ILog Log = LogManager.GetLogger(typeof(GDIplus)); [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] private static extern int GdipBitmapApplyEffect(IntPtr bitmap, IntPtr effect, ref RECT rectOfInterest, bool useAuxData, IntPtr auxData, int auxDataSize); @@ -170,15 +170,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// This accounts for the "bug" I reported here: http://social.technet.microsoft.com/Forums/en/w8itprogeneral/thread/99ddbe9d-556d-475a-8bab-84e25aa13a2c /// /// - /// + /// false if blur is not possible public static bool IsBlurPossible(int radius) { if (!_isBlurEnabled) { return false; } - if (Environment.OSVersion.Version.Minor >= 2 && radius < 20) { - return false; - } - return true; + return Environment.OSVersion.Version.Minor < 2 || radius >= 20; } /// @@ -197,18 +194,24 @@ namespace GreenshotPlugin.UnmanagedHelpers { IntPtr hEffect = IntPtr.Zero; try { + // Create the GDI+ BlurEffect, using the Guid + int status = GdipCreateEffect(BlurEffectGuid, out hEffect); + if (status != 0) + { + return false; + } // Create a BlurParams struct and set the values - BlurParams blurParams = new BlurParams(); - blurParams.Radius = radius; - blurParams.ExpandEdges = expandEdges; + var blurParams = new BlurParams + { + Radius = radius, + ExpandEdges = expandEdges + }; // Allocate space in unmanaged memory hBlurParams = Marshal.AllocHGlobal(Marshal.SizeOf(blurParams)); // Copy the structure to the unmanaged memory Marshal.StructureToPtr(blurParams, hBlurParams, false); - // Create the GDI+ BlurEffect, using the Guid - int status = GdipCreateEffect(BlurEffectGuid, out hEffect); // Set the blurParams to the effect GdipSetEffectParameters(hEffect, hBlurParams, (uint)Marshal.SizeOf(blurParams)); @@ -226,7 +229,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { return true; } catch (Exception ex) { _isBlurEnabled = false; - LOG.Error("Problem using GdipBitmapApplyEffect: ", ex); + Log.Error("Problem using GdipBitmapApplyEffect: ", ex); return false; } finally { try { @@ -240,7 +243,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { } } catch (Exception ex) { _isBlurEnabled = false; - LOG.Error("Problem cleaning up ApplyBlur: ", ex); + Log.Error("Problem cleaning up ApplyBlur: ", ex); } } } @@ -258,20 +261,26 @@ namespace GreenshotPlugin.UnmanagedHelpers { IntPtr hEffect = IntPtr.Zero; try { + // Create the GDI+ BlurEffect, using the Guid + int status = GdipCreateEffect(BlurEffectGuid, out hEffect); + if (status != 0) + { + return false; + } + // Create a BlurParams struct and set the values - BlurParams blurParams = new BlurParams(); - blurParams.Radius = radius; + var blurParams = new BlurParams + { + Radius = radius, + ExpandEdges = false + }; //blurParams.Padding = radius; - blurParams.ExpandEdges = false; // Allocate space in unmanaged memory hBlurParams = Marshal.AllocHGlobal(Marshal.SizeOf(blurParams)); // Copy the structure to the unmanaged memory Marshal.StructureToPtr(blurParams, hBlurParams, true); - // Create the GDI+ BlurEffect, using the Guid - int status = GdipCreateEffect(BlurEffectGuid, out hEffect); - // Set the blurParams to the effect GdipSetEffectParameters(hEffect, hBlurParams, (uint)Marshal.SizeOf(blurParams)); @@ -283,15 +292,15 @@ namespace GreenshotPlugin.UnmanagedHelpers { IntPtr hAttributes = GetNativeImageAttributes(imageAttributes); // Create a RECT from the Rectangle - RECTF sourceRECF = new RECTF(source); + RECTF sourceRecf = new RECTF(source); // Apply the effect to the bitmap in the specified area - GdipDrawImageFX(hGraphics, hBitmap, ref sourceRECF, hMatrix, hEffect, hAttributes, GpUnit.UnitPixel); + GdipDrawImageFX(hGraphics, hBitmap, ref sourceRecf, hMatrix, hEffect, hAttributes, GpUnit.UnitPixel); // Everything worked, return true return true; } catch (Exception ex) { _isBlurEnabled = false; - LOG.Error("Problem using GdipDrawImageFX: ", ex); + Log.Error("Problem using GdipDrawImageFX: ", ex); return false; } finally { try { @@ -305,7 +314,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { } } catch (Exception ex) { _isBlurEnabled = false; - LOG.Error("Problem cleaning up DrawWithBlur: ", ex); + Log.Error("Problem cleaning up DrawWithBlur: ", ex); } } } diff --git a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs index b78b22ed1..42e44aec7 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Shell32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Shell32.cs @@ -196,12 +196,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// /// The path to the file that contains an image. /// The System.Drawing.Icon representation of the image contained in the specified file. - public static Icon ExtractAssociatedIcon(String filePath) { + public static Icon ExtractAssociatedIcon(string filePath) { int index = 0; Uri uri; if (filePath == null) { - throw new ArgumentException(String.Format("'{0}' is not valid for '{1}'", "null", "filePath"), "filePath"); + throw new ArgumentException("Null is not valid for filePath", nameof(filePath)); } try { uri = new Uri(filePath); diff --git a/GreenshotPlugin/UnmanagedHelpers/Structs.cs b/GreenshotPlugin/UnmanagedHelpers/Structs.cs index ea9abc1fd..42c7ecf94 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Structs.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Structs.cs @@ -30,10 +30,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { public SIZE(Size size) : this(size.Width, size.Height) { } + public SIZE(int width, int height) { Width = width; Height = height; } + public Size ToSize() { return new Size(Width, Height); } @@ -82,11 +84,11 @@ namespace GreenshotPlugin.UnmanagedHelpers { public RECT(Rectangle rectangle) : this(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom) { } - public RECT(int Left, int Top, int Right, int Bottom) { - _Left = Left; - _Top = Top; - _Right = Right; - _Bottom = Bottom; + public RECT(int left, int top, int right, int bottom) { + _Left = left; + _Top = top; + _Right = right; + _Bottom = bottom; } public int X { @@ -172,17 +174,17 @@ namespace GreenshotPlugin.UnmanagedHelpers { } } - public static implicit operator Rectangle(RECT Rectangle) { - return new Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height); + public static implicit operator Rectangle(RECT rectangle) { + return new Rectangle(rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height); } - public static implicit operator RECT(Rectangle Rectangle) { - return new RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom); + public static implicit operator RECT(Rectangle rectangle) { + return new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom); } - public static bool operator ==(RECT Rectangle1, RECT Rectangle2) { - return Rectangle1.Equals(Rectangle2); + public static bool operator ==(RECT rectangle1, RECT rectangle2) { + return rectangle1.Equals(rectangle2); } - public static bool operator !=(RECT Rectangle1, RECT Rectangle2) { - return !Rectangle1.Equals(Rectangle2); + public static bool operator !=(RECT rectangle1, RECT rectangle2) { + return !rectangle1.Equals(rectangle2); } public override string ToString() { @@ -193,8 +195,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { return ToString().GetHashCode(); } - public bool Equals(RECT Rectangle) { - return Rectangle.Left == _Left && Rectangle.Top == _Top && Rectangle.Right == _Right && Rectangle.Bottom == _Bottom; + public bool Equals(RECT rectangle) { + return rectangle.Left == _Left && rectangle.Top == _Top && rectangle.Right == _Right && rectangle.Bottom == _Bottom; } public Rectangle ToRectangle() { @@ -313,7 +315,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// The structure for the WindowInfo /// See: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632610%28v=vs.85%29.aspx /// - [StructLayout(LayoutKind.Sequential), Serializable()] + [StructLayout(LayoutKind.Sequential), Serializable] public struct WindowInfo { public uint cbSize; public RECT rcWindow; @@ -326,8 +328,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { public ushort atomWindowType; public ushort wCreatorVersion; // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)". - public WindowInfo(Boolean? filler) : this() { - cbSize = (UInt32)(Marshal.SizeOf(typeof(WindowInfo))); + public WindowInfo(bool? filler) : this() { + cbSize = (uint)(Marshal.SizeOf(typeof(WindowInfo))); } } @@ -383,8 +385,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { [StructLayout(LayoutKind.Sequential)] public struct CursorInfo { - public Int32 cbSize; - public Int32 flags; + public int cbSize; + public int flags; public IntPtr hCursor; public POINT ptScreenPos; } @@ -392,8 +394,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { [StructLayout(LayoutKind.Sequential)] public struct IconInfo { public bool fIcon; - public Int32 xHotspot; - public Int32 yHotspot; + public int xHotspot; + public int yHotspot; public IntPtr hbmMask; public IntPtr hbmColor; } diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index 5d26374a7..97e8fe497 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -58,7 +58,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { public const int MONITOR_DEFAULTTONULL = 0; public const int MONITOR_DEFAULTTOPRIMARY = 1; public const int MONITOR_DEFAULTTONEAREST = 2; - public const Int32 CURSOR_SHOWING = 0x00000001; + public const int CURSOR_SHOWING = 0x00000001; #region DllImports [DllImport("user32", SetLastError = true)] @@ -382,7 +382,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// /// A WindowDC SafeHandle implementation /// - public class SafeWindowDCHandle : SafeHandleZeroOrMinusOneIsInvalid { + public class SafeWindowDcHandle : SafeHandleZeroOrMinusOneIsInvalid { [DllImport("user32", SetLastError = true)] private static extern IntPtr GetWindowDC(IntPtr hWnd); [DllImport("user32", SetLastError = true)] @@ -393,12 +393,12 @@ namespace GreenshotPlugin.UnmanagedHelpers { /// /// Needed for marshalling return values /// - public SafeWindowDCHandle() : base(true) + public SafeWindowDcHandle() : base(true) { } [SecurityCritical] - public SafeWindowDCHandle(IntPtr hWnd, IntPtr preexistingHandle) : base(true) { + public SafeWindowDcHandle(IntPtr hWnd, IntPtr preexistingHandle) : base(true) { _hWnd = hWnd; SetHandle(preexistingHandle); } @@ -409,10 +409,10 @@ namespace GreenshotPlugin.UnmanagedHelpers { return returnValue; } - public static SafeWindowDCHandle FromDesktop() { + public static SafeWindowDcHandle FromDesktop() { IntPtr hWndDesktop = User32.GetDesktopWindow(); IntPtr hDCDesktop = GetWindowDC(hWndDesktop); - return new SafeWindowDCHandle(hWndDesktop, hDCDesktop); + return new SafeWindowDcHandle(hWndDesktop, hDCDesktop); } } } diff --git a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs index 01e435daa..8e8d24761 100644 --- a/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs +++ b/GreenshotPlugin/UnmanagedHelpers/Win32Errors.cs @@ -103,10 +103,10 @@ namespace GreenshotPlugin.UnmanagedHelpers { int error = (int)errorCode; if ((error & 0x80000000) == 0x80000000) { - return (long)error; + return error; } - return (long)(0x80070000 | (uint)(error & 0xffff)); + return 0x80070000 | (uint)(error & 0xffff); } public static string GetMessage(Win32Error errorCode) { From 4ff0f090bb472c9b0342b6f0ec61dc5147331974 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 23 Sep 2016 22:10:45 +0200 Subject: [PATCH 120/170] Fixed optimize error. --- GreenshotPlugin/IniFile/IniValue.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index 21d61644d..b01e87f19 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -140,8 +140,13 @@ namespace Greenshot.IniFile { public Type ValueType { get { var valueType = _propertyInfo?.PropertyType ?? _fieldInfo.FieldType; + if (!valueType.IsGenericType) + { + return valueType; + } var genericTypeDefinition = valueType.GetGenericTypeDefinition(); - if (genericTypeDefinition != null && (valueType.IsGenericType && genericTypeDefinition == typeof(Nullable<>))) { + if (genericTypeDefinition != null && genericTypeDefinition == typeof(Nullable<>)) + { // We are dealing with a generic type that is nullable valueType = Nullable.GetUnderlyingType(valueType); } @@ -286,8 +291,8 @@ namespace Greenshot.IniFile { return; } } else if (!string.IsNullOrEmpty(propertyValue)) { - var genericTypeDefinition = valueType.GetGenericTypeDefinition(); - if (genericTypeDefinition != null && (valueType.IsGenericType && genericTypeDefinition == typeof(Nullable<>))) { + if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { // We are dealing with a generic type that is nullable valueType = Nullable.GetUnderlyingType(valueType); } From 4da8f223da76f7c3dc701336d872e1cd70e2af24 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 24 Sep 2016 18:43:04 +0200 Subject: [PATCH 121/170] Starting on backport of the Windows 10 OCR & share functionality --- Greenshot.sln | 16 +++- .../GreenshotWin10Plugin.csproj | 79 ++++++++++++++++ .../Properties/AssemblyInfo.cs | 31 +++++++ GreenshotWin10Plugin/Win10OcrDestination.cs | 93 +++++++++++++++++++ GreenshotWin10Plugin/Win10Plugin.cs | 77 +++++++++++++++ 5 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 GreenshotWin10Plugin/GreenshotWin10Plugin.csproj create mode 100644 GreenshotWin10Plugin/Properties/AssemblyInfo.cs create mode 100644 GreenshotWin10Plugin/Win10OcrDestination.cs create mode 100644 GreenshotWin10Plugin/Win10Plugin.cs diff --git a/Greenshot.sln b/Greenshot.sln index 47be71a18..1814e9a20 100644 --- a/Greenshot.sln +++ b/Greenshot.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Greenshot", "Greenshot\Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}" EndProject @@ -34,6 +34,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotOfficePlugin", "Gr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotPhotobucketPlugin", "GreenshotPhotobucketPlugin\GreenshotPhotobucketPlugin.csproj", "{9C0ECC4C-7807-4111-916A-4F57BB29788A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenshotWin10Plugin", "GreenshotWin10Plugin\GreenshotWin10Plugin.csproj", "{9801F62C-540F-4BFE-9211-6405DEDE563B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -177,6 +179,18 @@ Global {9C0ECC4C-7807-4111-916A-4F57BB29788A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {9C0ECC4C-7807-4111-916A-4F57BB29788A}.Release|x86.ActiveCfg = Release|x86 {9C0ECC4C-7807-4111-916A-4F57BB29788A}.Release|x86.Build.0 = Release|x86 + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|x86.ActiveCfg = Debug|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|x86.Build.0 = Debug|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Any CPU.Build.0 = Release|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|x86.ActiveCfg = Release|Any CPU + {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj new file mode 100644 index 000000000..9aa9b6a71 --- /dev/null +++ b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + {9801F62C-540F-4BFE-9211-6405DEDE563B} + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + GreenshotWin10Plugin + GreenshotWin10Plugin + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + False + ..\Greenshot\lib\log4net.dll + + + + + + False + C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.WindowsRuntime.dll + global + + + C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd + + + {5B924697-4DCD-4F98-85F1-105CB84B7341} + GreenshotPlugin + + + + + +mkdir "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\*.gsp" +copy "$(ProjectDir)bin\$(Configuration)\$(ProjectName).pdb" "$(SolutionDir)Greenshot\bin\$(Configuration)\Plugins\$(ProjectName)\" + + + \ No newline at end of file diff --git a/GreenshotWin10Plugin/Properties/AssemblyInfo.cs b/GreenshotWin10Plugin/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..b020ad5f7 --- /dev/null +++ b/GreenshotWin10Plugin/Properties/AssemblyInfo.cs @@ -0,0 +1,31 @@ +using Greenshot.Plugin; +using System.Reflection; +using System.Runtime.InteropServices; + +// 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("GreenshotWin10Plugin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Greenshot")] +[assembly: AssemblyProduct("GreenshotWin10Plugin")] +[assembly: AssemblyCopyright("Copyright © Greenshot 2007-2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The PluginAttribute describes the "entryType" and if the plugin is configurable +[assembly: Plugin("GreenshotWin10Plugin.Win10Plugin", false)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9801f62c-540f-4bfe-9211-6405dede563b")] + +// The assembly version, replaced by build scripts +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyInformationalVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/GreenshotWin10Plugin/Win10OcrDestination.cs b/GreenshotWin10Plugin/Win10OcrDestination.cs new file mode 100644 index 000000000..9b2730455 --- /dev/null +++ b/GreenshotWin10Plugin/Win10OcrDestination.cs @@ -0,0 +1,93 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.IO; +using System.Threading.Tasks; +using Windows.Graphics.Imaging; +using Windows.Media.Ocr; +using Greenshot.Plugin; +using GreenshotPlugin.Core; + +namespace GreenshotWin10Plugin +{ + /// + /// This uses the OcrEngine from Windows 10 to perform OCR on the captured image. + /// + public class Win10OcrDestination : AbstractDestination + { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10OcrDestination)); + + public override string Designation { get; } = "OCR"; + public override string Description { get; } = "Windows 10 OCR"; + + public Win10OcrDestination() + { + var languages = OcrEngine.AvailableRecognizerLanguages; + foreach (var language in languages) + { + Log.DebugFormat("Found language {0} {1}", language.NativeName, language.LanguageTag); + } + + } + + /// + /// Run the Windows 10 OCR engine to process the text on the captured image + /// + /// + /// + /// + /// ExportInformation + public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) + { + ExportInformation exportInformation = new ExportInformation(Designation, Description); + try + { + var text = Task.Run(async () => + { + var ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages(); + using (var imageStream = new MemoryStream()) + { + ImageOutput.SaveToStream(surface, imageStream, new SurfaceOutputSettings()); + imageStream.Position = 0; + + var decoder = await BitmapDecoder.CreateAsync(imageStream.AsRandomAccessStream()); + var softwareBitmap = await decoder.GetSoftwareBitmapAsync(); + + var ocrResult = await ocrEngine.RecognizeAsync(softwareBitmap); + return ocrResult.Text; + } + }).Result; + ClipboardHelper.SetClipboardData(text); + exportInformation.ExportMade = true; + } + catch (Exception ex) + { + exportInformation.ExportMade = false; + exportInformation.ErrorMessage = ex.Message; + } + + ProcessExport(exportInformation, surface); + return exportInformation; + + } + } +} diff --git a/GreenshotWin10Plugin/Win10Plugin.cs b/GreenshotWin10Plugin/Win10Plugin.cs new file mode 100644 index 000000000..38826a0cf --- /dev/null +++ b/GreenshotWin10Plugin/Win10Plugin.cs @@ -0,0 +1,77 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 Greenshot.Plugin; + +namespace GreenshotWin10Plugin +{ + /// + /// This is the Win10Plugin + /// + public class Win10Plugin : IGreenshotPlugin + { + + public void Dispose() + { + Dispose(true); + } + + protected void Dispose(bool disposing) + { + if (disposing) + { + } + } + + public void Configure() + { + throw new NotImplementedException(); + } + + public IEnumerable Destinations() + { + yield return new Win10OcrDestination(); + } + + public IEnumerable Processors() + { + yield break; + } + + /// + /// Implementation of the IGreenshotPlugin.Initialize + /// + /// Use the IGreenshotPluginHost interface to register events + /// My own attributes + /// true if plugin is initialized, false if not (doesn't show) + public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) + { + return true; + } + + public void Shutdown() + { + } + } + +} From 5779d2ac2bda427e8d1540de6bcb3df1c584409e Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 28 Sep 2016 21:50:36 +0200 Subject: [PATCH 122/170] Made the Win10 share work, at least somewhat. --- .../GreenshotWin10Plugin.csproj | 10 +- .../MemoryRandomAccessStream.cs | 69 +++++++++ .../Native/DataTransferManagerHelper.cs | 64 ++++++++ .../Native/IDataTransferManagerInterOp.cs | 57 +++++++ GreenshotWin10Plugin/Win10OcrDestination.cs | 13 +- GreenshotWin10Plugin/Win10Plugin.cs | 10 ++ GreenshotWin10Plugin/Win10ShareDestination.cs | 146 ++++++++++++++++++ 7 files changed, 365 insertions(+), 4 deletions(-) create mode 100644 GreenshotWin10Plugin/MemoryRandomAccessStream.cs create mode 100644 GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs create mode 100644 GreenshotWin10Plugin/Native/IDataTransferManagerInterOp.cs create mode 100644 GreenshotWin10Plugin/Win10ShareDestination.cs diff --git a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj index 9aa9b6a71..3830b6f20 100644 --- a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj +++ b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj @@ -12,6 +12,7 @@ GreenshotWin10Plugin v4.5 512 + true @@ -35,6 +36,8 @@ + + @@ -43,16 +46,19 @@ + + + + - + False ..\Greenshot\lib\log4net.dll - diff --git a/GreenshotWin10Plugin/MemoryRandomAccessStream.cs b/GreenshotWin10Plugin/MemoryRandomAccessStream.cs new file mode 100644 index 000000000..4b3476a04 --- /dev/null +++ b/GreenshotWin10Plugin/MemoryRandomAccessStream.cs @@ -0,0 +1,69 @@ +using System.IO; +using Windows.Storage.Streams; + +namespace GreenshotWin10Plugin +{ + public sealed class MemoryRandomAccessStream : MemoryStream, IRandomAccessStream + { + public MemoryRandomAccessStream() + { + } + + public MemoryRandomAccessStream(byte[] bytes) + { + Write(bytes, 0, bytes.Length); + } + + public IInputStream GetInputStreamAt(ulong position) + { + Seek((long)position, SeekOrigin.Begin); + + return this.AsInputStream(); + } + + public IOutputStream GetOutputStreamAt(ulong position) + { + Seek((long)position, SeekOrigin.Begin); + + return this.AsOutputStream(); + } + + ulong IRandomAccessStream.Position => (ulong)Position; + + public ulong Size + { + get { return (ulong)Length; } + set { SetLength((long)value); } + } + + public IRandomAccessStream CloneStream() + { + var cloned = new MemoryRandomAccessStream(); + CopyTo(cloned); + return cloned; + } + + public void Seek(ulong position) + { + Seek((long)position, SeekOrigin.Begin); + } + + public Windows.Foundation.IAsyncOperationWithProgress ReadAsync(IBuffer buffer, uint count, InputStreamOptions options) + { + var inputStream = GetInputStreamAt(0); + return inputStream.ReadAsync(buffer, count, options); + } + + Windows.Foundation.IAsyncOperation IOutputStream.FlushAsync() + { + var outputStream = GetOutputStreamAt(0); + return outputStream.FlushAsync(); + } + + public Windows.Foundation.IAsyncOperationWithProgress WriteAsync(IBuffer buffer) + { + var outputStream = GetOutputStreamAt(0); + return outputStream.WriteAsync(buffer); + } + } +} diff --git a/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs b/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs new file mode 100644 index 000000000..cca7d08c3 --- /dev/null +++ b/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs @@ -0,0 +1,64 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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.InteropServices.WindowsRuntime; +using Windows.ApplicationModel.DataTransfer; + +namespace GreenshotWin10Plugin.Native +{ + public class DataTransferManagerHelper + { + private const string DataTransferManagerId = "a5caee9b-8708-49d1-8d36-67d25a8da00c"; + private readonly IDataTransferManagerInterOp _dataTransferManagerInterOp; + private readonly IntPtr _windowHandle; + + public DataTransferManager DataTransferManager + { + get; + private set; + } + + public DataTransferManagerHelper(IntPtr handle) + { + //TODO: Add a check for failure here. This will fail for versions of Windows below Windows 10 + IActivationFactory activationFactory = WindowsRuntimeMarshal.GetActivationFactory(typeof(DataTransferManager)); + + // ReSharper disable once SuspiciousTypeConversion.Global + _dataTransferManagerInterOp = (IDataTransferManagerInterOp)activationFactory; + + _windowHandle = handle; + var riid = new Guid(DataTransferManagerId); + DataTransferManager dataTransferManager; + _dataTransferManagerInterOp.GetForWindow(_windowHandle, riid, out dataTransferManager); + DataTransferManager = dataTransferManager; + } + + /// + /// Show the share UI + /// + public void ShowShareUi() + { + _dataTransferManagerInterOp.ShowShareUIForWindow(_windowHandle); + } + } + +} diff --git a/GreenshotWin10Plugin/Native/IDataTransferManagerInterOp.cs b/GreenshotWin10Plugin/Native/IDataTransferManagerInterOp.cs new file mode 100644 index 000000000..f350e7372 --- /dev/null +++ b/GreenshotWin10Plugin/Native/IDataTransferManagerInterOp.cs @@ -0,0 +1,57 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2015 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.InteropServices; +using Windows.ApplicationModel.DataTransfer; + +namespace GreenshotWin10Plugin.Native +{ + /// + /// The IDataTransferManagerInterOp is documented here: https://msdn.microsoft.com/en-us/library/windows/desktop/jj542488(v=vs.85).aspx. + /// This interface allows an app to tie the share context to a specific + /// window using a window handle. Useful for Win32 apps. + /// + [ComImport, Guid("3A3DCD6C-3EAB-43DC-BCDE-45671CE800C8")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IDataTransferManagerInterOp + { + /// + /// Get an instance of Windows.ApplicationModel.DataTransfer.DataTransferManager + /// for the window identified by a window handle + /// + /// The window handle + /// ID of the DataTransferManager interface + /// The DataTransferManager instance for this window handle + /// HRESULT + [PreserveSig] + uint GetForWindow([In] IntPtr appWindow, [In] ref Guid riid, [Out] out DataTransferManager pDataTransferManager); + + /// + /// Show the share flyout for the window identified by a window handle + /// + /// The window handle + /// HRESULT + [PreserveSig] + uint ShowShareUIForWindow(IntPtr appWindow); + } + +} diff --git a/GreenshotWin10Plugin/Win10OcrDestination.cs b/GreenshotWin10Plugin/Win10OcrDestination.cs index 9b2730455..e12bcf0fc 100644 --- a/GreenshotWin10Plugin/Win10OcrDestination.cs +++ b/GreenshotWin10Plugin/Win10OcrDestination.cs @@ -39,6 +39,9 @@ namespace GreenshotWin10Plugin public override string Designation { get; } = "OCR"; public override string Description { get; } = "Windows 10 OCR"; + /// + /// Constructor, this is only debug information + /// public Win10OcrDestination() { var languages = OcrEngine.AvailableRecognizerLanguages; @@ -58,7 +61,7 @@ namespace GreenshotWin10Plugin /// ExportInformation public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { - ExportInformation exportInformation = new ExportInformation(Designation, Description); + var exportInformation = new ExportInformation(Designation, Description); try { var text = Task.Run(async () => @@ -76,7 +79,13 @@ namespace GreenshotWin10Plugin return ocrResult.Text; } }).Result; - ClipboardHelper.SetClipboardData(text); + + // Check if we found text + if (!string.IsNullOrWhiteSpace(text)) + { + // Place the OCR text on the + ClipboardHelper.SetClipboardData(text); + } exportInformation.ExportMade = true; } catch (Exception ex) diff --git a/GreenshotWin10Plugin/Win10Plugin.cs b/GreenshotWin10Plugin/Win10Plugin.cs index 38826a0cf..527411d8f 100644 --- a/GreenshotWin10Plugin/Win10Plugin.cs +++ b/GreenshotWin10Plugin/Win10Plugin.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using Greenshot.Plugin; +using GreenshotPlugin.Core; namespace GreenshotWin10Plugin { @@ -48,9 +49,18 @@ namespace GreenshotWin10Plugin throw new NotImplementedException(); } + /// + /// yields the windows 10 destinations if Windows 10 is detected + /// + /// IEnumerable with the destinations public IEnumerable Destinations() { + if (!Environment.OSVersion.IsWindows10()) + { + yield break; + } yield return new Win10OcrDestination(); + yield return new Win10ShareDestination(); } public IEnumerable Processors() diff --git a/GreenshotWin10Plugin/Win10ShareDestination.cs b/GreenshotWin10Plugin/Win10ShareDestination.cs new file mode 100644 index 000000000..5eb16487c --- /dev/null +++ b/GreenshotWin10Plugin/Win10ShareDestination.cs @@ -0,0 +1,146 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 Windows.Storage.Streams; +using Greenshot.Plugin; +using GreenshotPlugin.Core; +using GreenshotWin10Plugin.Native; +using System.Threading.Tasks; +using Color = Windows.UI.Color; + +namespace GreenshotWin10Plugin +{ + /// + /// This uses the Share from Windows 10 to make the capture available to apps. + /// + public class Win10ShareDestination : AbstractDestination + { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10ShareDestination)); + + public override string Designation { get; } = "Share"; + public override string Description { get; } = "Windows 10 share"; + + /// + /// Share the screenshot with a windows app + /// + /// + /// + /// + /// ExportInformation + public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) + { + var exportInformation = new ExportInformation(Designation, Description); + try + { + var handle = PluginUtils.Host.GreenshotForm.Handle; + + var exportTarget = Task.Run(async () => + { + var taskCompletionSource = new TaskCompletionSource(); + + using (var imageStream = new MemoryRandomAccessStream()) + using (var logoStream = new MemoryRandomAccessStream()) + using (var thumbnailStream = new MemoryRandomAccessStream()) + { + // Create capture for export + ImageOutput.SaveToStream(surface, imageStream, new SurfaceOutputSettings()); + imageStream.Position = 0; + var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); + RandomAccessStreamReference thumbnailRandomAccessStreamReference; + RandomAccessStreamReference logoRandomAccessStreamReference; + + // Create thumbnail + using (var tmpImageForThumbnail = surface.GetImageForExport()) + { + using (var thumbnail = ImageHelper.CreateThumbnail(tmpImageForThumbnail, 240, 160)) + { + ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, new SurfaceOutputSettings()); + thumbnailStream.Position = 0; + thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); + } + } + // Create logo + using (var logo = GreenshotResources.getGreenshotIcon().ToBitmap()) + { + using (var logoThumbnail = ImageHelper.CreateThumbnail(logo, 30, 30)) + { + ImageOutput.SaveToStream(logoThumbnail, null, logoStream, new SurfaceOutputSettings()); + logoStream.Position = 0; + logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); + } + } + string applicationName = null; + var dataTransferManagerHelper = new DataTransferManagerHelper(handle); + dataTransferManagerHelper.DataTransferManager.TargetApplicationChosen += (dtm, args) => + { + Log.DebugFormat("Trying to share with {0}", args.ApplicationName); + applicationName = args.ApplicationName; + }; + dataTransferManagerHelper.DataTransferManager.DataRequested += (sender, args) => + { + var deferral = args.Request.GetDeferral(); + args.Request.Data.OperationCompleted += (dp, eventArgs) => + { + Log.DebugFormat("OperationCompleted: {0}, shared with", eventArgs.Operation); + taskCompletionSource.TrySetResult(applicationName); + }; + var dataPackage = args.Request.Data; + dataPackage.Properties.Title = captureDetails.Title; + dataPackage.Properties.ApplicationName = "Greenshot"; + dataPackage.Properties.Description = "Share a screenshot"; + dataPackage.Properties.Thumbnail = thumbnailRandomAccessStreamReference; + dataPackage.Properties.Square30x30Logo = logoRandomAccessStreamReference; + dataPackage.Properties.LogoBackgroundColor = Color.FromArgb(0xff, 0x3d, 0x3d, 0x3d); + dataPackage.SetBitmap(imageRandomAccessStreamReference); + dataPackage.Destroyed += (dp, o) => + { + Log.Debug("Destroyed."); + taskCompletionSource.TrySetCanceled(); + }; + deferral.Complete(); + }; + dataTransferManagerHelper.ShowShareUi(); + return await taskCompletionSource.Task; + } + }).Result; + if (string.IsNullOrWhiteSpace(exportTarget)) + { + exportInformation.ExportMade = false; + } + else + { + exportInformation.ExportMade = true; + exportInformation.DestinationDescription = exportTarget; + } + } + catch (Exception ex) + { + exportInformation.ExportMade = false; + exportInformation.ErrorMessage = ex.Message; + } + + ProcessExport(exportInformation, surface); + return exportInformation; + + } + } +} From 3b214133e46730ffbfbf9076f4f3e5b4fe2134fb Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 29 Sep 2016 18:10:32 +0200 Subject: [PATCH 123/170] BUG-2037: Added a small fix to improve the ini stability, also added some other small changes which were pending. --- .../GreenshotJiraPlugin.csproj | 8 +-- GreenshotJiraPlugin/packages.config | 4 +- GreenshotPlugin/IniFile/IniConfig.cs | 20 +++--- GreenshotPlugin/IniFile/IniReader.cs | 69 +++++++++++-------- GreenshotPlugin/UnmanagedHelpers/GDI32.cs | 2 +- 5 files changed, 57 insertions(+), 46 deletions(-) diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index bb3f82676..af2e4453c 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -34,12 +34,12 @@ - - ..\packages\Dapplo.HttpExtensions.0.5.36\lib\net45\Dapplo.HttpExtensions.dll + + ..\packages\Dapplo.HttpExtensions.0.5.43\lib\net45\Dapplo.HttpExtensions.dll True - - ..\packages\Dapplo.Jira.0.1.61\lib\net45\Dapplo.Jira.dll + + ..\packages\Dapplo.Jira.0.1.65\lib\net45\Dapplo.Jira.dll True diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index bd1287f70..bfe2a551d 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -1,7 +1,7 @@  - - + + diff --git a/GreenshotPlugin/IniFile/IniConfig.cs b/GreenshotPlugin/IniFile/IniConfig.cs index 3869640f0..8ac27deca 100644 --- a/GreenshotPlugin/IniFile/IniConfig.cs +++ b/GreenshotPlugin/IniFile/IniConfig.cs @@ -51,17 +51,17 @@ namespace Greenshot.IniFile { /// /// A Dictionary with all the sections stored by section name /// - private static readonly Dictionary SectionMap = new Dictionary(); + private static readonly IDictionary SectionMap = new Dictionary(); /// /// A Dictionary with the properties for a section stored by section name /// - private static Dictionary> _sections = new Dictionary>(); + private static IDictionary> _sections = new Dictionary>(); /// /// A Dictionary with the fixed-properties for a section stored by section name /// - private static Dictionary> _fixedProperties; + private static IDictionary> _fixedProperties; /// /// Stores if we checked for portable @@ -231,7 +231,7 @@ namespace Greenshot.IniFile { /// public static void Reload() { // Clear the current properties - _sections = new Dictionary>(); + _sections = new Dictionary>(); // Load the defaults Read(CreateIniLocation(_configName + DefaultsPostfix + IniExtension, true)); // Load the normal @@ -264,7 +264,7 @@ namespace Greenshot.IniFile { { return; } - Dictionary fixedPropertiesForSection; + IDictionary fixedPropertiesForSection; if (!_fixedProperties.TryGetValue(section.IniSectionAttribute.Name, out fixedPropertiesForSection)) { return; @@ -280,23 +280,23 @@ namespace Greenshot.IniFile { /// Read the ini file into the Dictionary /// /// Path & Filename of ini file - private static Dictionary> Read(string iniLocation) { + private static IDictionary> Read(string iniLocation) { if (!File.Exists(iniLocation)) { Log.Info("Can't find file: " + iniLocation); return null; } Log.InfoFormat("Loading ini-file: {0}", iniLocation); //LOG.Info("Reading ini-properties from file: " + iniLocation); - Dictionary> newSections = IniReader.read(iniLocation, Encoding.UTF8); + var newSections = IniReader.Read(iniLocation, Encoding.UTF8); // Merge the newly loaded properties to the already available foreach(string section in newSections.Keys) { - Dictionary newProperties = newSections[section]; + IDictionary newProperties = newSections[section]; if (!_sections.ContainsKey(section)) { // This section is not yet loaded, simply add the complete section _sections.Add(section, newProperties); } else { // Overwrite or add every property from the newly loaded section to the available one - Dictionary currentProperties = _sections[section]; + var currentProperties = _sections[section]; foreach(string propertyName in newProperties.Keys) { string propertyValue = newProperties[propertyName]; if (currentProperties.ContainsKey(propertyName)) { @@ -446,7 +446,7 @@ namespace Greenshot.IniFile { writer.WriteLine("; The reason could be that the section {0} just hasn't been used, a plugin has an error and can't claim it or maybe the whole section {0} is obsolete.", sectionName); // Write section name writer.WriteLine("[{0}]", sectionName); - Dictionary properties = _sections[sectionName]; + var properties = _sections[sectionName]; // Loop and write properties foreach (string propertyName in properties.Keys) { writer.WriteLine("{0}={1}", propertyName, properties[propertyName]); diff --git a/GreenshotPlugin/IniFile/IniReader.cs b/GreenshotPlugin/IniFile/IniReader.cs index 23346f605..96db00760 100644 --- a/GreenshotPlugin/IniFile/IniReader.cs +++ b/GreenshotPlugin/IniFile/IniReader.cs @@ -24,40 +24,51 @@ using System.IO; using System.Text; namespace Greenshot.IniFile { + /// + /// + /// public static class IniReader { - private const string SECTION_START = "["; - private const string SECTION_END = "]"; - private const string COMMENT = ";"; - private static readonly char[] ASSIGNMENT = new[] { '=' }; + private const string SectionStart = "["; + private const string SectionEnd = "]"; + private const string Comment = ";"; + private static readonly char[] Assignment = { '=' }; - /** - * Read an ini file to a Dictionary, each key is a section and the value is a Dictionary with name and values. - */ - public static Dictionary> read(string path, Encoding encoding) { - Dictionary> ini = new Dictionary>(); - using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 1024)) { - using (StreamReader reader = new StreamReader(fileStream, encoding)) { - Dictionary nameValues = new Dictionary(); - while (!reader.EndOfStream) { - string line = reader.ReadLine(); - if (line != null) { - string cleanLine = line.Trim(); - if (cleanLine.Length == 0 || cleanLine.StartsWith(COMMENT)) { - continue; - } - if (cleanLine.StartsWith(SECTION_START)) { - string section = line.Replace(SECTION_START, "").Replace(SECTION_END, "").Trim(); + /// + /// Read an ini file to a Dictionary, each key is a section and the value is a Dictionary with name and values. + /// + /// + /// + /// + public static IDictionary> Read(string path, Encoding encoding) { + var ini = new Dictionary>(); + using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 1024)) { + using (var streamReader = new StreamReader(fileStream, encoding)) { + IDictionary nameValues = new Dictionary(); + while (!streamReader.EndOfStream) { + string line = streamReader.ReadLine(); + if (line == null) + { + continue; + } + string cleanLine = line.Trim(); + if (cleanLine.Length == 0 || cleanLine.StartsWith(Comment)) { + continue; + } + if (cleanLine.StartsWith(SectionStart)) { + string section = line.Replace(SectionStart, string.Empty).Replace(SectionEnd, string.Empty).Trim(); + if (!ini.TryGetValue(section, out nameValues)) + { nameValues = new Dictionary(); ini.Add(section, nameValues); + } + } else { + string[] keyvalueSplitter = line.Split(Assignment, 2); + string name = keyvalueSplitter[0]; + string inivalue = keyvalueSplitter.Length > 1 ? keyvalueSplitter[1] : null; + if (nameValues.ContainsKey(name)) { + nameValues[name] = inivalue; } else { - string[] keyvalueSplitter = line.Split(ASSIGNMENT, 2); - string name = keyvalueSplitter[0]; - string inivalue = keyvalueSplitter.Length > 1 ? keyvalueSplitter[1] : null; - if (nameValues.ContainsKey(name)) { - nameValues[name] = inivalue; - } else { - nameValues.Add(name, inivalue); - } + nameValues.Add(name, inivalue); } } } diff --git a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs index f3411e245..9176b21df 100644 --- a/GreenshotPlugin/UnmanagedHelpers/GDI32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/GDI32.cs @@ -369,7 +369,7 @@ namespace GreenshotPlugin.UnmanagedHelpers { bV5GreenMask = (uint)255 << 8; bV5BlueMask = 255; bV5AlphaMask = (uint)255 << 24; - bV5CSType = 1934772034; // sRGB + bV5CSType = 0x73524742; // LCS_sRGB bV5Endpoints = new CIEXYZTRIPLE { ciexyzBlue = new CIEXYZ(0), From 243a3e1418de6acd3b340dc2139833870a10e65f Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 30 Sep 2016 22:59:20 +0200 Subject: [PATCH 124/170] Made the sharing also work via a file, which is accepted by more apps. --- GreenshotWin10Plugin/Win10ShareDestination.cs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/GreenshotWin10Plugin/Win10ShareDestination.cs b/GreenshotWin10Plugin/Win10ShareDestination.cs index 5eb16487c..758eab6da 100644 --- a/GreenshotWin10Plugin/Win10ShareDestination.cs +++ b/GreenshotWin10Plugin/Win10ShareDestination.cs @@ -20,12 +20,15 @@ */ using System; +using System.IO; using Windows.Storage.Streams; using Greenshot.Plugin; using GreenshotPlugin.Core; using GreenshotWin10Plugin.Native; using System.Threading.Tasks; +using Windows.Storage; using Color = Windows.UI.Color; +using System.Collections.Generic; namespace GreenshotWin10Plugin { @@ -95,6 +98,28 @@ namespace GreenshotWin10Plugin Log.DebugFormat("Trying to share with {0}", args.ApplicationName); applicationName = args.ApplicationName; }; + var filename = FilenameHelper.GetFilename(OutputFormat.png, captureDetails); + var storageFile = await StorageFile.CreateStreamedFileAsync(filename, async streamedFileDataRequest => + { + Log.DebugFormat("Creating deferred file {0}", filename); + try + { + using (var deferredStream = streamedFileDataRequest.AsStreamForWrite()) + { + await imageStream.CopyToAsync(deferredStream); + await imageStream.FlushAsync(); + } + // Signal that the stream is ready + streamedFileDataRequest.Dispose(); + } + catch (Exception) + { + streamedFileDataRequest.FailAndClose(StreamedFileFailureMode.Incomplete); + } + // Signal transfer ready + taskCompletionSource.TrySetResult(applicationName); + }, imageRandomAccessStreamReference); + dataTransferManagerHelper.DataTransferManager.DataRequested += (sender, args) => { var deferral = args.Request.GetDeferral(); @@ -110,11 +135,11 @@ namespace GreenshotWin10Plugin dataPackage.Properties.Thumbnail = thumbnailRandomAccessStreamReference; dataPackage.Properties.Square30x30Logo = logoRandomAccessStreamReference; dataPackage.Properties.LogoBackgroundColor = Color.FromArgb(0xff, 0x3d, 0x3d, 0x3d); - dataPackage.SetBitmap(imageRandomAccessStreamReference); + dataPackage.SetStorageItems(new List { storageFile }); + //dataPackage.SetBitmap(imageRandomAccessStreamReference); dataPackage.Destroyed += (dp, o) => { Log.Debug("Destroyed."); - taskCompletionSource.TrySetCanceled(); }; deferral.Complete(); }; From cab0f21e266dc89c799dfb523d54030352c6e812 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 1 Oct 2016 22:22:32 +0200 Subject: [PATCH 125/170] OCR Code cleanup, preparing for adding the word-rectangles to assist other Greenshot functionality (like blur/pixelate etc) --- GreenshotOCRCommand/COMWrapper.cs | 54 ++++++----- GreenshotOCRCommand/ComProgIdAttribute.cs | 1 + .../GreenshotOCRCommand.csproj | 15 ++- GreenshotOCRCommand/IDispatch.cs | 12 --- GreenshotOCRCommand/Modi/CompressionLevel.cs | 29 ++++++ GreenshotOCRCommand/Modi/FileFormat.cs | 30 ++++++ GreenshotOCRCommand/Modi/ICommon.cs | 32 ++++++ GreenshotOCRCommand/Modi/IDispatch.cs | 33 +++++++ GreenshotOCRCommand/Modi/IDocument.cs | 82 ++++++++++++++++ GreenshotOCRCommand/Modi/IImage.cs | 41 ++++++++ GreenshotOCRCommand/Modi/IImages.cs | 41 ++++++++ GreenshotOCRCommand/Modi/ILayout.cs | 55 +++++++++++ GreenshotOCRCommand/Modi/IMiRect.cs | 48 +++++++++ GreenshotOCRCommand/Modi/IMiRects.cs | 38 ++++++++ GreenshotOCRCommand/Modi/IWord.cs | 65 +++++++++++++ GreenshotOCRCommand/Modi/IWords.cs | 43 ++++++++ .../{ModiInterop.cs => Modi/ModiLanguage.cs} | 64 ++---------- GreenshotOCRCommand/Program.cs | 97 +++++++++++++++---- GreenshotWin10Plugin/Win10ShareDestination.cs | 3 +- 19 files changed, 672 insertions(+), 111 deletions(-) delete mode 100644 GreenshotOCRCommand/IDispatch.cs create mode 100644 GreenshotOCRCommand/Modi/CompressionLevel.cs create mode 100644 GreenshotOCRCommand/Modi/FileFormat.cs create mode 100644 GreenshotOCRCommand/Modi/ICommon.cs create mode 100644 GreenshotOCRCommand/Modi/IDispatch.cs create mode 100644 GreenshotOCRCommand/Modi/IDocument.cs create mode 100644 GreenshotOCRCommand/Modi/IImage.cs create mode 100644 GreenshotOCRCommand/Modi/IImages.cs create mode 100644 GreenshotOCRCommand/Modi/ILayout.cs create mode 100644 GreenshotOCRCommand/Modi/IMiRect.cs create mode 100644 GreenshotOCRCommand/Modi/IMiRects.cs create mode 100644 GreenshotOCRCommand/Modi/IWord.cs create mode 100644 GreenshotOCRCommand/Modi/IWords.cs rename GreenshotOCRCommand/{ModiInterop.cs => Modi/ModiLanguage.cs} (53%) diff --git a/GreenshotOCRCommand/COMWrapper.cs b/GreenshotOCRCommand/COMWrapper.cs index 67ef5fad9..4d9d7f11b 100644 --- a/GreenshotOCRCommand/COMWrapper.cs +++ b/GreenshotOCRCommand/COMWrapper.cs @@ -19,6 +19,7 @@ * along with this program. If not, see . */ using System; +using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.Remoting; @@ -79,13 +80,16 @@ namespace Greenshot.Interop { try { comObject = Marshal.GetActiveObject(progId); } catch (COMException comE) { - if (comE.ErrorCode == MK_E_UNAVAILABLE) { - //LOG.DebugFormat("No current instance of {0} object available.", progId); - } else if (comE.ErrorCode == CO_E_CLASSSTRING) { - //LOG.WarnFormat("Unknown progId {0}", progId); + if (comE.ErrorCode == MK_E_UNAVAILABLE) + { + Debug.WriteLine($"No current instance of {progId} object available."); } - } catch (Exception) { - //LOG.Warn("Error getting active object for " + progId, e); + else if (comE.ErrorCode == CO_E_CLASSSTRING) + { + Debug.WriteLine($"Unknown progId {progId}"); + } + } catch (Exception ex) { + Debug.WriteLine($"Error getting active object for {progId} {ex.Message}"); } if (comObject != null) { @@ -123,30 +127,32 @@ namespace Greenshot.Interop { try { comObject = Marshal.GetActiveObject(progId); } catch (COMException comE) { - if (comE.ErrorCode == MK_E_UNAVAILABLE) { - //LOG.DebugFormat("No current instance of {0} object available.", progId); - } else if (comE.ErrorCode == CO_E_CLASSSTRING) { - //LOG.WarnFormat("Unknown progId {0} (application not installed)", progId); - return default(T); + if (comE.ErrorCode == MK_E_UNAVAILABLE) + { + Debug.WriteLine($"No current instance of {progId} object available."); } - } catch (Exception) { - //LOG.Warn("Error getting active object for " + progId, e); + else if (comE.ErrorCode == CO_E_CLASSSTRING) + { + Debug.WriteLine($"Unknown progId {progId}"); + } + } catch (Exception ex) { + Debug.WriteLine($"Error getting active object for {progId} {ex.Message}"); } // Did we get the current instance? If not, try to create a new if (comObject == null) { try { comType = Type.GetTypeFromProgID(progId, true); } catch (Exception) { - //LOG.Warn("Error type for " + progId, ex); + Debug.WriteLine($"Error getting type for {progId}"); } if (comType != null) { try { comObject = Activator.CreateInstance(comType); if (comObject != null) { - //LOG.DebugFormat("Created new instance of {0} object.", progId); + Debug.WriteLine($"Created new instance of {progId} object."); } - } catch (Exception) { - //LOG.Warn("Error creating object for " + progId, e); + } catch (Exception ex) { + Debug.WriteLine($"Error creating object for {progId} {ex.Message}"); } } } @@ -225,9 +231,9 @@ namespace Greenshot.Interop { while (Marshal.ReleaseComObject(_comObject) > 0) { } - } catch (Exception) { - //LOG.WarnFormat("Problem releasing {0}", _COMType); - //LOG.Warn("Error: ", ex); + } catch (Exception ex) { + Debug.WriteLine($"Problem releasing {_comType}"); + Debug.WriteLine("Error: " + ex); } } } @@ -318,8 +324,12 @@ namespace Greenshot.Interop { IMethodCallMessage callMessage = myMessage as IMethodCallMessage; MethodInfo method = callMessage?.MethodBase as MethodInfo; - if (method == null) { - //LOG.DebugFormat("Unrecognized Invoke call: {0}", callMessage.MethodBase.ToString()); + if (method == null) + { + if (callMessage != null) + { + Debug.WriteLine($"Unrecognized Invoke call: {callMessage.MethodBase}"); + } return null; } diff --git a/GreenshotOCRCommand/ComProgIdAttribute.cs b/GreenshotOCRCommand/ComProgIdAttribute.cs index 893db2fcb..05fd69237 100644 --- a/GreenshotOCRCommand/ComProgIdAttribute.cs +++ b/GreenshotOCRCommand/ComProgIdAttribute.cs @@ -18,6 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + using System; namespace Greenshot.Interop { diff --git a/GreenshotOCRCommand/GreenshotOCRCommand.csproj b/GreenshotOCRCommand/GreenshotOCRCommand.csproj index bf34f8d0e..b9645113d 100644 --- a/GreenshotOCRCommand/GreenshotOCRCommand.csproj +++ b/GreenshotOCRCommand/GreenshotOCRCommand.csproj @@ -53,10 +53,21 @@ + + - - + + + + + + + + + + + diff --git a/GreenshotOCRCommand/IDispatch.cs b/GreenshotOCRCommand/IDispatch.cs deleted file mode 100644 index 8df4cc022..000000000 --- a/GreenshotOCRCommand/IDispatch.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.CustomMarshalers; - -namespace Greenshot.Interop { - [ComImport, Guid("00020400-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - public interface IDispatch { - void Reserved(); - [PreserveSig] - int GetTypeInfo(uint nInfo, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))] out Type typeInfo); - } -} diff --git a/GreenshotOCRCommand/Modi/CompressionLevel.cs b/GreenshotOCRCommand/Modi/CompressionLevel.cs new file mode 100644 index 000000000..a8bc9e34a --- /dev/null +++ b/GreenshotOCRCommand/Modi/CompressionLevel.cs @@ -0,0 +1,29 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotOCRCommand.Modi +{ + public enum CompressionLevel { + miCOMP_LEVEL_LOW = 0, + miCOMP_LEVEL_MEDIUM = 1, + miCOMP_LEVEL_HIGH = 2 + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/FileFormat.cs b/GreenshotOCRCommand/Modi/FileFormat.cs new file mode 100644 index 000000000..cbf061333 --- /dev/null +++ b/GreenshotOCRCommand/Modi/FileFormat.cs @@ -0,0 +1,30 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 +{ + public enum FileFormat { + miFILE_FORMAT_DEFAULTVALUE = -1, + miFILE_FORMAT_TIFF = 1, + miFILE_FORMAT_TIFF_LOSSLESS = 2, + miFILE_FORMAT_MDI = 4 + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/ICommon.cs b/GreenshotOCRCommand/Modi/ICommon.cs new file mode 100644 index 000000000..ecdf4052d --- /dev/null +++ b/GreenshotOCRCommand/Modi/ICommon.cs @@ -0,0 +1,32 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotOCRCommand.Modi +{ + /// + /// Base class for the common properties of the Modi interfaces + /// + public interface ICommon : IDisposable { + IDocument Application { get; } + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/IDispatch.cs b/GreenshotOCRCommand/Modi/IDispatch.cs new file mode 100644 index 000000000..22235153d --- /dev/null +++ b/GreenshotOCRCommand/Modi/IDispatch.cs @@ -0,0 +1,33 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.InteropServices; +using System.Runtime.InteropServices.CustomMarshalers; + +namespace GreenshotOCRCommand.Modi { + [ComImport, Guid("00020400-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IDispatch { + void Reserved(); + [PreserveSig] + int GetTypeInfo(uint nInfo, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))] out Type typeInfo); + } +} diff --git a/GreenshotOCRCommand/Modi/IDocument.cs b/GreenshotOCRCommand/Modi/IDocument.cs new file mode 100644 index 000000000..7913ece5f --- /dev/null +++ b/GreenshotOCRCommand/Modi/IDocument.cs @@ -0,0 +1,82 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 Greenshot.Interop; +using GreenshotOCR; + +namespace GreenshotOCRCommand.Modi { + /// + /// The MODI Document object represents an ordered collection of document images saved as a single file. + /// You can use the Create method to load an existing MDI or TIF file, or to create an empty document that you can populate with images from other documents. + /// The OCR method performs OCR on all pages in the document, and the OnOCRProgress event reports the status of the operation and allows the user to cancel it. + /// The Dirty property lets you know whether your document has unsaved OCR results or changes. + /// The SaveAs method allows you to specify an image file format and a compression level. + /// You can also use the PrintOut method to print the document to a printer or a file. + /// + [ComProgId("MODI.Document")] + public interface IDocument : ICommon { + /// + /// Closes the document. + /// + /// + void Close(bool saveCall); + + /// + /// The document's collection of pages. + /// + IImages Images + { + get; + } + + /// + /// Occurs periodically during an optical character recognition (OCR) operation. Returns the estimated percentage of the OCR operation that is complete, and allows the user to cancel the operation. + /// + // event OnOCRProgress { get; } + + /// + /// Indicates whether the active document has unsaved changes. + /// + bool Dirty { get; } + + /// + /// Creates a new document. + /// + /// Optional String. The path and filename of the optional document file that is to be loaded into the new document. + void Create(string file); + + /// + /// Performs optical character recognition (OCR) on the specified document or image. + /// + /// ModiLanguage + /// Optional Boolean. Specifies whether the OCR engine attempts to determine the orientation of the page. Default is true. + /// Optional Boolean. Specifies whether the OCR engine attempts to "de-skew" the page to correct for small angles of misalignment from the vertical. Default is true. + void OCR(ModiLanguage language, bool orientimage, bool straightenImage); + + /// + /// + /// + /// + /// + /// + void SaveAs(string filename, FileFormat fileFormat, CompressionLevel compressionLevel); + } +} diff --git a/GreenshotOCRCommand/Modi/IImage.cs b/GreenshotOCRCommand/Modi/IImage.cs new file mode 100644 index 000000000..fd7dd3c06 --- /dev/null +++ b/GreenshotOCRCommand/Modi/IImage.cs @@ -0,0 +1,41 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotOCRCommand.Modi +{ + /// + /// Describes the page in a scan + /// + public interface IImage : ICommon { + ILayout Layout { + get; + } + + long BitsPerPixel { get; } + CompressionLevel Compression { get; } + //IPictureDisp Picture { get; } + int PixelHeight { get; } + int PixelWidth { get; } + //IPictureDisp Thumbnail { get; } + int XDPI { get; } + int YDPI { get; } + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/IImages.cs b/GreenshotOCRCommand/Modi/IImages.cs new file mode 100644 index 000000000..885dd1bba --- /dev/null +++ b/GreenshotOCRCommand/Modi/IImages.cs @@ -0,0 +1,41 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Collections; + +namespace GreenshotOCRCommand.Modi +{ + /// + /// Use the Images accessor property of the Document object to return an Images collection. + /// Use the Item property of the Images collection to return an Image object and gain access to its OCR Layout + /// (including recognized Text and Words), the properties that describe its dimensions and format (BitsPerPixel, Compression, PixelHeight, PixelWidth, XDPI, and YDPI), + /// and its Picture and Thumbnail images. + /// + public interface IImages : ICommon, IEnumerable { + int Count { + get; + } + IImage this [int index] { + get; + } + new IEnumerator GetEnumerator(); + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/ILayout.cs b/GreenshotOCRCommand/Modi/ILayout.cs new file mode 100644 index 000000000..ca7b43322 --- /dev/null +++ b/GreenshotOCRCommand/Modi/ILayout.cs @@ -0,0 +1,55 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotOCRCommand.Modi +{ + /// + /// Layout of the IImage + /// + public interface ILayout : ICommon { + /// + /// Returns the recognized text as a Unicode string. + /// + string Text { + get; + } + + /// + /// An accessor property that returns the Words collection recognized in the text during an optical character recognition (OCR) operation. + /// + IWords Words { get; } + + /// + /// Returns the number of characters in the recognized text. + /// + int NumChars { get; } + + /// + /// Returns the number of words in the recognized text. + /// + int NumWords { get; } + + /// + /// Returns the language identifier for the recognized text. Read-only Long. + /// + ModiLanguage Language { get; } + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/IMiRect.cs b/GreenshotOCRCommand/Modi/IMiRect.cs new file mode 100644 index 000000000..18ac6b0e8 --- /dev/null +++ b/GreenshotOCRCommand/Modi/IMiRect.cs @@ -0,0 +1,48 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotOCRCommand.Modi +{ + /// + /// Represents a bounding rectangle in the optical character recognition (OCR) layout. + /// + public interface IMiRect : ICommon { + /// + /// The Bottom property represent the distance in pixels from the top edge of the containing image. + /// + int Bottom { get; } + + /// + /// The Left property represent the distance in pixels from the left edge of the containing image. + /// + int Left { get; } + + /// + /// The Right property represent the distance in pixels from the left edge of the containing image. + /// + int Right { get; } + + /// + /// The Top property represent the distance in pixels from the top edge of the containing image. + /// + int Top { get; } + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/IMiRects.cs b/GreenshotOCRCommand/Modi/IMiRects.cs new file mode 100644 index 000000000..9981bdd5f --- /dev/null +++ b/GreenshotOCRCommand/Modi/IMiRects.cs @@ -0,0 +1,38 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Collections; + +namespace GreenshotOCRCommand.Modi +{ + /// + /// Represents the collection of bounding rectangles in the optical character recognition (OCR) layout. A collection of MiRect objects. + /// + public interface IMiRects : ICommon, IEnumerable { + int Count { + get; + } + IMiRect this [int index] { + get; + } + new IEnumerator GetEnumerator(); + } +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Modi/IWord.cs b/GreenshotOCRCommand/Modi/IWord.cs new file mode 100644 index 000000000..8e7895f8c --- /dev/null +++ b/GreenshotOCRCommand/Modi/IWord.cs @@ -0,0 +1,65 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 GreenshotOCRCommand.Modi +{ + /// + /// Represents a word recognized in the text during an optical character recognition (OCR) operation. + /// + public interface IWord : ICommon + { + /// + /// Returns the index of the specified word in the Words collection of the Layout or IMiSelectableItem object. + /// + long Id { get; } + + /// + /// Returns the number of the region in the optical character recognition (OCR) layout where the word occurs. + /// + long RegionId { get; } + + /// + /// Returns the number of the line in the optical character recognition (OCR) layout where the word occurs. + /// + long LineId { get; } + + /// + /// Returns the recognized text as a Unicode string. + /// + string Text { get; } + + /// + /// Returns the relative confidence factor reported by the optical character recognition (OCR) engine (on a scale of 0 to 999) after recognizing the specified word. + /// + short RecognitionConfidence { get; } + + /// + /// Returns the index of the font used by the specified wordthis is the font that was recognized in the text during an optical character recognition (OCR) operation. + /// + long FontId { get; } + + /// + /// Rectangles + /// + IMiRects Rects { get; } + + } +} diff --git a/GreenshotOCRCommand/Modi/IWords.cs b/GreenshotOCRCommand/Modi/IWords.cs new file mode 100644 index 000000000..b26b6f0c3 --- /dev/null +++ b/GreenshotOCRCommand/Modi/IWords.cs @@ -0,0 +1,43 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.Collections; + +namespace GreenshotOCRCommand.Modi +{ + /// + /// The Words collection recognized in the text during an optical character recognition (OCR) operation. + /// + public interface IWords : ICommon, IEnumerable + { + int Count + { + get; + } + + IWord this[int index] + { + get; + } + + new IEnumerator GetEnumerator(); + } +} diff --git a/GreenshotOCRCommand/ModiInterop.cs b/GreenshotOCRCommand/Modi/ModiLanguage.cs similarity index 53% rename from GreenshotOCRCommand/ModiInterop.cs rename to GreenshotOCRCommand/Modi/ModiLanguage.cs index be861b808..d062a4cb9 100644 --- a/GreenshotOCRCommand/ModiInterop.cs +++ b/GreenshotOCRCommand/Modi/ModiLanguage.cs @@ -1,64 +1,26 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/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 Greenshot.Interop; - -namespace GreenshotOCR { - [ComProgId("MODI.Document")] - public interface ModiDocu : Common { - void Close(bool SaveCall); - IImages Images{ - get; - } - void Create(string file); - void OCR(ModiLanguage language, bool Orientimage, bool StraightenImage); - void SaveAs(string filename, FileFormat fileFormat, CompressionLevel compressionLevel); - } - - public interface Common : IDisposable { - ModiDocu Application { get; } - } - - public interface ILayout : Common{ - string Text { - get; - } - } - public interface IImage : Common { - ILayout Layout { - get; - } - } - - public interface IImages : Common, IEnumerable{ - int Count { - get; - } - IImage this [int index] { - get; - } - new IEnumerator GetEnumerator(); - } +namespace GreenshotOCRCommand.Modi +{ public enum ModiLanguage { CHINESE_SIMPLIFIED = 2052, CHINESE_TRADITIONAL = 1028, @@ -83,16 +45,4 @@ namespace GreenshotOCR { TURKISH = 31, SYSDEFAULT = 2048 } - - public enum CompressionLevel { - miCOMP_LEVEL_LOW = 0, - miCOMP_LEVEL_MEDIUM = 1, - miCOMP_LEVEL_HIGH = 2 - } - public enum FileFormat { - miFILE_FORMAT_DEFAULTVALUE = -1, - miFILE_FORMAT_TIFF = 1, - miFILE_FORMAT_TIFF_LOSSLESS = 2, - miFILE_FORMAT_MDI = 4 - } -} +} \ No newline at end of file diff --git a/GreenshotOCRCommand/Program.cs b/GreenshotOCRCommand/Program.cs index eb8033856..6f7fe33a1 100644 --- a/GreenshotOCRCommand/Program.cs +++ b/GreenshotOCRCommand/Program.cs @@ -1,16 +1,37 @@ -using System; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/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.IO; using Greenshot.Interop; -using GreenshotOCR; +using GreenshotOCRCommand.Modi; namespace GreenshotOCRCommand { public class Program { - private const string USAGE = "<-c> | [language] [orientimage] [straightenImage]"; + private const string Usage = "<-c> | [language] [orientimage] [straightenImage]"; public static int Main(string[] args) { - // to test - //args = new string[] { @"C:\localdata\test.bmp"}; if (args.Length == 0) { - Console.WriteLine(USAGE); + Console.WriteLine(Usage); return -1; } string filename = args[0]; @@ -28,25 +49,43 @@ namespace GreenshotOCRCommand { } try { if (File.Exists(filename) || "-c".Equals(filename)) { - using (ModiDocu modiDocument = COMWrapper.GetOrCreateInstance()) { - if (modiDocument == null) { + using (var document = COMWrapper.GetOrCreateInstance()) { + if (document == null) { Console.WriteLine("MODI not installed"); return -2; } if ("-c".Equals(filename)) { return 0; } - modiDocument.Create(filename); - modiDocument.OCR(language, orientimage, straightenImage); - IImage modiImage = modiDocument.Images[0]; - ILayout layout = modiImage.Layout; - if (layout.Text != null) + document.Create(filename); + document.OCR(language, orientimage, straightenImage); + var modiImage = document.Images[0]; + var layout = modiImage.Layout; + if (layout != null) { - // For for BUG-1884: - // Although this is done in the OCR Plugin, it does make sense in the command too. - Console.WriteLine(layout.Text.Trim()); +#if DEBUG + if (layout.Words != null) + { + foreach (var word in ToEnumerable(layout.Words)) + { + if (word.Rects != null) + { + foreach (var rect in ToEnumerable(word.Rects)) + { + Debug.WriteLine($"Rect {rect.Left},{rect.Top},{rect.Right},{rect.Bottom} - Word {word.Text} : Confidence: {word.RecognitionConfidence}"); + } + } + } + } +#endif + if (layout.Text != null) + { + // For for BUG-1884: + // Although trim is done in the OCR Plugin, it does make sense in the command too. + Console.WriteLine(layout.Text.Trim()); + } } - modiDocument.Close(false); + document.Close(false); return 0; } } @@ -55,5 +94,29 @@ namespace GreenshotOCRCommand { } return -1; } + + /// + /// Helper method + /// + /// IEnumerable of IMiRect + private static IEnumerable ToEnumerable(IMiRects rects) + { + for (int i = 0; i < rects.Count; i++) + { + yield return rects[i]; + } + } + + /// + /// Helper method + /// + /// IEnumerable of IWord + private static IEnumerable ToEnumerable(IWords words) + { + for (int i = 0; i < words.Count; i++) + { + yield return words[i]; + } + } } } diff --git a/GreenshotWin10Plugin/Win10ShareDestination.cs b/GreenshotWin10Plugin/Win10ShareDestination.cs index 758eab6da..ac790b50c 100644 --- a/GreenshotWin10Plugin/Win10ShareDestination.cs +++ b/GreenshotWin10Plugin/Win10ShareDestination.cs @@ -101,6 +101,7 @@ namespace GreenshotWin10Plugin var filename = FilenameHelper.GetFilename(OutputFormat.png, captureDetails); var storageFile = await StorageFile.CreateStreamedFileAsync(filename, async streamedFileDataRequest => { + // Information on how was found here: https://socialeboladev.wordpress.com/2013/03/15/how-to-use-createstreamedfileasync/ Log.DebugFormat("Creating deferred file {0}", filename); try { @@ -116,7 +117,7 @@ namespace GreenshotWin10Plugin { streamedFileDataRequest.FailAndClose(StreamedFileFailureMode.Incomplete); } - // Signal transfer ready + // Signal transfer ready to the await down below taskCompletionSource.TrySetResult(applicationName); }, imageRandomAccessStreamReference); From f2649a1feb7e3c84a9dc4d49a2a7ae2dbe11b680 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 2 Oct 2016 16:08:22 +0200 Subject: [PATCH 126/170] Added the Win10 plugin to the Greenshot installer. --- .../releases/innosetup/setup.iss.template | 33 +++++++++++++++++-- GreenshotPlugin/Core/FilenameHelper.cs | 2 +- .../Core/OperatingSystemExtensions.cs | 10 ++++++ GreenshotPlugin/Core/PluginUtils.cs | 5 +-- GreenshotWin10Plugin/Win10OcrDestination.cs | 9 +++-- GreenshotWin10Plugin/Win10Plugin.cs | 2 +- GreenshotWin10Plugin/Win10ShareDestination.cs | 8 ++++- 7 files changed, 59 insertions(+), 10 deletions(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index c89aaf6d0..5aefcccad 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -101,8 +101,8 @@ Source: ..\..\bin\Release\Languages\Plugins\GreenshotConfluencePlugin\*; DestDir ;ExternalCommand Plugin Source: ..\..\bin\Release\Plugins\GreenshotExternalCommandPlugin\GreenshotExternalCommandPlugin.gsp; DestDir: {app}\Plugins\GreenshotExternalCommandPlugin; Components: plugins\externalcommand; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: ..\..\bin\Release\Languages\Plugins\GreenshotExternalCommandPlugin\*; DestDir: {app}\Languages\Plugins\GreenshotExternalCommandPlugin; Components: plugins\externalcommand; Flags: overwritereadonly ignoreversion replacesameversion; -;Network Import Plugin -;Source: ..\..\bin\Release\Plugins\GreenshotNetworkImportPlugin\*; DestDir: {app}\Plugins\GreenshotNetworkImportPlugin; Components: plugins\networkimport; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +;Win 10 Plugin +Source: ..\..\bin\Release\Plugins\GreenshotWin10Plugin\GreenshotWin10Plugin.gsp; DestDir: {app}\Plugins\GreenshotWin10Plugin; Components: plugins\win10; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; [Setup] ; changes associations is used when the installer installs new extensions, it clears the explorer icon cache ChangesAssociations=yes @@ -211,6 +211,7 @@ de.ocr=OCR Plug-in (benötigt Microsoft Office Document Imaging (MODI)) de.optimize=Optimierung der Leistung, kann etwas dauern. de.startgreenshot={#ExeName} starten de.startup={#ExeName} starten wenn Windows hochfährt +de.win10=Windows 10 Plug-in en.confluence=Confluence plug-in en.default=Default installation @@ -223,6 +224,7 @@ en.ocr=OCR plug-in (needs Microsoft Office Document Imaging (MODI)) en.optimize=Optimizing performance, this may take a while. en.startgreenshot=Start {#ExeName} en.startup=Start {#ExeName} with Windows start +en.win10=Windows 10 plug-in es.confluence=Extensión para Confluence es.default=${default} @@ -234,6 +236,7 @@ es.ocr=Extensión para OCR (necesita Microsoft Office Document Imaging (MODI)) es.optimize=Optimizando rendimiento; por favor, espera. es.startgreenshot=Lanzar {#ExeName} es.startup=Lanzar {#ExeName} al iniciarse Windows +es.win10=Extensión para Windows 10 fi.confluence=Confluence-liitännäinen fi.default=${default} @@ -246,6 +249,7 @@ fi.ocr=OCR-liitännäinen (Tarvitaan: Microsoft Office Document Imaging (MODI)) fi.optimize=Optimoidaan suorituskykyä, tämä voi kestää hetken. fi.startgreenshot=Käynnistä {#ExeName} fi.startup=Käynnistä {#ExeName} Windowsin käynnistyessä +fi.win10=Windows 10-liitännäinen fr.confluence=Greffon Confluence fr.default=${default} @@ -258,6 +262,7 @@ fr.ocr=Greffon OCR (nécessite Document Imaging de Microsoft Office [MODI]) fr.optimize=Optimisation des performances, Ceci peut prendre un certain temps. fr.startgreenshot=Démarrer {#ExeName} fr.startup=Lancer {#ExeName} au démarrage de Windows +fr.win10=Greffon Windows 10 lt.confluence=Confluence spraudnis lt.default=${default} @@ -270,6 +275,7 @@ lt.ocr=OCR spraudnis (nepieciešams Microsoft Office Document Imaging (MODI)) lt.optimize=Uzlaboju veikstpēju, tas prasīs kādu laiciņu. lt.startgreenshot=Palaist {#ExeName} lt.startup=Palaist {#ExeName} uzsākot darbus +lt.win10=Windows 10 spraudnis nl.confluence=Confluence plug-in nl.default=Default installation @@ -282,6 +288,7 @@ nl.ocr=OCR plug-in (heeft Microsoft Office Document Imaging (MODI) nodig) nl.optimize=Prestaties verbeteren, kan even duren. nl.startgreenshot=Start {#ExeName} nl.startup=Start {#ExeName} wanneer Windows opstart +nl.win10=Windows 10 plug-in nn.confluence=Confluence-tillegg nn.default=Default installation @@ -294,6 +301,7 @@ nn.ocr=OCR-tillegg (krev Microsoft Office Document Imaging (MODI)) nn.optimize=Optimaliserar ytelse, dette kan ta litt tid... nn.startgreenshot=Start {#ExeName} nn.startup=Start {#ExeName} når Windows startar +nn.win10=Windows 10 Tillegg sr.confluence=Прикључак за Конфлуенс sr.default=${default} @@ -305,6 +313,7 @@ sr.ocr=OCR прикључак (захтева Microsoft Office Document Imaging sr.optimize=Оптимизујем перформансе… sr.startgreenshot=Покрени Гриншот sr.startup=Покрени програм са системом +sr.win10=Прикључак за Windows 10 sv.startup=Starta {#ExeName} med Windows sv.startgreenshot=Starta {#ExeName} @@ -315,6 +324,7 @@ sv.ocr=OCR-insticksprogram (kräver Microsoft Office Document Imaging (MODI)) sv.imgur=Imgur-insticksprogram (Se: http://imgur.com) sv.language=Ytterligare språk sv.optimize=Optimerar prestanda, detta kan ta en stund. +sv.win10=Windows 10-insticksprogram uk.confluence=Плагін Confluence uk.default=${default} @@ -326,6 +336,7 @@ uk.ocr=Плагін OCR (потребує Microsoft Office Document Imaging (MOD uk.optimize=Оптимізація продуктивності, це може забрати час. uk.startgreenshot=Запустити {#ExeName} uk.startup=Запускати {#ExeName} під час запуску Windows +uk.win10=Плагін Windows 10 cn.confluence=Confluence插件 cn.default=${default} @@ -337,7 +348,7 @@ cn.ocr=OCR插件(需要Microsoft Office Document Imaging (MODI)的支持) cn.optimize=正在优化性能,这可能需要一点时间。 cn.startgreenshot=启动{#ExeName} cn.startup=让{#ExeName}随Windows一起启动 - +cn.win10=Windows 10插件 [Types] Name: "default"; Description: "{cm:default}" @@ -359,6 +370,7 @@ Name: "plugins\dropbox"; Description: "Dropbox Plugin"; Types: full custom; Flag Name: "plugins\flickr"; Description: "Flickr Plugin"; Types: full custom; Flags: disablenouninstallwarning Name: "plugins\picasa"; Description: "Picasa Plugin"; Types: full custom; Flags: disablenouninstallwarning Name: "plugins\photobucket"; Description: "Photobucket Plugin"; Types: full custom; Flags: disablenouninstallwarning +Name: "plugins\win10"; Description: "Windows 10 Plugin"; Types: full custom; Flags: disablenouninstallwarning; Check: IsWindows10OrNewer() Name: "languages"; Description: {cm:language}; Types: full custom; Flags: disablenouninstallwarning Name: "languages\arSY"; Description: "العربية"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('d') Name: "languages\csCZ"; Description: "Ceština"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') @@ -616,6 +628,21 @@ begin end; Result := true; end; + +function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean; +var + Version: TWindowsVersion; +begin + GetWindowsVersionEx(Version); + Result := + (Version.Major > Major) or + ((Version.Major = Major) and (Version.Minor >= Minor)); +end; + +function IsWindows10OrNewer: Boolean; +begin + Result := IsWindowsVersionOrNewer(10, 0); +end; [Run] Filename: "{code:getNGENPath}\ngen.exe"; Parameters: "install ""{app}\{#ExeName}.exe"""; StatusMsg: "{cm:optimize}"; Flags: runhidden runasoriginaluser Filename: "{code:getNGENPath}\ngen.exe"; Parameters: "install ""{app}\GreenshotPlugin.dll"""; StatusMsg: "{cm:optimize}"; Flags: runhidden runasoriginaluser diff --git a/GreenshotPlugin/Core/FilenameHelper.cs b/GreenshotPlugin/Core/FilenameHelper.cs index b3ed50181..2016c27af 100644 --- a/GreenshotPlugin/Core/FilenameHelper.cs +++ b/GreenshotPlugin/Core/FilenameHelper.cs @@ -406,7 +406,7 @@ namespace GreenshotPlugin.Core { /// String with pattern %var% /// true to make sure everything is filenamesafe /// Filled string - public static string FillCmdVariables(string pattern, bool filenameSafeMode) + public static string FillCmdVariables(string pattern, bool filenameSafeMode = true) { IDictionary processVars = null; IDictionary userVars = null; diff --git a/GreenshotPlugin/Core/OperatingSystemExtensions.cs b/GreenshotPlugin/Core/OperatingSystemExtensions.cs index ffe07bc6f..678a65058 100644 --- a/GreenshotPlugin/Core/OperatingSystemExtensions.cs +++ b/GreenshotPlugin/Core/OperatingSystemExtensions.cs @@ -38,6 +38,16 @@ namespace GreenshotPlugin.Core return operatingSystem.Version.Major == 10; } + /// + /// Test if the current OS is Windows 10 or later + /// + /// OperatingSystem from Environment.OSVersion + /// true if we are running on Windows 10 or later + public static bool IsWindows10OrLater(this OperatingSystem operatingSystem) + { + return operatingSystem.Version.Major >= 10; + } + /// /// Test if the current OS is Windows 8(.1) /// diff --git a/GreenshotPlugin/Core/PluginUtils.cs b/GreenshotPlugin/Core/PluginUtils.cs index 78d0f1cd5..4ef0fd8ee 100644 --- a/GreenshotPlugin/Core/PluginUtils.cs +++ b/GreenshotPlugin/Core/PluginUtils.cs @@ -99,9 +99,10 @@ namespace GreenshotPlugin.Core { } return null; } - + /// - /// Get icon for executable, from the cache + /// Get icon from resource files, from the cache. + /// Examples can be found here: https://diymediahome.org/windows-icons-reference-list-with-details-locations-images/ /// /// path to the exe or dll /// index of the icon diff --git a/GreenshotWin10Plugin/Win10OcrDestination.cs b/GreenshotWin10Plugin/Win10OcrDestination.cs index e12bcf0fc..52e8b7fef 100644 --- a/GreenshotWin10Plugin/Win10OcrDestination.cs +++ b/GreenshotWin10Plugin/Win10OcrDestination.cs @@ -20,6 +20,7 @@ */ using System; +using System.Drawing; using System.IO; using System.Threading.Tasks; using Windows.Graphics.Imaging; @@ -36,9 +37,14 @@ namespace GreenshotWin10Plugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10OcrDestination)); - public override string Designation { get; } = "OCR"; + public override string Designation { get; } = "WIN10OCR"; public override string Description { get; } = "Windows 10 OCR"; + /// + /// Icon for the OCR function, the icon was found via: http://help4windows.com/windows_8_imageres_dll.shtml + /// + public override Image DisplayIcon=> PluginUtils.GetCachedExeIcon(FilenameHelper.FillCmdVariables(@"%windir%\system32\imageres.dll"), 97); + /// /// Constructor, this is only debug information /// @@ -49,7 +55,6 @@ namespace GreenshotWin10Plugin { Log.DebugFormat("Found language {0} {1}", language.NativeName, language.LanguageTag); } - } /// diff --git a/GreenshotWin10Plugin/Win10Plugin.cs b/GreenshotWin10Plugin/Win10Plugin.cs index 527411d8f..507b7d058 100644 --- a/GreenshotWin10Plugin/Win10Plugin.cs +++ b/GreenshotWin10Plugin/Win10Plugin.cs @@ -55,7 +55,7 @@ namespace GreenshotWin10Plugin /// IEnumerable with the destinations public IEnumerable Destinations() { - if (!Environment.OSVersion.IsWindows10()) + if (!Environment.OSVersion.IsWindows10OrLater()) { yield break; } diff --git a/GreenshotWin10Plugin/Win10ShareDestination.cs b/GreenshotWin10Plugin/Win10ShareDestination.cs index ac790b50c..c96ca7394 100644 --- a/GreenshotWin10Plugin/Win10ShareDestination.cs +++ b/GreenshotWin10Plugin/Win10ShareDestination.cs @@ -29,6 +29,7 @@ using System.Threading.Tasks; using Windows.Storage; using Color = Windows.UI.Color; using System.Collections.Generic; +using System.Drawing; namespace GreenshotWin10Plugin { @@ -39,9 +40,14 @@ namespace GreenshotWin10Plugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10ShareDestination)); - public override string Designation { get; } = "Share"; + public override string Designation { get; } = "WIN10Share"; public override string Description { get; } = "Windows 10 share"; + /// + /// Icon for the App-share, the icon was found via: http://help4windows.com/windows_8_shell32_dll.shtml + /// + public override Image DisplayIcon => PluginUtils.GetCachedExeIcon(FilenameHelper.FillCmdVariables(@"%windir%\system32\shell32.dll"), 238); + /// /// Share the screenshot with a windows app /// From 55cdcde9c81d928b4a682a9cf8d6b6e446b99dd5 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 2 Oct 2016 16:24:59 +0200 Subject: [PATCH 127/170] Made the installation of the Win10 plugin default, if Win 10 is available of course. --- Greenshot/releases/innosetup/setup.iss.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 5aefcccad..e6470ee66 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -370,7 +370,7 @@ Name: "plugins\dropbox"; Description: "Dropbox Plugin"; Types: full custom; Flag Name: "plugins\flickr"; Description: "Flickr Plugin"; Types: full custom; Flags: disablenouninstallwarning Name: "plugins\picasa"; Description: "Picasa Plugin"; Types: full custom; Flags: disablenouninstallwarning Name: "plugins\photobucket"; Description: "Photobucket Plugin"; Types: full custom; Flags: disablenouninstallwarning -Name: "plugins\win10"; Description: "Windows 10 Plugin"; Types: full custom; Flags: disablenouninstallwarning; Check: IsWindows10OrNewer() +Name: "plugins\win10"; Description: "Windows 10 Plugin"; Types: default full custom; Flags: disablenouninstallwarning; Check: IsWindows10OrNewer() Name: "languages"; Description: {cm:language}; Types: full custom; Flags: disablenouninstallwarning Name: "languages\arSY"; Description: "العربية"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('d') Name: "languages\csCZ"; Description: "Ceština"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') From 85e8f763114ce8347ce6fa9964125ec13e9cd894 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 2 Oct 2016 16:34:26 +0200 Subject: [PATCH 128/170] Fixed the fact that the plug-in wasn't visible in the settings. --- GreenshotWin10Plugin/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotWin10Plugin/Properties/AssemblyInfo.cs b/GreenshotWin10Plugin/Properties/AssemblyInfo.cs index b020ad5f7..748cbf731 100644 --- a/GreenshotWin10Plugin/Properties/AssemblyInfo.cs +++ b/GreenshotWin10Plugin/Properties/AssemblyInfo.cs @@ -6,7 +6,7 @@ using System.Runtime.InteropServices; // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("GreenshotWin10Plugin")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyDescription("A plug-in for Windows 10 only functionality")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] [assembly: AssemblyProduct("GreenshotWin10Plugin")] From 505b861416eb7b16cd36f9d47a02d014afc8109e Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 2 Oct 2016 16:41:19 +0200 Subject: [PATCH 129/170] [skip ci] fixed name of plug-in --- GreenshotWin10Plugin/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotWin10Plugin/Properties/AssemblyInfo.cs b/GreenshotWin10Plugin/Properties/AssemblyInfo.cs index 748cbf731..25b4329e9 100644 --- a/GreenshotWin10Plugin/Properties/AssemblyInfo.cs +++ b/GreenshotWin10Plugin/Properties/AssemblyInfo.cs @@ -9,7 +9,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyDescription("A plug-in for Windows 10 only functionality")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Greenshot")] -[assembly: AssemblyProduct("GreenshotWin10Plugin")] +[assembly: AssemblyProduct("Windown 10 Plug-in")] [assembly: AssemblyCopyright("Copyright © Greenshot 2007-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] From 19415080f9635a594530b61ccbbae843b4fe50e0 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 3 Oct 2016 20:24:32 +0200 Subject: [PATCH 130/170] =?UTF-8?q?Added=20translation=20Catal=C3=A0=20by?= =?UTF-8?q?=20Gabriel=20Guix.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Greenshot/Languages/language-ca-CA.xml | 313 ++++++++++++++++++ .../additional_files/readme.txt.template | 13 +- .../releases/innosetup/setup.iss.template | 2 + 3 files changed, 325 insertions(+), 3 deletions(-) create mode 100644 Greenshot/Languages/language-ca-CA.xml diff --git a/Greenshot/Languages/language-ca-CA.xml b/Greenshot/Languages/language-ca-CA.xml new file mode 100644 index 000000000..df48b4bc3 --- /dev/null +++ b/Greenshot/Languages/language-ca-CA.xml @@ -0,0 +1,313 @@ + + + + Si us plau comuniqueu qualsevol error a + Si Greenshot us agrada , us agrairem que ens ajudeu: + Greenshot s'allotja a sourceforge.net + Icones del conjunt d'icones Fugue de Yusuke Kamiyamane(Creative Commons Attribution 3.0 license) + Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom +Greenshot s'ofereix SENSE CAP GARANTIA. Aquest és un programari gratuït, i podeu redistribuir-lo amb algunes condicions. +Detalls sobre la Llicència General Publica GNU: + Quant a Greenshot + Greenshot - La revolucionària Utilitat de Captura de Pantalla + Tanca + Hi ha hagut un error inesperat. + + Podeu ajudar-nos a millorar Greenshot enviant informació sobre l'error. +Si us plau visiteu la URL de baix, creeu un nou informe d'error i enganxeu el contingut de l'àrea de text a la descripció. + +Afegiu un resum significatiu i tota la informació que considereu útil per descriure el problema. +Abans de crear un nou informe d'error, us agrairem que comproveu que l'error no hagi estat ja comunicat (us podeu ajudar amb el cercador) Gràcies :) + Error + Cancel·la + Error inesperat copiant al porta-retalls. + Greenshot no ho pot copiar al porta-retalls perquè el procés {0} en bloqueja l'accés. + No hi ha cap imatge al porta-retalls. + Windows Bitmap + Mapa de bits independent del dispositiu (DIB) + HTML + HTML amb imatges en línea + PNG + Alfa + Aplica + Blau + Verd + Color HTML + Colors utilitzats recentment + Vermell + Selector de Color + Transparència + El destí {0} ha rebutjat l'accés de Greenshot, probablement hi hagi una caixa de diàleg oberta. Tanqueu la caixa de diàleg i torneu-ho a provar. + Accés de Greenshot rebutjat + No es pot desar el fitxer de configuració de Greenshot. Si us plau verifiqueu els permisos d'accés a '{0}'. + Quant a Greenshot + Captura una regió + Obre la imatge del porta-retalls + Captura la pantalla completa + tot + avall + esquerra + dreta + amunt + Captura Internet Explorer + Captura Internet Explorer de la llista + Captura l'última regió + Captura la finestra + Captura la finestra de la llista + Ajuda a Greenshot + Surt + Ajuda + Obre el fitxer d'imatge + Obre la carpeta de l'última captura + Preferències ràpides + Preferències... + Error exportant a {0}. Si us plau,torneu-ho a provar. + Inferior + Centre + Alineació horitzontal + Esquerra + Mig + Dreta + Superior + Alineació vertical + Reordena + Extrems amb fletxa + Tots dos + Punt final + Cap + Punt inicial + Autorretalla + Color de fons + Radi del difuminat + Negreta + Vora + Brillantor + Cancel·la + Error en accedir al porta-retalls. Si us plau,torneu-ho a provar. + Tanca + Voleu desar la captura? + Voleu desar la imatge? + Confirma + Copia la imatge al porta-retalls + Copia el camí al porta-retalls + Copia + Retalla(C) + Eina de selecció (ESC) + Retalla + Esborra + Baixa un nivell + Baixa a l'últim nivell + Dibuixa una fletxa (A) + Dibuixa una el·lipse (E) + Dibuix lliure (F) + Destaca (H) + Dibuixa una línia (L) + Dibuixa un rectangle (R) + Afegeix una caixa de text (T) + Duplica l'element seleccionat + Edita + Efectes + Correu electrònic + Fitxer + Mida + Color de línia + Escala de grisos + Destaca l'àrea + Escala de grisos + Amplia + Mode destacat + Text destacat + Ombra + Imatge desada a {0}. + Insereix una finestra + Inverteix + Itàlica + Carrega objectes del fitxer + Factor d'ampliació + Fes coincidir amb la mida de la captura + Taca (O) + Difumina + Mode de taca + Pixela + Objecte + Obre la carpeta a l'Explorador de Windows + Enganxa + Mida del pixel + Qualitat de previsualització + Imprimeix + Refés {0} + Reinicia la mida + Percentatge + Pixels + Gira en sentit antihorari + Gira en sentit horari + Desa + Desa objectes al fitxer + Anomena i desa... + Selecciona-ho tot + S'ha enviat el treball d'impressió a '{0}'. + Ombra + Imatge copiada al porta-retalls. + Gruix de línia + Editor d'imatges de Greenshot + Vores esquinçades + Desfés {0} + Puja un nivell + Puja a dalt + Client MAPI + Outlook amb HTML + Outlook amb text + Error + Ja s'està executant Greenshot. + No es pot desar el fitxer a {0}. +Si us plau, verifiqueu el camí d'accés seleccionat. + El fitxer "{0}" no s'ha pogut obrir. + No es pot obrir l'adreça '{0}'. + No s'ha pogut desar la captura de pantalla, cerqueu un lloc adient. + El nom de fitxer o de carpeta que s'ha generat no és vàlid. Si us plau, corregiu el patró del nom de fitxer i torneu-ho a provar. + Expert + Crea imatge de 8 bits si hi ha menys de 256 colors i la imatge es de més de 8 bits + Cerca també versions noves no estables + Formats del porta-retalls + Núm. a substituir ${NUM} al patró del nom del fitxer + Sé el que em faig! + Patró pel peu d'impressió + Minimiza l'ús de memòria, però penalitza el rendiment (desaconsellat). + Optimiza per a ús amb Escriptori Remot + Si es pot, reutilitza l'editor + Suprimeix el diàleg de desar quan es tanca l'editor + Mostra les miniatures de finestra en el menú contextual (Vista y Windows 7) + Exportat a: {0} + S'ha produït un error quan s'exportava a {0}: + Ajuda de Greenshot + Dreceres de teclat + Ajusta la qualitat JPEG per la imatge. + D'acord + S'ha produït un error quan s'imprimia. + Centra la impressió a la pàgina + Engrandeix la impressió per omplir el paper + Gira la impressió segons l'orientació de la pàgina + Ajusta la impressió a la mida del paper + Paràmetres de color + Desa les opcions per defecte i no m'ho tornis a preguntar + Imprimeix amb colors invertits + Paràmetres de disseny de pàgina + Imprimeix a tot color + Imprimeix en escala de grisos + Imprimeix en blanc i negre + Imprimeix data/hora a la part inferior de la pàgina + Opcions d'impressió de Greenshot + Desa amb la qualitat per defecte i no m'ho tornis a preguntar + Qualitat de Greenshot + Desa directament (utilitza la configuració predeterminada) + Mostra les opcions d'impressió cada cop que s'imprimeix una imatge + Mostra les opcions de qualitat cada cop que es desa una imatge + Configuració de l'aplicació + Carrega Greenshot a l'inici de Windows + Captura + Captura el cursor del ratolí + Utilitza el mode iteratiu de caputara de finestra + Interval de comprobació d'actualitzacions (0 = No ho comprovis) + Configura + Copia la ubicació al porta-retalls cada cop que es desa una imatge + Destí de la captura de pantalla + Copia al porta-retalls + Obre la imatge a l'editor + Correu electrònic + Desa directament (utilitzant la configuració indicada a sota) + Anomena i desa (es mostra el quadre de diàleg) + Selecciona el destí dinàmicament + Envia a la impressora + Editor + Format del nom de fitxer + General + Captura Internet Explorer + Qualitat de JPEG + Idioma + Els següents marcadors de posició serán substituïts automáticament pel format definit: +${YYYY} any, 4 digits +${MM} mes, 2 digits +${DD} dia, 2 digits +${hh} hora, 2 digits +${mm} minut, 2 digits +${ss} segon, 2 digits +${NUM} número d'increment, 6 digits +${title} Títol de finestra +${user} Usuari de Windows +${domain} Domini de Windows +${hostname} Nom de l'Equip + +També podeu crear dinàmicament ubicacions per a Greenshot, simplement utilitzeu el símbol de diagonal (\) per separar carpetes i noms de fitxer. +Exemple: el format ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} +generarà una carpeta pel dia actual dins de la carpeta d'emmagatzematge per defecte, per exemple: 2008-06-29, els noms de les imatges contingudes es basaran en el moment +actual, per exemple: 11_58_32 (més l'extensió definida a la configuració) + Xarxa i actualitzacions + Sortida + Reprodueix so de càmera + Extensions + Creat per + Camí de les llibreries de les extensions + Nom + Versió + Configuració predeterminada dels fitxers de sortida + Format d'imatge + Impressora + Configuració d'impressió + Configuració de qualitat + Redueix a menys de 256 colors + Registra accesos de teclat + Mostra Flash + Mostra notificacions + Mostra l'ampliació + Lloc d'emmagatzematge + Configuració + Format per generar el nom dels fitxers en desar les captures de pantalla + Idioma de la interfície d'usuari de Greenshot (cal reiniciar) + Format d'imatge per defecte + definiu si els accessos directes Prnt, Ctrl + Print, Alt + Prnt són reservats per a ús global de Greenshot a l'inici, fins tancar el programa. + Lloc on es desen per defecte les captures de pantalla (deixeu-ho en blanc si ho voleu desar a l'escriptori) + Utilitzeu proxy del sistema per defecte + Efectes + Milisegons d'espera abans de capturar + Mode de captura de finestra + Captura finestra + Feu clic amb el botó dret aquí o premeu la tecla {0}. + Hi ha una nova versió de Greenshot, us la voleu descarregar {0}? + Si us plau, espereu que s'acabi de capturar la página a Internet Explorer... + Atenció + No s'ha pogut registrar la drecera "{0}". Probablement el problema és que alguna altra aplicació també vol fer-se amb aquesta combinació de tecles. Hi ha dues possibles solucions: canviar la drecera a Greenshot, o desactivar/canviar la configuració de l'altre programa que fa servir aquesta drecera. + +Malgrat això, encara es poden utilitzar totes les característiques de Greenshot directament des del menú contextual de la icona a la zona de notificacions del sistema. + Utilitza el color personalitzat + Conserva transparència + Automàticament + Utilitza el color per defecte + Com es mostra + + Foscor de l'ombra + Desplaçament + Configuració de l'ombra + Amplada de l'ombra + + Rang horitzontal de les dents + Configuració de les vores esquinçades + Mida de les dents + Rang vertical de les dents + Esquinça per tots costats + Costat esquerre + Costat dret + Costat superior + Costat inferior + Genera l'ombra + + Afegeix un comptador (I) + Afegeix una bafarada (S) + + Canvia la mida + Configuració del canvi de mida + Manté la relació d'aspecte + Amplada + Alçada + Mida de la icona + + \ No newline at end of file diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 63c3ca9e3..b6061e179 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -43,9 +43,16 @@ Added features: * FEATURE-946 Updated to Inno-Setup 5.5.9 for improved installer security * FEATURE-958 Greenshot is now using code signing certificates -Open issues planned for this version: -BUG-1872: OneDrive prevents Greenshot hotkeys from working -FEATURE-912: [Storage Location] Define directory pattern +Added translation: +* Català by Gabriel Guix. + +Additionally we added some code quality measures, since build 87, which should reduce the number of problems. + +An experimental plug-in was added which adds functionality which only works with Windows 10: +1) Sharing screenshots with Windows 10 apps +2) Exporting the text via Windows 10 OCR to the clipboard +We don't know if this will be in the final release of 1.2.9, this depends on the stability of this functionality. +It will only be installed when the target system is running with Windows 10, and if the default or full installation is selected, for custom you will need to manually select it. 1.2.8.12-cab854b RELEASE diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index e6470ee66..60d941df8 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -33,6 +33,7 @@ Source: ..\..\Languages\*de-DE*; Excludes: "*installer*,*website*"; DestDir: {ap ; Additional language files Source: ..\..\Languages\*ar-SY*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\arSY; Flags: overwritereadonly ignoreversion replacesameversion; +Source: ..\..\Languages\*ca-CA*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\caCA; Flags: overwritereadonly ignoreversion replacesameversion; Source: ..\..\Languages\*cs-CZ*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\csCZ; Flags: overwritereadonly ignoreversion replacesameversion; Source: ..\..\Languages\*da-DK*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\daDK; Flags: overwritereadonly ignoreversion replacesameversion; Source: ..\..\Languages\*de-x-franconia*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\dexfranconia; Flags: overwritereadonly ignoreversion replacesameversion; @@ -373,6 +374,7 @@ Name: "plugins\photobucket"; Description: "Photobucket Plugin"; Types: full cust Name: "plugins\win10"; Description: "Windows 10 Plugin"; Types: default full custom; Flags: disablenouninstallwarning; Check: IsWindows10OrNewer() Name: "languages"; Description: {cm:language}; Types: full custom; Flags: disablenouninstallwarning Name: "languages\arSY"; Description: "العربية"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('d') +Name: "languages\caCA"; Description: "Català"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') Name: "languages\csCZ"; Description: "Ceština"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') Name: "languages\daDK"; Description: "Dansk"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') Name: "languages\dexfranconia"; Description: "Frängisch (Deutsch)"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') From 3cf3540eddc3eb722060c6097d30ffcac6eee316 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 4 Oct 2016 09:23:26 +0200 Subject: [PATCH 131/170] Fixed unneeded log entry [skip ci] --- GreenshotPlugin/Core/WindowsHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 54ac58240..114d1296e 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -833,7 +833,7 @@ namespace GreenshotPlugin.Core { public Rectangle ClientRectangle { get { Rectangle clientRect; - if (GetClientRect(out clientRect)) + if (!GetClientRect(out clientRect)) { Win32Error error = Win32.GetLastErrorCode(); Log.WarnFormat("Couldn't retrieve the client rectangle for {0}, error: {1}", Text, Win32.GetMessage(error)); From aea11451cf2e5257192d537ff6f51cd09a2eada3 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 7 Oct 2016 16:21:42 +0200 Subject: [PATCH 132/170] Added MD5 for all files that go into the end-product. --- build.ps1 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/build.ps1 b/build.ps1 index 88bef73b7..f28a6794e 100644 --- a/build.ps1 +++ b/build.ps1 @@ -96,10 +96,14 @@ Function FillTemplates { # Create the MD5 checksum file Function MD5Checksums { echo "MD5 Checksums:" - $currentMD5 = MD5("$(get-location)\Greenshot\bin\Release\Greenshot.exe") - echo "Greenshot.exe : $currentMD5" - $currentMD5 = MD5("$(get-location)\Greenshot\bin\Release\GreenshotPlugin.dll") - echo "GreenshotPlugin.dll : $currentMD5" + $sourcebase = "$(get-location)\Greenshot\bin\Release" + + $INCLUDE=@("*.exe", "*.gsp", "*.dll") + Get-ChildItem -Path "$sourcebase" -Recurse -Include $INCLUDE | foreach { + $currentMD5 = MD5($_.fullname) + $name = $_.Name + echo "$name : $currentMD5" + } } # This function creates the paf.exe @@ -318,6 +322,7 @@ FillTemplates echo "Signing executables" SignBinaryFilesBeforeBuildingInstaller +# This must be after the signing, otherwise they would be different. echo "Generating MD5" MD5Checksums | Set-Content "$(get-location)\Greenshot\bin\Release\checksum.MD5" -encoding UTF8 From 667669ca3ef450ab2da6c91340778718d1913769 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 18 Oct 2016 20:18:36 +0200 Subject: [PATCH 133/170] Small fixes before removing the Win10 plugins for the RC1 --- .../GreenshotWin10Plugin.csproj | 1 + .../Native/DataTransferManagerHelper.cs | 21 +++++++++++++++++-- GreenshotWin10Plugin/Win10ShareDestination.cs | 17 ++++++++------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj index 3830b6f20..c2af2069e 100644 --- a/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj +++ b/GreenshotWin10Plugin/GreenshotWin10Plugin.csproj @@ -13,6 +13,7 @@ v4.5 512 + 8.1 true diff --git a/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs b/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs index cca7d08c3..fec499b6c 100644 --- a/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs +++ b/GreenshotWin10Plugin/Native/DataTransferManagerHelper.cs @@ -25,8 +25,13 @@ using Windows.ApplicationModel.DataTransfer; namespace GreenshotWin10Plugin.Native { + /// + /// Wraps the interop for calling the ShareUI + /// public class DataTransferManagerHelper { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(DataTransferManagerHelper)); + private const string DataTransferManagerId = "a5caee9b-8708-49d1-8d36-67d25a8da00c"; private readonly IDataTransferManagerInterOp _dataTransferManagerInterOp; private readonly IntPtr _windowHandle; @@ -48,7 +53,11 @@ namespace GreenshotWin10Plugin.Native _windowHandle = handle; var riid = new Guid(DataTransferManagerId); DataTransferManager dataTransferManager; - _dataTransferManagerInterOp.GetForWindow(_windowHandle, riid, out dataTransferManager); + var hresult = _dataTransferManagerInterOp.GetForWindow(_windowHandle, riid, out dataTransferManager); + if (hresult != 0) + { + Log.WarnFormat("HResult for GetForWindow: {0}", hresult); + } DataTransferManager = dataTransferManager; } @@ -57,7 +66,15 @@ namespace GreenshotWin10Plugin.Native /// public void ShowShareUi() { - _dataTransferManagerInterOp.ShowShareUIForWindow(_windowHandle); + var hresult = _dataTransferManagerInterOp.ShowShareUIForWindow(_windowHandle); + if (hresult != 0) + { + Log.WarnFormat("HResult for ShowShareUIForWindow: {0}", hresult); + } + else + { + Log.Debug("ShowShareUIForWindow called"); + } } } diff --git a/GreenshotWin10Plugin/Win10ShareDestination.cs b/GreenshotWin10Plugin/Win10ShareDestination.cs index c96ca7394..780f568cd 100644 --- a/GreenshotWin10Plugin/Win10ShareDestination.cs +++ b/GreenshotWin10Plugin/Win10ShareDestination.cs @@ -73,6 +73,7 @@ namespace GreenshotWin10Plugin // Create capture for export ImageOutput.SaveToStream(surface, imageStream, new SurfaceOutputSettings()); imageStream.Position = 0; + Log.Info("Created RandomAccessStreamReference for the image"); var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); RandomAccessStreamReference thumbnailRandomAccessStreamReference; RandomAccessStreamReference logoRandomAccessStreamReference; @@ -85,6 +86,7 @@ namespace GreenshotWin10Plugin ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, new SurfaceOutputSettings()); thumbnailStream.Position = 0; thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); + Log.Info("Created RandomAccessStreamReference for the thumbnail"); } } // Create logo @@ -95,13 +97,14 @@ namespace GreenshotWin10Plugin ImageOutput.SaveToStream(logoThumbnail, null, logoStream, new SurfaceOutputSettings()); logoStream.Position = 0; logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); + Log.Info("Created RandomAccessStreamReference for the logo"); } } string applicationName = null; var dataTransferManagerHelper = new DataTransferManagerHelper(handle); dataTransferManagerHelper.DataTransferManager.TargetApplicationChosen += (dtm, args) => { - Log.DebugFormat("Trying to share with {0}", args.ApplicationName); + Log.InfoFormat("Trying to share with {0}", args.ApplicationName); applicationName = args.ApplicationName; }; var filename = FilenameHelper.GetFilename(OutputFormat.png, captureDetails); @@ -113,8 +116,8 @@ namespace GreenshotWin10Plugin { using (var deferredStream = streamedFileDataRequest.AsStreamForWrite()) { - await imageStream.CopyToAsync(deferredStream); - await imageStream.FlushAsync(); + await imageStream.CopyToAsync(deferredStream).ConfigureAwait(false); + await imageStream.FlushAsync().ConfigureAwait(false); } // Signal that the stream is ready streamedFileDataRequest.Dispose(); @@ -125,8 +128,8 @@ namespace GreenshotWin10Plugin } // Signal transfer ready to the await down below taskCompletionSource.TrySetResult(applicationName); - }, imageRandomAccessStreamReference); - + }, imageRandomAccessStreamReference).AsTask().ConfigureAwait(false); + dataTransferManagerHelper.DataTransferManager.DataRequested += (sender, args) => { var deferral = args.Request.GetDeferral(); @@ -143,7 +146,7 @@ namespace GreenshotWin10Plugin dataPackage.Properties.Square30x30Logo = logoRandomAccessStreamReference; dataPackage.Properties.LogoBackgroundColor = Color.FromArgb(0xff, 0x3d, 0x3d, 0x3d); dataPackage.SetStorageItems(new List { storageFile }); - //dataPackage.SetBitmap(imageRandomAccessStreamReference); + dataPackage.SetBitmap(imageRandomAccessStreamReference); dataPackage.Destroyed += (dp, o) => { Log.Debug("Destroyed."); @@ -151,7 +154,7 @@ namespace GreenshotWin10Plugin deferral.Complete(); }; dataTransferManagerHelper.ShowShareUi(); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task.ConfigureAwait(false); } }).Result; if (string.IsNullOrWhiteSpace(exportTarget)) From d885a1471cc48b40fcc3d0705c4afd10a3c5b3ac Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 18 Oct 2016 20:42:49 +0200 Subject: [PATCH 134/170] Removed the Win10 plugin from the build & installer. Changed the build type to RC, we are starting with release candidates!!! (yeah!!) --- Greenshot.sln | 2 -- Greenshot/releases/additional_files/readme.txt.template | 8 +------- Greenshot/releases/innosetup/setup.iss.template | 4 ++-- appveyor12.yml | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/Greenshot.sln b/Greenshot.sln index 1814e9a20..b76fba9a6 100644 --- a/Greenshot.sln +++ b/Greenshot.sln @@ -180,13 +180,11 @@ Global {9C0ECC4C-7807-4111-916A-4F57BB29788A}.Release|x86.ActiveCfg = Release|x86 {9C0ECC4C-7807-4111-916A-4F57BB29788A}.Release|x86.Build.0 = Release|x86 {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Any CPU.Build.0 = Debug|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|x86.ActiveCfg = Debug|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|x86.Build.0 = Debug|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Any CPU.Build.0 = Release|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|x86.ActiveCfg = Release|Any CPU diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index b6061e179..8daaa7713 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,7 +9,7 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ -This is a pre-release for the coming release of Greenshot. +This is a release candidate for the coming release of Greenshot. **Testing is not finished, use at your own risk...** Changes for the following reported tickets were added since 1.2.8.12: @@ -48,12 +48,6 @@ Added translation: Additionally we added some code quality measures, since build 87, which should reduce the number of problems. -An experimental plug-in was added which adds functionality which only works with Windows 10: -1) Sharing screenshots with Windows 10 apps -2) Exporting the text via Windows 10 OCR to the clipboard -We don't know if this will be in the final release of 1.2.9, this depends on the stability of this functionality. -It will only be installed when the target system is running with Windows 10, and if the default or full installation is selected, for custom you will need to manually select it. - 1.2.8.12-cab854b RELEASE diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index 60d941df8..c81af71d3 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -103,7 +103,7 @@ Source: ..\..\bin\Release\Languages\Plugins\GreenshotConfluencePlugin\*; DestDir Source: ..\..\bin\Release\Plugins\GreenshotExternalCommandPlugin\GreenshotExternalCommandPlugin.gsp; DestDir: {app}\Plugins\GreenshotExternalCommandPlugin; Components: plugins\externalcommand; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: ..\..\bin\Release\Languages\Plugins\GreenshotExternalCommandPlugin\*; DestDir: {app}\Languages\Plugins\GreenshotExternalCommandPlugin; Components: plugins\externalcommand; Flags: overwritereadonly ignoreversion replacesameversion; ;Win 10 Plugin -Source: ..\..\bin\Release\Plugins\GreenshotWin10Plugin\GreenshotWin10Plugin.gsp; DestDir: {app}\Plugins\GreenshotWin10Plugin; Components: plugins\win10; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +;Source: ..\..\bin\Release\Plugins\GreenshotWin10Plugin\GreenshotWin10Plugin.gsp; DestDir: {app}\Plugins\GreenshotWin10Plugin; Components: plugins\win10; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; [Setup] ; changes associations is used when the installer installs new extensions, it clears the explorer icon cache ChangesAssociations=yes @@ -371,7 +371,7 @@ Name: "plugins\dropbox"; Description: "Dropbox Plugin"; Types: full custom; Flag Name: "plugins\flickr"; Description: "Flickr Plugin"; Types: full custom; Flags: disablenouninstallwarning Name: "plugins\picasa"; Description: "Picasa Plugin"; Types: full custom; Flags: disablenouninstallwarning Name: "plugins\photobucket"; Description: "Photobucket Plugin"; Types: full custom; Flags: disablenouninstallwarning -Name: "plugins\win10"; Description: "Windows 10 Plugin"; Types: default full custom; Flags: disablenouninstallwarning; Check: IsWindows10OrNewer() +;Name: "plugins\win10"; Description: "Windows 10 Plugin"; Types: default full custom; Flags: disablenouninstallwarning; Check: IsWindows10OrNewer() Name: "languages"; Description: {cm:language}; Types: full custom; Flags: disablenouninstallwarning Name: "languages\arSY"; Description: "العربية"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('d') Name: "languages\caCA"; Description: "Català"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1') diff --git a/appveyor12.yml b/appveyor12.yml index b08dfe989..441bd42b9 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: UNSTABLE + build_type: RC rsakey: secure: GNomwdlwZOCyd8d7xEWTnMVs1lpOeHvF+tlnvcbXGovLRtwAp2Ufu0r7paGY7BHGGkIs2WE7xUfyQ9UauVB+58JZ6fwVega8ucUgVJhl4x0QQNN2d6sULUhHfhuEHmxw+FDO/FxKFE6Lmf+ZRY+OGiw0wKIl4qD7mGRHcDQTipNEsTbau8HzqRVCdu3dx7pODC61DlsbO71xLF7UlqnmuZE+91Zz3V6AgaqE246n1499d6bXBYw1AH+8opNnKDFLnTHf7hUVcZn9mj6tKZXeTCuVUOr/SVQcgHKxlBlqzhfaEkxCR5GPtzQRqwDMxEycmFvj2wNP/sie6UEGhQxE4YMCc2OgqNOkpc5BbP/fxLr/SLFOEf1XXzTWCFMhsgpHx7TZbgQH26sa0rK/xaBRacZlwAaNk7V2nFZT7TebYEFy6zWNr9Y+IyeXIofj42XQTNXv8d8hyh+UYLByVEFYRf2DnActQkZQyNdWjZ+CxDV50QSZZs8FT3IIqraHYKsj2ITAN5LrUtWCi7bpNJL0UGo0EJiB2i0bp++tEAAwyrCljxI8d4bbGl/flHk/xd+ysQPnomndijeObjguEzqT8pyXZluSZhF+lI50mIDhMdtdAfMi5yn5RW7P6NWOSlC8xgQQgMZylsuSvRflKbEd/gsoDyEOnakNcdH2jekt9OD6GnuYM7iHkbMC89LBZ0VaHNGvCC+BQXdGUG7O9R3NthZcDXE7q7xbtGRB5ncVQDRfKoT5HVfiV6bSDrcfRODiuR59mZgiSYtZG+3kQWYUKn2wagvZKckGukA0SlOuTRCKZhgLcVHhWeRWeGE3iJ8K6BeHf2EgB8Qr6ayTyTUjBcn+u4qqWKgkvG4qRavlvrBSdMrAXWIKE8vSq1od0A2ZzP6+HCsrkuUR+HFfpE2dpjeckoa5vATQgyn8j5x11iIOB9HnT3YKbZ0aTU4rQgYMJXA/fPcgKDGkAPdgtGbQLssy/mwSdsXBYtMgEcs7vI9laR8Ik+NK2dbFHGFPnxS43WToGyKBxojt8SZbgPJXm22WRrN1+9AZvvhI7/mpZiEE7HWgNRClZYuqbfCMpelLGvVq832OLjelrWMJ0XBVNHnOw0p8qZKI1UpqQJXX1nL8j3JttEVHsfryIanM03kNDL0dX1VAKECKUMCVQ6i6tG4VWsR0C2JccPJ3PSoPgo5KMJhuZNaBoiPjZ2eaMREV6vUYbBYzrvdDQzUcE2stacREl4eJzGJ4GP5h08GQmIirGF/SCyZV1CadAbKZVjqb70XpIbE6NT/+84O82LZR4ui5KgTAv87lTZgvNJ7LxM7rRg1awj/iBxQeARNJxuPMPlk1CVx8Z3091UdL1K1avPKa85lCRwCkDKLcJPO9tlqi4dVjCrwpoCJkQMm3fbTl/BgHn00/RsnFZ2qfl5m2DyF+XuaOPauzsRdLUFAC4h44qoUuzRb4Pv6RFhN5CI4fddRKafNBHU9f69UCkO080/hIjTdj0+bpr4oNY4UEi80huyJY/c0iUPE8o48qBB8F3cW30SwhPmuphn4/18lB8GEwEPqoatmli4QRaDFUCUf9Hj0DEUqEAya/OHOW7/PvWcw/l/ZaIMUpOZ6q0xvPDAXokFRJAWzZhG7hNbWNEzQ3f/BjlYlYsBtMY0JUU8mH6YxwIzIGbHiLTBC0OglH0rDd5W+3NaUG9FZ//o9MAP5j2QqwSuFWXppbigh4zk+h17eJn5zhld7dtvOr+YmgYULj6NFIDKBZHUJdqLYScVzdc1p812FCCBcLmmw4RnwuF+RldHixTdy4UZ17T/hD4OLpWCINl9lUAficC0OFeLJLHxFW6Em8SCbZ3aUtFDIQD8oTqzUHZhGWYF2ukrOc8Dzm4FQ8xy3BhqfntTod1gwoilIirsP/z+GGMnTltkqiqK+gCmkVOfICwNFmHltZeJrmDQ4YU5abR09Yr1TaAk3CzWjV1XGBaf/oek0+tFkMOtZNdFRdlzLLE90PsZZFFnZhFBoNoOhYnMB9K2VqgEpJs0nXvF6qBOllptcpBYUYMzMdb0Ggu6m1d/phxuBuOsm+Xtr0Zw8Xd0vxIOQNDGsskCDIEUYWYajw2i66MmRPRyFEennXfLA0WIPpztXvfsrKjf42rjE3RukBsRff1Sci68cel4fGfmvj2y7gW0Tt before_build: From 5a05817c2f677c70ac0d4ef23422d8f872a3a635 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 18 Oct 2016 20:46:00 +0200 Subject: [PATCH 135/170] Changed to RC1 --- appveyor12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor12.yml b/appveyor12.yml index 441bd42b9..e511b25c9 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: RC + build_type: RC1 rsakey: secure: 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 before_build: From f1d70720a16bfbcb9caa18c7cfb64c0a125a9c17 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 18 Oct 2016 21:02:01 +0200 Subject: [PATCH 136/170] Build-type fixes. --- appveyor12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor12.yml b/appveyor12.yml index e511b25c9..a4a8a65b1 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -70,7 +70,7 @@ deploy: prerelease: true draft: true on: - build_type: UNSTABLE + build_type: /^(RC|UNSTABLE).*/ - provider: GitHub tag: Greenshot-$(build_type)-$(APPVEYOR_BUILD_VERSION) auth_token: From 3defd0e6c0c765aa70ad5e80456555f43c4c0e6e Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 18 Oct 2016 21:28:57 +0200 Subject: [PATCH 137/170] BUG-2043: Fix for a weird combination of windows messages. [skip ci] --- GreenshotPlugin/Controls/HotkeyControl.cs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/GreenshotPlugin/Controls/HotkeyControl.cs b/GreenshotPlugin/Controls/HotkeyControl.cs index 0e40a9cbc..af12f6d93 100644 --- a/GreenshotPlugin/Controls/HotkeyControl.cs +++ b/GreenshotPlugin/Controls/HotkeyControl.cs @@ -512,18 +512,21 @@ namespace GreenshotPlugin.Controls { /// /// true if the message was handled public static bool HandleMessages(ref Message m) { - if (m.Msg == WM_HOTKEY) { - // Call handler - if (IsWindows7OrOlder) { - KeyHandlers[(int)m.WParam](); - } else { - if (EventDelay.Check()) { - KeyHandlers[(int)m.WParam](); - } - } + if (m.Msg != WM_HOTKEY) + { + return false; + } + // Call handler + if (!IsWindows7OrOlder && !EventDelay.Check()) + { return true; } - return false; + HotKeyHandler handler; + if (KeyHandlers.TryGetValue((int)m.WParam, out handler)) + { + handler(); + } + return true; } public static string GetKeyName(Keys givenKey) { From e8d51579ba50868266ddd312b4d7ec9e6f3a9f3d Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 20 Oct 2016 21:21:10 +0200 Subject: [PATCH 138/170] Nederlandse vertaling van Stephen [skip ci] --- Greenshot/Languages/language-nl-NL.xml | 374 ++++++++++-------- .../additional_files/readme.txt.template | 3 +- 2 files changed, 203 insertions(+), 174 deletions(-) diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index b42ab02e1..ac4954896 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -1,88 +1,102 @@ - - + + Meld problemen bij - Als U Greenshot goed vindt kunt U ons ondersteunen: - Greenshot word gehost door GitHub op - Iconen van de icon set van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license) - Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom -Greenshot komt zonder enige garantie! Dit is gratis software, en U kunt het distribueren onder bepaalde voorwaarden. + Als Greenshot u bevalt, wilt u ons misschien ondersteunen: + Greenshot wordt gebracht door sourceforge.net op + Iconen afkomstig van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license) + Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom +Greenshot komt zonder enige garantie! Dit is gratis software en het staat u vrij het onder bepaalde voorwaarden te verspreiden. Details over de GNU General Public License: Over Greenshot - Nederlandse vertaling door Jurjen Ladenius en Thomas Smid - Greenshot - de revolutionaire screenshot utility + Nederlandse vertaling door Jurjen Ladenius, Thomas Smid en Stephan Paternotte + Greenshot - het revolutionaire schermopname-programma Sluiten - Sorry, er is een onverwachte fout opgetreden. -Het goede nieuws is dat U ons kan helpen om dit probleem op te lossen! -Bezoek de onderstaande URL, maak een "bug report" aan en plak de inhoud van de volgende text in de probleembeschrijving. -Het helpt nog meer als U beschrijft hoe het probleem tot stand is gekomen en ook gegevens over uw systeem geeft. -We stellen het zeer op prijs als u eerst kijkt of dit probleem misschien al gemeld is! -Gebruik de zoekfunctie om bekende foutmeldingen snel te vinden. Hartelijk bedankt! ;-) + Er is een onverwachte fout opgetreden. + +Het goede nieuws is dat u ons kan helpen om dit probleem op te lossen! +Bezoek de onderstaande URL, maak een "bug report" aan en kopieer de volgende tekst in de probleembeschrijving. + +Beschrijf als het kan hoe deze fout tot stand is gekomen en vermeld ook de specificaties van uw PC-systeem. +Controleer ook even of dit probleem mogelijk al gemeld is! Gebruik de zoekfunctie om deze snel te vinden. Hartelijk bedankt! ;-) Fout Annuleren - Tijdens het kopiëren naar het klembord is een onverwachte fout opgetreden. - Greenshot kon niet naar het klembord kopiëren omdat het proces {0} de actie geblokkeerd heeft. - Apparaat onafhankelijk beeld (DIB) + Een onverwachte fout is opgetreden bij het kopiëren naar het klembord. + Greenshot kon niet naar het klembord kopiëren vanwege een blokkade door het proces {0}. + Geen klembord-afbeelding gevonden. + Windows Bitmap + Device Independent Bitmap (DIB) HTML - HTML met ingebouwde beelden + HTML met ingebedde afbeeldingen PNG Alpha Toepassen Blauw Groen - HTML kleur - Pas gebruikte kleuren + HTML-kleur + Onlangs gebruikte kleuren Rood - Kleur kiezen - Doorzichtig - Kan het Greenshot configuratie bestand niet schrijven. Controleer de bestandstoegang voor '{0}'. + Kleurenkiezer + Transparant + De bestemming {0} heeft Greenshot de toegang geweigerd. Sluit eventuele meldingsvensters en probeer het opnieuw. + Greenshot is de toegang geweigerd + Greenshot kan het configuratiebestand niet opslaan. Controleer de toegangsrechten voor '{0}'. Over Greenshot - Regio vastleggen - Laad beeld van het klembord - Gehele beeldscherm vastleggen + Interactief kader + Afbeelding van het klembord laden + Volledige schermopname alles onder links rechts boven - Internet Explorer pagina vastleggen - Internet Explorer pagina uit de lijst vastleggen - Laatst gebruikte regio vastleggen - Window vastleggen - Window uit de lijst vastleggen + Internet Explorer vensteropname + Internet Explorer vensteropname uit lijst + Laatste schermopname herhalen + Vensteropname + Vensteropname uit lijst Greenshot ondersteunen - Exit + Afsluiten Help - Open beeld uit bestand - Open laatste screenshot locatie + Afbeelding openen van bestand + Laatste schermopnamelocatie openen Snelle instellingen - Voorkeuren... - Aanpassen - Pijlkop - Beide - Eind punt + Voorkeuren… + Fout bij het exporteren naar {0}. Probeer het opnieuw. + Onder + Midden + Horizontale uitlijning + Links + Midden + Rechts + Boven + Verticale uitlijning + Schikken + Pijlpunt + Beiden + Eindpunt Geen - Start punt - Automatisch snijden - Vul kleur - Onduidelijk maken radius + Startpunt + Automatisch bijsnijden + Vulkleur + Vervagingsradius Vet Rand Helderheid Afbreken - Er is een fout opgetreden bij toegang naar het klembord. Probeer nogmaals, AUB. + Fout bij de toegang tot het klembord. Probeer het opnieuw. Sluiten - Wilt U het beeld opslaan? - Beeld opslaan? + Wilt u de schermopname opslaan? + Afbeelding opslaan? Bevestigen - Beeld naar klembord kopiëren - Kopieer locatie naar het klembord + Afbeelding naar klembord kopiëren + Locatie naar klembord kopiëren Kopiëren Bijsnijden (C) - Selectie gereedschap (ESC) + Selectiegereedschap (ESC) Knippen Verwijderen - Een plaats omlaag + Een niveau omlaag Helemaal naar beneden Pijl tekenen (A) Ellips tekenen (E) @@ -90,54 +104,56 @@ Gebruik de zoekfunctie om bekende foutmeldingen snel te vinden. Hartelijk bedank Markeren (H) Lijn tekenen (L) Rechthoek tekenen (R) - Textbox toevoegen (T) - Het geselekteerde element kopiëren + Tekstkader toevoegen (T) + Selectie dupliceren Bewerken Effecten - E-Mail + E-mail Bestand Grootte - Lijn kleur + Lijnkleur Grijstinten Gebied markeren Grijstinten Vergroten - Highlight mode - Text markeren - Beeld opgeslagen onder {0}. + Markeringswijze + Tekst markeren + Slagschaduw + Afbeelding opgeslagen naar {0}. Venster invoegen Omkeren - Schuin - Laad objecten uit bestand + Cursief + Objecten uit bestand laden Vergrotingsfactor - Pas aan screenshot grootte aan - Onherkenbaar maken (O) - Onduidelijk maken - Verduisteringsmode - Blokkig maken + Grootte aanpassen aan schermopname + Maskeren (O) + Vervagen + Maskeringswijze + Pixeleren Object - Directorie in Windows Explorer openen + Map met Windows Verkenner openen Plakken Pixelgrootte - Voorbeeld kwaliteit - Print - Opnieuw uitvoeren {0} - Grootte terugzetten - Roteer tegen de klok in - Roteer met de klok mee + Kwaliteit voorbeeld + Afdrukken + Opnieuw {0} + Afmetingen herstellen + Procent + Pixels + Linksom roteren (Control + ,) + Rechtsom roteren (Control + .) Opslaan Objecten in bestand opslaan - Opslaan als... + Opslaan als… Alles selecteren - Print opdracht is naar '{0}' gestuurt. - Schaduw - Schaduw - Beeld naar het klembord gekopieerd. - Lijn dikte - Greenshot beeld bewerking - Gescheurde randen + Afdruktaak verzonden naar '{0}'. + Slagschaduw + Afbeelding opgeslagen op het klembord. + Lijndikte + Greenshot beeldbewerker + Rafelige randen Ongedaan maken {0} - Een plaats omhoog + Een niveau omhoog Helemaal omhoog MAPI client Outlook met HTML @@ -145,64 +161,71 @@ Gebruik de zoekfunctie om bekende foutmeldingen snel te vinden. Hartelijk bedank Fout Greenshot is al gestart. Kan bestand niet opslaan naar {0}. -Controleer AUB de schrijf permissies voor de locatie. - Het bestand "{0}" kan niet gelezen worden. - Kan link '{0}' niet openen. - Kan screenshot niet opslaan, kies AUB een nieuwe locatie. +Controleer de toegangsrechten voor de betreffende locatie. + Het bestand "{0}" kon niet worden geopend. + De snelkoppeling '{0}' kon niet worden geopend. + De schermopname kon niet worden opgeslagen, kies een andere bestemming. + De bestandsnaam of bestemmingsmap is niet geldig. Corrigeer het bestandsnaampatroon en probeer het opnieuw. Expert - Maak een 8-bit beeld als er minder als 256 kleuren zijn en het beeld is > 8 bit. - Controleer bij updates ook op instabiele versies. - Klembord formaten + Afbeeldingen met minder dan 256 kleuren tot 8 bit reduceren. + Ook op test-versies controleren. + Klembordformaten Het ${NUM} nummer in de bestandsnaam Ik weet wat ik doe! - Voetnoot onder print - Verminder het zichtbare geheugen gebruik, maakt Greenshot langzamer - Optimaliseer voor Remote Desktop gebruik - Onderdruk de opslaan vraag bij het sluiten van de editor - Laat voorbeelden zien bij het vastleggen van Windows via het context menu - Exporteert naar: {0} + Voetnoot bij het afdrukken + Geheugengebruik verminderen ten koste van snelheid (niet aangeraden). + Optimaliseren voor Remote Desktop gebruik + Beeldbewerker weer gebruiken + Bij het sluiten van de beeldbewerker niet vragen om op te slaan + Schermvoorbeelden tonen in het context menu + Geëxporteerd naar: {0} + Er is een fout opgetreden bij het exporteren naar {0}: Greenshot Help Sneltoetsen - Kies AUB de kwaliteit voor uw JPEG beeld. + Selecteer de JPEG-kwaliteit voor uw afbeelding. Ok - Er is een fout opgetreden tijdens het printen - Centreer afdruk op papier - Vergroot afdruk en pas aan de papiergrootte aan - Roteer afdruk en pas aan het papier aan - Verklein afdruk en pas aan de papiergrootte aan - Sla afdrukvoorkeuren op als standaard en vraag niet opnieuw - Kleuren omkeren - Maak afdruk in grijstinten - Datum / tijd onder aan de pagina printen + Er is een fout opgetreden bij het afdrukken + Afdruk op het papier centreren + Afdruk vergroten en aanpassen aan de papiergrootte + Afdruk roteren en aanpassen aan het papier + Afdruk verkleinen en aanpassen aan de papiergrootte + Kleurinstellingen + Instellingen opslaan als standaard en niet meer vragen + Afdrukken in negatief-kleuren + Papieroriëntatie + Kleurenafdruk + Afdruk in grijstinten + Zwart-witafdruk forceren + Datum / tijd onderaan de pagina afdrukken Greenshot afdrukvoorkeuren - Opslaan met de standaard kwaliteit en niet meer vragen + Opslaan met de standaardkwaliteit en niet meer vragen Greenshot kwaliteit - Direct opslaan (met de standaard opslaan instellingen) - Toon afdrukvoorkeuren iedere keer wanneer een beeld wordt afdrukt + Direct opslaan (met de standaardinstellingen) + Afdrukvoorkeuren tonen wanneer een afbeelding wordt afgedrukt Vraag iedere keer dat een beeld opgeslagen wordt om de beeldkwaliteit - Applicatie instellingen - Start Greenshot wanneer Windows opstart - Vastleggen - Muisaanwijzer vastleggen - Interactief windows (delen) vastleggen - Versie update controle interval in dagen (0=geen controle) + Porgrammainstellingen + Greenshot met Windows opstarten + Schermopname + Muisaanwijzer opnemen + Interactieve schemopname + Controleren op nieuwe versies [dagen] (0=geen controle) Instellingen - Bestandslocatie naar het klembord kopiëren als een beeld opgeslagen wordt - Screenshot doel - Kopieer naar klembord - Open in beeld bewerken - E-Mail - Direct opslaan (gebruik de instellingen hieronder) - Opslaan als (laat dialoog zien) - Dynamisch het doel kiezen - Stuur naar printer - Beeld bewerken + Bestandslocatie naar het klembord kopiëren wanneer een afbeelding wordt opgeslagen + Bestemming + Naar klembord kopiëren + In beeldbewerker openen + E-mail + Direct opslaan (Onderstaande instellingen gebruiken) + Opslaan als… (via dialoog) + Bestemming dynamisch kiezen + Naar printer sturen + Beeldbewerker Bestandsnaam patroon Algemeen - Internet Explorer vastleggen - JPEG kwaliteit + Internet Explorer vensteropname + JPEG-kwaliteit Taal - De volgende variabelen worden automatisch vervangen in het ingestelde patroon: + De volgende variabelen worden automatisch vervangen in het gedefinieerde patroon: ${YYYY} jaar, 4 cijfers ${MM} maand, 2 cijfers ${DD} dag, 2 cijfers @@ -210,77 +233,84 @@ ${hh} uur, 2 cijfers ${mm} minuut, 2 cijfers ${ss} seconde, 2 cijfers ${NUM} oplopend nummer, 6 cijfers -${title} venster titel +${title} venstertitel ${user} Windows gebruikersnaam ${domain} Windows domein -${hostname} PC naam -U kunt ook Greenshot automatisch directories laten aanmaken door eenvoudig een backslash symbool (\) te gebruiken. +${hostname} PC-naam + +U kunt ook Greenshot automatisch mappen laten aanmaken door eenvoudig een backslash symbool (\) te gebruiken. Voorbeeld: Het patroon ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss} -genereert een directorie voor de huidige dag in uw standaard opslag lokatie, b.v. 2008-06-29, de naam van het bestand heeft dan de tijd +genereert een map voor de huidige dag in uw standaard opslaglocatie, b.v. 2008-06-29, de naam van het bestand bevat dan de tijd , b.v. 11-58-32 (plus de extensie zoals in de voorkeursinstellingen staat) Netwerk en bijwerken Uitvoer - Speel camera geluid - Uitbreidingen + Camerageluid afspelen + Plugins + Created by + DLL Path + Name + Version Voorkeursinstellingen voor opslaan van bestanden - Beeld formaat + Afbeeldingsformaat Printer - Afdrukvoorkeuren - Kwaliteit instellingen - Verminder het aantal kleuren tot maximaal 256 - Registreer Hotkeys - Toon flits - Toon notificaties - Toon vergrootglas - Opslag locatie + Afdrukinstellingen + Kwaliteitsinstellingen + Kleuren verminderen tot maximaal 256 + Sneltoetsen aanmelden + Flits tonen + Meldingen weergeven + Vergrootglas weergeven + Opslaglocatie Voorkeursinstellingen - Patroon voor het produceren van bestandsnamen van opgeslagen screenshots + Patroon voor het aanmaken van bestandsnamen bij het opslaan van schermopnamen Taal voor de Greenshot gebruikersinterface - Standaard beeld formaat - Definieert of the shortcuts Prnt, Ctrl + Print, Alt + Prnt door Greenshot gereserveerd worden. - Locatie waar screenshots standaard opgeslagen worden (leeg laten voor de desktop) - Gebruik de standaard systeem proxy - Effects - Milliseconden wachten voor vastleggen - Window vastleg mode - Window vastleggen + Standaard afbeeldingsformaat + Definieert of de sneltoetsen Prnt, Ctrl + Print, Alt + Prnt door Greenshot worden gereserveerd. + Standaardlocatie waar schermopnamen worden opgeslagen (leeg laten voor het bureaublad) + De standaard systeem proxy gebruiken + Effecten + Milliseconden vertraging voor schermopname + Vensteropname-modus + Vensteropname Klik hier met de rechter muis knop of druk op de {0} knop. - Er is een nieuwere versie van Greenshot beschikbaar! Wilt U Greenshot {0} downloaden? - Wacht terwijl de Internet Explorer pagina wordt vastgelegd... + Een nieuwe versie van Greenshot is beschikbaar! Wilt u Greenshot {0} downloaden? + Wacht terwijl de Internet Explorer pagina wordt vastgelegd… Waarschuwing - De hotkeys "{0}" kunnen niet geregistreerd worden. Dit probleem komt waarschijnlijk doordat een andere applicatie{1} deze hotkeys al gebruikt. U kunt de hotkeys instellingen van Greenshot veranderen of de andere applicatie stoppen/veranderen. + De sneltoetsen "{0}" kunnen worden aangemeld. Dit probleem komt waarschijnlijk doordat een ander programma deze al gebruikt. U kunt de sneltoetsinstellingen van Greenshot aanpassen of het andere programma stoppen/aanpassen. -Alle Greenshot functies werken ook over het context menu. - Eigen kleur - Met doorzichtigheid +Alle Greenshot functies werken ook zonder sneltoetsen via het context menu. + Aangepaste kleur + Transparantie behouden Automatisch - Standaard kleur - Zoals zichtbaar + Standaardkleur gebruiken + Zoals weergegeven - Schaduw intensiteit - Schaduw verspringing - Schaduw - Schaduw dikte - Horizontale tand afstand - Gescheurde kanten - Tand grootte - Vertikale tand afstand - Alle kanten scheuren + Schaduw-intensiteit + Schaduw-positie + Slagschaduw instellingen + Schaduw-breedte + + Horizontale rafeling + Rafelige randen + Dikte rafeling + Verticale rafeling + Alle randen rafelen Linkerkant Rechterkant Bovenkant Onderkant Schaduw - + Teller toevoegen (I) Tekstballon toevoegen (S) - Grootte veranderen - Grootte veranderen - Aspect ratio behouden + Verschalen + Verschalingsinstellingen + Verhouding behouden Breedte Hoogte - Pictogram grootte + Pictogramgrootte + \ No newline at end of file diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 8daaa7713..cefdcd321 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -45,8 +45,7 @@ Added features: Added translation: * Català by Gabriel Guix. - -Additionally we added some code quality measures, since build 87, which should reduce the number of problems. +* Nederlands by Stephan Paternotte 1.2.8.12-cab854b RELEASE From 6cdf1adf944e6721e30b09dd908195ab29f341d6 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 3 Nov 2016 17:20:35 +0100 Subject: [PATCH 139/170] BUG-2058: Fixing serializable issues with the AbstractFieldHolder [skip ci] --- Greenshot/Drawing/Fields/AbstractFieldHolder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs index e0f1c864c..1a31e073e 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolder.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolder.cs @@ -39,6 +39,7 @@ namespace Greenshot.Drawing.Fields { private static readonly ILog LOG = LogManager.GetLogger(typeof(AbstractFieldHolder)); private static readonly EditorConfiguration EditorConfig = IniConfig.GetIniSection(); + [NonSerialized] private readonly IDictionary _handlers = new Dictionary(); /// From f0fae0031154bf25d1a817ea451e7a6adf290901 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 3 Nov 2016 20:10:25 +0100 Subject: [PATCH 140/170] Checking the default check interval from 1 (oops) to 14 days. [skip ci] --- GreenshotPlugin/Core/CoreConfiguration.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index 57de57088..e49fb491b 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -174,7 +174,7 @@ namespace GreenshotPlugin.Core { [IniProperty("ExcludeDestinations", Description = "Comma separated list of destinations which should be disabled.")] public List ExcludeDestinations { get; set; } - [IniProperty("UpdateCheckInterval", Description="How many days between every update check? (0=no checks)", DefaultValue="1")] + [IniProperty("UpdateCheckInterval", Description="How many days between every update check? (0=no checks)", DefaultValue="14")] public int UpdateCheckInterval { get; set; } [IniProperty("LastUpdateCheck", Description="Last update check")] public DateTime LastUpdateCheck { get; set; } @@ -426,6 +426,12 @@ namespace GreenshotPlugin.Core { OutputFileAutoReduceColors = false; } + // Fix for excessive feed checking + if (UpdateCheckInterval <= 7 && LastSaveWithVersion.StartsWith("1.2")) + { + UpdateCheckInterval = 14; + } + // Enable OneNote if upgrading from 1.1 if(ExcludeDestinations != null && ExcludeDestinations.Contains("OneNote")) { if(LastSaveWithVersion != null && LastSaveWithVersion.StartsWith("1.1")) { From 8690a6b52baf1c42634a4d089999fa7ce861f93f Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 4 Nov 2016 12:48:57 +0100 Subject: [PATCH 141/170] RC2, added the version to the support us and help pages, so we can show that the user is using an outdated version. --- Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs | 3 ++- Greenshot/Drawing/Fields/FieldAggregator.cs | 2 ++ Greenshot/Drawing/Filters/AbstractFilter.cs | 2 +- Greenshot/Forms/AboutForm.Designer.cs | 6 ++++-- Greenshot/Forms/MainForm.cs | 2 +- Greenshot/releases/additional_files/readme.txt.template | 2 ++ appveyor12.yml | 2 +- 7 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs index 6aac87393..e76626b2c 100644 --- a/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs +++ b/Greenshot/Drawing/Fields/AbstractFieldHolderWithChildren.cs @@ -31,9 +31,10 @@ namespace Greenshot.Drawing.Fields /// but has a List of IFieldHolder for children. /// Field values are passed to and from children as well. /// - [Serializable()] + [Serializable] public abstract class AbstractFieldHolderWithChildren : AbstractFieldHolder { + [NonSerialized] private readonly FieldChangedEventHandler _fieldChangedEventHandler; [NonSerialized] diff --git a/Greenshot/Drawing/Fields/FieldAggregator.cs b/Greenshot/Drawing/Fields/FieldAggregator.cs index 8f3631f87..cbf5377d7 100644 --- a/Greenshot/Drawing/Fields/FieldAggregator.cs +++ b/Greenshot/Drawing/Fields/FieldAggregator.cs @@ -19,6 +19,7 @@ * along with this program. If not, see . */ +using System; using Greenshot.Configuration; using Greenshot.IniFile; using Greenshot.Plugin; @@ -40,6 +41,7 @@ namespace Greenshot.Drawing.Fields /// 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. /// + [Serializable] public sealed class FieldAggregator : AbstractFieldHolder { diff --git a/Greenshot/Drawing/Filters/AbstractFilter.cs b/Greenshot/Drawing/Filters/AbstractFilter.cs index e84d8913f..d9e8806ac 100644 --- a/Greenshot/Drawing/Filters/AbstractFilter.cs +++ b/Greenshot/Drawing/Filters/AbstractFilter.cs @@ -31,7 +31,7 @@ namespace Greenshot.Drawing.Filters { /// Subclasses should fulfill INotifyPropertyChanged contract, i.e. call /// OnPropertyChanged whenever a public property has been changed. /// - [Serializable()] + [Serializable] public abstract class AbstractFilter : AbstractFieldHolder, IFilter { [NonSerialized] diff --git a/Greenshot/Forms/AboutForm.Designer.cs b/Greenshot/Forms/AboutForm.Designer.cs index db85114e8..66c86ac20 100644 --- a/Greenshot/Forms/AboutForm.Designer.cs +++ b/Greenshot/Forms/AboutForm.Designer.cs @@ -19,6 +19,8 @@ * along with this program. If not, see . */ +using System.Reflection; + namespace Greenshot { partial class AboutForm { /// @@ -114,7 +116,7 @@ namespace Greenshot { this.linkLblBugs.Size = new System.Drawing.Size(465, 23); this.linkLblBugs.TabIndex = 8; this.linkLblBugs.TabStop = true; - this.linkLblBugs.Text = "http://getgreenshot.org/tickets/"; + this.linkLblBugs.Text = "http://getgreenshot.org/tickets/?version=" + Assembly.GetEntryAssembly().GetName().Version; this.linkLblBugs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // lblBugs @@ -132,7 +134,7 @@ namespace Greenshot { 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.Text = "http://getgreenshot.org/support/?version=" + Assembly.GetEntryAssembly().GetName().Version; this.linkLblDonations.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelClicked); // // lblDonations diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 5ded41e26..9c957ef90 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -1006,7 +1006,7 @@ namespace Greenshot { /// private void Contextmenu_donateClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate { - Process.Start("http://getgreenshot.org/support/"); + Process.Start("http://getgreenshot.org/support/?version=" + Assembly.GetEntryAssembly().GetName().Version); }); } diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index cefdcd321..c8c6bc14d 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -35,6 +35,8 @@ Fixed bugs: * BUG-1991 Greenshot portable (PAF) uses wrong log configuration * BUG-1992 OutputFilePath setting is wrong config used on a different system * BUG-2011 Editor issues when the font is gone or broken +* BUG-2043 Fixed an issue which occured after wakeup from sleep +* BUG-2059 Reduce the update check interval Added features: * FEATURE-916 Added icon save format (capture will be resized to 16x16, 32x32, 48x48 or 256x256) diff --git a/appveyor12.yml b/appveyor12.yml index a4a8a65b1..fe72fc804 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: RC1 + build_type: RC2 rsakey: secure: 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 before_build: From a9fd39fd454e2b98ea7b57c2ec767c5aa25175e4 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 14 Nov 2016 20:53:16 +0100 Subject: [PATCH 142/170] BUG-1894: Fixing excessive Imgur thumbnail downloading, which was wasting "credits", and caused 429 errors. --- .../additional_files/readme.txt.template | 40 ++++--------------- GreenshotImgurPlugin/ImgurUtils.cs | 12 +++--- appveyor12.yml | 2 +- 3 files changed, 14 insertions(+), 40 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index c8c6bc14d..cbc4bce74 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -12,7 +12,7 @@ All details to our tickets can be found here: https://greenshot.atlassian.net This is a release candidate for the coming release of Greenshot. **Testing is not finished, use at your own risk...** -Changes for the following reported tickets were added since 1.2.8.12: +Changes for the following reported tickets were added since 1.2.8.14: Fixed bugs: * BUG-1762 Dropshadow & tornedge prompts for settings every time @@ -22,6 +22,7 @@ Fixed bugs: * BUG-1887 Editor hangs on exit - hang time proportional to number of objects * BUG-1890 Slight cropping around window on Windows 10 * BUG-1892 Greenshot saves blank JPG file with reduce colors +* BUG-1894 Imgur remote server error 429 * BUG-1896 JIRA Plugin doesn't work with JIRA Server v7.0 * BUG-1898 Specify GPLv3 in the license text * BUG-1908 External Command, add commands at startup @@ -50,41 +51,14 @@ Added translation: * Nederlands by Stephan Paternotte -1.2.8.12-cab854b RELEASE +1.2.8.14-b7c8384 RELEASE -There were some major issues with the authenticated (non anonymous) uploads to Imgur. -After contacting Imgur they told us that their old API was deprecated or disabled, unfortunately this was not communicated. -Although we are working hard on Greenshot 1.3, where we changed most of the Imgur code already, we can't release it. -We did see a need to fix the imgur uploads, so in this release we quickly updated the Imgur API. -This should resolve a lot of tickets that were reported to us. - -Additionally our website http://getgreenshot.org is hosted by sourceforge and they seem to have a lot of stability problems. -Due to these problems a bug in the Greenshot update check manifested itself and causes Greenshot to get slow or even stop responding. -In this version we fix the bug in the update check, and we are also working on a solution for the instability with our website. - -Here is the list of chances: - -This is a pre-release for the comming bug-fix release of Greenshot. - -This version has changes, compared to 1.2.8.12, for the following reported tickets: - -* BUG-1884: OCR has trailing blank spaces| -* BUG-1890: Slight cropping around window on Windows 10| -* BUG-1892: Greenshot saves blank JPG file with reduce colors| -* BUG-1898: Specify GPLv3 in the license text| -* BUG-1918: Speechbubble issue: Artifacts appeared when shadow is on and transparency is used| -* BUG-1933: Greenshot Installer sets bad registry key permission| -* BUG-1935: Delay when pasting and ShapeShifter from FlameFusion is running| -* BUG-1941: Error when creating speech bubble| -* BUG-1945: Failure starting Greenshot at system startup| -* BUG-1949: Can't delete Imgur upload -* BUG-1965: Activation border around window is visible in the capture -* FEATURE-945: Added environment variables to the external command - -Testing is not finished, use at your own risk... +Changes for this release: +This has Imgur improvements for the newer API version, this is a backport from Greenshot 1.2.9 +With the move to a new hosting platform, we also noticed our update checks are way to often, this needed to be reduced. -1.2.8.12 Release +1.2.8.12-cab854b Release Bugs Resolved: diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index c32c0afba..aee304ec3 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -46,7 +46,7 @@ namespace GreenshotImgurPlugin { return; } // Load the ImUr history - List hashes = new List(); + IList hashes = new List(); foreach(string hash in Config.ImgurUploadHistory.Keys) { hashes.Add(hash); } @@ -62,7 +62,7 @@ namespace GreenshotImgurPlugin { ImgurInfo imgurInfo = RetrieveImgurInfo(hash, Config.ImgurUploadHistory[hash]); if (imgurInfo != null) { RetrieveImgurThumbnail(imgurInfo); - Config.runtimeImgurHistory.Add(hash, imgurInfo); + Config.runtimeImgurHistory[hash] = imgurInfo; } else { Log.DebugFormat("Deleting not found ImgUr {0} from config.", hash); Config.ImgurUploadHistory.Remove(hash); @@ -113,11 +113,11 @@ namespace GreenshotImgurPlugin { IDictionary otherParameters = new Dictionary(); // add title if (title != null && Config.AddTitle) { - otherParameters.Add("title", title); + otherParameters["title"]= title; } // add filename if (filename != null && Config.AddFilename) { - otherParameters.Add("name", filename); + otherParameters["name"] = filename; } string responseString = null; if (Config.AnonymousAccess) { @@ -171,7 +171,7 @@ namespace GreenshotImgurPlugin { try { var webRequest = OAuth2Helper.CreateOAuth2WebRequest(HTTPMethod.POST, Config.ImgurApi3Url + "/upload.xml", oauth2Settings); - otherParameters.Add("image", new SurfaceContainer(surfaceToUpload, outputSettings, filename)); + otherParameters["image"] = new SurfaceContainer(surfaceToUpload, outputSettings, filename); NetworkHelper.WriteMultipartFormData(webRequest, otherParameters); @@ -307,7 +307,7 @@ namespace GreenshotImgurPlugin { /// private static void LogHeader(IDictionary nameValues, string key) { if (nameValues.ContainsKey(key)) { - Log.InfoFormat("key={0}", nameValues[key]); + Log.InfoFormat("{0}={1}", key, nameValues[key]); } } diff --git a/appveyor12.yml b/appveyor12.yml index fe72fc804..d8e129c14 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: RC2 + build_type: RC3 rsakey: secure: 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 before_build: From ede5bfef97e2b7b0dcf41bb755671a18ef65a8ce Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 16 Nov 2016 09:09:28 +0100 Subject: [PATCH 143/170] BUG-1894: Postponing history loading as long as possible, this reduces the Imgur activity dramatically (as it's not loaded during start) and should at least prevent a 429 early on... hopefully. It would be better to cache everything locally on the user's PC, but this is unrealistic with .NET 2.0 technology (not impossible, but so time consuming that it would be better to wait for the next Greenshot version with 4.5). --- .../additional_files/readme.txt.template | 2 +- GreenshotImgurPlugin/Forms/ImgurHistory.cs | 29 ++++++++--- GreenshotImgurPlugin/Forms/SettingsForm.cs | 6 +-- .../GreenshotImgurPlugin.csproj | 5 ++ GreenshotImgurPlugin/ImgurConfiguration.cs | 14 +----- GreenshotImgurPlugin/ImgurPlugin.cs | 18 ++----- GreenshotImgurPlugin/ImgurUtils.cs | 49 +++++++++++++------ GreenshotPlugin/IniFile/IniValue.cs | 14 ++++++ 8 files changed, 85 insertions(+), 52 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index cbc4bce74..6f55b4038 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -46,7 +46,7 @@ Added features: * FEATURE-946 Updated to Inno-Setup 5.5.9 for improved installer security * FEATURE-958 Greenshot is now using code signing certificates -Added translation: +Added or changed translation: * Català by Gabriel Guix. * Nederlands by Stephan Paternotte diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index 4d67ab528..517bb165f 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -29,22 +29,37 @@ using Greenshot.IniFile; namespace GreenshotImgurPlugin { /// - /// Description of ImgurHistory. + /// Imgur history form /// public sealed partial class ImgurHistory : ImgurForm { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurHistory)); private readonly GreenshotColumnSorter _columnSorter; + private static readonly object Lock = new object(); private static readonly ImgurConfiguration Config = IniConfig.GetIniSection(); private static ImgurHistory _instance; public static void ShowHistory() { - // Make sure the history is loaded, will be done only once - ImgurUtils.LoadHistory(); - if (_instance == null) { - _instance = new ImgurHistory(); + lock (Lock) + { + if (ImgurUtils.IsHistoryLoadingNeeded()) + { + // Run upload in the background + new PleaseWaitForm().ShowAndWait("Imgur " + Language.GetString("imgur", LangKey.history), Language.GetString("imgur", LangKey.communication_wait), + ImgurUtils.LoadHistory + ); + } + + // Make sure the history is loaded, will be done only once + if (_instance == null) + { + _instance = new ImgurHistory(); + } + if (!_instance.Visible) + { + _instance.Show(); + } + _instance.Redraw(); } - _instance.Show(); - _instance.Redraw(); } private ImgurHistory() { diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index e7afda70c..f68a50794 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -25,7 +25,7 @@ namespace GreenshotImgurPlugin { /// Description of PasswordRequestForm. /// public partial class SettingsForm : ImgurForm { - public SettingsForm(ImgurConfiguration config) + public SettingsForm() { // // The InitializeComponent() call is required for Windows Forms designer support. @@ -34,9 +34,7 @@ namespace GreenshotImgurPlugin { CancelButton = buttonCancel; AcceptButton = buttonOK; - ImgurUtils.LoadHistory(); - - historyButton.Enabled = config.runtimeImgurHistory.Count > 0; + historyButton.Enabled = ImgurUtils.IsHistoryLoadingNeeded(); } private void ButtonHistoryClick(object sender, EventArgs e) { diff --git a/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj b/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj index 16a2690f1..6e4f81932 100644 --- a/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj +++ b/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj @@ -22,6 +22,10 @@ + + ..\packages\LinqBridge.1.3.0\lib\net20\LinqBridge.dll + True + ..\Greenshot\Lib\log4net.dll @@ -70,6 +74,7 @@ ImgurPlugin.cs + diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 2889c9501..a65c3e7b2 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -23,7 +23,6 @@ using System; using System.Collections.Generic; using System.Windows.Forms; using Greenshot.IniFile; -using GreenshotPlugin.Controls; using GreenshotPlugin.Core; namespace GreenshotImgurPlugin { @@ -95,18 +94,9 @@ namespace GreenshotImgurPlugin { /// /// bool true if OK was pressed, false if cancel public bool ShowConfigDialog() { - SettingsForm settingsForm = null; - - new PleaseWaitForm().ShowAndWait(ImgurPlugin.Attributes.Name, Language.GetString("imgur", LangKey.communication_wait), - delegate { - settingsForm = new SettingsForm(this); - } - ); + SettingsForm settingsForm = new SettingsForm(); DialogResult result = settingsForm.ShowDialog(); - if (result == DialogResult.OK) { - return true; - } - return false; + return result == DialogResult.OK; } } } diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index 93b8ede40..ec1d41b9e 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -23,7 +23,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; -using System.Threading; using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; @@ -75,7 +74,7 @@ namespace GreenshotImgurPlugin { /// Use the IGreenshotPluginHost interface to register events /// My own attributes /// true if plugin is initialized, false if not (doesn't show) - public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { + public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { _host = pluginHost; Attributes = myAttributes; @@ -109,14 +108,8 @@ namespace GreenshotImgurPlugin { PluginUtils.AddToContextMenu(_host, itemPlugInRoot); Language.LanguageChanged += OnLanguageChanged; - // retrieve history in the background - Thread backgroundTask = new Thread(CheckHistory) - { - Name = "Imgur History", - IsBackground = true - }; - backgroundTask.SetApartmentState(ApartmentState.STA); - backgroundTask.Start(); + // Enable history if there are items available + UpdateHistoryMenuItem(); return true; } @@ -129,9 +122,8 @@ namespace GreenshotImgurPlugin { } } - private void CheckHistory() { + private void UpdateHistoryMenuItem() { try { - ImgurUtils.LoadHistory(); _host.GreenshotForm.BeginInvoke((MethodInvoker)delegate { if (_config.ImgurUploadHistory.Count > 0) { _historyMenuItem.Enabled = true; @@ -178,7 +170,7 @@ namespace GreenshotImgurPlugin { Log.InfoFormat("Storing imgur upload for hash {0} and delete hash {1}", imgurInfo.Hash, imgurInfo.DeleteHash); _config.ImgurUploadHistory.Add(imgurInfo.Hash, imgurInfo.DeleteHash); _config.runtimeImgurHistory.Add(imgurInfo.Hash, imgurInfo); - CheckHistory(); + UpdateHistoryMenuItem(); } } ); diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index aee304ec3..95bbfc806 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Linq; using System.Net; using Greenshot.IniFile; using Greenshot.Plugin; @@ -29,7 +30,7 @@ using GreenshotPlugin.Core; namespace GreenshotImgurPlugin { /// - /// Description of ImgurUtils. + /// A collection of Imgur helper methods /// public static class ImgurUtils { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurUtils)); @@ -38,44 +39,62 @@ namespace GreenshotImgurPlugin { private const string AuthUrlPattern = "https://api.imgur.com/oauth2/authorize?response_type=code&client_id={ClientId}&redirect_uri={RedirectUrl}&state={State}"; private const string TokenUrl = "https://api.imgur.com/oauth2/token"; + /// + /// Check if we need to load the history + /// + /// + public static bool IsHistoryLoadingNeeded() + { + Log.InfoFormat("Checking if imgur cache loading needed, configuration has {0} imgur hashes, loaded are {1} hashes.", Config.ImgurUploadHistory.Count, Config.runtimeImgurHistory.Count); + return Config.runtimeImgurHistory.Count != Config.ImgurUploadHistory.Count; + } + /// /// Load the complete history of the imgur uploads, with the corresponding information /// public static void LoadHistory() { - if (Config.runtimeImgurHistory.Count == Config.ImgurUploadHistory.Count) { + if (!IsHistoryLoadingNeeded()) + { return; } - // Load the ImUr history - IList hashes = new List(); - foreach(string hash in Config.ImgurUploadHistory.Keys) { - hashes.Add(hash); - } - + bool saveNeeded = false; - foreach(string hash in hashes) { + // Load the ImUr history + foreach (string hash in Config.ImgurUploadHistory.Keys.ToList()) { if (Config.runtimeImgurHistory.ContainsKey(hash)) { // Already loaded continue; } - try { - ImgurInfo imgurInfo = RetrieveImgurInfo(hash, Config.ImgurUploadHistory[hash]); + + try + { + var deleteHash = Config.ImgurUploadHistory[hash]; + ImgurInfo imgurInfo = RetrieveImgurInfo(hash, deleteHash); if (imgurInfo != null) { RetrieveImgurThumbnail(imgurInfo); Config.runtimeImgurHistory[hash] = imgurInfo; } else { - Log.DebugFormat("Deleting not found ImgUr {0} from config.", hash); + Log.InfoFormat("Deleting unknown ImgUr {0} from config, delete hash was {1}.", hash, deleteHash); Config.ImgurUploadHistory.Remove(hash); + Config.runtimeImgurHistory.Remove(hash); saveNeeded = true; } } catch (WebException wE) { bool redirected = false; if (wE.Status == WebExceptionStatus.ProtocolError) { - HttpWebResponse response = ((HttpWebResponse)wE.Response); - // Image no longer available + HttpWebResponse response = (HttpWebResponse)wE.Response; + + if (response.StatusCode == HttpStatusCode.Forbidden) + { + Log.Error("Imgur loading forbidden", wE); + break; + } + // Image no longer available? if (response.StatusCode == HttpStatusCode.Redirect) { - Log.InfoFormat("ImgUr image for hash {0} is no longer available", hash); + Log.InfoFormat("ImgUr image for hash {0} is no longer available, removing it from the history", hash); Config.ImgurUploadHistory.Remove(hash); + Config.runtimeImgurHistory.Remove(hash); redirected = true; } } diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index b01e87f19..2ad6c356b 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -353,6 +353,20 @@ namespace Greenshot.IniFile { return null; } + // The following makes the enum string values a bit less restrictive + if (valueType.IsEnum) + { + string searchingEnumString = valueString.Replace("_", "").ToLowerInvariant(); + foreach (var possibleValue in Enum.GetValues(valueType)) + { + var possibleString = possibleValue.ToString().Replace("_", "").ToLowerInvariant(); + if (possibleString.Equals(searchingEnumString)) + { + return possibleValue; + } + } + } + if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(List<>)) { string arraySeparator = separator; object list = Activator.CreateInstance(valueType); From 07cd0b041fbb0dd7e7259e62bca656ec00e1457b Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 21 Nov 2016 22:07:26 +0100 Subject: [PATCH 144/170] BUG-2071: Fixed Box upload, there seems to be a change in the URL behavior of the site. --- GreenshotPlugin/Controls/OAuthLoginForm.cs | 23 ++++++++++------------ 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index 9c9bcf68d..3f370b543 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -29,25 +29,22 @@ namespace GreenshotPlugin.Controls { /// /// The OAuthLoginForm is used to allow the user to authorize Greenshot with an "Oauth" application /// - public partial class OAuthLoginForm : Form { + public sealed partial class OAuthLoginForm : Form { private static readonly ILog LOG = LogManager.GetLogger(typeof(OAuthLoginForm)); private readonly string _callbackUrl; private IDictionary _callbackParameters; - public IDictionary CallbackParameters { - get { - return _callbackParameters; - } - } - - public bool IsOk { - get { - return DialogResult == DialogResult.OK; - } - } - + public IDictionary CallbackParameters => _callbackParameters; + + public bool IsOk => DialogResult == DialogResult.OK; + public OAuthLoginForm(string browserTitle, Size size, string authorizationLink, string callbackUrl) { _callbackUrl = callbackUrl; + // Fix for BUG-2071 + if (callbackUrl.EndsWith("/")) + { + _callbackUrl = callbackUrl.Substring(0, callbackUrl.Length - 1); + } InitializeComponent(); ClientSize = size; Icon = GreenshotResources.getGreenshotIcon(); From a80e4e2a26521838b0c7b1430d4e2be009b14ce6 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 21 Nov 2016 23:40:26 +0100 Subject: [PATCH 145/170] Updated readme.txt for RC3 --- Greenshot/releases/additional_files/readme.txt.template | 1 + 1 file changed, 1 insertion(+) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 6f55b4038..8fef4301f 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -38,6 +38,7 @@ Fixed bugs: * BUG-2011 Editor issues when the font is gone or broken * BUG-2043 Fixed an issue which occured after wakeup from sleep * BUG-2059 Reduce the update check interval +* BUG-2071 Authentication not completing with Box.com Added features: * FEATURE-916 Added icon save format (capture will be resized to 16x16, 32x32, 48x48 or 256x256) From f2f37700b35de510fd9f87389a5ad08f90411766 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 21 Nov 2016 23:47:10 +0100 Subject: [PATCH 146/170] FEATURE-863: Trying to get it working in 1.2.9 --- .../Configuration/EditorConfiguration.cs | 1 - Greenshot/Drawing/Fields/FieldType.cs | 8 +++--- Greenshot/Drawing/ImageContainer.cs | 1 - Greenshot/Drawing/StepLabelContainer.cs | 17 ++++++++++++ Greenshot/Drawing/Surface.cs | 26 ++++++++++++++++-- Greenshot/Forms/ImageEditorForm.Designer.cs | 27 +++++++++++++++++-- Greenshot/Forms/ImageEditorForm.cs | 4 ++- GreenshotOCRPlugin/OCRPlugin.cs | 1 - GreenshotPlugin/Core/ImageHelper.cs | 1 - GreenshotPlugin/Interfaces/Generic.cs | 4 ++- .../Interfaces/Plugin/PluginInterfaces.cs | 1 - 11 files changed, 77 insertions(+), 14 deletions(-) diff --git a/Greenshot/Configuration/EditorConfiguration.cs b/Greenshot/Configuration/EditorConfiguration.cs index e7c90623c..2a95136d3 100644 --- a/Greenshot/Configuration/EditorConfiguration.cs +++ b/Greenshot/Configuration/EditorConfiguration.cs @@ -25,7 +25,6 @@ using System.Drawing; using Greenshot.Drawing.Fields; using GreenshotPlugin.UnmanagedHelpers; using Greenshot.IniFile; -using Greenshot.Core; using GreenshotPlugin.Effects; using GreenshotPlugin.Interfaces.Drawing; diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index 1ed3b84fa..f73518dd3 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -51,8 +51,9 @@ namespace Greenshot.Drawing.Fields public static readonly IFieldType PREPARED_FILTER_OBFUSCATE = new FieldType("PREPARED_FILTER_OBFUSCATE"); public static readonly IFieldType PREPARED_FILTER_HIGHLIGHT = new FieldType("PREPARED_FILTER_HIGHLIGHT"); public static readonly IFieldType FLAGS = new FieldType("FLAGS"); - - public static IFieldType[] Values = new IFieldType[]{ + public static readonly IFieldType COUNTER_START = new FieldType("COUNTER_START"); + + public static IFieldType[] Values = { ARROWHEADS, BLUR_RADIUS, BRIGHTNESS, @@ -72,7 +73,8 @@ namespace Greenshot.Drawing.Fields SHADOW, PREPARED_FILTER_OBFUSCATE, PREPARED_FILTER_HIGHLIGHT, - FLAGS + FLAGS, + COUNTER_START }; public string Name diff --git a/Greenshot/Drawing/ImageContainer.cs b/Greenshot/Drawing/ImageContainer.cs index b29a92683..ab8d4e541 100644 --- a/Greenshot/Drawing/ImageContainer.cs +++ b/Greenshot/Drawing/ImageContainer.cs @@ -25,7 +25,6 @@ using Greenshot.Drawing.Fields; using Greenshot.Plugin.Drawing; using GreenshotPlugin.Core; using System.Drawing.Drawing2D; -using Greenshot.Core; using log4net; using System.Runtime.Serialization; using GreenshotPlugin.Effects; diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index d47f2ad0f..fb5ae1e42 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -27,6 +27,7 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.Serialization; +using GreenshotPlugin.Interfaces.Drawing; namespace Greenshot.Drawing { /// @@ -48,9 +49,19 @@ namespace Greenshot.Drawing { Init(); } + private void UpdateCounterOnFieldChanged(object sender, FieldChangedEventArgs fieldChangedEventArgs) + { + if (Equals(fieldChangedEventArgs.Field.FieldType, FieldType.COUNTER_START)) + { + Parent.CounterStart = (int)fieldChangedEventArgs.Field.Value; + } + } + private void Init() { CreateDefaultAdorners(); + FieldChanged -= UpdateCounterOnFieldChanged; + FieldChanged += UpdateCounterOnFieldChanged; } #region Number serializing @@ -102,9 +113,14 @@ namespace Greenshot.Drawing { } ((Surface) Parent)?.RemoveStepLabel(this); base.SwitchParent(newParent); + if (Parent != null) + { + Parent.CounterStart = GetFieldValueAsInt(FieldType.COUNTER_START); + } if (newParent != null) { ((Surface)Parent)?.AddStepLabel(this); } + } public override Size DefaultSize => new Size(30, 30); @@ -134,6 +150,7 @@ namespace Greenshot.Drawing { protected override void InitializeFields() { AddField(GetType(), FieldType.FILL_COLOR, Color.DarkRed); AddField(GetType(), FieldType.LINE_COLOR, Color.White); + AddField(GetType(), FieldType.COUNTER_START, 1); } /// diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 3754b9f7f..33965bc7a 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -20,7 +20,6 @@ */ using Greenshot.Configuration; -using Greenshot.Core; using Greenshot.Drawing.Fields; using Greenshot.Helpers; using Greenshot.IniFile; @@ -87,6 +86,7 @@ namespace Greenshot.Drawing _movingElementChanged -= value; } } + [NonSerialized] private SurfaceDrawingModeEventHandler _drawingModeChanged; public event SurfaceDrawingModeEventHandler DrawingModeChanged @@ -228,6 +228,11 @@ namespace Greenshot.Drawing /// private readonly List _stepLabels = new List(); + /// + /// This value is used to start counting the step labels + /// + private int _counterStart = 1; + public void AddStepLabel(StepLabelContainer stepLabel) { if (!_stepLabels.Contains(stepLabel)) @@ -235,11 +240,28 @@ namespace Greenshot.Drawing _stepLabels.Add(stepLabel); } } + public void RemoveStepLabel(StepLabelContainer stepLabel) { _stepLabels.Remove(stepLabel); } + /// + /// The start value of the counter objects + /// + public int CounterStart + { + get { return _counterStart; } + set + { + if (_counterStart != value) + { + _counterStart = value; + Invalidate(); + } + } + } + /// /// Count all the VISIBLE steplabels in the surface, up to the supplied one /// @@ -247,7 +269,7 @@ namespace Greenshot.Drawing /// number of steplabels before the supplied container public int CountStepLabels(IDrawableContainer stopAtContainer) { - int number = 1; + int number = CounterStart; foreach (var possibleThis in _stepLabels) { if (possibleThis.Equals(stopAtContainer)) diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index bad17280b..1bf498412 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -152,6 +152,8 @@ namespace Greenshot { this.btnLineColor = new Greenshot.Controls.ToolStripColorButton(); this.lineThicknessLabel = new GreenshotPlugin.Controls.GreenshotToolStripLabel(); this.lineThicknessUpDown = new Greenshot.Controls.ToolStripNumericUpDown(); + this.counterLabel = new GreenshotPlugin.Controls.GreenshotToolStripLabel(); + this.counterUpDown = new Greenshot.Controls.ToolStripNumericUpDown(); this.fontFamilyComboBox = new Greenshot.Controls.FontFamilyComboBox(); this.fontSizeLabel = new GreenshotPlugin.Controls.GreenshotToolStripLabel(); this.fontSizeUpDown = new Greenshot.Controls.ToolStripNumericUpDown(); @@ -1053,7 +1055,9 @@ namespace Greenshot { this.toolStripSeparator, this.toolStripSeparator10, this.btnConfirm, - this.btnCancel}); + this.btnCancel, + this.counterLabel, + this.counterUpDown}); // // obfuscateModeButton // @@ -1143,6 +1147,23 @@ namespace Greenshot { this.btnLineColor.Name = "btnLineColor"; this.btnLineColor.SelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(203)))), ((int)(((byte)(222)))), ((int)(((byte)(250))))); // + // counterLabel + // + this.counterLabel.LanguageKey = "editor_counter_startvalue"; + this.counterLabel.Name = "counterLabel"; + // + // counterUpDown + // + this.counterUpDown.DecimalPlaces = 0; + this.counterUpDown.Increment = 1; + this.counterUpDown.Maximum = 100; + this.counterUpDown.Minimum = 0; + this.counterUpDown.Name = "counterUpDown"; + this.counterUpDown.Text = "1"; + this.counterUpDown.Value = 1; + this.counterUpDown.GotFocus += new System.EventHandler(this.ToolBarFocusableElementGotFocus); + this.counterUpDown.LostFocus += new System.EventHandler(this.ToolBarFocusableElementLostFocus); + // // lineThicknessLabel // this.lineThicknessLabel.LanguageKey = "editor_thickness"; @@ -1691,6 +1712,8 @@ namespace Greenshot { private Greenshot.Controls.ToolStripEx propertiesToolStrip; private GreenshotPlugin.Controls.GreenshotToolStripLabel lineThicknessLabel; private Greenshot.Controls.ToolStripNumericUpDown lineThicknessUpDown; + private GreenshotPlugin.Controls.GreenshotToolStripLabel counterLabel; + private Greenshot.Controls.ToolStripNumericUpDown counterUpDown; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; @@ -1736,7 +1759,7 @@ namespace Greenshot { private GreenshotPlugin.Controls.GreenshotToolStripMenuItem removeObjectToolStripMenuItem; private GreenshotPlugin.Controls.GreenshotToolStripMenuItem addTextBoxToolStripMenuItem; private GreenshotPlugin.Controls.GreenshotToolStripMenuItem addSpeechBubbleToolStripMenuItem; - private GreenshotPlugin.Controls.GreenshotToolStripMenuItem addCounterToolStripMenuItem; + private GreenshotPlugin.Controls.GreenshotToolStripMenuItem addCounterToolStripMenuItem; private GreenshotPlugin.Controls.GreenshotToolStripMenuItem addEllipseToolStripMenuItem; private GreenshotPlugin.Controls.GreenshotToolStripMenuItem addRectangleToolStripMenuItem; private GreenshotPlugin.Controls.GreenshotToolStripMenuItem objectToolStripMenuItem; diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index 00eeeaf8f..bdd316a04 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -1033,8 +1033,9 @@ namespace Greenshot { new BidirectionalBinding(previewQualityUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.PREVIEW_QUALITY), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); new BidirectionalBinding(obfuscateModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_OBFUSCATE), "Value"); new BidirectionalBinding(highlightModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_HIGHLIGHT), "Value"); + new BidirectionalBinding(counterUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.COUNTER_START), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); } - + /// /// shows/hides field controls (2nd toolbar on top) depending on fields of selected elements /// @@ -1058,6 +1059,7 @@ namespace Greenshot { textHorizontalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); textVerticalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_VERTICAL_ALIGNMENT); shadowButton.Visible = props.HasFieldValue(FieldType.SHADOW); + counterLabel.Visible = counterUpDown.Visible = props.HasFieldValue(FieldType.COUNTER_START); btnConfirm.Visible = btnCancel.Visible = props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE; diff --git a/GreenshotOCRPlugin/OCRPlugin.cs b/GreenshotOCRPlugin/OCRPlugin.cs index 65ae39723..992e6ea96 100644 --- a/GreenshotOCRPlugin/OCRPlugin.cs +++ b/GreenshotOCRPlugin/OCRPlugin.cs @@ -26,7 +26,6 @@ using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; using GreenshotPlugin.Core; -using Greenshot.Core; using GreenshotPlugin.Effects; //using Microsoft.Win32; diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index a9169d097..bac22c31b 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -27,7 +27,6 @@ using System.Drawing.Imaging; using System.IO; using Greenshot.IniFile; using GreenshotPlugin.UnmanagedHelpers; -using Greenshot.Core; using Greenshot.Plugin; using GreenshotPlugin.Effects; using log4net; diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index afb835df2..30dff7583 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -using Greenshot.Core; + using Greenshot.Memento; using Greenshot.Plugin.Drawing; using System; @@ -111,6 +111,8 @@ namespace Greenshot.Plugin event SurfaceDrawingModeEventHandler DrawingModeChanged; event SurfaceElementEventHandler MovingElementChanged; + int CounterStart { get; set; } + /// /// Unique ID of the Surface /// diff --git a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs index 7a19d4e4a..63ad027cb 100644 --- a/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs +++ b/GreenshotPlugin/Interfaces/Plugin/PluginInterfaces.cs @@ -25,7 +25,6 @@ using System.Windows.Forms; using GreenshotPlugin.Core; using Greenshot.IniFile; -using Greenshot.Core; using GreenshotPlugin.Effects; namespace Greenshot.Plugin { From dc29ef0a2732d89380cf4eb2694604dc64cc5ec6 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 22 Nov 2016 07:31:11 +0100 Subject: [PATCH 147/170] FEATURE-863: Fixed counter to work with a flag, still the starting value is not serialized / deserialized? --- Greenshot/Drawing/Fields/FieldType.cs | 4 +-- Greenshot/Drawing/StepLabelContainer.cs | 16 +---------- Greenshot/Drawing/Surface.cs | 30 +++++++++++++++----- Greenshot/Forms/ImageEditorForm.cs | 5 ++-- GreenshotPlugin/GreenshotPlugin.csproj | 3 -- GreenshotPlugin/Interfaces/Drawing/IField.cs | 3 +- 6 files changed, 30 insertions(+), 31 deletions(-) diff --git a/Greenshot/Drawing/Fields/FieldType.cs b/Greenshot/Drawing/Fields/FieldType.cs index f73518dd3..d99af3759 100644 --- a/Greenshot/Drawing/Fields/FieldType.cs +++ b/Greenshot/Drawing/Fields/FieldType.cs @@ -51,7 +51,6 @@ namespace Greenshot.Drawing.Fields public static readonly IFieldType PREPARED_FILTER_OBFUSCATE = new FieldType("PREPARED_FILTER_OBFUSCATE"); public static readonly IFieldType PREPARED_FILTER_HIGHLIGHT = new FieldType("PREPARED_FILTER_HIGHLIGHT"); public static readonly IFieldType FLAGS = new FieldType("FLAGS"); - public static readonly IFieldType COUNTER_START = new FieldType("COUNTER_START"); public static IFieldType[] Values = { ARROWHEADS, @@ -73,8 +72,7 @@ namespace Greenshot.Drawing.Fields SHADOW, PREPARED_FILTER_OBFUSCATE, PREPARED_FILTER_HIGHLIGHT, - FLAGS, - COUNTER_START + FLAGS }; public string Name diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index fb5ae1e42..8775e8d43 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -49,19 +49,9 @@ namespace Greenshot.Drawing { Init(); } - private void UpdateCounterOnFieldChanged(object sender, FieldChangedEventArgs fieldChangedEventArgs) - { - if (Equals(fieldChangedEventArgs.Field.FieldType, FieldType.COUNTER_START)) - { - Parent.CounterStart = (int)fieldChangedEventArgs.Field.Value; - } - } - private void Init() { CreateDefaultAdorners(); - FieldChanged -= UpdateCounterOnFieldChanged; - FieldChanged += UpdateCounterOnFieldChanged; } #region Number serializing @@ -113,10 +103,6 @@ namespace Greenshot.Drawing { } ((Surface) Parent)?.RemoveStepLabel(this); base.SwitchParent(newParent); - if (Parent != null) - { - Parent.CounterStart = GetFieldValueAsInt(FieldType.COUNTER_START); - } if (newParent != null) { ((Surface)Parent)?.AddStepLabel(this); } @@ -150,7 +136,7 @@ namespace Greenshot.Drawing { protected override void InitializeFields() { AddField(GetType(), FieldType.FILL_COLOR, Color.DarkRed); AddField(GetType(), FieldType.LINE_COLOR, Color.White); - AddField(GetType(), FieldType.COUNTER_START, 1); + AddField(GetType(), FieldType.FLAGS, FieldFlag.COUNTER); } /// diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 33965bc7a..d12ae30bf 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -33,6 +33,7 @@ using GreenshotPlugin.Interfaces.Drawing; using log4net; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; @@ -46,7 +47,7 @@ namespace Greenshot.Drawing /// /// Description of Surface. /// - public sealed class Surface : Control, ISurface + public sealed class Surface : Control, ISurface, INotifyPropertyChanged { private static readonly ILog LOG = LogManager.GetLogger(typeof(Surface)); public static int Count; @@ -55,6 +56,11 @@ namespace Greenshot.Drawing // Property to identify the Surface ID private Guid _uniqueId = Guid.NewGuid(); + /// + /// This value is used to start counting the step labels + /// + private int _counterStart = 1; + /// /// The GUID of the surface /// @@ -73,6 +79,20 @@ namespace Greenshot.Drawing /// /// Event handlers (do not serialize!) /// + [NonSerialized] + private PropertyChangedEventHandler _propertyChanged; + public event PropertyChangedEventHandler PropertyChanged + { + add + { + _propertyChanged += value; + } + remove + { + _propertyChanged -= value; + } + } + [NonSerialized] private SurfaceElementEventHandler _movingElementChanged; public event SurfaceElementEventHandler MovingElementChanged @@ -228,11 +248,6 @@ namespace Greenshot.Drawing /// private readonly List _stepLabels = new List(); - /// - /// This value is used to start counting the step labels - /// - private int _counterStart = 1; - public void AddStepLabel(StepLabelContainer stepLabel) { if (!_stepLabels.Contains(stepLabel)) @@ -254,9 +269,10 @@ namespace Greenshot.Drawing get { return _counterStart; } set { - if (_counterStart != value) + if (_propertyChanged != null && _counterStart != value) { _counterStart = value; + _propertyChanged(this, new PropertyChangedEventArgs("CounterStart")); Invalidate(); } } diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index bdd316a04..133112824 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -1033,7 +1033,7 @@ namespace Greenshot { new BidirectionalBinding(previewQualityUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.PREVIEW_QUALITY), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); new BidirectionalBinding(obfuscateModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_OBFUSCATE), "Value"); new BidirectionalBinding(highlightModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_HIGHLIGHT), "Value"); - new BidirectionalBinding(counterUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.COUNTER_START), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); + new BidirectionalBinding(counterUpDown, "Value", _surface, "CounterStart", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); } /// @@ -1059,7 +1059,8 @@ namespace Greenshot { textHorizontalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); textVerticalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_VERTICAL_ALIGNMENT); shadowButton.Visible = props.HasFieldValue(FieldType.SHADOW); - counterLabel.Visible = counterUpDown.Visible = props.HasFieldValue(FieldType.COUNTER_START); + counterLabel.Visible = counterUpDown.Visible = props.HasFieldValue(FieldType.FLAGS) + && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS) & FieldFlag.COUNTER) == FieldFlag.COUNTER; btnConfirm.Visible = btnCancel.Visible = props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE; diff --git a/GreenshotPlugin/GreenshotPlugin.csproj b/GreenshotPlugin/GreenshotPlugin.csproj index a854cd79f..1c3ab8ce7 100644 --- a/GreenshotPlugin/GreenshotPlugin.csproj +++ b/GreenshotPlugin/GreenshotPlugin.csproj @@ -236,9 +236,6 @@ GreenshotResources.cs - - - diff --git a/GreenshotPlugin/Interfaces/Drawing/IField.cs b/GreenshotPlugin/Interfaces/Drawing/IField.cs index 5a8f0a673..1dcd46061 100644 --- a/GreenshotPlugin/Interfaces/Drawing/IField.cs +++ b/GreenshotPlugin/Interfaces/Drawing/IField.cs @@ -28,7 +28,8 @@ namespace GreenshotPlugin.Interfaces.Drawing public enum FieldFlag { NONE = 0, - CONFIRMABLE = 1 + CONFIRMABLE = 1, + COUNTER = 2 } public interface IFieldType { From e654a606294c536b7e4ea963d0deb023863d555c Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 22 Nov 2016 10:23:46 +0100 Subject: [PATCH 148/170] FEATURE-863: Fixed storing of the start value. Updated SVG dependency, which fixes a few small issues with the Jira plug-in. --- Greenshot/Drawing/StepLabelContainer.cs | 13 ++++++++++--- Greenshot/Drawing/Surface.cs | 10 ++++++---- Greenshot/Forms/ImageEditorForm.cs | 2 ++ GreenshotJiraPlugin/GreenshotJiraPlugin.csproj | 4 ++-- GreenshotJiraPlugin/packages.config | 2 +- GreenshotPlugin/Interfaces/Generic.cs | 3 +++ 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Greenshot/Drawing/StepLabelContainer.cs b/Greenshot/Drawing/StepLabelContainer.cs index 8775e8d43..5994bf617 100644 --- a/Greenshot/Drawing/StepLabelContainer.cs +++ b/Greenshot/Drawing/StepLabelContainer.cs @@ -57,6 +57,8 @@ namespace Greenshot.Drawing { #region Number serializing // Used to store the number of this label, so when deserializing it can be placed back to the StepLabels list in the right location private int _number; + // Used to store the counter start of the Surface, as the surface is NOT stored. + private int _counterStart = 1; public int Number { get { return _number; @@ -74,6 +76,7 @@ namespace Greenshot.Drawing { private void SetValuesOnSerializing(StreamingContext context) { if (Parent != null) { Number = ((Surface)Parent).CountStepLabels(this); + _counterStart = ((Surface) Parent).CounterStart; } } #endregion @@ -90,6 +93,7 @@ namespace Greenshot.Drawing { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; + } /// @@ -103,10 +107,13 @@ namespace Greenshot.Drawing { } ((Surface) Parent)?.RemoveStepLabel(this); base.SwitchParent(newParent); - if (newParent != null) { - ((Surface)Parent)?.AddStepLabel(this); + if (newParent == null) + { + return; } - + // Make sure the counter start is restored (this unfortunately happens multiple times... -> hack) + newParent.CounterStart = _counterStart; + newParent.AddStepLabel(this); } public override Size DefaultSize => new Size(30, 30); diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index d12ae30bf..b24f26dab 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -269,12 +269,14 @@ namespace Greenshot.Drawing get { return _counterStart; } set { - if (_propertyChanged != null && _counterStart != value) + if (_counterStart == value) { - _counterStart = value; - _propertyChanged(this, new PropertyChangedEventArgs("CounterStart")); - Invalidate(); + return; } + + _counterStart = value; + Invalidate(); + _propertyChanged?.Invoke(this, new PropertyChangedEventArgs("CounterStart")); } } diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index 133112824..d64f9a863 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -207,6 +207,8 @@ namespace Greenshot { // Workaround: for the MouseWheel event which doesn't get to the panel MouseWheel += PanelMouseWheel; + // Make sure the value is set correctly when starting + counterUpDown.Value = Surface.CounterStart; ApplyLanguage(); } diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index af2e4453c..fe5838095 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -49,8 +49,8 @@ ..\Greenshot\Lib\log4net.dll - - ..\packages\Svg.2.2.1\lib\net35\Svg.dll + + ..\packages\Svg.2.2.2\lib\net35\Svg.dll True diff --git a/GreenshotJiraPlugin/packages.config b/GreenshotJiraPlugin/packages.config index bfe2a551d..fade6b5dd 100644 --- a/GreenshotJiraPlugin/packages.config +++ b/GreenshotJiraPlugin/packages.config @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/GreenshotPlugin/Interfaces/Generic.cs b/GreenshotPlugin/Interfaces/Generic.cs index 30dff7583..4fc2da7aa 100644 --- a/GreenshotPlugin/Interfaces/Generic.cs +++ b/GreenshotPlugin/Interfaces/Generic.cs @@ -111,6 +111,9 @@ namespace Greenshot.Plugin event SurfaceDrawingModeEventHandler DrawingModeChanged; event SurfaceElementEventHandler MovingElementChanged; + /// + /// Start valueof the step-labels (counts) + /// int CounterStart { get; set; } /// From 5226b5d79f3ce2cfeeb15b7c701a6c563fd958ba Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 22 Nov 2016 10:29:13 +0100 Subject: [PATCH 149/170] Added FEATURE-863 to the readme.txt --- Greenshot/releases/additional_files/readme.txt.template | 1 + 1 file changed, 1 insertion(+) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 8fef4301f..0ea4c9940 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -41,6 +41,7 @@ Fixed bugs: * BUG-2071 Authentication not completing with Box.com Added features: +* FEATURE-863 The start value of the counters can now be changed * FEATURE-916 Added icon save format (capture will be resized to 16x16, 32x32, 48x48 or 256x256) * FEATURE-919 Added a way to increase the editor canvas size (use Ctrl + / Ctrl -) * FEATURE-945 Added environment variables resolving to the external command plugin From fdd855cf1461b49aea74f1b814fa2fc4af88b6dd Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 7 Dec 2016 23:12:09 +0100 Subject: [PATCH 150/170] BUG-2070: Prevents all files in the target directory to be deleted, I am not certain yet if this is THE solution... [skip ci] --- Greenshot/releases/innosetup/setup.iss.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Greenshot/releases/innosetup/setup.iss.template b/Greenshot/releases/innosetup/setup.iss.template index c81af71d3..23080614a 100644 --- a/Greenshot/releases/innosetup/setup.iss.template +++ b/Greenshot/releases/innosetup/setup.iss.template @@ -652,7 +652,7 @@ Filename: "{app}\{#ExeName}.exe"; Description: "{cm:startgreenshot}"; Parameters Filename: "http://getgreenshot.org/thank-you/?language={language}&version={#Version}"; Flags: shellexec runasoriginaluser [InstallDelete] -Name: {app}; Type: filesandordirs; +Name: {app}; Type: dirifempty; [UninstallRun] Filename: "{code:GetNGENPath}\ngen.exe"; Parameters: "uninstall ""{app}\{#ExeName}.exe"""; StatusMsg: "Cleanup"; Flags: runhidden From e3151797214bf78390319b73fc2560c8f99b67b0 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 11 Dec 2016 20:12:52 +0100 Subject: [PATCH 151/170] Releasing 1.2.9 --- Greenshot/releases/additional_files/readme.txt.template | 6 +----- appveyor12.yml | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 0ea4c9940..5c014e1ce 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,11 +9,6 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ -This is a release candidate for the coming release of Greenshot. -**Testing is not finished, use at your own risk...** - -Changes for the following reported tickets were added since 1.2.8.14: - Fixed bugs: * BUG-1762 Dropshadow & tornedge prompts for settings every time * BUG-1812 Editor opens outside the screen @@ -38,6 +33,7 @@ Fixed bugs: * BUG-2011 Editor issues when the font is gone or broken * BUG-2043 Fixed an issue which occured after wakeup from sleep * BUG-2059 Reduce the update check interval +* BUG-2070 Installing Greenshot deletes everything in the target directory * BUG-2071 Authentication not completing with Box.com Added features: diff --git a/appveyor12.yml b/appveyor12.yml index d8e129c14..07aaa346b 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: RC3 + build_type: RELEASE rsakey: secure: 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 before_build: From 3721c1004d2b146fd31b1e20740b8add11a61330 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 15 Dec 2016 20:33:43 +0100 Subject: [PATCH 152/170] Fixed readme.txt for the update check, this was a bit ambiguous. [release] --- Greenshot/releases/additional_files/readme.txt.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 5c014e1ce..f540446b5 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -32,7 +32,7 @@ Fixed bugs: * BUG-1992 OutputFilePath setting is wrong config used on a different system * BUG-2011 Editor issues when the font is gone or broken * BUG-2043 Fixed an issue which occured after wakeup from sleep -* BUG-2059 Reduce the update check interval +* BUG-2059 The default frequency of update checks is now reduced from every day to every 14 days * BUG-2070 Installing Greenshot deletes everything in the target directory * BUG-2071 Authentication not completing with Box.com From 95903b3d28a26d4d24c384a1e0bf3c109516c642 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 20 Dec 2016 22:34:18 +0100 Subject: [PATCH 153/170] BUG-2065: Simple fix by catching exception. Don't know what happens after that... [skip ci] --- Greenshot/Drawing/Adorners/MoveAdorner.cs | 9 ++++++++- appveyor12.yml | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Greenshot/Drawing/Adorners/MoveAdorner.cs b/Greenshot/Drawing/Adorners/MoveAdorner.cs index 2d0c8d390..6e0aed9c7 100644 --- a/Greenshot/Drawing/Adorners/MoveAdorner.cs +++ b/Greenshot/Drawing/Adorners/MoveAdorner.cs @@ -150,7 +150,14 @@ namespace Greenshot.Drawing.Adorners targetGraphics.PixelOffsetMode = PixelOffsetMode.Half; targetGraphics.InterpolationMode = InterpolationMode.NearestNeighbor; - targetGraphics.FillRectangle(Brushes.Black, bounds.X, bounds.Y, bounds.Width , bounds.Height); + try + { + targetGraphics.FillRectangle(Brushes.Black, bounds.X, bounds.Y, bounds.Width, bounds.Height); + } + catch + { + // Ignore, BUG-2065 + } targetGraphics.Restore(state); } } diff --git a/appveyor12.yml b/appveyor12.yml index 07aaa346b..fd16f2741 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: RELEASE + build_type: UNSTABLE rsakey: secure: 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 before_build: From 5c9fde65edb71ae8686e4fd74083d308e77c7acf Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 24 Dec 2016 13:34:48 +0100 Subject: [PATCH 154/170] BUG-2077 & BUG-2083: Fixed a bug where 0, which means that there is no update check, was not allowed. [skip ci9] --- GreenshotPlugin/Core/CoreConfiguration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index e49fb491b..54c146773 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -427,7 +427,7 @@ namespace GreenshotPlugin.Core { } // Fix for excessive feed checking - if (UpdateCheckInterval <= 7 && LastSaveWithVersion.StartsWith("1.2")) + if (UpdateCheckInterval != 0 && UpdateCheckInterval <= 7 && LastSaveWithVersion.StartsWith("1.2")) { UpdateCheckInterval = 14; } From a91dc8a798ed57ca1c63a3e51b483de68d484df9 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 24 Dec 2016 19:59:09 +0100 Subject: [PATCH 155/170] BUG-2080: Fix for an exception when a filename on the clipboard doesn't have an extension. [skip ci] --- GreenshotPlugin/Core/ClipboardHelper.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/GreenshotPlugin/Core/ClipboardHelper.cs b/GreenshotPlugin/Core/ClipboardHelper.cs index 6e9162f19..a2462708d 100644 --- a/GreenshotPlugin/Core/ClipboardHelper.cs +++ b/GreenshotPlugin/Core/ClipboardHelper.cs @@ -811,19 +811,14 @@ EndSelection:<<<<<<<4 /// public static IEnumerable GetImageFilenames(IDataObject dataObject) { string[] dropFileNames = (string[]) dataObject.GetData(DataFormats.FileDrop); - if (dropFileNames != null && dropFileNames.Length > 0) { - foreach (string filename in dropFileNames) { - if (string.IsNullOrEmpty(filename)) - { - continue; - } - string ext = Path.GetExtension(filename).ToLower().Substring(1); - if (ImageHelper.StreamConverters.ContainsKey(ext)) - { - yield return filename; - } - } + if (dropFileNames != null && dropFileNames.Length > 0) + { + return dropFileNames.Where(filename => !string.IsNullOrEmpty(filename)) + .Where(Path.HasExtension) + .Select(filename => Path.GetExtension(filename).ToLowerInvariant()) + .Where(ext => ImageHelper.StreamConverters.Keys.Contains(ext)); } + return Enumerable.Empty(); } /// From 5dc8c1368e2e16418b89fa4e2d03eee053243db3 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 24 Dec 2016 20:17:59 +0100 Subject: [PATCH 156/170] More changes for the dutch translations by Stephan Paternotte [skip ci] --- Greenshot/Languages/help-nl-NL.html | 465 ++++++++++++++++--------- Greenshot/Languages/language-nl-NL.xml | 54 +-- 2 files changed, 323 insertions(+), 196 deletions(-) diff --git a/Greenshot/Languages/help-nl-NL.html b/Greenshot/Languages/help-nl-NL.html index 0169cca9d..d4e90dee9 100644 --- a/Greenshot/Languages/help-nl-NL.html +++ b/Greenshot/Languages/help-nl-NL.html @@ -15,7 +15,7 @@ a:link, a:hover, a:visited, a:active {color:#009900;} kbd {background-color:#dddddd;border:1px solid #bbbbbb;padding:0 2px;border-radius:2px;} p.hint {background-color:#ffffdd;border:1px solid #ddddbb;padding:5px;} - + em {padding-right:0.2em;} @@ -23,273 +23,398 @@ - Version 0.8 Nederlanse vertaling van de help door Jurjen Ladenius + Versie 1.0 - Nederlandse vertaling van de help door Jurjen Ladenius en Stephan Paternotte

      Inhoud

        -
      1. Een screenshot maken
      2. +
      3. Een schermopname maken
        1. -
        2. Regio vastleggen
        3. -
        4. Laast gebruikte regio vastleggen
        5. -
        6. Window vangen
        7. -
        8. Gehele beeldscherm vastleggen
        9. +
        10. Interactief kader
        11. +
        12. Laastgebruikte schermopname
        13. +
        14. Actief venster
        15. +
        16. Volledige schermopname
        17. +
        18. Internet Explorer schermopname
        -
      4. Using the image editor
      5. +
      6. De beeldbewerker gebruiken
        1. -
        2. Drawing shapes
        3. -
        4. Adding text
        5. -
        6. Highlighting things
        7. -
        8. Obfuscating things
        9. -
        10. Cropping the screenshot
        11. -
        12. Re-using drawn elements
        13. -
        14. Exporting the screenshot
        15. +
        16. Vormen tekenen
        17. +
        18. Tekst toevoegen
        19. +
        20. Markeren
        21. +
        22. Maskeren
        23. +
        24. Effecten toepassen
        25. +
        26. Schermopname bijsnijden
        27. +
        28. Afbeeldingen aan een schermopname toevoegen
        29. +
        30. Getekende elementen hergebruiken
        31. +
        32. Schermopname exporteren
        -
      7. The settings dialog
      8. +
      9. Het instellingenvenster
        1. -
        2. General settings
        3. -
        4. Output settings
        5. -
        6. Printer settings
        7. +
        8. Algemene instellingen
        9. +
        10. Schermopname-instellingen
        11. +
        12. Resultaat-instellingen
        13. +
        14. Bestemmingsinstellingen
        15. +
        16. Printer-instellingen
        17. +
        18. Expert-instellingen
        -
      10. Want to help?
      11. +
      12. Wilt u helpen?
        1. -
        2. Consider a donation
        3. -
        4. Spread the word
        5. -
        6. Submit a translation
        7. +
        8. Overweeg een donatie
        9. +
        10. Vertel het door
        11. +
        12. Draag bij met een vertaling
      -

      Een screenshot maken

      +

      Een schermopname maken

      - U kunt een screenshot maken door de Print toets van uw keyboard te drukken of - rechts op het Greenshot icon in de systray te klikken
      - Er zijn meerdere mogelijkheden om een screenshot te maken: + U kunt een schermopname maken door op uw toetsenbord de Print-toets te drukken of + een rechtermuisklik op het Greenshot-icoon in het systeemvak te geven
      + Er zijn meerdere mogelijkheden om een schermopname te maken:

      -

      Regio vastleggen Print

      +

      Interactief kader Print

      - De "regio vastleggen" modus maakt het mogelijk om een gebied van het beeldscherm te markeren voor een screenshot.
      + De "regio-opname" modus maakt het mogelijk om een gebied van het beeldscherm te markeren voor een schermopname.
      Nadat de regio vastlegen modus gestart wordt verandert de mouse-cursor in een kruis. - Stuur de muis naar een hoek van het gebied waarvan u een screenshot wilt hebben en - druk op de linker muisknop en hou deze gedrukt. Beweeg nu de muis naar de tegenovergestelde hoek - van uw doelgebied, tijdens het bewegen ziet u een groeiende groene rechthoek. - Op het moment dat u de linker muisknop los laat word het gehele groene gebied vastgelegd. + Positioneer de muis naar een hoek van het gebied waarvan u een schermopname wilt hebben en + druk op de linkermuisknop en houd deze ingedrukt. Beweeg nu de muis naar de diagonale hoek + van uw doelgebied. Tijdens het bewegen ontstaat een groeiende groene rechthoek. + Op het moment dat u de linkermuisknop loslaat wordt van het groene gebied een schermopname gemaakt.

      - U kunt de spatie toets gebruiken om tussen de "regio vastleggen" en de - window modus te wisselen. De Esc-toets breekt het vastleggen af. + U kunt de spatie toets gebruiken om wisselen tussen de modi "regio-opname" en + venster. Met de Esc-toets breekt u de schermopname af.

      - Als u een zeer exact gebied wilt vastleggen is het misschen eenvoudiger om eerst een groter - gebied te nemen en dan de screeshot bij te snijden in de - Greenshot beeld bewerking. + Als u een zeer exact gebied wilt vastleggen is het misschien eenvoudiger om eerst van een groter + gebied een schermopname te maken en deze vervolgens in de Greenshot beeldbewerker + bij te snijden.

      -

      Laast gebruikte regio vastleggen Shift + Print

      +

      Laatstgebruikte schermopnameShift + Print

      - Als u al een keer een regio of een window - vastgelegt heeft, heeft u met deze optie de mogelijkheid nog een keer de zelfde regio vast te leggen. + Als u al een keer een schermopname heeft gemaakt van een kader + of een venster, dan heeft u met deze optie de mogelijkheid hetzelfde gebied nog eens vast te leggen.

      -

      Window vangen Alt + Print

      +

      Actief venster Alt + Print

      - Maakt een screenshot van het aktive window. + Maakt een schermopname van het aktieve venster.

      - In de voorkeursinstellingen is een optie om niet - het aktive window te vangen, maar om een window interaktiv uit te kiezen. - Als deze optie aan staat kunt u een window selekteren door erop te klikken. - (net als in de regio vastleggen modus tekent Greenshot - een groene rechhoek om het window wat gekozen wordt.)
      - Als u gedeeltes van een window wilt vangen, bijvoorbeeld het zichtbare gedeelte - van de website die op dit moment in Internet Explorer getoont word, dan beweeg de muis - over het window een druk de PgDown toets. Op dit moment is het mogelijk - om kleinere gedeeltes van het window te selekteren en te vangen. + Gebruik bij Windows 7 of Vista de Schermopname-instellingen om te bepalen + hoe Greenshot omgaat met transparante (Aero) vensterranden, etc. het vervangen + van transparanties door een vaste kleur. +

      +

      + De instellingendialoog biedt de mogelijkheid om niet direct + het actieve venster te fotograferen, maar een venster interactief te selecteren. + Als deze optie geactiveerd is, kunt u een venster selecteren door het te klikken (zoals bij + Interactief kader, zal Greenshot het te fotograferen + gebied markeren).
      Als u een deelvenster wilt fotograferen, zoals bijv. een browservenster + zonder menu of gereedschapsbalk of een enkel onderdeel in een webpagina, + positioneer dan de muis over het deelvenster en druk de PgDown-toets. Hierna + kunt u de specifieke vensterelementen selecteren voor de schermopname. +

      +

      + Schermopnamen van contextmenu's zijn lastig te maken: bij gebruik van de sneltoets voor een + "Venster"-schermopname zal het contextmenu verdwijnen en dat zal ook gebeuren als u + Greenshot's contextmenu gebruikt om de schermopname te maken. Wilt u een + schermopname maken van een contextmenu dat u zojuist met een rechtermuisklik hebt geopend, + gebruik dan eenvoudig "Interactief kader" Print en druk dan de Spatie-balk.

      -

      Gehele beeldscherm vastleggen Control + Print

      +

      Volledige schermopname Control + Print

      - Maakt een screenshot van het gehele beeldscherm, ook als er meerdere monitoren gebruikt worden. + Hierbij wordt een schermopname gemaakt van het gehele scherm, ook als meerdere monitoren gebruikt worden.

      + + +

      Internet Explorer schermopnameControl + Shift + Print

      +

      + Deze funcie maakt eenvoudig een schermopname van een webpagina die geopend is in Internet Explorer. + Gebruik Greenshot's contextmenu om de tab in Internet Explorer te selecteren voor schermopname, of druk + Crtl + Shift + Print om een schermopname te maken van de actieve tab. +

      + -

      De Greenshot beeld bewerking gebruiken

      +

      De Greenshot beeldbewerker gebruiken

      - Greenshot komt met een eenvoudig te gebruiken beeld bewerking die verschillende handige werktuigen heeft en het - mogelijk maakt om vormen en annotaties op een screenshot te maken. Het is zelfs mogelijk om bepaalde delen van + Greenshot heeft een eenvoudig te gebruiken beeldbewerkingsprogramma met verschillende handige functies en + mogelijkheden om een schermopname te voorzien van vormen en annotaties. Het is ook mogelijk om bepaalde delen van uw screenshot onherkenbaar te maken of te markeren waardoor het beter opvalt.

      - De Greenshot beeld bewerking kan niet alleen voor screenshot maar ook voor andere beelden uit bestanden of het klembord gebruikt worden. - Klik hiervoor met de rechter muis knop op het Greenshot icon in de systray en selekteer Open beeld uit bestand - of Laad beeld van het klembord. + De Greenshot beeldbewerker is niet alleen handig voor schermopnamen, maar is ook te gebruiken voor andere + afbeeldingen uit bestanden of het klembord. Klik hiervoor met de rechter muisknop op het Greenshot-icoon + in het systeemvak en selecteer Afbeelding uit bestand openen of + Afbeelding laden van het klembord.

      - By default, the image editor will be opened whenever a screenshot is - captured. If you do not want to use the image editor, you can disable this - behavior in the settings dialog. + Wanneer een schermopname is gemaakt wordt standaard de beeldbewerker geopend. + Indien u dit niet wenst, kunt u dit gedrag in het instellingen-venster + afschakelen.

      -

      Drawing shapes

      +

      Vormen tekenen

      - Select one of the shape drawing tools from the toolbar on the left hand side - of the image editor or from the Object menu. There is also a key assigned - to each tool for your convenience.
      - Available shapes are: rectangle R, ellipse E, line L - and arrow A.
      - Click, hold down the mouse button and drag to define position and size of the shape. - Release the mouse button when you are done. + Kies een van de vormen in de gereedschapsbalk aan de linkerzijde van de beeldbewerker + of van het menu Object. Aan elke toets is tevens een sneltoets gekoppeld + voor snelle toegang via het toetsenbord.
      + Beschikbare vormen zijn: rechthoek R, ellips E, lijn L + pijl A en vrije vorm F.
      + Klik en sleep de muis om de positie en de grootte van de vorm te bepalen. + Laat de muisknop los als de vorm van de juiste afmetingen is.

      - You can move or resize existing shapes after selecting the selection tool - ESC from the toolbar.
      For every element type there is a specific - set of options available to change the look of the element (e.g. line thickness, - line color, fill color). You can change the options for an existing element after - selecting it, but also for the next element to be drawn after selecting a drawing tool. + Getekende vormen kunnen worden verplaatst en vergroot met behulp van de knop Selectie + ESC op de gereedschapsbalk.
      Voor elk vormtype zijn specifieke + opties beschikbaar om het uiterlijk aan te passen (bijv. lijndikte, + lijnkleur, vulkleur). U kunt het uiterlijk veranderen voor een bestaand geselecteerd object, + maar u kunt ook de eigenschappen instellen voor de volgende te tekenen vorm.

      - You can select multiple elements for editing at a time. In order to select multiple - elements, hold down the Shift key while clicking the elements. + Op elk moment kunnen meerdere elementen worden geselecteerd door tijdens het maken van de selectie + de Shift-toets ingedrukt te houden. +

      +

      + Wilt u een symmetrische vorm tekenen (bijv. een vierkant of een cirkel)? Houd dan tijdens het tekenen + de Shift-toets ingedrukt. Bij het tekenen van pijlen, beperkt de Shift-toets + de mogelijke hoeken tot veelvouden van 15°.
      + Bij het vergroten van een bestaand object zorgt de Shift-toets ervoor dat de verhoudingen behouden blijven. +

      +

      + Bij het tekenen of het vergroten kunt u de Ctrl-toets ingedrukt houden om het object + in het geometrische centrum te fixeren. Zo kan een object ook in tegenovergestelde richting worden vergroot. + (Dit kan erg handig zijn om een ellips aan een schermafdruk toe te voegen.)

      -

      Adding text

      +

      Tekst toevoegen

      - Usage of the text tool T is similar to the usage of the - shape tools. Just draw the text element to the desired - size, then type in the text.
      - Double click an existing text element to edit the text. + Het gebruik van de Tekst-functie T is vergelijkbaar met dat van + Vormen toevoegen. Plaats een tekst-element van de gewenste grootte + en typ de tekst.
      + Dubbelklik een bestaande tekst om deze te bewerken.
      + Gebruik Return of Enter als u klaar bent met bewerken. +

      +

      + Gebruik Shift + Return of Shift + Enter + om binnen een tekstkader een nieuwe regel te beginnen.

      -

      Highlighting things

      +

      Markeren

      - After selecting the highlight tool H, you can define the area to be - highlighted exactly like you would draw a shape.
      - There are several options for highlighting, which you can choose from by clicking - the leftmost button in the toolbar on top: + Met de Markeer-functie H, kunt u een gebied markeren op precies dezelfde wijze + als waarmee u een vorm shape tekent.
      + De volgende opties bij het markeren zijn beschilbaar via de meest linkse knop + in de gereedschapsbalk:

        -
      • Highlight text: highlights an area by applying a bright color to it, like - an office text highlighter
      • -
      • Highlight area: blurs* and darkens everything outside the selected area
      • -
      • Grayscale: everything outside the selected area will be turned to grayscale
      • -
      • Magnify: the selected area will be displayed magnified
      • +
      • Tekst markeren: Een gebied markeren met een heldere kleur, zoals een markeerstift
      • + +
      • Gebied oplichten: Alles buiten het geselecteerde gebied vervagen* en donkerder maken
      • +
      • Grijstinten: Alles buiten het geselecteerde gebied wordt omgezet naar grijstinten
      • +
      • Vergroten: Het geselecteerde gebied wordt vergroot weergegeven
      -

      Obfuscating things

      +

      Maskeren

      - Obfuscating parts of a screenshot is a good idea if it contains data which is not - intended for other people to see, e.g. bank account data, names, passwords or faces on images.
      - Use the obfuscate tool O exactly like the highlight - tool.
      - Available options for obfuscation are: + Delen van een schermopname maskeren is een goed gebruik wanneer persoonlijke gegevens in beeld zijn + die beter privé kunnen blijven, zoals bijv. bankgegevens, namen, wachtwoorden of herkenbare personen.
      + De functie Maskeren O gebruikt u net als het Markeren.
      + + Beschikbare opties voor Maskeren zijn:

        -
      • Pixelize: increases the pixel size for the selected area
      • -
      • Blur*: blurs the selected area
      • +
      • Pixeleren: Vergroot de pixels in het geselecteerde gebied
      • +
      • Vervagen*: Vervaagt het beeld in het geselecteerde gebied

      - * Depeding on the performance of your computer, applying a blur effect might slow down - Greenshot's image editor. If you feel the image editor reacting slowly as soon as a - blur is applied, try reducing the value for Preview quality in the toolbar or - decrease the value for Blur radius.
      - If the blur performance is still too bad for you to work with, you might prefer - to use the pixelize effect instead. + * Afhankelijk van uw computer kan het vervagingseffect de werking van Greenshot's beeldbewerker + trager maken. Merkt u dat de beeldbewerker bij de toepassing van Vervagen traag en sloom wordt, + probeer dan de kwaliteit van de voorvertoning in de gereedschapsbalk te verminderen of + verlaag de waarde voor de Vervagings-radius.
      + Blijft de functie Vervagen traag reageren, probeer dan de functie Pixeleren te gebuiken. + +

      + +

      Effecten toevoegen

      +

      + U kunt aan uw schermopname verschillende effecten toevoegen. Zo kunt u bijvoorbeeld een lijst toevoegen + of een schaduw of het effect van gescheurde randen om de afbeelding meer nadruk te geven. + De effecten Grijstinten en Negatief zijn met name nuttig voor het afdrukken en de besparing van inkt of toner bij + kleurrijke of donkere schermopnames.

      -

      Cropping the screenshot

      +

      Schermopname bijsnijden

      - If you only need a part of the screenshot you have captured, use the crop tool C - to crop it to the desired area.
      - After selecting the crop tool, draw a rectangle for the area of the screenshot you want - to keep. You can resize the selected area like any other element.
      - When you are content with your selection, use the confirm button in the toolbar or hit - the Enter key. You can cancel cropping by clicking the cancel button or hitting - ESC. + Als u maar een deel van de schermopname nodig hebt, gebruik dan de functie bijsnijden C + om de overtollige delen weg te snijden.
      + Na het activeren van de functie bijsnijden, tekent u een rechthoek om het gebied van de schermopname dat behouden + moet worden. U kunt de afmetingen van het geselecteerde gebied naar wens aanpassen.
      + Bent u tevreden over het geselecteerde gebied, bevestig het bijsnijden dan in de gereedschapsbalk of type Enter. + U kunt het bijsnijden afbreken met de toets ESC. + +

      +

      + Automatisch Bijsnijden: Als u een schermopname wilt bijsnijden tot een rand of vlakke achtergrondkleur, + gebruik dan Automatisch bijsnijden in het menu Bewerken en Greenshot zal het bij te snijden gebied + automatisch bepalen. +

      + + +

      + Gebruik de functie Roteren om een schermopname linksom of rechtsom te draaien. +

      + + +

      Afbeeldingen aan een schermopname toevoegen

      +

      + U kunt eenvoudig afbeeldingen aan een schermopname toevoegen door een afbeeldingsbestand in + het venster van de beeldbewerker te slepen. U kunt ook schermopnames van andere vensters invoegen met behulp van + de functie Venster invoegen in het menu Bewerken. Een lijst van alle geopende vensters biedt u + de gelegenheid er een te kiezen om in te voegen.

      -

      Re-using drawn elements

      +

      Eerder getekende elementen hergebruiken

      - If you find yourself using the same or similar elements on most of your screenshots - (e.g. a textfield containing browser type and version, or obfuscating the same - element on several screenshots) you can re-use elements.
      - Select Save objects to file from the Object menu to save the current - set of elements for re-using it later. Load objects from file applies the - same elements to another screenshot. + Als u regelmatig dezelfde elementen toepast in de bewerking van uw schermopnamen + (bijv. een tekstkader met browsertype en versienummer, of het maskeren van hetzelfde + element in verschillende schermopnamen) dan kunt u deze elementen hergebruiken.
      + Kies in het menu Objecten, Objecten opslaan om de huidige elementen op te slaan + voor later gebruik. Objecten laden past deze eerder opgeslagen elementen toe + op een andere schermopname.

      -

      Exporting the screenshot

      +

      Schermopname exporteren

      - After editing the screenshot, you can export the result for different purposes, - depending on your needs. You can access all export options through the File - menu, the topmost toolbar or via shortcuts: + Na het bewerken van de schermopname, kunt u het resultaat naar believen + opslaan voor later gebruik. Alle opties voor het exporteren zijn beschikbaar via het menu Bestand, + de bovenste gereedschapsbalk of via de sneltoetsen:

        -
      • Save Control + S: saves the image to a file (if the image has already been saved, else displays Save as... dialog
      • -
      • Save as... Control + Shift + S: lets you choose location, filename and image format for the file to save
      • -
      • Copy image to clipboard Control + Shift + C: puts a copy of the image into the clipboard, allowing to paste into other programs
      • -
      • Print... Control + P: sends the image to a printer
      • -
      • E-Mail Control + E: opens a new message in your default e-mail client, adding the image as attachment
      • +
      • Opslaan Ctrl + S: slaat de afbeelding op naar een bestand (als het bestand al is opgeslagen, anders wordt Opslaan als… getoond
      • +
      • Opslaan als… Ctrl + Shift + S: laat u een locatie, bestandsnaam en afbeeldingsformaat kiezen voor het opslaan van het bestand
      • +
      • Afbeelding naar klembord kopiëren Ctrl + Shift + C: plaatst een kopie van de afbeelding op het klembord, zodat u het vervolgens in een ander programma kunt kopiëren
      • +
      • Afdrukken… Ctrl + P: stuurt de afbeelding naar een printer
      • +
      • E-mail Ctrl + E: opent een nieuw bericht in uw standaard e-mailprogramme met de afbeelding als bijlage
      +

      + Er zijn plugins om schermopnamen te exporteren naar andere bestemmingen, zoald DropBox, Picasa, Flickr. + Selecteer de relevante plugins tijdens de installatie van Greenshot. +

      - After saving an image from the editor, right-click the status bar at the bottom of - the editor window to either copy the file path into the clipboard or open the - containing directory in Windows Explorer. + Klik, nadat u de afbeelding hebt opgeslagen, de statusbalk onderaan de beeldbewerker + om het bestandspad naar het klembord te kopiëren of de betreffende map met + Windows Explorer te openen.

      -

      The settings dialog

      +

      Het instellingenvenster

      -

      General settings

      +

      Algemene instellingen

        -
      • Language: The language you prefer to be used.
        - You can download additional language files for Greenshot here.
      • -
      • Register hotkeys: If checked, Greenshot can be used with the Print key.
      • -
      • Launch Greenshot on startup: Start the program when the system has been booted.
      • -
      • Show flashlight: Visual feedback when doing a capture
      • -
      • Play camera sound: Audible feedback when doing a capture
      • -
      • Capture mousepointer: If checked, the mousepointer will be captured. The pointer is handled is a separate element in the editor, so that you can move or remove it later.
      • +
      • Taal: De taal waarin Greenshot wordt weergegeven.
        + Aanvullende taalbestanden zijn te downloaden van de Greenshot website.
      • +
      • Greenshot automatisch opstarten: Start het programma als de PC wordt opgestart.
      • +
      • Sneltoetsen: De sneltoetsen aanpassen voor het maken van schermopnames.
      • +
      • Systeem-proxy gebruiken: Greenshot gebruikt de systeem-proxy instelllingen bij het zoeken naar updates.
      • +
      • Versiecontrole-interval [dagen]: Greenshot automatisch uitkijken naar nieuwe versies. Gebruik deze instelling om het + interval (in dagen) aan te passen of gebruik 0 om de versiecontrole af te schakelen.
      • +
      + + +

      Opname-instellingen

      +
        +
      • Muisaanwijzer opnemen: Indien geactiveerd, wordt de muisaanwijzer in de schermopname meegenomen. De muisaanwijzer is een apart element in the beeldbewerker, dus u kunt deze later nog verplaatsen of verwijderen.
      • +
      • Camerageluid afspelen: Het maken van een schermopname gaat gepaard met een geluidseffect
      • +
      • Vertragingstijd voor de schermopname [ms]: Een instelbare tijdsvertraging welke wordt toegepast voor de schermopname.
      • Use interactive window capture mode: Instead of capturing the active window right away, interactive mode allows you to select the window to capture. It is also possible to capture child windows, see window capture.
      • +
      • + Aero schermopname (alleen Windows Vista / 7): Als u Greenshot gebruikt bij Windows Vista of Windows 7 met aero geactiveerd, dan kunt u + aangeven hoe transparante vensterranden moeten worden behandeld bij het maken van de schermopname. Gebruik deze instelling om te voorkomen dat elementen + in de achtergrond met de transparante vensterranden mee worden gefotografeerd. +
          +
        • Automatisch: Laat Greenshot bepalen hoe om te gaan met transparantie.
        • +
        • Zoals weergegeven: Transparante randen worden opgenomen zoals deze op het scherm worden weergegeven.
        • +
        • Standaardkleur gebruiken: De transparantie wordt vervangen door een solide standaardkleur.
        • +
        • Aangepaste kleur gebruiken: Selecteer een kleur die wordt gebruikt ter vervanging van transparanties.
        • +
        • Transparantie behouden: Vensterranden worden opgenomen met behoud van hun transparantie, waarbij objecten in de achtergrond worden geneerd. + (Opm.: transparante gebied worden in de beeldbewerker weergegeven met een geblokt patroon. Dit blokpatroon wordt niet bij het opslaan van de afbeeelding niet geëxporteerd. + Sla de afbeelding op als PNG voor volledige ondersteuning van transparanties.)
        • +
        +
      • +
      • Internet Explorer schermopname: Maakt eenvoudige schermopnames mogelijk van webpagina's in Internet Explorer.
      • +
      • Beeldbewerker-venster aanpassen op schermopname: Indien geactiveerd, past de beeldbewerker automatisch het venster aan op de afmetingen van de schermopname.
      • +
      -

      Output settings

      +

      Resultaat-instellingen

        -
      • Screenshot destination: Allows you to choose the destination(s) for your screenshot right after capturing it.
      • +
      • Bestemming schermopname: Hiermee kunt u opgeven naar welke bestemming(en) de schermopnamen moeten worden opgeslagen.
      • Preferred output file settings: Directory and filename to be used when saving directly or to be suggested when saving (using the save-as dialog). Click the ? button to learn more about the placeholders that can be used as filename pattern.
      • -
      • JPEG settings: Quality to be used when saving JPEG files
      • +
      • JPEG-instellingen: De kwaliteit waarmee de afbeeldingen worden opgeslagen als JPEG-bestand.
      + +

      Bestemming

      +

      + Na de schermopname vertoont Greenshot een eenvoudig menu waarmee u zelf een bestemmingsmap kiezen. + Is er geen noodzaak of heeft u geen behoefte om de bestemminsmap aan te passen, + dan kunt Greenshot instellen de schermopnames direct naar meerdrere bestemmingen op te slaan, zonder + tussenkomst van het keuzemenu.
      + Opmerking: Net als bij het exporteren vanuit het beeldbewerkingsvenster, zullen mogelijke bestemmingen + afhangen van de plugins welke met Greenshot zijn geïnstalleerd. +

      + -

      Printer settings

      +

      Printer-instellingen

        -
      • Shrink printout to fit paper size: If the image would exceed paper size, it will be shrinked to fit on the page.
      • -
      • Enlarge printout to fit paper size: If the image is smaller than the paper size, it will be scaled to be printed as large as possible without exceeding paper size.
      • -
      • Rotate printout to page orientation: Will rotate a landscape format image by 90� for printing.
      • +
      • Afbeelding verkleinen tot pagina-afmetingen: Wanneer de afbeelding te groot zou zijn voor het papier, wordt deze verkleind zodat deze past op de pagina.
      • +
      • Afbeelding vergroten tot pagina-afmetingen: Wanneer de afbeelding kleiner is dan de papiergrootte, wordt deze vergroot zodat de pagina vult.
      • +
      • Afdruk roteren en aanpassen aan papier-oriëntatie: Afbeeldingen met horizontale oriëntatie worden 90° gedraaid voor een afdruk op papier met verticale oriëntatie.
      • +
      • Negatieve kleuren afdrukken: De afbeelding wordt in kleur-negatief afgedrukt. Bijvoorbeeld handig bij het afdrukken van een afbeelding met witte tekst tegen een donkere achtergrond (besparing toner/inkt).
      • +
      • Grijstinten forceren: Kleuren in de afbeelding worden voor de afdruk omgezet naar grijstinten.
      + + +

      Plugin-instellingen

      +

      + Hier wordt de lijst met geïnstalleerde Greenshot-plugins weergegeven. Selecteer een plugin van de lijst and klik Instellingen + om de instellingen van de plugin aan te passen. +

      + + +

      Expert-instellingen

      +

      + Serieus: Als u geen idee heeft wat u doet en welke gevolgen het kan hebben, verander dan niets aan deze instellingen. +

      U wilt helpen?

      - Op dit moment zoeken we geen hulp voor de ontwikkeling. Maar u kunt meerdere dingen doen om + Op dit moment zoeken we geen hulp bij de ontwikkeling. Maar u kunt wel iets doen om het Greenshot ontwikkelteam te ondersteunen.
      Bij voorbaat dank :)

      @@ -297,35 +422,37 @@

      Overweeg een donatie

      - We stoppen een hoop tijd en werk in Greenshot om goede software gratis en open tot uw beschiking te stellen! - Als u het gevoel heeft dat Greenshot u meer produktief maakt, u of uw firma een hoop tijd en geld bespaard - of als u eenvoudig Greenshot en het idee van open source software goed vindt: - Overweeg een donatie ter eren van onze inspanningen.
      - Kijk AUB op onze home page om te lezen hoe u het Greenshot ontwikkelteam kunt ondersteunen:
      - http://getgreenshot.org/support/ + Wij verrichten een hoop werk aan Greenshot en besteden nogal wat tijd om + goede software gratis en vrij toegankelijk te houden. Als Greenshot + u helpt in uw werkzaamheden, als het u (of uw bedrijf) + tijd en geld bespaart, of u vindt het gewoon een fijn programma en + u staat positief tegenover het concept van open source software: Ondersteun ons werk dan met een donatie.
      + Bezoek onze website en lees daar hoe u het Greenshot team kunt ondersteunen:
      + http://getgreenshot.org/support/

      Vertel het door

      - Als u Greenshot goed vind, vertel het door: vertel uw vrienden en kollegas over Greenshot. - Uw aanhang en achterban ook! :)
      - Geef Greenshot goede kritiek in software portals of verlink Greenshot in uw blog of website. + Bevalt Greenshot u? Vertel het dan door: vertel uw vrienden en collega's over Greenshot. + En ook uw aanhang en achterban ! :)
      + Bespreek Greenshot met goede kritieken in software portals of plaats een verwijzing naar Greenshot in uw blog of op uw website.

      Maak een vertaling

      - Greenshot is niet in uw favorite taal vertaald? Als u denkt dat u software kunt vertalen dan bent u welkom! - Als u een geregisteerde gebruiker bij sourceforge.net bent kunt u uw vertaling in onze - vertalings tracker bekent maken.
      - Voordat u begin is het verstandig om te kijken of Greenshot niet al in de taal vertaalt is, zie de - downloads pagina. Ook kunt u op onze vertalings tracker kijken, - het zou kunnen dat al iemand aan de vertaling werkt of misschien hierover een diskussie heeft.
      + Is Greenshot niet beschikbaar in uw favoriete taal en u denkt dat u software kunt vertalen dan bent u welkom! + Als geregisteerde gebruiker bij sourceforge.net kunt u uw vertaling in onze + vertalings tracker aanmelden.
      + Voordat u begint is het verstandig om te kijken of Greenshot niet al in de taal vertaald is, zie de + downloads pagina. Ook kunt u op onze vertalings tracker kijken. + Het zou namelijk kunnen dat iemand al aan de vertaling werkt of misschien hierover heeft gecommuniceerd.
      - Een belangrijk punt is dat we vertalingen alleen op onze website zetten als het door iemand vertaalt is die - ook een sourceforge.net gebruiker is. Omdat we zeer waarschijnlijk de vertaling niet begrijpen is het nodig - dat we de gebruiker kunnen vinden, alleen dan kunnen we bij nieuwe Greenshot versies ook deze taal weer uitleveren. + Merk op dat vertalingen alleen kunnen worden geaccepteerd als ze afkomstig zijn van een geregistreerde + sourceforge.net-gebruiker. Wij kunnen niet elke vertaling doorgronden en daarom is het belangrijk dat we + de vertaler kunnen bereiken. Alleen op deze manier kunnen we bij nieuwe versies van Greenshot deze taal + laten bijwerken en weer uitleveren.

      diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index ac4954896..6b56c3339 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -3,7 +3,7 @@ Meld problemen bij Als Greenshot u bevalt, wilt u ons misschien ondersteunen: - Greenshot wordt gebracht door sourceforge.net op + Greenshot wordt uitgegeven door sourceforge.net op Iconen afkomstig van Yusuke Kamiyamane's Fugue (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2015 Thomas Braun, Jens Klingen, Robin Krom Greenshot komt zonder enige garantie! Dit is gratis software en het staat u vrij het onder bepaalde voorwaarden te verspreiden. @@ -58,8 +58,8 @@ Controleer ook even of dit probleem mogelijk al gemeld is! Gebruik de zoekfuncti Greenshot ondersteunen Afsluiten Help - Afbeelding openen van bestand - Laatste schermopnamelocatie openen + Afbeeldingsbestand openen + Locatie laatste schermopname openen Snelle instellingen Voorkeuren… Fout bij het exporteren naar {0}. Probeer het opnieuw. @@ -98,13 +98,13 @@ Controleer ook even of dit probleem mogelijk al gemeld is! Gebruik de zoekfuncti Verwijderen Een niveau omlaag Helemaal naar beneden - Pijl tekenen (A) - Ellips tekenen (E) - Losse hand tekenen (F) + Pijl (A) + Ellips (E) + Vrije vorm (F) Markeren (H) - Lijn tekenen (L) - Rechthoek tekenen (R) - Tekstkader toevoegen (T) + Lijn (L) + Rechthoek (R) + Tekstkader (T) Selectie dupliceren Bewerken Effecten @@ -118,7 +118,7 @@ Controleer ook even of dit probleem mogelijk al gemeld is! Gebruik de zoekfuncti Vergroten Markeringswijze Tekst markeren - Slagschaduw + Schaduw Afbeelding opgeslagen naar {0}. Venster invoegen Omkeren @@ -147,7 +147,7 @@ Controleer ook even of dit probleem mogelijk al gemeld is! Gebruik de zoekfuncti Opslaan als… Alles selecteren Afdruktaak verzonden naar '{0}'. - Slagschaduw + Schaduw Afbeelding opgeslagen op het klembord. Lijndikte Greenshot beeldbewerker @@ -167,8 +167,8 @@ Controleer de toegangsrechten voor de betreffende locatie. De schermopname kon niet worden opgeslagen, kies een andere bestemming. De bestandsnaam of bestemmingsmap is niet geldig. Corrigeer het bestandsnaampatroon en probeer het opnieuw. Expert - Afbeeldingen met minder dan 256 kleuren tot 8 bit reduceren. - Ook op test-versies controleren. + Afbeeldingen met minder dan 256 kleuren tot 8 bit reduceren + Ook op test-versies controleren Klembordformaten Het ${NUM} nummer in de bestandsnaam Ik weet wat ik doe! @@ -178,12 +178,12 @@ Controleer de toegangsrechten voor de betreffende locatie. Beeldbewerker weer gebruiken Bij het sluiten van de beeldbewerker niet vragen om op te slaan Schermvoorbeelden tonen in het context menu - Geëxporteerd naar: {0} + Geëxporteerd: {0} Er is een fout opgetreden bij het exporteren naar {0}: Greenshot Help Sneltoetsen Selecteer de JPEG-kwaliteit voor uw afbeelding. - Ok + OK Er is een fout opgetreden bij het afdrukken Afdruk op het papier centreren Afdruk vergroten en aanpassen aan de papiergrootte @@ -203,7 +203,7 @@ Controleer de toegangsrechten voor de betreffende locatie. Direct opslaan (met de standaardinstellingen) Afdrukvoorkeuren tonen wanneer een afbeelding wordt afgedrukt Vraag iedere keer dat een beeld opgeslagen wordt om de beeldkwaliteit - Porgrammainstellingen + Programmainstellingen Greenshot met Windows opstarten Schermopname Muisaanwijzer opnemen @@ -212,13 +212,13 @@ Controleer de toegangsrechten voor de betreffende locatie. Instellingen Bestandslocatie naar het klembord kopiëren wanneer een afbeelding wordt opgeslagen Bestemming - Naar klembord kopiëren - In beeldbewerker openen + Naar klembord + In beeldbewerker E-mail Direct opslaan (Onderstaande instellingen gebruiken) Opslaan als… (via dialoog) Bestemming dynamisch kiezen - Naar printer sturen + Naar printer Beeldbewerker Bestandsnaam patroon Algemeen @@ -246,10 +246,10 @@ genereert een map voor de huidige dag in uw standaard opslaglocatie, b.v. 2008-0 Uitvoer Camerageluid afspelen Plugins - Created by - DLL Path - Name - Version + Door + DLL-pad + Naam + Versie Voorkeursinstellingen voor opslaan van bestanden Afbeeldingsformaat Printer @@ -272,7 +272,7 @@ genereert een map voor de huidige dag in uw standaard opslaglocatie, b.v. 2008-0 Milliseconden vertraging voor schermopname Vensteropname-modus Vensteropname - Klik hier met de rechter muis knop of druk op de {0} knop. + Klik hier met de rechtermuisknop of druk op de {0} knop. Een nieuwe versie van Greenshot is beschikbaar! Wilt u Greenshot {0} downloaden? Wacht terwijl de Internet Explorer pagina wordt vastgelegd… Waarschuwing @@ -288,7 +288,7 @@ Alle Greenshot functies werken ook zonder sneltoetsen via het context menu. Schaduw-intensiteit Schaduw-positie - Slagschaduw instellingen + Schaduw instellingen Schaduw-breedte Horizontale rafeling @@ -305,8 +305,8 @@ Alle Greenshot functies werken ook zonder sneltoetsen via het context menu.Teller toevoegen (I) Tekstballon toevoegen (S) - Verschalen - Verschalingsinstellingen + Grootte + Vergrotingsinstellingen Verhouding behouden Breedte Hoogte From 5e653cd3f1efaefe9f5e2b403a2b80fe64ded324 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 24 Dec 2016 20:29:36 +0100 Subject: [PATCH 157/170] Added the (possible) context of the bugfix release to the readme.txt.template. [skip ci] --- .../releases/additional_files/readme.txt.template | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index f540446b5..e341bfed0 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,6 +9,20 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ +* BUG-2065 Overflow Error +* BUG-2079 Problem with authentication in JIRA plugin +* BUG-2080 Exception when opening the context menu +* FEATURE-992 Open Greenshot in foreground +* FEATURE-995 Setting to paste new images inside greenshot based on cursor location +* FEATURE-998 Open Last Capture File should select/jump to the file +* FEATURE-1000 Active OK-button in Greenshot quality + +Added or changed translation: +* Nederlands by Stephan Paternotte + + +1.2.9.104-3721c10 RELEASE + Fixed bugs: * BUG-1762 Dropshadow & tornedge prompts for settings every time * BUG-1812 Editor opens outside the screen From 48fc52aab74250859d99181c0e56ff142eaf456c Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 24 Dec 2016 22:24:16 +0100 Subject: [PATCH 158/170] FEATURE-998: opening the explorer with the last file selected, this makes it jump to the correct file. [skip ci] --- Greenshot/Forms/MainForm.cs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 9c957ef90..d5d275398 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -1304,8 +1304,8 @@ namespace Greenshot { private void NotifyIconClick(ClickActions clickAction) { switch (clickAction) { case ClickActions.OPEN_LAST_IN_EXPLORER: - string path = null; - if (!string.IsNullOrEmpty(_conf.OutputFileAsFullpath)) { + string path = _conf.OutputFileAsFullpath; + if (!File.Exists(path)) { string lastFilePath = Path.GetDirectoryName(_conf.OutputFileAsFullpath); if (!string.IsNullOrEmpty(lastFilePath) && Directory.Exists(lastFilePath)) { path = lastFilePath; @@ -1320,7 +1320,22 @@ namespace Greenshot { if (path != null) { try { - using (Process.Start(path)) {} + // Check if path is a directory + if (Directory.Exists(path)) + { + using (Process.Start(path)) + { + } + } + // Check if path is a file + else if (File.Exists(path)) + { + // Start the explorer process and select the file + using (var explorer = Process.Start("explorer.exe", $"/select,\"{path}\"")) + { + explorer?.WaitForInputIdle(500); + } + } } catch (Exception ex) { // Make sure we show what we tried to open in the exception ex.Data.Add("path", path); From 01abc5e9e49b6d69bb2157e2e08e3a582472ae31 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 25 Dec 2016 13:20:37 +0100 Subject: [PATCH 159/170] FEATURE-1000: Changed tab order to make the OK button have focus. [skip ci] --- GreenshotPlugin/Controls/QualityDialog.Designer.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GreenshotPlugin/Controls/QualityDialog.Designer.cs b/GreenshotPlugin/Controls/QualityDialog.Designer.cs index cce46080a..f754b9508 100644 --- a/GreenshotPlugin/Controls/QualityDialog.Designer.cs +++ b/GreenshotPlugin/Controls/QualityDialog.Designer.cs @@ -69,7 +69,7 @@ namespace GreenshotPlugin.Controls { this.textBoxJpegQuality.Name = "textBoxJpegQuality"; this.textBoxJpegQuality.ReadOnly = true; this.textBoxJpegQuality.Size = new System.Drawing.Size(35, 20); - this.textBoxJpegQuality.TabIndex = 16; + this.textBoxJpegQuality.TabIndex = 4; this.textBoxJpegQuality.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; // // trackBarJpegQuality @@ -79,7 +79,7 @@ namespace GreenshotPlugin.Controls { this.trackBarJpegQuality.Maximum = 100; this.trackBarJpegQuality.Name = "trackBarJpegQuality"; this.trackBarJpegQuality.Size = new System.Drawing.Size(233, 45); - this.trackBarJpegQuality.TabIndex = 14; + this.trackBarJpegQuality.TabIndex = 3; this.trackBarJpegQuality.TickFrequency = 10; this.trackBarJpegQuality.Scroll += new System.EventHandler(this.TrackBarJpegQualityScroll); // @@ -91,7 +91,7 @@ namespace GreenshotPlugin.Controls { this.checkbox_dontaskagain.Name = "checkbox_dontaskagain"; this.checkbox_dontaskagain.LanguageKey = "qualitydialog_dontaskagain"; this.checkbox_dontaskagain.Size = new System.Drawing.Size(268, 37); - this.checkbox_dontaskagain.TabIndex = 17; + this.checkbox_dontaskagain.TabIndex = 5; this.checkbox_dontaskagain.TextAlign = System.Drawing.ContentAlignment.TopLeft; this.checkbox_dontaskagain.UseVisualStyleBackColor = true; // @@ -101,7 +101,7 @@ namespace GreenshotPlugin.Controls { this.button_ok.Location = new System.Drawing.Point(205, 149); this.button_ok.Name = "button_ok"; this.button_ok.Size = new System.Drawing.Size(75, 23); - this.button_ok.TabIndex = 18; + this.button_ok.TabIndex = 1; this.button_ok.LanguageKey = "OK"; this.button_ok.UseVisualStyleBackColor = true; this.button_ok.Click += new System.EventHandler(this.Button_okClick); @@ -112,7 +112,7 @@ namespace GreenshotPlugin.Controls { this.checkBox_reduceColors.Location = new System.Drawing.Point(12, 11); this.checkBox_reduceColors.Name = "checkBox_reduceColors"; this.checkBox_reduceColors.Size = new System.Drawing.Size(95, 17); - this.checkBox_reduceColors.TabIndex = 19; + this.checkBox_reduceColors.TabIndex = 2; this.checkBox_reduceColors.Text = "settings_reducecolors"; this.checkBox_reduceColors.UseVisualStyleBackColor = true; // From 4f289d838adca9c0851bcdf9f3166f9b754d5e20 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 26 Dec 2016 20:32:06 +0100 Subject: [PATCH 160/170] BUG-2079: Small changes for the bug, to help to track the issue. [skip ci] --- GreenshotJiraPlugin/JiraConnector.cs | 1 + GreenshotJiraPlugin/JiraPlugin.cs | 30 +++++++++++++++++++++-- GreenshotPlugin/Core/CredentialsHelper.cs | 10 ++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/GreenshotJiraPlugin/JiraConnector.cs b/GreenshotJiraPlugin/JiraConnector.cs index 16f96e027..ee9e98a2f 100644 --- a/GreenshotJiraPlugin/JiraConnector.cs +++ b/GreenshotJiraPlugin/JiraConnector.cs @@ -159,6 +159,7 @@ namespace GreenshotJiraPlugin { _loggedInTime = DateTime.Now; return; } + // Login failed, confirm this try { credentialsDialog.Confirm(false); } catch (ApplicationException e) { diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index cf888d5d8..a7240293e 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -27,13 +27,14 @@ using System.Threading.Tasks; using Dapplo.Log.Facade; using GreenshotJiraPlugin.Forms; using GreenshotPlugin.Core; +using log4net; namespace GreenshotJiraPlugin { /// /// This is the JiraPlugin base code /// public class JiraPlugin : IGreenshotPlugin { - private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraPlugin)); + private static readonly ILog Log = LogManager.GetLogger(typeof(JiraPlugin)); private JiraConfiguration _config; private static JiraPlugin _instance; private JiraConnector _jiraConnector; @@ -94,7 +95,32 @@ namespace GreenshotJiraPlugin { public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { // Register configuration (don't need the configuration itself) _config = IniConfig.GetIniSection(); - LogSettings.RegisterDefaultLogger(); + + // Make sure the loggin is enable for the corect level. + if (Log.IsDebugEnabled) + { + LogSettings.RegisterDefaultLogger(LogLevels.Verbose); + } + else if (Log.IsInfoEnabled) + { + LogSettings.RegisterDefaultLogger(LogLevels.Info); + } + else if (Log.IsWarnEnabled) + { + LogSettings.RegisterDefaultLogger(LogLevels.Warn); + } + else if (Log.IsErrorEnabled) + { + LogSettings.RegisterDefaultLogger(LogLevels.Error); + } + else if (Log.IsErrorEnabled) + { + LogSettings.RegisterDefaultLogger(LogLevels.Error); + } + else + { + LogSettings.RegisterDefaultLogger(LogLevels.Fatal); + } // Add a SVG converter, although it doesn't fit to the Jira plugin there is currently no other way ImageHelper.StreamConverters["svg"] = (stream, s) => diff --git a/GreenshotPlugin/Core/CredentialsHelper.cs b/GreenshotPlugin/Core/CredentialsHelper.cs index bffce88e5..a031b5922 100644 --- a/GreenshotPlugin/Core/CredentialsHelper.cs +++ b/GreenshotPlugin/Core/CredentialsHelper.cs @@ -322,17 +322,17 @@ namespace GreenshotPlugin.Core { /// Confirmation action to be applied. /// True if the credentials should be persisted. - public void Confirm(bool value) { - switch (CredUi.CredUIConfirmCredentials(Target, value)) { + public void Confirm(bool value) + { + var confirmResult = CredUi.CredUIConfirmCredentials(Target, value); + switch (confirmResult) { case CredUi.ReturnCodes.NO_ERROR: break; - case CredUi.ReturnCodes.ERROR_INVALID_PARAMETER: // for some reason, this is encountered when credentials are overwritten break; - default: - throw new ApplicationException("Credential confirmation failed."); + throw new ApplicationException($"Credential confirmation failed: {confirmResult}"); } } From eabe6a18bef9ae6a343fc1911badd2fbed213f3a Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 26 Dec 2016 21:00:15 +0100 Subject: [PATCH 161/170] FEATURE-992: Fixing a problem with the editor not becoming the foreground window. [skip ci] --- Greenshot/Forms/ImageEditorForm.cs | 1 + GreenshotPlugin/Core/WindowsHelper.cs | 20 +++++++++++++++++++- GreenshotPlugin/UnmanagedHelpers/User32.cs | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index d64f9a863..24ef53bc7 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -176,6 +176,7 @@ namespace Greenshot { Text = _surface.CaptureDetails.Title + " - " + Language.GetString(LangKey.editor_title); } } + Activate(); WindowDetails.ToForeground(Handle); } diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index 114d1296e..bc4aad664 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -1254,7 +1254,25 @@ namespace GreenshotPlugin.Core { /// /// Set the window as foreground window /// - public static void ToForeground(IntPtr handle) { + public static void ToForeground(IntPtr handle) + { + + // Do nothing if the window is already in the foreground + if (User32.GetForegroundWindow() == handle) + { + return; + } + + const byte ALT = 0xA4; + const int EXTENDEDKEY = 0x1; + const int KEYUP = 0x2; + + // Simulate an "ALT" key press. + User32.keybd_event(ALT, 0x45, EXTENDEDKEY | 0, 0); + // Simulate an "ALT" key release. + User32.keybd_event(ALT, 0x45, EXTENDEDKEY | KEYUP, 0); + + // Show window in forground. User32.SetForegroundWindow(handle); } diff --git a/GreenshotPlugin/UnmanagedHelpers/User32.cs b/GreenshotPlugin/UnmanagedHelpers/User32.cs index 97e8fe497..c0546ee48 100644 --- a/GreenshotPlugin/UnmanagedHelpers/User32.cs +++ b/GreenshotPlugin/UnmanagedHelpers/User32.cs @@ -62,6 +62,8 @@ namespace GreenshotPlugin.UnmanagedHelpers { #region DllImports [DllImport("user32", SetLastError = true)] + public static extern bool keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo); + [DllImport("user32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32", SetLastError = true)] From 4de8d0f8aa7f5cd22ae44a6ba7fb26e1150d5657 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 28 Dec 2016 21:02:56 +0100 Subject: [PATCH 162/170] FEATURE-995: Added a check for the current mouse cursor location, to paste the image on that location. --- Greenshot/Drawing/Surface.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index b24f26dab..9dae14bc6 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -1715,6 +1715,7 @@ namespace Greenshot.Drawing } _cropContainer.Dispose(); _cropContainer = null; + break; } } } @@ -1726,7 +1727,7 @@ namespace Greenshot.Drawing { IDataObject clipboard = ClipboardHelper.GetDataObject(); - List formats = ClipboardHelper.GetFormats(clipboard); + var formats = ClipboardHelper.GetFormats(clipboard); if (formats == null || formats.Count == 0) { return; @@ -1817,6 +1818,15 @@ namespace Greenshot.Drawing { int x = 10; int y = 10; + + // FEATURE-995: Added a check for the current mouse cursor location, to paste the image on that location. + var mousePos = PointToClient(MousePosition); + if (Bounds.Contains(mousePos)) + { + x = mousePos.X; + y = mousePos.Y; + } + foreach (Image clipboardImage in ClipboardHelper.GetImages(clipboard)) { if (clipboardImage != null) From 9a7b95e93d31245f2304a1c0e52307af5d45fda3 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 29 Dec 2016 16:28:33 +0100 Subject: [PATCH 163/170] BUG-2089: Fixed a problem when the hotkey registration fails and OneDrive is not installed. --- Greenshot/Forms/MainForm.cs | 5 ++++- Greenshot/releases/additional_files/readme.txt.template | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index d5d275398..b8164fba4 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -616,7 +616,10 @@ namespace Greenshot { } var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var oneDriveSettingsPath = Path.Combine(localAppData, @"Microsoft\OneDrive\settings\Personal"); - + if (!Directory.Exists(oneDriveSettingsPath)) + { + return false; + } var oneDriveSettingsFile = Directory.GetFiles(oneDriveSettingsPath, "*_screenshot.dat").FirstOrDefault(); if (!File.Exists(oneDriveSettingsFile)) { diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index e341bfed0..725c23570 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -12,6 +12,7 @@ All details to our tickets can be found here: https://greenshot.atlassian.net * BUG-2065 Overflow Error * BUG-2079 Problem with authentication in JIRA plugin * BUG-2080 Exception when opening the context menu +* BUG-2089 Greenshot crashes when hotkey registration fails and OneDrive is not installed * FEATURE-992 Open Greenshot in foreground * FEATURE-995 Setting to paste new images inside greenshot based on cursor location * FEATURE-998 Open Last Capture File should select/jump to the file From fbba70fce4b2c19492619934da8093ca7e7c9ebb Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 29 Dec 2016 20:38:51 +0100 Subject: [PATCH 164/170] FEATURE-995: Fine tuning of the paste logic. --- Greenshot/Drawing/Surface.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Greenshot/Drawing/Surface.cs b/Greenshot/Drawing/Surface.cs index 9dae14bc6..e8b90026d 100644 --- a/Greenshot/Drawing/Surface.cs +++ b/Greenshot/Drawing/Surface.cs @@ -1820,11 +1820,11 @@ namespace Greenshot.Drawing int y = 10; // FEATURE-995: Added a check for the current mouse cursor location, to paste the image on that location. - var mousePos = PointToClient(MousePosition); - if (Bounds.Contains(mousePos)) + var mousePositionOnControl = PointToClient(MousePosition); + if (ClientRectangle.Contains(mousePositionOnControl)) { - x = mousePos.X; - y = mousePos.Y; + x = mousePositionOnControl.X; + y = mousePositionOnControl.Y; } foreach (Image clipboardImage in ClipboardHelper.GetImages(clipboard)) From 08d28ff640dc48ac49cdfa2f4f837b16463e0b51 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 29 Dec 2016 20:59:27 +0100 Subject: [PATCH 165/170] BUG-2091: Fixed a missing configuration for the .zip version of Greenshot, this means the logger was configured wrong. --- Greenshot/log4net-zip.xml | 21 +++++++++++++++++++ .../additional_files/readme.txt.template | 1 + build.ps1 | 3 +++ 3 files changed, 25 insertions(+) create mode 100644 Greenshot/log4net-zip.xml diff --git a/Greenshot/log4net-zip.xml b/Greenshot/log4net-zip.xml new file mode 100644 index 000000000..eb3d3d20a --- /dev/null +++ b/Greenshot/log4net-zip.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 725c23570..0cd9e2edf 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -13,6 +13,7 @@ All details to our tickets can be found here: https://greenshot.atlassian.net * BUG-2079 Problem with authentication in JIRA plugin * BUG-2080 Exception when opening the context menu * BUG-2089 Greenshot crashes when hotkey registration fails and OneDrive is not installed +* BUG-2091 Greenshot .zip version has wrong log configuration * FEATURE-992 Open Greenshot in foreground * FEATURE-995 Setting to paste new images inside greenshot based on cursor location * FEATURE-998 Open Last Capture File should select/jump to the file diff --git a/build.ps1 b/build.ps1 index f28a6794e..601c7d3fa 100644 --- a/build.ps1 +++ b/build.ps1 @@ -215,8 +215,11 @@ Function PackageZip { "$sourcebase\GreenshotPlugin.dll", "$sourcebase\LinqBridge.dll", "$sourcebase\log4net.dll", + "$sourcebase\log4net-zip.xml" "$destbase\additional_files\*.txt" ) | foreach { Copy-Item $_ "$destzip\" } + Rename-Item "$destzip\log4net-zip.xml" "$destzip\log4net.xml" + $zipOutput = "$(get-location)\zip" $zip7 = "$(get-location)\greenshot\tools\7zip\7za.exe" $arguments = @('a', '-mx9', '-tzip', '-r', "$destbase\Greenshot-NO-INSTALLER-$fileversion.zip", "$destzip\*") From 363b91dfebc6f8791c47cc7eda77eb67bb94c9a9 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 29 Dec 2016 21:00:45 +0100 Subject: [PATCH 166/170] Removed BUG-2079 from the readme.txt as this is not a real bug in Greenshot. [skip ci] --- Greenshot/releases/additional_files/readme.txt.template | 1 - 1 file changed, 1 deletion(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 0cd9e2edf..b8f3ce43b 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -10,7 +10,6 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ * BUG-2065 Overflow Error -* BUG-2079 Problem with authentication in JIRA plugin * BUG-2080 Exception when opening the context menu * BUG-2089 Greenshot crashes when hotkey registration fails and OneDrive is not installed * BUG-2091 Greenshot .zip version has wrong log configuration From 245ffe5da961c4b149096a1fd39f40d72e9fa268 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 29 Dec 2016 21:09:26 +0100 Subject: [PATCH 167/170] Fixing the build for BUG-2091 --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index 601c7d3fa..9bfcc6797 100644 --- a/build.ps1 +++ b/build.ps1 @@ -215,7 +215,7 @@ Function PackageZip { "$sourcebase\GreenshotPlugin.dll", "$sourcebase\LinqBridge.dll", "$sourcebase\log4net.dll", - "$sourcebase\log4net-zip.xml" + "$(get-location)\Greenshot\log4net-zip.xml" "$destbase\additional_files\*.txt" ) | foreach { Copy-Item $_ "$destzip\" } Rename-Item "$destzip\log4net-zip.xml" "$destzip\log4net.xml" From b92d79ed39c2689784e85ff4519d6dedb4601d2d Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 30 Dec 2016 11:15:00 +0100 Subject: [PATCH 168/170] BUG-2077: More improvements for the update check interval. Also corrected the readme.txt.template --- Greenshot/Forms/SettingsForm.Designer.cs | 2 ++ Greenshot/Forms/SettingsForm.cs | 36 +++++++++++++++++++ .../additional_files/readme.txt.template | 20 +++++++---- GreenshotImgurPlugin/packages.config | 4 +++ GreenshotPlugin/Core/CoreConfiguration.cs | 6 +++- 5 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 GreenshotImgurPlugin/packages.config diff --git a/Greenshot/Forms/SettingsForm.Designer.cs b/Greenshot/Forms/SettingsForm.Designer.cs index 254209fb4..c07019503 100644 --- a/Greenshot/Forms/SettingsForm.Designer.cs +++ b/Greenshot/Forms/SettingsForm.Designer.cs @@ -506,6 +506,8 @@ namespace Greenshot { this.numericUpDown_daysbetweencheck.Size = new System.Drawing.Size(57, 20); this.numericUpDown_daysbetweencheck.TabIndex = 8; this.numericUpDown_daysbetweencheck.ThousandsSeparator = true; + this.numericUpDown_daysbetweencheck.Minimum = 0; + this.numericUpDown_daysbetweencheck.Maximum = 365; // // label_checkperiod // diff --git a/Greenshot/Forms/SettingsForm.cs b/Greenshot/Forms/SettingsForm.cs index 126a13b57..6f5b65eca 100644 --- a/Greenshot/Forms/SettingsForm.cs +++ b/Greenshot/Forms/SettingsForm.cs @@ -46,6 +46,7 @@ namespace Greenshot { private static readonly ILog Log = LogManager.GetLogger(typeof(SettingsForm)); private readonly ToolTip _toolTip = new ToolTip(); private bool _inHotkey; + private int _daysbetweencheckPreviousValue; public SettingsForm() { InitializeComponent(); @@ -71,7 +72,10 @@ namespace Greenshot { ie_hotkeyControl.Leave += LeaveHotkeyControl; lastregion_hotkeyControl.Enter += EnterHotkeyControl; lastregion_hotkeyControl.Leave += LeaveHotkeyControl; + // Changes for BUG-2077 + numericUpDown_daysbetweencheck.ValueChanged += NumericUpDownDaysbetweencheckOnValueChanged; + _daysbetweencheckPreviousValue = (int) numericUpDown_daysbetweencheck.Value; DisplayPluginTab(); UpdateUi(); ExpertSettingsEnableState(false); @@ -79,6 +83,38 @@ namespace Greenshot { CheckSettings(); } + /// + /// This makes sure the check cannot be set to 1-6 + /// + /// object + /// EventArgs + private void NumericUpDownDaysbetweencheckOnValueChanged(object sender, EventArgs eventArgs) + { + int currentValue = (int)numericUpDown_daysbetweencheck.Value; + + // Check if we can into the forbidden range + if (currentValue > 0 && currentValue < 7) + { + if (_daysbetweencheckPreviousValue <= currentValue) + { + numericUpDown_daysbetweencheck.Value = 7; + } + else + { + numericUpDown_daysbetweencheck.Value = 0; + } + } + if ((int)numericUpDown_daysbetweencheck.Value < 0) + { + numericUpDown_daysbetweencheck.Value = 0; + } + if ((int)numericUpDown_daysbetweencheck.Value > 365) + { + numericUpDown_daysbetweencheck.Value = 365; + } + _daysbetweencheckPreviousValue = (int)numericUpDown_daysbetweencheck.Value; + } + private void EnterHotkeyControl(object sender, EventArgs e) { HotkeyControl.UnregisterHotkeys(); _inHotkey = true; diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index b8f3ce43b..102467d71 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -9,17 +9,23 @@ All details to our tickets can be found here: https://greenshot.atlassian.net @DETAILVERSION@ -* BUG-2065 Overflow Error +This is a bugfix release for the Greenshot 1.2.9.104-3721c10 RELEASE + +Bugs fixed: +* BUG-2065 OverflowException in the editor +* BUG-2077 It's not possible to disable the update check * BUG-2080 Exception when opening the context menu * BUG-2089 Greenshot crashes when hotkey registration fails and OneDrive is not installed * BUG-2091 Greenshot .zip version has wrong log configuration -* FEATURE-992 Open Greenshot in foreground -* FEATURE-995 Setting to paste new images inside greenshot based on cursor location -* FEATURE-998 Open Last Capture File should select/jump to the file -* FEATURE-1000 Active OK-button in Greenshot quality -Added or changed translation: -* Nederlands by Stephan Paternotte +Features added: +* FEATURE-992 When reusing the editor, it is not brought to the front +* FEATURE-995 Paste images inside Greenshot editor to the current cursor location +* FEATURE-998 Opening last capture in explorer should select/jump to the file +* FEATURE-1000 Set default focus on the OK-button in the Greenshot quality dialog + +Translations modified: +Nederlands by Stephan Paternotte 1.2.9.104-3721c10 RELEASE diff --git a/GreenshotImgurPlugin/packages.config b/GreenshotImgurPlugin/packages.config new file mode 100644 index 000000000..6003a80e6 --- /dev/null +++ b/GreenshotImgurPlugin/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/GreenshotPlugin/Core/CoreConfiguration.cs b/GreenshotPlugin/Core/CoreConfiguration.cs index 54c146773..c5e1a190f 100644 --- a/GreenshotPlugin/Core/CoreConfiguration.cs +++ b/GreenshotPlugin/Core/CoreConfiguration.cs @@ -431,9 +431,13 @@ namespace GreenshotPlugin.Core { { UpdateCheckInterval = 14; } + if (UpdateCheckInterval > 365) + { + UpdateCheckInterval = 365; + } // Enable OneNote if upgrading from 1.1 - if(ExcludeDestinations != null && ExcludeDestinations.Contains("OneNote")) { + if (ExcludeDestinations != null && ExcludeDestinations.Contains("OneNote")) { if(LastSaveWithVersion != null && LastSaveWithVersion.StartsWith("1.1")) { ExcludeDestinations.Remove("OneNote"); } else { From 5a1a4737ec091d5a8a2c7ef039f5dd9c66da0b0d Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 30 Dec 2016 22:35:28 +0100 Subject: [PATCH 169/170] Some fixed for not getting windows to focus/to front which were inspired by FEATURE-992. [skip ci] --- Greenshot/Forms/CaptureForm.cs | 4 ++++ .../OfficeExport/ExcelExporter.cs | 6 ++++++ .../OfficeExport/WordExporter.cs | 21 +++++++++++++++++-- .../OfficeInterop/ExcelInterop.cs | 16 ++++++++++---- .../OfficeInterop/OutlookInterop.cs | 4 +++- .../OfficeInterop/WordInterop.cs | 5 +++++ GreenshotPlugin/Core/AbstractDestination.cs | 3 ++- GreenshotPlugin/Core/WindowsHelper.cs | 1 - 8 files changed, 51 insertions(+), 9 deletions(-) diff --git a/Greenshot/Forms/CaptureForm.cs b/Greenshot/Forms/CaptureForm.cs index 86ea4054f..7af509c03 100644 --- a/Greenshot/Forms/CaptureForm.cs +++ b/Greenshot/Forms/CaptureForm.cs @@ -300,6 +300,10 @@ namespace Greenshot.Forms { HandleMouseUp(); } break; + case Keys.F: + ToFront = !ToFront; + TopMost = !TopMost; + break; } } #endregion diff --git a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs index 74fc732a0..f65a3e33e 100644 --- a/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/ExcelExporter.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Reflection; using System.Drawing; +using GreenshotPlugin.Core; namespace Greenshot.Interop.Office { public class ExcelExporter { @@ -72,6 +73,11 @@ namespace Greenshot.Interop.Office { } } } + int hWnd = excelApplication.Hwnd; + if (hWnd > 0) + { + WindowDetails.ToForeground(new IntPtr(hWnd)); + } } } diff --git a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs index 548914287..350f51fd8 100644 --- a/GreenshotOfficePlugin/OfficeExport/WordExporter.cs +++ b/GreenshotOfficePlugin/OfficeExport/WordExporter.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using GreenshotOfficePlugin; using Greenshot.IniFile; +using GreenshotPlugin.Core; namespace Greenshot.Interop.Office { public class WordExporter { @@ -123,7 +124,15 @@ namespace Greenshot.Interop.Office { // ignored } try { - wordDocument.Activate(); + using (var activeWindow = wordDocument.ActiveWindow) + { + activeWindow.Activate(); + int hWnd = activeWindow.Hwnd; + if (hWnd > 0) + { + WindowDetails.ToForeground(new IntPtr(hWnd)); + } + } } catch { @@ -192,7 +201,15 @@ namespace Greenshot.Interop.Office { // ignored } try { - wordDocument.ActiveWindow.Activate(); + using (var activeWindow = wordDocument.ActiveWindow) + { + activeWindow.Activate(); + int hWnd = activeWindow.Hwnd; + if (hWnd > 0) + { + WindowDetails.ToForeground(new IntPtr(hWnd)); + } + } } catch { diff --git a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs index 9e6292fae..4ff22b066 100644 --- a/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/ExcelInterop.cs @@ -37,13 +37,21 @@ namespace Greenshot.Interop.Office { string Version { get; } + + /// + /// Returns an Integer indicating the top-level window handle of the Microsoft Excel window. + /// + int Hwnd + { + get; + } } // See: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.aspx public interface IWorkbooks : ICommon, ICollection { IWorkbook Add(object template); // Use index + 1!! - IWorkbook this[object Index] { + IWorkbook this[object index] { get; } } @@ -76,14 +84,14 @@ namespace Greenshot.Interop.Office { } // See: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.iworksheets_members.aspx - public interface IWorksheets : ICommon, ICollection { + public interface IWorksheets : ICollection { // Use index + 1!! - IWorksheet this[object Index] { + IWorksheet this[object index] { get; } } - public interface IPictures : ICommon, ICollection { + public interface IPictures : ICollection { // Use index + 1!! //IPicture this[object Index] { get; } void Insert(string file); diff --git a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs index f91390271..2fee5863d 100644 --- a/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/OutlookInterop.cs @@ -289,7 +289,9 @@ namespace Greenshot.Interop.Office { } } - // See: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.inspector_members.aspx + /// + /// See: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.inspector_members.aspx + /// public interface IInspector : ICommonExplorer { IItem CurrentItem { get; diff --git a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs index 2c2162cbf..2a2f63420 100644 --- a/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs +++ b/GreenshotOfficePlugin/OfficeInterop/WordInterop.cs @@ -60,6 +60,11 @@ namespace Greenshot.Interop.Office { string Caption { get; } + + /// + /// Returns an Integer (int in C#) that indicates the window handle of the specified window + /// + int Hwnd { get; } } /// diff --git a/GreenshotPlugin/Core/AbstractDestination.cs b/GreenshotPlugin/Core/AbstractDestination.cs index 1980e2614..8b7ea5c19 100644 --- a/GreenshotPlugin/Core/AbstractDestination.cs +++ b/GreenshotPlugin/Core/AbstractDestination.cs @@ -152,7 +152,8 @@ namespace GreenshotPlugin.Core { var menu = new ContextMenuStrip { ImageScalingSize = CoreConfig.IconSize, - Tag = null + Tag = null, + TopLevel = true }; menu.Closing += delegate(object source, ToolStripDropDownClosingEventArgs eventArgs) { diff --git a/GreenshotPlugin/Core/WindowsHelper.cs b/GreenshotPlugin/Core/WindowsHelper.cs index bc4aad664..1a6db39a1 100644 --- a/GreenshotPlugin/Core/WindowsHelper.cs +++ b/GreenshotPlugin/Core/WindowsHelper.cs @@ -1256,7 +1256,6 @@ namespace GreenshotPlugin.Core { /// public static void ToForeground(IntPtr handle) { - // Do nothing if the window is already in the foreground if (User32.GetForegroundWindow() == handle) { From 9bc62ac42bd37d7ba2b19946b70d40a599332b75 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 30 Dec 2016 22:37:08 +0100 Subject: [PATCH 170/170] Release the bugfix of 1.2.9 --- Greenshot/releases/additional_files/readme.txt.template | 2 +- appveyor12.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index 102467d71..4c85447db 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -25,7 +25,7 @@ Features added: * FEATURE-1000 Set default focus on the OK-button in the Greenshot quality dialog Translations modified: -Nederlands by Stephan Paternotte +* Nederlands by Stephan Paternotte 1.2.9.104-3721c10 RELEASE diff --git a/appveyor12.yml b/appveyor12.yml index fd16f2741..07aaa346b 100644 --- a/appveyor12.yml +++ b/appveyor12.yml @@ -38,7 +38,7 @@ environment: secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS credentials_picasa_consumer_secret: secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag= - build_type: UNSTABLE + build_type: RELEASE rsakey: secure: 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 before_build: