From 9c12c1f88691ef30a4f01f02e84c0af0c9ee959d Mon Sep 17 00:00:00 2001 From: gambas Date: Tue, 21 Apr 2020 07:35:27 +0200 Subject: [PATCH] Search dialog: The project browsing is now done through a background task. [DEVELOPMENT ENVIRONMENT] * BUG: Code editor: The automatic completion now appears at the correct position when the view is splitted. * NEW: Search dialog: The project browsing is now done through a background task. * NEW: Redraw the module icons. --- app/src/gambas3/.lang/fr.po | 504 ++++++------ app/src/gambas3/.src/Debug/FDebugInfo.class | 28 +- app/src/gambas3/.src/Debug/FDebugInfo.form | 25 +- .../.src/Editor/Code/FCompletion.class | 1 + .../.src/Editor/Code/FConflictEditor.class | 2 +- .../gambas3/.src/Editor/Code/FEditor.class | 17 +- .../.src/Editor/Code/FTextEditor.class | 13 +- app/src/gambas3/.src/Editor/Form/FForm.class | 54 +- .../gambas3/.src/Exported/TextEditor.class | 107 ++- app/src/gambas3/.src/FMain.class | 3 +- app/src/gambas3/.src/Project.module | 13 +- app/src/gambas3/.src/Search/CFindResult.class | 37 - app/src/gambas3/.src/Search/CGrepResult.class | 2 +- .../gambas3/.src/Search/CSearchResult.class | 47 ++ app/src/gambas3/.src/Search/CSearchTask.class | 247 ++++++ app/src/gambas3/.src/Search/FSearch.class | 777 +++++++++++------- app/src/gambas3/.src/Search/FSearch.form | 12 +- app/src/gambas3/img/module/class-dark.png | Bin 311 -> 594 bytes app/src/gambas3/img/module/class.png | Bin 311 -> 594 bytes app/src/gambas3/img/module/form-dark.png | Bin 147 -> 136 bytes app/src/gambas3/img/module/form.png | Bin 147 -> 136 bytes app/src/gambas3/img/module/module-dark.png | Bin 458 -> 368 bytes app/src/gambas3/img/module/module.png | Bin 459 -> 368 bytes app/src/gambas3/img/module/report-dark.png | Bin 175 -> 165 bytes app/src/gambas3/img/module/report.png | Bin 178 -> 165 bytes app/src/gambas3/img/module/termform-dark.png | Bin 483 -> 161 bytes app/src/gambas3/img/module/termform.png | Bin 544 -> 161 bytes app/src/gambas3/img/module/test-dark.png | Bin 193 -> 222 bytes app/src/gambas3/img/module/test.png | Bin 193 -> 222 bytes app/src/gambas3/img/module/webform-dark.png | Bin 598 -> 673 bytes app/src/gambas3/img/module/webform.png | Bin 637 -> 673 bytes app/src/gambas3/img/module/webpage-dark.png | Bin 271 -> 304 bytes app/src/gambas3/img/module/webpage.png | Bin 271 -> 304 bytes 33 files changed, 1187 insertions(+), 702 deletions(-) delete mode 100644 app/src/gambas3/.src/Search/CFindResult.class create mode 100644 app/src/gambas3/.src/Search/CSearchResult.class diff --git a/app/src/gambas3/.lang/fr.po b/app/src/gambas3/.lang/fr.po index 027faac0c..0a166faea 100644 --- a/app/src/gambas3/.lang/fr.po +++ b/app/src/gambas3/.lang/fr.po @@ -222,7 +222,7 @@ msgid "" msgstr "" "Project-Id-Version: gambas3 3.14.90\n" -"PO-Revision-Date: 2020-03-10 23:58 UTC\n" +"PO-Revision-Date: 2020-04-21 02:45 UTC\n" "Last-Translator: Benoît Minisini \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -254,143 +254,143 @@ msgstr "Signet précédent" msgid "Next bookmark" msgstr "Signet suivant" -#: CClassInfo.class:603 +#: CClassInfo.class:608 msgid "Static properties" msgstr "Propriétés statiques" -#: CClassInfo.class:604 +#: CClassInfo.class:609 msgid "Static variables" msgstr "Variables statiques" -#: CClassInfo.class:605 +#: CClassInfo.class:610 msgid "Static methods" msgstr "Méthodes statiques" -#: CClassInfo.class:606 MTheme.module:6 +#: CClassInfo.class:611 MTheme.module:6 msgid "Constants" msgstr "Constantes" -#: CClassInfo.class:623 FMain.form:569 FProperty.form:28 +#: CClassInfo.class:628 FMain.form:569 FProperty.form:28 msgid "Properties" msgstr "Propriétés" -#: CClassInfo.class:624 +#: CClassInfo.class:629 msgid "Variables" msgstr "Variables" -#: CClassInfo.class:625 +#: CClassInfo.class:630 msgid "Methods" msgstr "Méthodes" -#: CClassInfo.class:626 +#: CClassInfo.class:631 msgid "Events" msgstr "Evènements" -#: CClassInfo.class:648 +#: CClassInfo.class:653 msgid "This class reimplements &1" msgstr "Cette class réimplémente &1" -#: CClassInfo.class:650 +#: CClassInfo.class:655 msgid "This class inherits &1" msgstr "Cette class hérite de &1" -#: CClassInfo.class:656 +#: CClassInfo.class:661 msgid "in &1" msgstr "dans &1" -#: CClassInfo.class:664 +#: CClassInfo.class:669 msgid "This class can be used like an object by creating an hidden instance on demand." msgstr "Cette classe peut être utilisée comme un objet en créant une instance cachée à la demande." -#: CClassInfo.class:669 +#: CClassInfo.class:674 msgid "This class is &1." msgstr "Cette classe est &1." -#: CClassInfo.class:669 +#: CClassInfo.class:674 msgid "creatable" msgstr "instanciable" -#: CClassInfo.class:674 +#: CClassInfo.class:679 msgid "This class is static." msgstr "Cette classe est statique." -#: CClassInfo.class:676 +#: CClassInfo.class:681 msgid "This class is not creatable." msgstr "Cette classe n'est pas instanciable." -#: CClassInfo.class:682 +#: CClassInfo.class:687 msgid "This class can be used as a &1." msgstr "Cette classe peut être utilisée comme &1." -#: CClassInfo.class:682 +#: CClassInfo.class:687 msgid "function" msgstr "fonction" -#: CClassInfo.class:687 +#: CClassInfo.class:692 msgid "This class acts like a &1 / &2 array." msgstr "Cette classe se comporte comme un tableau accessible en &1 / &2." -#: CClassInfo.class:687 +#: CClassInfo.class:692 msgid "read" msgstr "lecture" -#: CClassInfo.class:687 +#: CClassInfo.class:692 msgid "write" msgstr "écriture" -#: CClassInfo.class:689 +#: CClassInfo.class:694 msgid "This class acts like a &1 array." msgstr "Cette classe se comporte comme un tableau accessible en &1." -#: CClassInfo.class:689 +#: CClassInfo.class:694 msgid "write-only" msgstr "écriture seule" -#: CClassInfo.class:692 Project.module:1657 +#: CClassInfo.class:697 Project.module:1658 msgid "read-only" msgstr "lecture seule" -#: CClassInfo.class:697 +#: CClassInfo.class:702 msgid "This class is &1 with the FOR EACH keyword." msgstr "Cette classe est &1 à l'aide du mot-clef FOR EACH." -#: CClassInfo.class:697 +#: CClassInfo.class:702 msgid "enumerable" msgstr "énumérable" -#: CClassInfo.class:848 +#: CClassInfo.class:853 msgid "This class reimplements" msgstr "Cette classe réimplémente" -#: CClassInfo.class:850 +#: CClassInfo.class:855 msgid "This class inherits" msgstr "Cette classe hérite de" -#: CClassInfo.class:865 +#: CClassInfo.class:870 msgid "This class is virtual." msgstr "Cette class est virtuelle." -#: CClassInfo.class:867 +#: CClassInfo.class:872 msgid "This class can be used like an object by creating a hidden instance on demand." msgstr "Cette classe peut s'utiliser comme un objet, auquel cas une instance cachée sera créée automatiquement." -#: CClassInfo.class:892 +#: CClassInfo.class:897 msgid "static function" msgstr "fonction statique" -#: CClassInfo.class:899 +#: CClassInfo.class:904 msgid "This class acts like a &1 / &2 static array." msgstr "Cette classe se comporte comme un tableau statique en &1 / &2." -#: CClassInfo.class:901 +#: CClassInfo.class:906 msgid "This class acts like a &1 static array." msgstr "Cette classe se comporte comme un tableau statique en &1." -#: CClassInfo.class:913 +#: CClassInfo.class:918 msgid "This class is &1 with the &2 keyword." msgstr "Cette classe est &1 à l'aide du mot-clef &2." -#: CClassInfo.class:913 +#: CClassInfo.class:918 msgid "statically enumerable" msgstr "énumérable statiquement" @@ -978,7 +978,7 @@ msgstr "ici" msgid "IDE extensions" msgstr "Extension de l'EDI" -#: CProjectList.class:552 CVersionControlGit.class:398 CWaitingAnimation.class:63 FColorChooser.form:68 FComponentChooser.form:97 FConflict.class:197 FConnectionEditor.class:470 FCrash.form:97 FCreateFile.form:204 FDebugExpr.form:46 FDebugInfo.form:290 FExportData.class:126 FFarmConfig.form:38 FFarmLogin.form:126 FFarmRegister.form:141 FFarmRequest.form:43 FFieldChooser.form:144 FFileProperty.class:155 FFontChooser.form:40 FGotoLine.form:23 FHelpBrowser.form:73 FImageOffsetSelection.form:33 FImageQuality.form:30 FImageResize.form:49 FImageRotate.form:32 FLayout.form:50 FList.form:128 FMain.class:259 FMakeInstall.class:358 FMenu.form:414 FNewConnection.form:318 FNewTable.form:86 FNewTranslation.form:21 FOption.class:818 FPasteSpecial.form:86 FPasteTable.form:105 FProjectChooser.form:73 FProjectProperty.form:1032 FProjectVersion.class:211 FProxy.form:57 FPublish.class:273 FReportBorderChooser.form:48 FReportBoxShadowChooser.form:27 FReportBrushChooser.form:36 FReportCoordChooser.form:26 FReportPaddingChooser.form:75 FSave.form:28 FSaveProjectAs.form:81 FSearch.class:946 FSelectComponent.form:39 FSelectExtraFile.form:43 FSelectIcon.form:89 FSelectLibrary.form:66 FSnippet.form:57 FSoftwareFarm.class:552 FTableChooser.form:68 FText.form:40 FTranslate.class:677 FVersionControl.form:98 FWebFontChooser.form:129 Project.module:566 VersionControl.module:398 +#: CProjectList.class:552 CVersionControlGit.class:398 CWaitingAnimation.class:63 FColorChooser.form:68 FComponentChooser.form:97 FConflict.class:197 FConnectionEditor.class:470 FCrash.form:97 FCreateFile.form:204 FDebugExpr.form:46 FDebugInfo.form:291 FExportData.class:126 FFarmConfig.form:38 FFarmLogin.form:126 FFarmRegister.form:141 FFarmRequest.form:43 FFieldChooser.form:144 FFileProperty.class:155 FFontChooser.form:40 FGotoLine.form:23 FHelpBrowser.form:73 FImageOffsetSelection.form:33 FImageQuality.form:30 FImageResize.form:49 FImageRotate.form:32 FLayout.form:50 FList.form:128 FMain.class:259 FMakeInstall.class:361 FMenu.form:414 FNewConnection.form:318 FNewTable.form:86 FNewTranslation.form:21 FOption.class:818 FPasteSpecial.form:86 FPasteTable.form:105 FProjectChooser.form:73 FProjectProperty.form:1032 FProjectVersion.class:211 FProxy.form:57 FPublish.class:273 FReportBorderChooser.form:48 FReportBoxShadowChooser.form:27 FReportBrushChooser.form:36 FReportCoordChooser.form:26 FReportPaddingChooser.form:75 FSave.form:28 FSaveProjectAs.form:81 FSearch.class:938 FSelectComponent.form:39 FSelectExtraFile.form:43 FSelectIcon.form:89 FSelectLibrary.form:66 FSnippet.form:57 FSoftwareFarm.class:552 FTableChooser.form:68 FText.form:40 FTranslate.class:677 FVersionControl.form:98 FWebFontChooser.form:129 Project.module:567 VersionControl.module:398 msgid "Cancel" msgstr "Annuler" @@ -1002,7 +1002,7 @@ msgstr "Le logiciel a été désinstallé avec succès." msgid "Files" msgstr "Fichiers" -#: CProjectTree.class:357 FHelpShortcut.form:22 FMain.form:427 FSearch.class:111 FSelectIcon.form:31 +#: CProjectTree.class:357 FHelpShortcut.form:22 FMain.form:427 FSearch.class:124 FSelectIcon.form:31 msgid "Project" msgstr "Projet" @@ -1058,7 +1058,7 @@ msgstr "Impossible de décompresser l'archive source." msgid "Abort" msgstr "Abandonner" -#: CSoftware.class:361 FMain.class:2713 FMenu.class:76 +#: CSoftware.class:361 FMain.class:2713 FMenu.class:88 msgid "Ignore" msgstr "Ignorer" @@ -1210,19 +1210,19 @@ msgstr "La police Gambas est publiée sous licence « SIL Open Font License »." msgid "This program is published under the GNU General Public License." msgstr "Ce programme est publié sous la « Licence Publique Générale GNU »." -#: Design.module:220 Project.module:2216 +#: Design.module:220 Project.module:2217 msgid "first" msgstr "premier" -#: Design.module:222 Project.module:2218 +#: Design.module:222 Project.module:2219 msgid "second" msgstr "deuxième" -#: Design.module:224 Project.module:2220 +#: Design.module:224 Project.module:2221 msgid "third" msgstr "troisième" -#: Design.module:318 Project.module:2279 +#: Design.module:318 Project.module:2280 msgid "in &1:&2." msgstr "dans &1:&2." @@ -1306,7 +1306,7 @@ msgstr "Ce composant est requis par :

&1" msgid "Keep" msgstr "Conserver" -#: FComponentChooser.class:589 FDebugInfo.form:210 +#: FComponentChooser.class:589 FDebugInfo.form:211 msgid "Remove all" msgstr "Tout supprimer" @@ -1330,7 +1330,7 @@ msgstr "Choisissez un composant" msgid "Show deprecated components" msgstr "Afficher les composants dépréciés" -#: FComponentChooser.form:103 FConflictEditor.form:293 FConnectionEditor.form:120 FEditor.form:366 FForm.form:445 FHelpBrowser.form:79 FImageEditor.form:377 FMain.form:377 FTextEditor.form:362 FTranslate.form:93 Project.module:857 +#: FComponentChooser.form:103 FConflictEditor.form:293 FConnectionEditor.form:120 FEditor.form:366 FForm.form:445 FHelpBrowser.form:79 FImageEditor.form:377 FMain.form:377 FTextEditor.form:362 FTranslate.form:93 Project.module:858 msgid "Reload" msgstr "Recharger" @@ -1362,7 +1362,7 @@ msgstr "Impossible de charger le fichier :" msgid "Text" msgstr "Texte" -#: FConflict.class:141 FMain.form:941 FReportBrushChooser.form:49 Project.module:235 +#: FConflict.class:141 FMain.form:941 FReportBrushChooser.form:49 Project.module:236 msgid "Image" msgstr "Image" @@ -1422,7 +1422,7 @@ msgstr "Désindenter" msgid "Open" msgstr "Ouvrir" -#: FConflict.form:149 FConflictEditor.form:299 FConnectionEditor.form:112 FEditor.form:372 FForm.form:451 FImageEditor.form:384 FMain.form:386 FMenu.class:76 FOption.form:805 FSaveProjectAs.form:87 FTextEditor.form:368 FTranslate.form:234 +#: FConflict.form:149 FConflictEditor.form:299 FConnectionEditor.form:112 FEditor.form:372 FForm.form:451 FImageEditor.form:384 FMain.form:386 FMenu.class:88 FOption.form:805 FSaveProjectAs.form:87 FTextEditor.form:368 FTranslate.form:234 msgid "Save" msgstr "Enregistrer" @@ -1430,11 +1430,11 @@ msgstr "Enregistrer" msgid "Solve" msgstr "Résoudre" -#: FConflict.form:166 FConflictEditor.form:306 FDebugInfo.form:297 FEditor.form:346 FFileProperty.form:94 FForm.form:438 FImageEditor.form:391 FMain.form:402 FPatch.form:88 FProjectVersion.form:322 FSystemInfo.form:68 FTextEditor.form:342 FTips.form:83 FTranslate.form:411 +#: FConflict.form:166 FConflictEditor.form:306 FDebugInfo.form:304 FEditor.form:346 FFileProperty.form:94 FForm.form:438 FImageEditor.form:391 FMain.form:402 FPatch.form:88 FProjectVersion.form:322 FSystemInfo.form:68 FTextEditor.form:342 FTips.form:83 FTranslate.form:411 msgid "Close" msgstr "Fermer" -#: FConflictEditor.class:956 FEditor.class:2720 FTextEditor.class:1139 +#: FConflictEditor.class:956 FEditor.class:2717 FTextEditor.class:1140 msgid "(Declarations)" msgstr "(Déclarations)" @@ -1749,7 +1749,7 @@ msgstr "Nouvelle table" msgid "Delete table" msgstr "Supprimer la table" -#: FConnectionEditor.form:134 FDebugInfo.form:186 FMain.form:1180 FMakeInstall.form:762 FOption.form:1547 FProjectProperty.form:605 FPublish.form:268 FSoftwareFarm.form:422 +#: FConnectionEditor.form:134 FDebugInfo.form:187 FMain.form:1180 FMakeInstall.form:762 FOption.form:1547 FProjectProperty.form:605 FPublish.form:268 FSoftwareFarm.form:422 msgid "Remove" msgstr "Supprimer" @@ -1853,7 +1853,7 @@ msgstr "Déselectionner tout" msgid "Gambas 3 project conversion" msgstr "Conversion en projet Gambas 3" -#: FCrash.class:73 FTranslate.class:244 Project.module:4542 +#: FCrash.class:73 FTranslate.class:244 Project.module:4548 msgid "The '&1' command has failed." msgstr "La commande '&1' a échoué." @@ -1893,7 +1893,7 @@ msgstr "Impossible d'ajouter le fichier." msgid "New file" msgstr "Nouveau fichier" -#: FCreateFile.form:72 FImportTable.form:58 FMakePatch.form:65 FProjectProperty.form:815 FSearch.form:98 +#: FCreateFile.form:72 FImportTable.form:58 FMakePatch.form:65 FProjectProperty.form:815 FSearch.form:99 msgid "Options" msgstr "Options" @@ -1997,31 +1997,31 @@ msgstr "Référentiel" msgid "The project repository is directly sent to the 'svn checkout' command." msgstr "Le référentiel du projet est directement envoyé à la commande 'svn checkout'." -#: FDebugButton.form:20 FDebugInfo.form:88 +#: FDebugButton.form:20 FDebugInfo.form:89 msgid "Debugging" msgstr "Débogage" -#: FDebugButton.form:29 FDebugInfo.form:169 FMain.form:742 FOption.form:933 +#: FDebugButton.form:29 FDebugInfo.form:170 FMain.form:742 FOption.form:933 msgid "Console" msgstr "Console" -#: FDebugButton.form:38 FDebugInfo.form:177 MTheme.module:6 +#: FDebugButton.form:38 FDebugInfo.form:178 MTheme.module:6 msgid "Breakpoints" msgstr "Points d'arrêt" -#: FDebugButton.form:47 FDebugInfo.form:239 +#: FDebugButton.form:47 FDebugInfo.form:240 msgid "Warnings" msgstr "Avertissements" -#: FDebugButton.form:56 FDebugInfo.form:258 +#: FDebugButton.form:56 FDebugInfo.form:259 msgid "Tasks" msgstr "Tâches" -#: FDebugButton.form:65 FDebugInfo.form:280 +#: FDebugButton.form:65 FDebugInfo.form:281 msgid "Search result" msgstr "Résultat de la recherche" -#: FDebugButton.form:74 FDebugInfo.form:358 FMain.form:498 FProjectProperty.form:970 FVersionControl.class:64 +#: FDebugButton.form:74 FDebugInfo.form:365 FMain.form:498 FProjectProperty.form:970 FVersionControl.class:64 msgid "Version control" msgstr "Contrôle de version" @@ -2089,90 +2089,94 @@ msgstr "Surveiller des expressions" msgid "Do you want to clear the expression list ?" msgstr "Voulez-vous effacer la liste des expressions ?" -#: FDebugInfo.class:1088 +#: FDebugInfo.class:1102 msgid "File not loaded" msgstr "Fichier non chargé" -#: FDebugInfo.class:1227 +#: FDebugInfo.class:1241 msgid "Current object" msgstr "Objet courant" -#: FDebugInfo.class:1273 +#: FDebugInfo.class:1287 msgid "Local variables" msgstr "Variables locales" -#: FDebugInfo.form:68 FMain.form:577 +#: FDebugInfo.form:69 FMain.form:577 msgid "Debug" msgstr "Débogage" -#: FDebugInfo.form:118 +#: FDebugInfo.form:119 msgid "Remove current expression" msgstr "Supprimer l'expression sélectionnée" -#: FDebugInfo.form:124 +#: FDebugInfo.form:125 msgid "Add expression" msgstr "Ajouter une expression" -#: FDebugInfo.form:184 +#: FDebugInfo.form:185 msgid "Remove breakpoint" msgstr "Supprimer le point d'arrêt" -#: FDebugInfo.form:192 +#: FDebugInfo.form:193 msgid "Disable breakpoint" msgstr "Désactiver le point d'arrêt" -#: FDebugInfo.form:194 +#: FDebugInfo.form:195 msgid "Disable" msgstr "Désactiver" -#: FDebugInfo.form:200 +#: FDebugInfo.form:201 msgid "Enable breakpoint" msgstr "Activer le point d'arrêt" -#: FDebugInfo.form:202 +#: FDebugInfo.form:203 msgid "Enable" msgstr "Activer" -#: FDebugInfo.form:208 +#: FDebugInfo.form:209 msgid "Remove all breakpoints" msgstr "Supprimer tous les points d'arrêts" -#: FDebugInfo.form:288 +#: FDebugInfo.form:289 msgid "Cancel current search" msgstr "Annuler la recherche en cours" -#: FDebugInfo.form:304 -msgid "Search again" -msgstr "Rechercher de nouveau" - #: FDebugInfo.form:311 msgid "Show search window" msgstr "Afficher la fenêtre de recherche" -#: FDebugInfo.form:354 FSearch.class:546 FTranslate.class:639 +#: FDebugInfo.form:318 +msgid "Search again" +msgstr "Rechercher de nouveau" + +#: FDebugInfo.form:361 FSearch.class:517 FTranslate.class:639 msgid "Search string cannot be found." msgstr "La chaîne recherchée est introuvable." -#: FDebugInfo.form:365 FOutput.form:78 +#: FDebugInfo.form:372 FOutput.form:78 msgid "Clear console" msgstr "Effacer la console" -#: FDebugInfo.form:372 FMain.form:503 FProjectVersion.form:89 FVersionControl.form:91 +#: FDebugInfo.form:379 FMain.form:503 FProjectVersion.form:89 FVersionControl.form:91 msgid "Commit" msgstr "Publier" -#: FDebugInfo.form:379 FMain.form:509 FReportBorderChooser.form:60 FReportPaddingChooser.form:64 +#: FDebugInfo.form:386 FMain.form:509 FReportBorderChooser.form:60 FReportPaddingChooser.form:64 msgid "Synchronize" msgstr "Synchroniser" -#: FDebugInfo.form:386 FMain.form:522 +#: FDebugInfo.form:393 FMain.form:522 msgid "Revert all changes" msgstr "Annuler tous les changements" -#: FDebugInfo.form:393 FMain.form:528 +#: FDebugInfo.form:400 FMain.form:528 msgid "Add everything to repository" msgstr "Tout ajouter au référentiel" +#: FEditor.class:3362 +msgid "Declarations" +msgstr "Déclarations" + #: FEditor.form:195 FTextEditor.form:214 msgid "Format code" msgstr "Formater le code" @@ -2409,7 +2413,7 @@ msgstr "Le fichier n'est pas versionné, et doit être ajouté au référentiel. msgid "This file has not been modified since the last commit." msgstr "Ce fichier est inchangé depuis la dernière publication." -#: FFileProperty.class:155 FMakeInstall.class:358 FProjectVersion.class:211 FSave.form:21 Project.module:3530 VersionControl.module:398 +#: FFileProperty.class:155 FMakeInstall.class:361 FProjectVersion.class:211 FSave.form:21 Project.module:3535 VersionControl.module:398 msgid "Continue" msgstr "Continuer" @@ -2541,11 +2545,11 @@ msgstr "Déplacer l'onglet" msgid "First" msgstr "Début" -#: FForm.form:373 FSearch.form:189 FTips.form:71 +#: FForm.form:373 FSearch.form:190 FTips.form:71 msgid "Previous" msgstr "Précédent" -#: FForm.form:380 FSearch.form:183 FTips.form:77 +#: FForm.form:380 FSearch.form:184 FTips.form:77 msgid "Next" msgstr "Suivant" @@ -2825,31 +2829,31 @@ msgstr "px" msgid "Duplicate" msgstr "Dupliquer" -#: FImageProperty.class:788 +#: FImageProperty.class:789 msgid "System clipboard" msgstr "Presse-papier système" -#: FImageProperty.class:1251 +#: FImageProperty.class:1256 msgid "Arrow" msgstr "Flèche" -#: FImageProperty.class:1253 +#: FImageProperty.class:1258 msgid "Arrow #2" msgstr "Flèche n°2" -#: FImageProperty.class:1254 +#: FImageProperty.class:1259 msgid "Triangle" msgstr "Triangle" -#: FImageProperty.class:1255 +#: FImageProperty.class:1260 msgid "Square triangle" msgstr "Triangle rectangle" -#: FImageProperty.class:1256 +#: FImageProperty.class:1261 msgid "Pentagon" msgstr "Pentagone" -#: FImageProperty.class:1257 +#: FImageProperty.class:1262 msgid "Hexagon" msgstr "Hexagone" @@ -3111,7 +3115,7 @@ msgstr "Importer des fichiers" msgid "Create symbolic links" msgstr "Créer des liens symboliques" -#: FImportTable.class:58 FSearch.form:171 FTranslate.class:1371 +#: FImportTable.class:58 FSearch.form:172 FTranslate.class:1371 msgid "All files" msgstr "Tous les fichiers" @@ -3307,7 +3311,7 @@ msgstr "Choisissez un fichier" msgid "This file is located inside the project." msgstr "Le fichier est situé à l'intérieur du projet." -#: FMain.class:2713 Project.module:857 +#: FMain.class:2713 Project.module:858 msgid "The file has been modified.\n\nAll your changes will be lost." msgstr "Le fichier a été modifié.\n\nToutes les modifications seront perdues." @@ -3504,7 +3508,7 @@ msgstr "Outils" msgid "Find" msgstr "Rechercher" -#: FMain.form:800 FSearch.form:74 +#: FMain.form:800 FSearch.form:75 msgid "Replace" msgstr "Remplacer" @@ -3680,7 +3684,7 @@ msgstr "Feuille de propriétés" msgid "Toolbox" msgstr "Boîte à outils" -#: FMain.form:1432 FSearch.form:60 +#: FMain.form:1432 FSearch.form:61 msgid "Search" msgstr "Rechercher" @@ -3768,115 +3772,115 @@ msgstr "Conserver les informations de débogage dans l'exécutable" msgid "Create a shortcut on the desktop" msgstr "Créer un raccourci sur le bureau" -#: FMakeInstall.class:135 +#: FMakeInstall.class:137 msgid "Package" msgstr "Paquet" -#: FMakeInstall.class:136 +#: FMakeInstall.class:138 msgid "Min. version" msgstr "Version min." -#: FMakeInstall.class:137 +#: FMakeInstall.class:139 msgid "Max. version" msgstr "Version max." -#: FMakeInstall.class:143 +#: FMakeInstall.class:145 msgid "File or directory" msgstr "Fichier ou répertoire" -#: FMakeInstall.class:277 +#: FMakeInstall.class:279 msgid "Creating packages..." msgstr "Creation des paquets..." -#: FMakeInstall.class:280 Package.module:311 +#: FMakeInstall.class:282 Package.module:311 msgid "The packages have been successfully created." msgstr "Les paquets ont été créés avec succès." -#: FMakeInstall.class:331 +#: FMakeInstall.class:333 msgid "Please enter your name." msgstr "Veuillez saisir votre nom." -#: FMakeInstall.class:336 +#: FMakeInstall.class:338 msgid "Please enter your e-mail address." msgstr "Veuillez saisir votre adresse e-mail." -#: FMakeInstall.class:343 +#: FMakeInstall.class:345 msgid "Please enter the vendor name." msgstr "Veuillez saisir le nom du fournisseur." -#: FMakeInstall.class:358 +#: FMakeInstall.class:361 msgid "There is no CHANGELOG entry for this release." msgstr "Il n'y aucune information de changement pour cette version." -#: FMakeInstall.class:365 +#: FMakeInstall.class:368 msgid "Please enter the first CHANGELOG entry." msgstr "Veuillez saisir la première entrée du CHANGELOG." -#: FMakeInstall.class:376 +#: FMakeInstall.class:379 msgid "Please choose at least one target distribution." msgstr "Veuillez sélectionner au moins une distribution cible." -#: FMakeInstall.class:414 +#: FMakeInstall.class:417 msgid "Please choose the package group for each target distribution." msgstr "Veuillez sélectionner un groupe de paquet pour chaque distribution cible." -#: FMakeInstall.class:416 +#: FMakeInstall.class:419 msgid "Please choose a package group." msgstr "Veuillez sélectionner un groupe de paquet." -#: FMakeInstall.class:426 +#: FMakeInstall.class:429 msgid "Please choose the menu location for each target distribution." msgstr "Veuillez sélectionner un emplacement de menu pour chaque distribution cible." -#: FMakeInstall.class:428 +#: FMakeInstall.class:431 msgid "Please choose a menu location." msgstr "Veuillez sélectionner un emplacement de menu." -#: FMakeInstall.class:455 +#: FMakeInstall.class:458 msgid "Cannot found extra file: &1" msgstr "Impossible de trouver le fichier supplémentaire : &1" -#: FMakeInstall.class:461 +#: FMakeInstall.class:464 msgid "Please choose a target directory for each extra file." msgstr "Veuillez choisir un répertoire de destination pour chaque fichier supplémentaire." -#: FMakeInstall.class:469 +#: FMakeInstall.class:472 msgid "Debian packaging system cannot handle spaces in file names." msgstr "Le système de gestion de paquets de Debian ne peut gérer les noms de fichiers contenant un caractère d'espacement." -#: FMakeInstall.class:475 +#: FMakeInstall.class:478 msgid "Debian packaging system cannot handle spaces in directories." msgstr "Le système de gestion de paquets de Debian ne peut gérer les noms de répertoires contenant un caractère d'espacement." -#: FMakeInstall.class:491 +#: FMakeInstall.class:494 msgid "The package cannot be stored inside the project directory." msgstr "Le paquet ne peut être créé à l'intérieur du répertoire du projet." -#: FMakeInstall.class:539 +#: FMakeInstall.class:542 msgid "Initial release" msgstr "Version initiale" -#: FMakeInstall.class:799 +#: FMakeInstall.class:802 msgid "Menus" msgstr "Menus" -#: FMakeInstall.class:867 +#: FMakeInstall.class:870 msgid "Groups" msgstr "Groupes" -#: FMakeInstall.class:992 +#: FMakeInstall.class:995 msgid "Incorrect characters" msgstr "Caractères incorrects" -#: FMakeInstall.class:1065 +#: FMakeInstall.class:1068 msgid "Do you really want to remove all extra dependencies?" msgstr "Voulez-vous vraiment retirer toutes les dépendances supplémentaires ?" -#: FMakeInstall.class:1165 +#: FMakeInstall.class:1168 msgid "Do you really want to remove all extra files?" msgstr "Voulez-vous vraiment retirer tous les fichiers supplémentaires ?" -#: FMakeInstall.class:1213 +#: FMakeInstall.class:1216 msgid "Select the destination directory" msgstr "Sélectionnez le répertoire destination" @@ -4069,7 +4073,7 @@ msgstr "Selectionnez l'archive source" msgid "*.gz;*.bz2;*.xz" msgstr "" -#: FMakePatch.form:97 Project.module:4581 +#: FMakePatch.form:97 Project.module:4587 msgid "Source packages" msgstr "Paquets sources" @@ -4090,27 +4094,27 @@ msgstr "" msgid "Patch/Diff files" msgstr "Fichiers Patch/Diff" -#: FMenu.class:76 +#: FMenu.class:88 msgid "Menus have been modified!" msgstr "Les menus ont été modifiés !" -#: FMenu.class:314 +#: FMenu.class:326 msgid "Please enter a menu name." msgstr "Veuillez entrer un nom de menu." -#: FMenu.class:320 +#: FMenu.class:332 msgid "Bad menu name !" msgstr "Nom de menu incorrect !" -#: FMenu.class:326 +#: FMenu.class:338 msgid "Bad group name !" msgstr "Nom de groupe incorrect !" -#: FMenu.class:626 +#: FMenu.class:638 msgid "This menu is too deep !" msgstr "Ce menu est trop profond !" -#: FMenu.class:1065 Project.module:5475 +#: FMenu.class:1077 Project.module:5463 msgid "modified" msgstr "modifié" @@ -4186,7 +4190,7 @@ msgstr "Emplacement" msgid "No password" msgstr "Pas de mot de passe" -#: FNewConnection.form:189 Project.module:232 +#: FNewConnection.form:189 Project.module:233 msgid "Database" msgstr "Bases de données" @@ -4502,7 +4506,7 @@ msgstr "Taille des titres" msgid "Debugger size" msgstr "Taille du débogueur" -#: FOption.form:949 Project.module:239 +#: FOption.form:949 Project.module:240 msgid "Printing" msgstr "Impression" @@ -5306,79 +5310,87 @@ msgstr "Nouveau nom du projet" msgid "Take screenshot" msgstr "Capture d'écran" -#: FSearch.class:548 +#: FSearch.class:519 msgid "Search string replaced once." msgstr "La chaîne de caractères recherchée à été remplacée une fois." -#: FSearch.class:550 +#: FSearch.class:521 msgid "Search string replaced &1 times." msgstr "La chaîne de caractères a été remplacée &1 fois." -#: FSearch.class:647 +#: FSearch.class:626 msgid "One match" msgstr "Une correspondance" -#: FSearch.class:649 +#: FSearch.class:628 msgid "&1 matches" msgstr "&1 correspondances" -#: FSearch.class:946 +#: FSearch.class:634 +msgid "One replacement" +msgstr "Un remplacement" + +#: FSearch.class:636 +msgid "&1 replacements" +msgstr "&1 remplacements" + +#: FSearch.class:938 msgid "Do you really want to replace every string?" msgstr "Voulez-vous vraiment remplacer l'ensemble des chaînes ?" -#: FSearch.form:41 +#: FSearch.form:42 msgid "Search & Replace" msgstr "Rechercher & Remplacer" -#: FSearch.form:104 +#: FSearch.form:105 msgid "Case sensitive" msgstr "Tenir compte de la casse" -#: FSearch.form:109 +#: FSearch.form:110 msgid "Words only" msgstr "Mots seulements" -#: FSearch.form:114 +#: FSearch.form:115 msgid "Regular expression" msgstr "Expression rationnelle" -#: FSearch.form:119 +#: FSearch.form:120 msgid "Ignore strings" msgstr "Ignorer les chaînes" -#: FSearch.form:124 +#: FSearch.form:125 msgid "Ignore comments" msgstr "Ignorer les commentaires" -#: FSearch.form:139 +#: FSearch.form:140 msgid "Search in" msgstr "Rechercher dans" -#: FSearch.form:146 -msgid "Current procedure" -msgstr "Procédure courante" +#: FSearch.form:147 +msgid "Current function" +msgstr "Fonction courante" -#: FSearch.form:152 +#: FSearch.form:153 msgid "Current file" msgstr "Fichier courant" -#: FSearch.form:159 +#: FSearch.form:160 msgid "Source files" msgstr "Fichiers sources" -#: FSearch.form:165 +#: FSearch.form:166 msgid "Data files" msgstr "Fichiers de données" -#: FSearch.form:196 +#: FSearch.form:197 msgid "Browse" msgstr "Parcourir" -#: FSearch.form:208 +#: FSearch.form:209 msgid "Replace all" msgstr "Tout remplacer" -#: FSearch.form:219 +#: FSearch.form:220 msgid "Highlight search" msgstr "Surligner la recherche" @@ -5386,11 +5398,11 @@ msgstr "Surligner la recherche" msgid "Select an extra file" msgstr "Choisissez un fichier supplémentaire" -#: FSelectIcon.class:35 +#: FSelectIcon.class:37 msgid "Image files" msgstr "Fichiers images" -#: FSelectIcon.class:36 +#: FSelectIcon.class:38 msgid "SVG image files" msgstr "Fichiers images SVG" @@ -5434,7 +5446,7 @@ msgstr "Nouveau fragment de code" msgid "Trigger string" msgstr "Chaîne de déclenchement" -#: FSoftwareFarm.class:42 Project.module:234 +#: FSoftwareFarm.class:42 Project.module:235 msgid "Games" msgstr "Jeux" @@ -5454,7 +5466,7 @@ msgstr "Graphique" msgid "Audio" msgstr "Son" -#: FSoftwareFarm.class:48 Project.module:241 +#: FSoftwareFarm.class:48 Project.module:242 msgid "Video" msgstr "Vidéo" @@ -5622,11 +5634,11 @@ msgstr "Utiliser une police non proportionnelle" msgid "Console output #&1" msgstr "Sortie de console n°&1" -#: FTextEditor.class:969 +#: FTextEditor.class:970 msgid "Unable to compress file." msgstr "Impossible de compresser le fichier." -#: FTextEditor.class:1887 +#: FTextEditor.class:1888 msgid "Compressed at &1" msgstr "Compressé à &1" @@ -5846,7 +5858,7 @@ msgstr "Nouveau projet..." msgid "Recent projects" msgstr "Projets récents" -#: FWelcome.class:72 Project.module:6278 +#: FWelcome.class:72 Project.module:6266 msgid "Installed software" msgstr "Logiciels installés" @@ -7434,343 +7446,343 @@ msgstr "Format d'archive des sources non supporté" msgid "Patch didn't apply:\n" msgstr "Le patch n'a pas été appliqué :\n" -#: Project.module:230 +#: Project.module:231 msgid "Automation" msgstr "Automatisation" -#: Project.module:231 +#: Project.module:232 msgid "Basic" msgstr "Exemples de base" -#: Project.module:233 +#: Project.module:234 msgid "Drawing" msgstr "Dessin" -#: Project.module:236 +#: Project.module:237 msgid "Miscellaneous" msgstr "Divers" -#: Project.module:237 +#: Project.module:238 msgid "Networking" msgstr "Programmation réseau" -#: Project.module:238 +#: Project.module:239 msgid "OpenGL" msgstr "OpenGL" -#: Project.module:240 +#: Project.module:241 msgid "Sound" msgstr "Son" -#: Project.module:242 +#: Project.module:243 msgid "Controls" msgstr "Contrôles" -#: Project.module:243 +#: Project.module:244 msgid "Multimedia" msgstr "Multimedia" -#: Project.module:244 +#: Project.module:245 msgid "Web" msgstr "Web" -#: Project.module:417 +#: Project.module:418 msgid "File not found!" msgstr "Fichier introuvable !" -#: Project.module:529 +#: Project.module:530 msgid "This project does not exist." msgstr "Ce projet n'existe pas." -#: Project.module:541 +#: Project.module:542 msgid "Unable to find Gambas IDE executable in directory:\n\n&1" msgstr "Impossible de trouver l'exécutable de l'EDI Gambas dans le répertoire :\n\n&1" -#: Project.module:560 +#: Project.module:561 msgid "This is not a Gambas project." msgstr "Ce n'est pas un projet Gambas." -#: Project.module:563 +#: Project.module:564 msgid "This is a Gambas 1.0 project. Use Gambas 2 to convert it." msgstr "Ceci est un projet Gambas 1.0. Utilisez Gambas 2 pour le convertir." -#: Project.module:566 +#: Project.module:567 msgid "Convert" msgstr "Convertir" -#: Project.module:566 +#: Project.module:567 msgid "This is a Gambas 2.0 project.\n\nDo you want to convert it?" msgstr "Ceci est un projet Gambas 2.0.\n\nDésirez-vous le convertir ?" -#: Project.module:584 +#: Project.module:585 msgid "Do not open" msgstr "Ne pas ouvrir" -#: Project.module:584 +#: Project.module:585 msgid "Open after all" msgstr "Ouvrir malgré tout" -#: Project.module:584 +#: Project.module:585 msgid "This project seems to be already opened.\n\nOpening the same project twice can lead to data loss." msgstr "Il semble que ce projet soit déjà ouvert.\n\nOuvrir le même projet deux fois peut provoquer des pertes de données." -#: Project.module:590 +#: Project.module:591 msgid "It cannot be converted." msgstr "Il ne peut être converti." -#: Project.module:590 +#: Project.module:591 msgid "This project is read-only." msgstr "Le projet est en lecture seule." -#: Project.module:601 +#: Project.module:602 msgid "Current project" msgstr "Projet courant" -#: Project.module:608 +#: Project.module:609 msgid "Copying project inside a temporary directory..." msgstr "Copie du projet dans un répertoire temporaire..." -#: Project.module:611 +#: Project.module:612 msgid "Unable to create temporary directory" msgstr "Impossible de créer le répertoire temporaire" -#: Project.module:641 +#: Project.module:642 msgid "Converting project structure..." msgstr "Conversion de la structure du projet..." -#: Project.module:674 +#: Project.module:675 msgid "Applying conversion..." msgstr "Application de la conversion..." -#: Project.module:680 +#: Project.module:681 msgid "Unable to apply conversion" msgstr "Impossible d'appliquer la conversion" -#: Project.module:799 +#: Project.module:800 msgid "Some libraries used by the project are missing." msgstr "Des bibliothèques utilisées par le projet sont manquantes." -#: Project.module:818 +#: Project.module:819 msgid "Cannot open project file :" msgstr "Impossible d'ouvrir le fichier :" -#: Project.module:870 +#: Project.module:871 msgid "Cannot reload file." msgstr "Impossible de recharger le fichier." -#: Project.module:1666 +#: Project.module:1667 msgid "ALPHA VERSION, USE AT YOUR OWN RISK!" msgstr "VERSION ALPHA, À UTILISER À VOS RISQUES ET PÉRILS !" -#: Project.module:1668 +#: Project.module:1669 msgid "DEVELOPMENT VERSION, USE AT YOUR OWN RISK!" msgstr "VERSION DE DÉVELOPPEMENT, À UTILISER À VOS RISQUES ET PÉRILS !" -#: Project.module:2026 +#: Project.module:2027 msgid "Cannot open a binary file." msgstr "Impossible d'ouvrir un fichier binaire." -#: Project.module:2064 +#: Project.module:2065 msgid "Cannot open file." msgstr "Impossible d'ouvrir le fichier." -#: Project.module:2222 +#: Project.module:2223 msgid "&1th" msgstr "&1ème" -#: Project.module:2275 +#: Project.module:2276 msgid "in form definition" msgstr "dans la définition du formulaire" -#: Project.module:2282 +#: Project.module:2283 msgid "in &1." msgstr "dans &1." -#: Project.module:2443 +#: Project.module:2444 msgid "Some project source files are in conflict.\nPlease solve them if you want to compile the project." msgstr "Certains fichiers sources du projet sont en conflit.\nVeuillez résoudre ces conflits pour pouvoir compiler le projet." -#: Project.module:2447 +#: Project.module:2448 msgid "Compiling project" msgstr "Compilation du projet" -#: Project.module:2698 +#: Project.module:2699 msgid "File already exists." msgstr "Ce fichier existe déja." -#: Project.module:2730 +#: Project.module:2731 msgid "Directory already exists." msgstr "Le répertoire existe déja." -#: Project.module:2742 +#: Project.module:2743 msgid "Cannot link template file." msgstr "Impossible de créer le lien vers le fichier modèle." -#: Project.module:2748 +#: Project.module:2749 msgid "Cannot copy template file." msgstr "Impossible de copier le fichier modèle." -#: Project.module:2954 +#: Project.module:2955 msgid "The contents of VERSION file is incorrect." msgstr "Le contenu du fichier VERSION est incorrect." -#: Project.module:2976 +#: Project.module:2977 msgid "Cannot install library in &1." msgstr "Impossible d'installer la bibliothèque dans &1." -#: Project.module:3018 +#: Project.module:3019 msgid "Making executable..." msgstr "Génération de l'exécutable..." -#: Project.module:3076 +#: Project.module:3077 msgid "Cannot make executable." msgstr "Impossible de créer l'exécutable." -#: Project.module:3529 +#: Project.module:3534 msgid "Some components are missing: &1" msgstr "Certains composants ne sont pas installés : &1" -#: Project.module:3731 +#: Project.module:3737 msgid "Cannot write project file." msgstr "Impossible d'écrire le fichier projet." -#: Project.module:3780 +#: Project.module:3786 msgid "Unable to create desktop shortcut." msgstr "Imposible de créer le raccourci sur le bureau." -#: Project.module:4044 +#: Project.module:4050 msgid "The directory will be removed at the next commit." msgstr "Le répertoire sera supprimé à la prochaine publication." -#: Project.module:4061 +#: Project.module:4067 msgid "You must define a startup class or form!" msgstr "Vous devez définir une classe ou un formulaire de démarrage !" -#: Project.module:4092 +#: Project.module:4098 msgid "Please type a name." msgstr "Veuillez saisir un nom." -#: Project.module:4096 +#: Project.module:4102 msgid "This name contains a forbidden character:" msgstr "Ce nom contient un caractère interdit:" -#: Project.module:4100 +#: Project.module:4106 msgid "The name cannot begins with a dot." msgstr "Le nom ne peut pas commencer par un point." -#: Project.module:4104 +#: Project.module:4110 msgid "This name is already used. Choose another one." msgstr "Ce nom est déjà utilisé. Choisissez-en un autre." -#: Project.module:4140 +#: Project.module:4146 msgid "A class name must begin with a letter or an underscore, followed by any letter or digit." msgstr "Un nom de classe doit commencer par une lettre ou un caractère '_', et être suivi par des lettres ou des chiffres. " -#: Project.module:4183 +#: Project.module:4189 msgid "Destination already exists." msgstr "La destination existe déjà." -#: Project.module:4365 +#: Project.module:4371 msgid "Unable to rename '&1'" msgstr "Impossible de renommer « &1 »" -#: Project.module:4481 +#: Project.module:4487 msgid "Please type a project name." msgstr "Veuillez saisir un nom de projet." -#: Project.module:4489 +#: Project.module:4495 msgid "The project name cannot begin with a dot." msgstr "Un nom de projet ne peut commencer par un point." -#: Project.module:4492 +#: Project.module:4498 msgid "Non-ASCII characters are forbidden in a project name." msgstr "Un nom de projet ne peut contenir que des caractères ASCII." -#: Project.module:4493 +#: Project.module:4499 msgid "SPACE" msgstr "ESPACE" -#: Project.module:4493 +#: Project.module:4499 msgid "The following characters are forbidden in a project name:" msgstr "Les caractères suivants sont interdits dans un nom de projet :" -#: Project.module:4500 +#: Project.module:4506 msgid "This project already exists." msgstr "Ce projet existe déjà." -#: Project.module:4503 +#: Project.module:4509 msgid "The project directory already exists." msgstr "Le répertoire du projet existe déjà." -#: Project.module:4505 +#: Project.module:4511 msgid "The project directory cannot be created because a file with the same name already exists." msgstr "Le répertoire du projet ne peut être créé car un fichier avec le même nom existe déjà." -#: Project.module:4553 +#: Project.module:4559 msgid "Unable to create source archive." msgstr "Impossible de créer l'archive source." -#: Project.module:4580 +#: Project.module:4586 msgid "Create source package" msgstr "Générer une archive des sources du projet" -#: Project.module:4860 +#: Project.module:4866 msgid "Cannot copy file &1." msgstr "Impossible de copier le fichier &1." -#: Project.module:4908 +#: Project.module:4914 msgid "Cannot create link &1." msgstr "Impossible de créer le lien &1." -#: Project.module:4923 +#: Project.module:4929 msgid "Cannot move a directory inside itself." msgstr "Impossible de déplacer un répertoire à l'intérieur de lui-même." -#: Project.module:4987 +#: Project.module:4993 msgid "Cannot move file &1." msgstr "Impossible de déplacer le fichier &1." -#: Project.module:5200 +#: Project.module:5206 msgid "The following files couldn't be removed:" msgstr "Les fichiers suivants n'ont pu être supprimés :" -#: Project.module:5685 +#: Project.module:5673 msgid "Project cleanup..." msgstr "Nettoyage du projet..." -#: Project.module:5691 +#: Project.module:5679 msgid "Project files conversion..." msgstr "Conversion des fichiers du projet..." -#: Project.module:5721 +#: Project.module:5709 msgid "Unable to convert &1" msgstr "Impossible de convertir &1" -#: Project.module:5972 +#: Project.module:5960 msgid "Unable to update forms." msgstr "Impossible de mettre à-jour les formulaires." -#: Project.module:6062 +#: Project.module:6050 msgid "The &1 program is not installed on your system." msgstr "Le programme &1 n'est pas installé sur votre système." -#: Project.module:6064 +#: Project.module:6052 msgid "The following programs are not installed on your system: &1." msgstr "Les programmes suivants ne sont pas installés sur votre système : &1." -#: Project.module:6156 +#: Project.module:6144 msgid "Unable to read component description file." msgstr "Impossible de lire le fichier de description du composant." -#: Project.module:6217 +#: Project.module:6205 msgid "Cannot write component description file." msgstr "Impossible d'écrire le fichier de description du composant." -#: Project.module:6278 +#: Project.module:6266 msgid "Project templates" msgstr "Modèles de projet" -#: Project.module:6324 +#: Project.module:6312 msgid "Unable to run terminal." msgstr "Impossible de démarrer le terminal." diff --git a/app/src/gambas3/.src/Debug/FDebugInfo.class b/app/src/gambas3/.src/Debug/FDebugInfo.class index 76097573e..13c29ec18 100644 --- a/app/src/gambas3/.src/Debug/FDebugInfo.class +++ b/app/src/gambas3/.src/Debug/FDebugInfo.class @@ -42,20 +42,6 @@ Public Sub _new() .AddColumn(("Function")) End With - ' With gvwFind - ' .Columns.Count = 5 - ' .Columns[0].Width = DS * 16 - ' .Columns[0].Text = ("File") - ' .Columns[1].Width = DS * 16 - ' .Columns[1].Text = ("Location") - ' .Columns[2].Width = DS * 6 - ' .Columns[2].Text = ("Line") - ' .Columns[3].Width = DS * 6 - ' .Columns[3].Text = ("Col.") - ' .Columns[4].Width = 32 - ' .Columns[4].Text = ("Text") - ' End With - With gvwFind .AddColumn(("File")) .AddColumn(("Location")) @@ -628,6 +614,20 @@ Public Sub SetSearchListInfo(Optional sText As String) End +Public Sub StartSearch() + + spnSearch.Start + spnSearch.Show + +End + +Public Sub StopSearch() + + spnSearch.Stop + spnSearch.Hide + +End + Public Sub btnShowSearch_Click() FSearch.WakeUp(False, True) diff --git a/app/src/gambas3/.src/Debug/FDebugInfo.form b/app/src/gambas3/.src/Debug/FDebugInfo.form index a7519224d..c7f526dcb 100644 --- a/app/src/gambas3/.src/Debug/FDebugInfo.form +++ b/app/src/gambas3/.src/Debug/FDebugInfo.form @@ -184,7 +184,7 @@ Index = 5 Text = ("Search result") { panSearch HBox - MoveScaled(1,0,83,4) + MoveScaled(1,0,97,4) { btnCancelSearch ToolButton MoveScaled(0,0,10,4) Visible = False @@ -193,36 +193,41 @@ Text = ("Cancel") Picture = Picture["icon:/small/halt"] } + { spnSearch Spinner + MoveScaled(6,0,4,4) + Visible = False + Padding = 4 + } { btnCloseSearch ToolButton MoveScaled(11,0,10,4) AutoResize = True Text = ("Close") Picture = Picture["icon:/small/close"] } - { btnRefreshSearch ToolButton - MoveScaled(22,0,18,4) - AutoResize = True - Text = ("Search again") - Picture = Picture["icon:/small/refresh"] - } { btnShowSearch ToolButton - MoveScaled(41,0,19,4) + MoveScaled(21,0,21,4) AutoResize = True Text = ("Show search window") Picture = Picture["icon:/small/find"] } + { btnRefreshSearch ToolButton + MoveScaled(43,0,18,4) + AutoResize = True + Text = ("Search again") + Picture = Picture["icon:/small/refresh"] + } { Panel1 Panel MoveScaled(62,0,2,4) Expand = True } { lblBrowse Label - MoveScaled(66,0,11,4) + MoveScaled(77,0,11,4) Font = Font["Italic"] Padding = 4 AutoResize = True } { panButtonSearch Panel - MoveScaled(78,0,4,4) + MoveScaled(90,0,4,4) } } { Separator5 Separator diff --git a/app/src/gambas3/.src/Editor/Code/FCompletion.class b/app/src/gambas3/.src/Editor/Code/FCompletion.class index dc5603b8e..6c5246d90 100644 --- a/app/src/gambas3/.src/Editor/Code/FCompletion.class +++ b/app/src/gambas3/.src/Editor/Code/FCompletion.class @@ -225,6 +225,7 @@ Public Sub Open(hForm As Object, sMode As String, Optional sClass As String, Opt panResizeTop.Hide Endif + iY += $hEditor.Y hCont = $hEditor.Parent Do If hCont Is Form Then Break diff --git a/app/src/gambas3/.src/Editor/Code/FConflictEditor.class b/app/src/gambas3/.src/Editor/Code/FConflictEditor.class index d5e1bd642..4c275e86e 100644 --- a/app/src/gambas3/.src/Editor/Code/FConflictEditor.class +++ b/app/src/gambas3/.src/Editor/Code/FConflictEditor.class @@ -750,7 +750,7 @@ Public Sub GetPosition() As Integer End -Public Sub SetPosition(hResult As CFindResult, Optional bJustCheck As Boolean) As Boolean +Public Sub SetPosition(hResult As CSearchResult, Optional bJustCheck As Boolean) As Boolean Return $hEditor.SetPosition(hResult, bJustCheck) diff --git a/app/src/gambas3/.src/Editor/Code/FEditor.class b/app/src/gambas3/.src/Editor/Code/FEditor.class index e61ccbef1..3e991d4c9 100644 --- a/app/src/gambas3/.src/Editor/Code/FEditor.class +++ b/app/src/gambas3/.src/Editor/Code/FEditor.class @@ -267,16 +267,13 @@ Public Sub Modify(Optional bReset As Boolean) If Me.ReadOnly Then Return - $bModify = True Inc Project.TimeStamp Inc Age - FSearch.OnFileChange(Me.Path) FDebugInfo.RefreshTabs(Me.Path, Me.Name) - If bReset Then - $bModify = False - Endif + $bModify = Not bReset + If $bModify Then FSearch.OnFileChange(Me.Path) DrawTitle @@ -3345,9 +3342,10 @@ Public Sub GetPosition() As Integer End -Public Sub SetPosition(hResult As CFindResult, Optional bJustCheck As Boolean) As Boolean +Public Sub SetPosition(hResult As CSearchResult, Optional bJustCheck As Boolean) As Boolean Dim bResult As Boolean + Dim sWhere As String If FSearch.CurrentProcedure Then bResult = $hEditor.SetPosition(hResult, True) @@ -3358,6 +3356,13 @@ Public Sub SetPosition(hResult As CFindResult, Optional bJustCheck As Boolean) A Else bResult = $hEditor.SetPosition(hResult, bJustCheck) Endif + + If bJustCheck And If Not bResult Then + sWhere = GetProcAt(hResult.Line) + If Not sWhere Then sWhere = ("Declarations") + hResult.Location = sWhere + Endif + Return bResult End diff --git a/app/src/gambas3/.src/Editor/Code/FTextEditor.class b/app/src/gambas3/.src/Editor/Code/FTextEditor.class index c02e94107..fbe469aa8 100644 --- a/app/src/gambas3/.src/Editor/Code/FTextEditor.class +++ b/app/src/gambas3/.src/Editor/Code/FTextEditor.class @@ -265,14 +265,11 @@ Public Sub Modify(Optional bReset As Boolean) If Project.ReadOnly Then Return - $bModify = True Inc Project.TimeStamp Inc Age - FSearch.OnFileChange(Me.Path) - If bReset Then - $bModify = False - Endif + $bModify = Not bReset + If $bModify Then FSearch.OnFileChange(Me.Path) DrawTitle @@ -871,8 +868,12 @@ Public Sub GetPosition() As Integer End -Public Sub SetPosition(hResult As CFindResult, Optional bJustCheck As Boolean) As Boolean +Public Sub SetPosition(hResult As CSearchResult, Optional bJustCheck As Boolean) As Boolean + If bJustCheck Then + hResult.Location = GetProcAt(hResult.Line) + Endif + Return $hEditor.SetPosition(hResult, bJustCheck) End diff --git a/app/src/gambas3/.src/Editor/Form/FForm.class b/app/src/gambas3/.src/Editor/Form/FForm.class index 129dafe07..9c6cccf47 100644 --- a/app/src/gambas3/.src/Editor/Form/FForm.class +++ b/app/src/gambas3/.src/Editor/Form/FForm.class @@ -1928,9 +1928,9 @@ Public Sub Modify(Optional bReset As Boolean) Inc Project.TimeStamp Inc Age - FSearch.OnFileChange(Me.Path) - $bModify = Not bReset + If $bModify Then FSearch.OnFileChange(Me.Path) + DrawTitle End @@ -3752,15 +3752,15 @@ Public Sub GetPosition() As Integer End -Public Sub SetPosition(hResult As CFindResult, Optional bJustCheck As Boolean) As Boolean +Public Sub SetPosition(hResult As CSearchResult, Optional bJustCheck As Boolean) As Boolean - Dim sName As String = hResult.GetLocation() Dim aName As String[] If bJustCheck Then - If Not sName Then Return True + FindLocation(hResult) + If Not hResult.Location Then Return True Else - aName = Split(sName, ".") + aName = Split(hResult.Location, ".") Try SelectControl(aName[0]) If Not Error Then FProperty.FocusOn(aName[1]) Endif @@ -4392,34 +4392,50 @@ Public Sub dwgInfo_Draw() End -Public Sub GetLocation(iLine As Integer) As String +Private Sub FindLocation(hResult As CSearchResult) - Dim aText As String[] Dim sLine As String Dim iPos As Integer Dim sProperty As String Dim iLevel As Integer + Dim sText As String + Dim iPos2 As Integer - aText = Split(GetText(), "\n") - Dec iLine - If iLine > aText.Max Then Return - sLine = Trim(aText[iLine]) - iPos = InStr(sLine, " = ") - If iPos = 0 Then Return - sProperty = Left(sLine, iPos - 1) + sText = GetText() - While iLine >= 0 - sLine = Trim(aText[iLine]) + iPos = RInStr(sText, "\n", hResult.Pos) + 1 + + iPos2 = InStr(sText, "\n", iPos + 1) + If iPos2 = 0 Then iPos2 = Len(sText) + 1 + + sLine = Mid$(sText, iPos, iPos2 - iPos) + + hResult.Column = hResult.Pos - iPos + 1 + hResult.Text = sLine + + sLine = Trim(sLine) + iPos2 = InStr(sLine, " = ") + If iPos2 = 0 Then Return + sProperty = Left(sLine, iPos2 - 1) + + While iPos > 1 + iPos2 = iPos - 1 + If iPos = 2 Then + iPos = 1 + Else + iPos = RInStr(sText, "\n", iPos - 2) + 1 + Endif + sLine = Trim(Mid$(sText, iPos, iPos2 - iPos)) If sLine = "}" Then Inc iLevel Else If sLine Begins "{ " Then If iLevel Then Dec iLevel Else - Return Split(sLine, " ")[1] & "." & sProperty + hResult.Location = Split(sLine, " ")[1] & "." & sProperty + Break Endif Endif - Dec iLine Wend End diff --git a/app/src/gambas3/.src/Exported/TextEditor.class b/app/src/gambas3/.src/Exported/TextEditor.class index 86468f2a6..15a37f9de 100644 --- a/app/src/gambas3/.src/Exported/TextEditor.class +++ b/app/src/gambas3/.src/Exported/TextEditor.class @@ -12,13 +12,15 @@ Private $iEndColumn As Integer Private $hLabel As TextLabel Private $hLabelTimer As Timer Private $hObserver As Observer -Private $iLastLine As Integer = -1 Private $bLabelBottom As Boolean Static Private $sFindPrefix As String Static Private $aFind As Integer[] +Private $iLastLine As Integer +Private $iLastLineOffset As Integer + Public Sub _new() $hObserver = New Observer(Me) As "Editor" @@ -77,69 +79,56 @@ Public Sub GetPosition() As Integer End -Fast Private Sub CalcPos(iPos As Integer) As Integer[] +Fast Private Sub GetLineOffset(iLine As Integer) As Integer + + Dim I As Integer + Dim iOffset As Integer - Dim iLine As Integer - Dim iLen As Integer + If $iLastLine >= 0 And If iLine >= $iLastLine Then + I = $iLastLine + iOffset = $iLastLineOffset + Endif - While iLine < Me.Count - - iLen = Len(Me[iLine].Text) - If iPos <= iLen Then Break - iPos -= iLen + 1 - Inc iLine - + While I < iLine + iOffset += Len(Me[I].Text) + 1 + Inc I Wend - Return [iLine, iPos] - + $iLastLine = iLine + $iLastLineOffset = iOffset + + Return iOffset + End - -Public Sub SetPosition(hFindResult As CFindResult, bJustCheck As Boolean) As Boolean +Public Sub SetPosition(hResult As CSearchResult, bJustCheck As Boolean) As Boolean Dim iLine, iColumn As Integer Dim sLine As String - Dim iPos As Integer - Dim aPos As Integer[] + Dim iOffset As Integer - ' If hFindResult.Line Or If hFindResult.Column Then - ' - ' iLine = hFindResult.Line - ' iColumn = hFindResult.Column - ' sLine = Me.Lines[iLine].Text - ' - ' Else - - aPos = CalcPos(hFindResult.Pos) - iLine = aPos[0] - iPos = aPos[1] - - If iLine >= Me.Count Then Return True - - sLine = Me[iLine].Text - iColumn = String.Len(Left$(sLine, iPos)) - - If Me.Highlight Then - If InStr(String.Mid$(Me[iLine].Purge(Not FSearch.IgnoreComments, Not FSearch.IgnoreStrings, Chr$(1)), iColumn + 1, hFindResult.Length), Chr$(1)) Then Return True - Endif - - hFindResult.Line = iLine - hFindResult.Column = iColumn + iLine = hResult.Line - 1 If bJustCheck Then - 'If iColumn >= 40 And If Me[iLine].Length > 80 Then - ' sLine = "…" & Html(String.Mid$(sLine, iColumn - 31, 32)) & "" & Html(String.Mid$(sLine, iColumn + 1, hFindResult.Length)) & "" & Html(String.Mid$(sLine, iColumn + hFindResult.Length + 1, 160)) - 'Else - ' sLine = Html(String.Left(sLine, iColumn)) & "" & Html(String.Mid$(sLine, iColumn + 1, hFindResult.Length)) & "" & Html(String.Mid$(sLine, iColumn + hFindResult.Length + 1, 160)) - 'Endif - 'sLine = Replace(sLine, " ", " ") - hFindResult.Text = sLine + + iOffset = GetLineOffset(iLine) + 'If iLine >= Me.Count Then Return True + + sLine = Me[iLine].Text + iColumn = String.Len(Left$(sLine, hResult.Pos - iOffset)) + + If Me.Highlight Then + If InStr(String.Mid$(Me[iLine].Purge(Not FSearch.IgnoreComments, Not FSearch.IgnoreStrings, Chr$(1)), iColumn + 1, hResult.Length), Chr$(1)) Then Return True + Endif + + hResult.Column = iColumn + hResult.Text = sLine Else ' TODO Me[iLine].Expanded = True - Me.GotoCenter(iColumn, iLine) - Me.Goto(iColumn + hFindResult.Length, iLine, True) + Me.GotoCenter(hResult.Column, iLine) + Me.Goto(hResult.Column + hResult.Length, iLine, True) + Endif End @@ -286,7 +275,7 @@ End Public Sub Editor_GotFocus() - $iLastLine = -1 + '$iLastLine = -1 $aFind = Null $sFindPrefix = "" @@ -296,12 +285,12 @@ Public Sub Editor_Cursor() HideMessageLabel - If Me.Line <> $iLastLine Then - $iLastLine = Me.Line - '$aFind = Null - '$sFindPrefix = "" - 'Raise LineChange - Endif + ' If Me.Line <> $iLastLine Then + ' $iLastLine = Me.Line + ' '$aFind = Null + ' '$sFindPrefix = "" + ' 'Raise LineChange + ' Endif End @@ -475,3 +464,9 @@ Public Sub FillWithHistory(sPath As String) Dec Application.Busy End + +Public Sub Editor_Change() + + $iLastLine = -1 + +End diff --git a/app/src/gambas3/.src/FMain.class b/app/src/gambas3/.src/FMain.class index 3f2c57be1..3f48dfe25 100644 --- a/app/src/gambas3/.src/FMain.class +++ b/app/src/gambas3/.src/FMain.class @@ -31,7 +31,6 @@ Private $bFirstShowDebug As Boolean Static Private $sCompressMessage As String - Public Sub _new() 'Me.ResizeScaled(86, 97) @@ -1943,7 +1942,7 @@ Public Sub Form_KeyPress() If FSignature.VisibleFrom(hEditor.GetEditor()) Then Return Endif - If FSearch.InBrowse Then + If FSearch.IsSearching() Then FSearch.Cancel Return Endif diff --git a/app/src/gambas3/.src/Project.module b/app/src/gambas3/.src/Project.module index 7b21987bd..167537acd 100644 --- a/app/src/gambas3/.src/Project.module +++ b/app/src/gambas3/.src/Project.module @@ -1946,6 +1946,7 @@ Public Sub IsPatchFile(sPath As String) As Boolean Dim hFile As File Dim sHead As String + If Not IsTextFile(sPath) Then Return hFile = Open sPath sHead = Read #hFile, -4 Return sHead = "diff" @@ -1963,7 +1964,7 @@ Public Function LoadFile(sPath As String, Optional bNoErrorIfUnknown As Boolean) If Not hForm Then - Inc Application.Busy + 'Inc Application.Busy 'If VersionControl.InConflict(sPath) Then Error.Raise("File in conflict") If IsConflict(sPath) Then @@ -1994,7 +1995,7 @@ Public Function LoadFile(sPath As String, Optional bNoErrorIfUnknown As Boolean) Else If IsConnectionPath(sPath) Then If MConnection.CheckPassword(sPath) Then - Dec Application.Busy + 'Dec Application.Busy Return Endif hForm = New FConnectionEditor(sPath) @@ -2019,7 +2020,7 @@ Public Function LoadFile(sPath As String, Optional bNoErrorIfUnknown As Boolean) Else - Dec Application.Busy + 'Dec Application.Busy Files[sPath] = Null If bNoErrorIfUnknown Then $bFileIsUnknown = True @@ -2042,7 +2043,7 @@ Public Function LoadFile(sPath As String, Optional bNoErrorIfUnknown As Boolean) If bError Then Files[sPath] = Null Try hForm.Delete - Dec Application.Busy + 'Dec Application.Busy Return Endif hForm.Icon = GetFileIcon(sPath) @@ -2050,7 +2051,7 @@ Public Function LoadFile(sPath As String, Optional bNoErrorIfUnknown As Boolean) If hForm Then FSearch.OnNewForm(hForm) - Dec Application.Busy + 'Dec Application.Busy Endif @@ -2060,7 +2061,7 @@ Catch sErr = Error.Text & "\n" & Error.Backtrace.Join(" ") If hForm Then Try hForm.Delete - Dec Application.Busy + 'Dec Application.Busy Try Files[sPath] = Null FMain.ShowError(("Cannot open file.") & "\n\n" & sErr, sPath) diff --git a/app/src/gambas3/.src/Search/CFindResult.class b/app/src/gambas3/.src/Search/CFindResult.class deleted file mode 100644 index e2af6c9c2..000000000 --- a/app/src/gambas3/.src/Search/CFindResult.class +++ /dev/null @@ -1,37 +0,0 @@ -' Gambas class file - -Public Path As String -Public (File) As String -Public (Line) As Integer -Public Pos As Integer -Public Column As Integer -Public Text As String -Public Bytes As Integer -Public Length As Integer -Public Dark As Boolean -Public Control As String -Public {Property} As String -Public (Highlight) As String -Public RichText As String - -Private $sWhere As String - -Public Sub GetLocation() As String - - Dim hFile As Object - - If Not Project.IsSourcePath(Path) Then Return - If $sWhere Then Return $sWhere - - $sWhere = "-" - Try hFile = Project.LoadFile(Path) - If hFile Then - If hFile Is FEditor Or If hFile Is FTextEditor Then - $sWhere = hFile.GetProcAt({Line}) - Else If hFile Is FForm Then - $sWhere = hFile.GetLocation({Line}) - Endif - Endif - Return $sWhere - -End diff --git a/app/src/gambas3/.src/Search/CGrepResult.class b/app/src/gambas3/.src/Search/CGrepResult.class index c3427f7fa..d5d24eafa 100644 --- a/app/src/gambas3/.src/Search/CGrepResult.class +++ b/app/src/gambas3/.src/Search/CGrepResult.class @@ -3,4 +3,4 @@ Public Path As String Public Age As Integer Public Command As String -Public Result As CFindResult[] +Public Result As CSearchResult[] diff --git a/app/src/gambas3/.src/Search/CSearchResult.class b/app/src/gambas3/.src/Search/CSearchResult.class new file mode 100644 index 000000000..a889f027a --- /dev/null +++ b/app/src/gambas3/.src/Search/CSearchResult.class @@ -0,0 +1,47 @@ +' Gambas class file + +Public Path As String +Public (File) As String +Public (Line) As Integer +Public Pos As Integer +Public Column As Integer +Public Text As String +Public Bytes As Integer +Public Length As Integer +Public Dark As Boolean +Public Control As String +Public {Property} As String +Public (Highlight) As String +Public RichText As String +Public Location As String + +'Private $sWhere As String + +' Public Sub GetLocation() As String +' +' Dim hFile As Object +' Dim sPath As String +' +' sPath = Project.Dir &/ Path +' +' If Not Project.IsSourcePath(sPath) Then Return +' If $sWhere Then Return $sWhere +' +' $sWhere = "-" +' Try hFile = Project.LoadFile(sPath) +' If hFile Then +' If hFile Is FEditor Or If hFile Is FTextEditor Then +' $sWhere = hFile.GetProcAt({Line}) +' If Not $sWhere Then $sWhere = ("(Declarations)") +' Else If hFile Is FForm Then +' $sWhere = hFile.GetLocation({Line}) +' Endif +' Endif +' Return $sWhere +' +' Catch +' +' $sWhere = "?" +' Return $sWhere +' +' End diff --git a/app/src/gambas3/.src/Search/CSearchTask.class b/app/src/gambas3/.src/Search/CSearchTask.class index 7a3f4c767..a6db0da34 100644 --- a/app/src/gambas3/.src/Search/CSearchTask.class +++ b/app/src/gambas3/.src/Search/CSearchTask.class @@ -2,8 +2,255 @@ Inherits Task +Public Search As String + +Public IgnoreCase As Boolean +Public WordsOnly As Boolean +Public RegularExpression As Boolean + +Public Where As String +Public Update As String[] + +Public Const ALL_FILES As String = "*" +Public Const SOURCE_FILES As String = "$" +Public Const DATA_FILES As String = "@" + +Private $aExt As String[] = ["jpg", "jpeg", "bmp", "gif", "png", "ico", "xpm", "tga", "gambas", "wav", "ogg", "mp3", "mp4", "avi", "webm"] + Public Sub Main() + Dim sDir As String + Dim sFile As String + Dim sPath As String + Dim sName As String + Dim sExt As String + Dim aFile As String[] + Dim aSort As String[] + + Application.Priority = 10 + + If Update Then + + sDir = "" + aFile = Update + + Else + + Select Case Where + + Case ALL_FILES, DATA_FILES + sDir = Project.Dir + + Case SOURCE_FILES + sDir = Project.SourceDir + + Case Else + sDir = File.Dir(Where) + aFile = [File.Name(Where)] + + End Select + + Endif + + If Not aFile Then + aFile = RDir(sDir).Sort(gb.Natural) + aSort = New String[] + For Each sPath In aFile + aSort.Add(File.Name(sPath)) + Next + aFile.SortUsing(aSort) + Endif + + For Each sFile In aFile + + If Right(sFile) = "~" Then Continue + + sPath = sDir &/ sFile + + sFile = Mid$(sPath, Len(Project.Dir) + 1) + If Left(sFile) = "/" Then sFile = Mid$(sFile, 2) + + If Left(sFile) = "." And If sFile Not Begins ".public/" Then + If Where = DATA_FILES Then Continue + If sFile Not Begins ".src/" Then Continue + Endif + + If IsDir(sPath) Then Continue + If InStr(sPath, "/.svn/") Then Continue + + sExt = LCase(File.Ext(sFile)) + If $aExt.Exist(sExt) Then Continue + + sName = File.Name(sPath) + If sName Begins "core." Then Continue + If sName Begins "vgcore." Then Continue + If sName Begins "callgrind.out." Then Continue + If sName Begins "cachegrind.out." Then Continue + + If Not Project.IsTextFile(sPath) Then Continue + + ' TODO: If bReplace And If Not Access(sPath) Then Continue + + Print "/" &/ Mid$(sPath, Len(Project.Dir) + 1) + + ' If sFile Begins ".src/" Then + ' FDebugInfo.SetSearchListInfo(sName) + ' Else + ' FDebugInfo.SetSearchListInfo(sFile) + ' Endif + + GrepFile(sPath) ', bReplace) + + 'Debug sName + Next End + +Private Sub GrepQuote(sStr As String) As String + + Dim I As Integer + Dim sCar As String + Dim sResult As String + + For I = 1 To String.Len(sStr) + sCar = String.Mid$(sStr, I, 1) + If Len(sCar) > 1 Or If IsLetter(sCar) Or If IsDigit(sCar) Then + sResult &= sCar + Else + sResult &= "\\" & sCar + Endif + Next + + Return sResult + +End + +Private Sub GrepFile(sPath As String, Optional bUseReplaceString As Boolean) + + Dim sText As String + Dim aGrep As String[] + Dim sGrep As String + Dim sFind As String + Dim sTemp As String + ' Dim iAge As Integer + ' Dim hGrepResult As CGrepResult + Dim iPos As Integer + Dim sSearch As String + Dim hFile As Object + Dim sResult As String + Dim iFilePos As Integer + + hFile = Project.Files[sPath] + + If sPath Then + If Not hFile Or If Not hFile.IsModified() Then + sTemp = sPath + Endif + Endif + + If Not sTemp Then + Try sText = hFile.GetText() + If Error Then Return + sTemp = Temp$("grep") + File.Save(sTemp, sText) + Endif + + aGrep = ["grep", "-nobs"] + + If bUseReplaceString Then + ' aGrep.Add("-F") + ' aGrep.Add("--") + ' aGrep.Add(ReplaceString) + Else + If IgnoreCase Then aGrep.Add("-i") + If RegularExpression Then + aGrep.Add("-E") + Else If WordsOnly Then + aGrep.Add("-E") + Else + aGrep.Add("-F") + Endif + aGrep.Add("--") + + sSearch = Search + If WordsOnly Then sSearch = "(^|[^_$[:alnum:]])" & GrepQuote(Search) & "($|[^_$[:alnum:]])" + aGrep.Add(sSearch) + Endif + + aGrep.Add(sTemp) + + ' If sPath Then + ' hGrepResult = $cGrepCache[sPath] + ' + ' If hGrepResult Then + ' Try iAge = hFile.Age + ' If iAge = hGrepResult.Age Then + ' If aGrep.Join("\n") = hGrepResult.Command Then + ' Return hGrepResult.Result + ' Endif + ' Endif + ' Endif + ' Endif + + 'grep -nR -F -I -i -w -ob --exclude=*~ --exclude-dir=.svn -s -- "Date" * .src + + Exec aGrep To sGrep + + For Each sFind In Split(sGrep, "\n", "", True) + + If hFile Then + ' If hFile Is FOutput Then + ' hResult.Path = "" + ' hResult.File = "Console" + ' Else + 'hResult.Path = sPath + ''hResult.File = hFile.Name + 'Endif + Else + 'hResult.Path = sPath + ''hResult.File = If(Project.IsSourcePath(sPath), File.BaseName(sPath), File.Name(sPath)) + Endif + + 'hResult.Highlight = TextEditor.GetModeFromPath(sPath) + + iPos = InStr(sFind, ":") + If iPos = 0 Then Continue + + sResult = CStr(CInt(Left(sFind, iPos - 1))) + sFind = Mid$(sFind, iPos + 1) + + iPos = InStr(sFind, ":") + If iPos = 0 Then Continue + + iFilePos = CInt(Left(sFind, iPos - 1)) + sFind = Mid$(sFind, iPos + 1) + + If WordsOnly Then + If String.Left(sFind) <> String.Left(Search) Then iFilePos += String.Len(String.Left(sFind)) + sFind = Search + Endif + + sResult &= ":" & CStr(iFilePos) + + sResult &= ":" & CStr(Len(sFind)) & ":" & CStr(String.Len(sFind)) '& ":" & sFind + Print sResult + Flush + 'Sleep 0.005 + + Next + + ' If sPath Then + ' If hFile Then Try iAge = hFile.Age + ' hGrepResult = New CGrepResult + ' With hGrepResult + ' .Result = aResult.Copy() + ' .Age = iAge + ' .Path = sPath + ' .Command = aGrep.Join("\n") + ' End With + ' $cGrepCache[sPath] = hGrepResult + ' Endif + +End + diff --git a/app/src/gambas3/.src/Search/FSearch.class b/app/src/gambas3/.src/Search/FSearch.class index 19336482e..edf6a67df 100644 --- a/app/src/gambas3/.src/Search/FSearch.class +++ b/app/src/gambas3/.src/Search/FSearch.class @@ -1,10 +1,10 @@ ' Gambas class file -Public CaseSensitive As Boolean +Public IgnoreCase As Boolean Public RegularExpression As Boolean Public IgnoreStrings As Boolean Public IgnoreComments As Boolean -Public WordOnly As Boolean +Public WordsOnly As Boolean Public CurrentProcedure As Boolean Public CurrentProcedureName As String Public SearchString As String @@ -13,13 +13,10 @@ Public BrowseTimeStamp As Integer Public OnlySource As Boolean Public OnlyData As Boolean -Public InBrowse As Boolean - Private $hCurrent As Object Private $sGrep As String Private $bReplace As Boolean -Private $aBrowse As New CFindResult[] -Private $aExt As String[] = ["JPG", "JPEG", "BMP", "GIF", "PNG", "ICO", "XPM", "GAMBAS", "WAV", "OGG"] +'Private $aBrowse As New CSearchResult[] Private $bCancel As Boolean Private $cGrepCache As New Collection @@ -35,6 +32,22 @@ Private Const GO_BACKWARD As Integer = 1 Private Const DO_REPLACE As Integer = 2 Private Const DO_ALL As Integer = 4 +Private Enum SEARCH_STRING, SEARCH_REPLACE, SEARCH_AFTER_REPLACE, SEARCH_UPDATE + +Private $hTask As CSearchTask +Private $sTaskBuffer As String +Private $sTaskPath As String +Private $aResult As New CSearchResult[] +Private $iTaskIndex As Integer +Private $sTaskFullPath As String +Private $bTaskUpdate As Boolean + +Private $bReplaceAll As Boolean +Private $iReplaceFrom As Integer +Private $bIgnoreFileChange As Boolean +Private $nReplace As Integer +Private $bUseReplaceString As Boolean + Public Sub _new() Me.Utility = Settings["/UseUtilityWindows", 1] @@ -56,7 +69,7 @@ Public Sub Form_Open() chkIgnoreComments.Value = Settings["/FSearch/IgnoreComments", False] chkIgnoreStrings.Value = Settings["/FSearch/IgnoreStrings", False] chkRegularExpression.Value = Settings["/FSearch/RegularExpression", False] - chkWordOnly.Value = Settings["/FSearch/WordOnly", False] + chkWordsOnly.Value = Settings["/FSearch/WordsOnly", False] 'radSourceFileOnly.Value = Settings["/FSearch/SourceOnly", False] gvwFind_Font @@ -73,7 +86,7 @@ Public Sub Form_Close() Settings["/FSearch/IgnoreComments"] = CBool(chkIgnoreComments.Value) Settings["/FSearch/IgnoreStrings"] = CBool(chkIgnoreStrings.Value) Settings["/FSearch/RegularExpression"] = CBool(chkRegularExpression.Value) - Settings["/FSearch/WordOnly"] = CBool(chkWordOnly.Value) + Settings["/FSearch/WordsOnly"] = CBool(chkWordsOnly.Value) 'Settings["/FSearch/SourceOnly"] = CBool(radSourceFileOnly.Value) End @@ -91,8 +104,8 @@ Public Sub ReadConfig() $CW = Paint._EstimateFixedFontCharWidth($hFont) $hStyle = MTheme.GetStyles() - For I = 0 To $aBrowse.Max - $aBrowse[I].RichText = "" + For I = 0 To $aResult.Max + $aResult[I].RichText = "" Next gvwFind.Refresh @@ -180,20 +193,20 @@ End Public Sub cmbSearch_Activate() - If btnBrowse.Visible Then - btnBrowse.Value = True - Else + If btnNext.Visible Then btnNext.Value = True + Else + btnBrowse.Value = True Endif End Public Sub cmbReplace_Activate() - If btnBrowse.Visible Then - btnReplaceAll.Value = True - Else + If btnReplace.Visible Then btnReplace.Value = True + Else If btnReplaceAll.Visible Then + btnReplaceAll.Value = True Endif End @@ -208,50 +221,6 @@ Private Sub ShowMessage(sMsg As String, hCtrl As Control) End -' Private Sub GetCurrentPosition() -' -' Dim hFirst As Object -' -' If $hCurrent Then -' $hPosition = $hCurrent.GetFindPosition() -' Else -' hFirst = Project.Get -' Endif -' -' End - -' Public Sub Grep_Read() -' -' Dim sData As String -' -' sData = Read #Last, Lof(Last) -' $sGrep &= sData -' -' End - -' Private Sub MakeResult(sResult As String) As CFindResult -' -' Dim aResult As String[] -' Dim hResult As New CFindResult -' -' aResult = Split(sResult, ":") -' -' iLine = CInt(aResult[1]) - 1 -' If iLine < hPos.Line Then Continue -' -' iCol = 0 -' iPos = CInt(aResult[2]) -' While iPos > 0 -' If Mid$(sText, iPos, 1) = "\n" Then Break -' Dec iPos -' Inc iCol -' Wend -' -' hResult = New CFindResult -' hResult.Line = -' -' End - Private Sub GrepQuote(sStr As String) As String Dim I As Integer @@ -271,13 +240,13 @@ Private Sub GrepQuote(sStr As String) As String End -Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseReplaceString As Boolean) As CFindResult[] +Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseReplaceString As Boolean) As CSearchResult[] Dim sText As String Dim aGrep As String[] - Dim aResult As New CFindResult[] + Dim aResult As New CSearchResult[] Dim sFind As String - Dim hResult As CFindResult + Dim hResult As CSearchResult Dim sTemp As String Dim iAge As Integer Dim hGrepResult As CGrepResult @@ -304,10 +273,10 @@ Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseRep aGrep.Add("--") aGrep.Add(ReplaceString) Else - If Not CaseSensitive Then aGrep.Add("-i") + If IgnoreCase Then aGrep.Add("-i") If RegularExpression Then aGrep.Add("-E") - Else If WordOnly Then + Else If WordsOnly Then aGrep.Add("-E") Else aGrep.Add("-F") @@ -315,7 +284,7 @@ Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseRep aGrep.Add("--") sSearch = SearchString - If WordOnly Then sSearch = "(^|[^_$[:alnum:]])" & GrepQuote(SearchString) & "($|[^_$[:alnum:]])" + If WordsOnly Then sSearch = "(^|[^_$[:alnum:]])" & GrepQuote(SearchString) & "($|[^_$[:alnum:]])" aGrep.Add(sSearch) Endif @@ -345,7 +314,7 @@ Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseRep For Each sFind In Split($sGrep, "\n", "", True) - hResult = New CFindResult + hResult = New CSearchResult If hFile Then ' If hFile Is FOutput Then @@ -374,7 +343,7 @@ Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseRep hResult.Pos = CInt(Left(sFind, iPos - 1)) sFind = Mid$(sFind, iPos + 1) - If WordOnly Then + If WordsOnly Then If String.Left(sFind) <> String.Left(SearchString) Then hResult.Pos += String.Len(String.Left(sFind)) sFind = SearchString Endif @@ -410,11 +379,11 @@ Private Sub InitSearch() As Boolean Project.StoreCombo(cmbSearch) Project.StoreCombo(cmbReplace) - CaseSensitive = chkCaseSensitive.Value + IgnoreCase = Not chkCaseSensitive.Value IgnoreStrings = chkIgnoreStrings.Value IgnoreComments = chkIgnoreComments.Value RegularExpression = chkRegularExpression.Value - WordOnly = chkWordOnly.Value + WordsOnly = chkWordsOnly.Value CurrentProcedure = radCurrentProcedure.Value OnlySource = radSourceFileOnly.Value OnlyData = radDataFileOnly.Value @@ -423,7 +392,7 @@ Private Sub InitSearch() As Boolean End -Private Sub DoReplace(aResult As CFindResult[], iInd As Integer, sReplace As String) +Private Sub DoReplace(aResult As CSearchResult[], iInd As Integer, sReplace As String) Dim iAdd As Integer @@ -439,7 +408,7 @@ End Private Sub Run(iAction As Integer) - Dim aResult As CFindResult[] + Dim aResult As CSearchResult[] Dim iCurrentPos, iPos, iInd As Integer Dim iTry As Integer Dim nReplace As Integer @@ -466,9 +435,10 @@ Private Sub Run(iAction As Integer) Try hTextEditor.Begin While aResult.Count - If $hCurrent.SetPosition(aResult[0], False) Then + If $hCurrent.SetPosition(aResult[0], True) Then aResult.Remove(0) Else + $hCurrent.SetPosition(aResult[0], False) If Not $hCurrent.Replace(ReplaceString) Then Inc nReplace DoReplace(aResult, 0, ReplaceString) @@ -520,7 +490,8 @@ Private Sub Run(iAction As Integer) Endif - If $hCurrent.SetPosition(aResult[iInd], False) Then Goto FIND_NEXT + If $hCurrent.SetPosition(aResult[iInd], True) Then Goto FIND_NEXT + $hCurrent.SetPosition(aResult[iInd], False) If iAction And DO_REPLACE And If iPos = iLastPos Then If Not $hCurrent.Replace(ReplaceString) Then @@ -557,7 +528,7 @@ End ' Private Sub UpdateSpan(iRow As Integer) ' -' Dim hResult As CFindResult +' Dim hResult As CSearchResult ' Dim iLastFile, iLastLine As Integer ' ' If iRow >= $aBrowse.Count Then Return @@ -590,20 +561,20 @@ End ' End -Public Sub AddFound(hResult As CFindResult, Optional iIndex As Integer = -1) +Public Sub AddFound(hResult As CSearchResult, Optional iIndex As Integer = -1) If iIndex < 0 Then - iIndex = $aBrowse.Count - $aBrowse.Add(hResult) + iIndex = $aResult.Count + $aResult.Add(hResult) Else - $aBrowse.Add(hResult, iIndex) + $aResult.Add(hResult, iIndex) Endif If iIndex > 0 Then - If hResult.File = $aBrowse[iIndex - 1].File Then - hResult.Dark = $aBrowse[iIndex - 1].Dark + If hResult.File = $aResult[iIndex - 1].File Then + hResult.Dark = $aResult[iIndex - 1].Dark Else - hResult.Dark = Not $aBrowse[iIndex - 1].Dark + hResult.Dark = Not $aResult[iIndex - 1].Dark Endif Endif @@ -628,8 +599,14 @@ Private Sub FindPathInBrowseResult(sPath As String) As Integer Dim iInd As Integer - For iInd = 0 To $aBrowse.Max - If $aBrowse[iInd].Path = sPath Then Return iInd + For iInd = 0 To $aResult.Max + If $aResult[iInd].Path = sPath Then + Repeat + $aResult.Remove(iInd) + If iInd >= $aResult.Count Then Break + Until $aResult[iInd].Path <> sPath + Return iInd + Endif Next Return -1 @@ -638,194 +615,209 @@ End Private Sub UpdateSearchList() - Dim iLen As Integer + Dim sMsg As String + + gvwFind.Rows.Count = $aResult.Count + gvwFind.Refresh - iLen = gvwFind.Rows.Count - If iLen = 0 Then - FDebugInfo.SetSearchListInfo() - Else If iLen = 1 Then - FDebugInfo.SetSearchListInfo(("One match")) + If $aResult.Count = 0 Then + sMsg = "" + Else If $aResult.Count = 1 Then + sMsg = ("One match") Else - FDebugInfo.SetSearchListInfo(Subst(("&1 matches"), iLen)) + sMsg = Subst(("&1 matches"), $aResult.Count) Endif - gvwFind.Columns[4].W = -1 - -End - -Private Sub BrowseFile(sPath As String, bReplace As Boolean, Optional iIndex As Integer = -1, Optional bRefresh As Boolean) - - Dim hFile As Object - Dim aResult As CFindResult[] - Dim iInd As Integer - Dim hResult As CFindResult - Dim iStart As Integer - - If iIndex < 0 Then - iStart = $aBrowse.Count - Else - iStart = iIndex - Endif - - hFile = Project.Files[sPath] - aResult = GrepFile(hFile, sPath) - If aResult.Count = 0 Then Return - - Try hFile = Project.LoadFile(sPath) - If Not hFile Then Return - - If bReplace Then - - For iInd = aResult.Max DownTo 0 - hResult = aResult[iInd] - If hFile.SetPosition(hResult) Then Continue - hFile.Replace(ReplaceString) - Next - - aResult = GrepFile(hFile, sPath, True) - - Endif - - For iInd = 0 To aResult.Max - hResult = aResult[iInd] - If Not hFile.SetPosition(hResult, True) Then - hResult.Path = sPath - AddFound(hResult, iIndex) - If bRefresh Then - If iIndex >= 0 Then gvwFind.Rows[iIndex].Refresh - Endif - If iIndex >= 0 Then Inc iIndex + If $nReplace Then + If sMsg Then sMsg &= " ‒ " + If $nReplace = 1 Then + sMsg &= ("One replacement") + Else + sMsg &= Subst(("&1 replacements"), $nReplace) Endif - Next + Endif - gvwFind.Rows.Count = $aBrowse.Count - UpdateSearchList + FDebugInfo.SetSearchListInfo(sMsg) End -Public Sub ResetBrowse() +' Private Sub BrowseFile(sPath As String, bReplace As Boolean, Optional iIndex As Integer = -1, Optional bRefresh As Boolean) +' +' Dim hFile As Object +' Dim aResult As CSearchResult[] +' Dim iInd As Integer +' Dim hResult As CSearchResult +' Dim iStart As Integer +' +' If iIndex < 0 Then +' iStart = $aResult.Count +' Else +' iStart = iIndex +' Endif +' +' hFile = Project.Files[sPath] +' aResult = GrepFile(hFile, sPath) +' If aResult.Count = 0 Then Return +' +' Try hFile = Project.LoadFile(sPath) +' If Not hFile Then Return +' +' If bReplace Then +' +' For iInd = aResult.Max DownTo 0 +' hResult = aResult[iInd] +' If hFile.SetPosition(hResult) Then Continue +' hFile.Replace(ReplaceString) +' Next +' +' aResult = GrepFile(hFile, sPath, True) +' +' Endif +' +' For iInd = 0 To aResult.Max +' hResult = aResult[iInd] +' If Not hFile.SetPosition(hResult, True) Then +' hResult.Path = sPath +' AddFound(hResult, iIndex) +' If bRefresh Then +' If iIndex >= 0 Then gvwFind.Rows[iIndex].Refresh +' Endif +' If iIndex >= 0 Then Inc iIndex +' Endif +' Next +' +' UpdateSearchList +' +' End + +Public Sub ResetBrowse(Optional bKeepResult As Boolean) - gvwFind.Rows.Count = 0 + If $hTask Then $hTask.Stop() + timFillList.Stop + + If bKeepResult Then Return + + $bReplaceAll = False + $bUseReplaceString = False + 'gvwFind.Rows.Count = 0 gvwFind.Clear gvwFind.Rows.Height = Max(gvwFind.Font.Height, $hFont.Height) + 4 - $aBrowse.Clear + $aResult.Clear ClearCache UpdateSearchList End -Private Sub Browse(Optional bReplace As Boolean, Optional bAgain As Boolean) - - Dim sDir As String - Dim sFile As String - Dim sPath As String - Dim sName As String - Dim sExt As String - Dim fTime As Float - - If Not bAgain Then - If InitSearch() Then Return - Else - If Not SearchString Then Return - Endif - 'OnlySource = bOnlySource - - InBrowse = True - - CurrentProcedure = False - BrowseTimeStamp = Project.TimeStamp - - FDebugInfo.ShowSearchList - - Inc Application.Busy - FDebugInfo.EnableGUI(False) - 'tabSearch.Enabled = False - - 'btnClose.Text = ("Cancel") - $bCancel = False - - ResetBrowse - - Inc FMain.NoMessage - - If OnlySource Then - sDir = Project.Dir &/ ".src" - Else - sDir = Project.Dir - Endif - - fTime = Timer - - For Each sFile In RDir(sDir).Sort() - - If Left(sFile) = "." And If sFile Not Begins ".public/" Then - If OnlyData Then Continue - If sFile Not Begins ".src/" Then Continue - Endif - - If Right(sFile) = "~" Then Continue - - sPath = sDir &/ sFile - - If IsDir(sPath) Then Continue - If InStr(sPath, "/.svn/") Then Continue - - sExt = UCase(File.Ext(sFile)) - If $aExt.Exist(sExt) Then Continue - - sName = File.Name(sPath) - If sName Begins "core." Then Continue - If sName Begins "vgcore." Then Continue - If sName Begins "callgrind.out." Then Continue - If sName Begins "cachegrind.out." Then Continue - - If Not Project.IsTextFile(sPath) Then Continue - - If bReplace And If Not Access(sPath) Then Continue - - If sFile Begins ".src/" Then - FDebugInfo.SetSearchListInfo(sName) - Else - FDebugInfo.SetSearchListInfo(sFile) - Endif - - BrowseFile(sPath, bReplace) - If (Timer - fTime) > 0.2 Then - fTime = Timer - Wait 0.01 - Endif - If $bCancel Then Break - - 'Debug sName - Next - - gvwFind.Columns[0].Width = -1 - gvwFind.Columns[1].Width = -1 - - If bReplace Then - SearchString = ReplaceString - CaseSensitive = True - RegularExpression = False - WordOnly = False - Endif - -Finally - - Dec FMain.NoMessage - - UpdateSearchList - - 'lblBrowse.Hide - FDebugInfo.EnableGUI(True) - 'btnClose.Text = ("Close") - Dec Application.Busy - - InBrowse = False - -End - - +' Private Sub Browse(Optional bReplace As Boolean, Optional bAgain As Boolean) +' +' Dim sDir As String +' Dim sFile As String +' Dim sPath As String +' Dim sName As String +' Dim sExt As String +' Dim fTime As Float +' +' If Not bAgain Then +' If InitSearch() Then Return +' Else +' If Not SearchString Then Return +' Endif +' 'OnlySource = bOnlySource +' +' InBrowse = True +' +' CurrentProcedure = False +' BrowseTimeStamp = Project.TimeStamp +' +' FDebugInfo.ShowSearchList +' +' Inc Application.Busy +' FDebugInfo.EnableGUI(False) +' 'tabSearch.Enabled = False +' +' 'btnClose.Text = ("Cancel") +' $bCancel = False +' +' ResetBrowse +' +' Inc FMain.NoMessage +' +' If OnlySource Then +' sDir = Project.Dir &/ ".src" +' Else +' sDir = Project.Dir +' Endif +' +' fTime = Timer +' +' For Each sFile In RDir(sDir).Sort() +' +' If Left(sFile) = "." And If sFile Not Begins ".public/" Then +' If OnlyData Then Continue +' If sFile Not Begins ".src/" Then Continue +' Endif +' +' If Right(sFile) = "~" Then Continue +' +' sPath = sDir &/ sFile +' +' If IsDir(sPath) Then Continue +' If InStr(sPath, "/.svn/") Then Continue +' +' sExt = UCase(File.Ext(sFile)) +' If $aExt.Exist(sExt) Then Continue +' +' sName = File.Name(sPath) +' If sName Begins "core." Then Continue +' If sName Begins "vgcore." Then Continue +' If sName Begins "callgrind.out." Then Continue +' If sName Begins "cachegrind.out." Then Continue +' +' If Not Project.IsTextFile(sPath) Then Continue +' +' If bReplace And If Not Access(sPath) Then Continue +' +' If sFile Begins ".src/" Then +' FDebugInfo.SetSearchListInfo(sName) +' Else +' FDebugInfo.SetSearchListInfo(sFile) +' Endif +' +' BrowseFile(sPath, bReplace) +' If (Timer - fTime) > 0.2 Then +' fTime = Timer +' Wait 0.01 +' Endif +' If $bCancel Then Break +' +' 'Debug sName +' Next +' +' gvwFind.Columns[0].Width = -1 +' gvwFind.Columns[1].Width = -1 +' +' If bReplace Then +' SearchString = ReplaceString +' IgnoreCase = False +' RegularExpression = False +' WordsOnly = False +' Endif +' +' Finally +' +' Dec FMain.NoMessage +' +' UpdateSearchList +' +' 'lblBrowse.Hide +' FDebugInfo.EnableGUI(True) +' 'btnClose.Text = ("Close") +' Dec Application.Busy +' +' InBrowse = False +' +' End Public Sub btnNext_Click() @@ -871,13 +863,13 @@ Public Sub FindProject(sText As String) 'WakeUp(False) cmbSearch.Text = sText radEverywhere.Value = True - Browse() + Search(SEARCH_STRING) End Public Sub BrowseAgain() - Browse(False, True) + Search(SEARCH_STRING) End @@ -892,7 +884,7 @@ Private Sub ShowString() Dim hForm As Object Dim bIgnoreCase As Boolean = chkCaseSensitive.Value = False - Dim bWordOnly As Boolean = chkWordOnly.Value + Dim bWordOnly As Boolean = chkWordsOnly.Value Dim sStr As String If chkHighlight.Value And If Me.Visible And If chkRegularExpression.Value = False Then sStr = cmbSearch.Text @@ -918,7 +910,7 @@ Public Sub OnNewForm(hForm As Object) If chkHighlight.Value And If Me.Visible And If chkRegularExpression.Value = False Then sStr = cmbSearch.Text - Try hForm.OnShowString(sStr, chkCaseSensitive.Value = False, chkWordOnly.Value) + Try hForm.OnShowString(sStr, chkCaseSensitive.Value = False, chkWordsOnly.Value) End @@ -946,7 +938,7 @@ Public Sub btnReplaceAll_Click() If Message.Question(("Do you really want to replace every string?"), ("Replace"), ("Cancel")) <> 1 Then Return If btnBrowse.Visible Then - Browse(True) + Search(SEARCH_REPLACE) Else Run(GO_FORWARD + DO_REPLACE + DO_ALL) Endif @@ -993,7 +985,9 @@ End Public Sub btnBrowse_Click() - Browse(False) + 'Browse(False) + + Search(SEARCH_STRING) End @@ -1002,13 +996,15 @@ Public Sub gvwFind_Font() gvwFind.Rows.Height = Max(gvwFind.Font.Height, $hFont.Height) + 4 gvwFind.Columns[0].Width = -1 gvwFind.Columns[1].Width = -1 + gvwFind.Columns[0].Width = Max(gvwFind.Columns[0].Width, Desktop.Scale * 20) + gvwFind.Columns[1].Width = Max(gvwFind.Columns[1].Width, Desktop.Scale * 20) gvwFind.Refresh End Public Sub gvwFind_Draw(X As Integer, Y As Integer, (Width) As Integer, Height As Integer, Row As Integer, Column As Integer) - Dim hResult As CFindResult + Dim hResult As CSearchResult Dim sText As String Dim iCol As Integer Dim XX As Integer @@ -1016,7 +1012,7 @@ Public Sub gvwFind_Draw(X As Integer, Y As Integer, (Width) As Integer, Height A If Column <> 4 Then Return - hResult = $aBrowse[Row] + hResult = $aResult[Row] sText = hResult.Text iCol = hResult.Column @@ -1119,21 +1115,22 @@ End Public Sub gvwFind_Data(Row As Integer, Column As Integer) - Dim hResult As CFindResult + Dim hResult As CSearchResult Dim iCol As Integer - If Row > $aBrowse.Max Then Return + If Row > $aResult.Max Then Return With gvwFind.Data - hResult = $aBrowse[Row] + hResult = $aResult[Row] Select Case Column Case 0 .Text = hResult.File .Alignment = Align.Normal + .Picture = Project.GetFileIcon(Project.Dir &/ hResult.Path, 16) Case 1 - .Text = hResult.GetLocation() + .Text = hResult.Location .Alignment = Align.Normal Case 2 .Text = CStr(hResult.Line + 1) & " " @@ -1164,16 +1161,16 @@ End Public Sub gvwFind_Select() - Dim hFind As CFindResult + Dim hFind As CSearchResult Dim hForm As Object - If $aBrowse.Count = 0 Then Return + If $aResult.Count = 0 Then Return If gvwFind.Row < 0 Then Return If Not gvwFind.Rows[gvwFind.Row].Selected Then Return - hFind = $aBrowse[gvwFind.Row] + hFind = $aResult[gvwFind.Row] - Try hForm = Project.OpenFile(hFind.Path) + Try hForm = Project.OpenFile(Project.Dir &/ hFind.Path) If Not hForm Then Return Project.Activate(hForm) @@ -1188,7 +1185,7 @@ End Public Sub Form_KeyPress() If Key.Code = Key.Escape Then - If InBrowse Then + If IsSearching() Then Cancel Else Me.Close @@ -1203,6 +1200,7 @@ Private Sub ClearCache() $cGrepCache.Clear $cRefreshBrowse.Clear + timRefresh.Stop End @@ -1211,15 +1209,16 @@ Public Sub OnProjectChange() ClearCache gvwFind.Rows.Count = 0 gvwFind.Hide - $aBrowse.Clear + $aResult.Clear Update(True) End Public Sub OnFileChange(sPath As String) - If Not $cGrepCache.Exist(sPath) Then Return - + 'If Not $cGrepCache.Exist(sPath) Then Return + If $bIgnoreFileChange Then Return + 'Debug sPath $cRefreshBrowse[sPath] = True timRefresh.Restart @@ -1228,33 +1227,25 @@ End Public Sub RefreshBrowse() Dim sPath As String - Dim iIndex As Integer + Dim aPath As String[] If Not FDebugInfo.IsSearchListVisible() Then Return If $cRefreshBrowse.Count = 0 Then Return - If InBrowse Then Return + If IsSearching() Then Return Object.Lock(gvwFind) + aPath = New String[] For Each $cRefreshBrowse sPath = $cRefreshBrowse.Key - $cGrepCache[sPath] = Null - - iIndex = FindPathInBrowseResult(sPath) - If iIndex >= 0 Then - While $aBrowse[iIndex].Path = sPath - $aBrowse.Remove(iIndex) - If iIndex >= $aBrowse.Count Then Break - Wend - Endif - BrowseFile(sPath, False, iIndex) - + aPath.Add(sPath) Next + If aPath.Count Then Search(SEARCH_UPDATE, aPath) + $cRefreshBrowse.Clear Object.Unlock(gvwFind) - gvwFind.Rows.Count = $aBrowse.Count gvwFind.Refresh gvwFind.ScrollX = 0 timRefresh.Stop @@ -1304,13 +1295,12 @@ Public Sub OnProjectDebug() End - Public Sub radSearch_Click() - btnBrowse.Visible = radEverywhere.Value Or radSourceFileOnly.Value Or radDataFileOnly.Value - btnReplace.Visible = Not btnBrowse.Visible - btnNext.Visible = Not btnBrowse.Visible - btnPrevious.Visible = Not btnBrowse.Visible + btnBrowse.Visible = radEverywhere.Value Or radSourceFileOnly.Value Or radDataFileOnly.Value Or radCurrentFile.Value + btnReplace.Visible = Not (radEverywhere.Value Or radSourceFileOnly.Value Or radDataFileOnly.Value) + btnNext.Visible = btnReplace.Visible + btnPrevious.Visible = btnReplace.Visible UpdateReplaceState @@ -1331,7 +1321,7 @@ End ' ' End -Public Sub chkWordOnly_Click() +Public Sub chkWordsOnly_Click() ShowString @@ -1348,3 +1338,202 @@ Public Sub GetHighlightStyle() As TextHighlighterStyle[] Return $hStyle End + +Public Sub IsSearching() As Boolean + + Return timFillList.Enabled + +End + +Public Sub SearchTask_Read(Data As String) + + $sTaskBuffer &= Data + timFillList.Start + +End + +Public Sub timFillList_Timer() + + Dim sLine As String + Dim hResult As CSearchResult + Dim aResult As String[] + Dim hFile As Object + Dim fTimer As Float + Dim iPos As Integer + Dim bUndo As Boolean + Dim hNewFile As Object + + fTimer = Timer + + $bIgnoreFileChange = True + + While (Timer - fTimer) < 0.02 + + If $iReplaceFrom > 0 Then + + Dec $iReplaceFrom + hResult = $aResult[$iReplaceFrom] + + hNewFile = Project.LoadFile(Project.Dir &/ hResult.Path) + If hNewFile <> hFile Then + If bUndo Then + Try hFile.GetEditor().End + bUndo = False + Endif + hFile = hNewFile + Endif + + If Not hFile Then Continue + If hFile.SetPosition(hResult) Then Continue + + If Not bUndo Then + Try hFile.GetEditor().Begin + bUndo = True + Endif + + If Not hFile.Replace(ReplaceString) Then + hResult.Text = String.Left(hResult.Text, hResult.Column) & ReplaceString & String.Mid(hResult.Text, hResult.Column + hResult.Length + 1) + hResult.Length = String.Len(ReplaceString) + hResult.Bytes = Len(ReplaceString) + Inc $nReplace + Endif + + Continue + + Endif + + iPos = InStr($sTaskBuffer, "\n") + If iPos = 0 Then Break + sLine = Left($sTaskBuffer, iPos - 1) + $sTaskBuffer = Mid$($sTaskBuffer, iPos + 1) + + If sLine Begins "/" Then + + $sTaskPath = Mid$(sLine, 2) + $sTaskFullPath = Project.Dir &/ sLine + If $bTaskUpdate Then + $iTaskIndex = FindPathInBrowseResult($sTaskPath) + Else + $iTaskIndex = -1 + Endif + hFile = Null + + Else + + If Not hFile Then hFile = Project.LoadFile($sTaskFullPath) + If Not hFile Then Continue + + hResult = New CSearchResult + aResult = Split(sLine, ":") + hResult.Path = $sTaskPath + hResult.File = hFile.Name + hResult.Line = CInt(aResult[0]) + hResult.Pos = CInt(aResult[1]) + hResult.Bytes = CInt(aResult[2]) + hResult.Length = CInt(aResult[3]) + + If hFile.SetPosition(hResult, True) Then Continue + + hResult.Highlight = TextEditor.GetModeFromPath($sTaskFullPath) + + AddFound(hResult, $iTaskIndex) + If $iTaskIndex >= 0 Then Inc $iTaskIndex + + 'FOutput.Insert(hResult.File & " " & hResult.Line & " " & hResult.Column & "\n") + + Endif + + Wend + + $bIgnoreFileChange = False + + UpdateSearchList + + If $sTaskBuffer Then Return + If $hTask Then Return + If $iReplaceFrom > 0 Then Return + + If $bReplaceAll Then + If $iReplaceFrom < 0 Then + $iReplaceFrom = $aResult.Count + Return + Endif + Endif + + If bUndo Then + $bIgnoreFileChange = True + Try hFile.GetEditor().End + $bIgnoreFileChange = False + Endif + + gvwFind.Columns[0].Width = -1 + gvwFind.Columns[1].Width = -1 + gvwFind.Columns[4].W = -1 + + timFillList.Stop + FDebugInfo.StopSearch + + If $bReplaceAll Then + ClearCache + Search(SEARCH_AFTER_REPLACE) + Endif + +End + +Public Sub SearchTask_Kill() + + If $hTask = Last Then $hTask = Null + +End + +Private Sub Search(iMode As Integer, Optional aPath As String[]) + + If InitSearch() Then Return + + FDebugInfo.ShowSearchList + FDebugInfo.StartSearch + + $sTaskBuffer = "" + $sTaskPath = "" + $iTaskIndex = -1 + $bTaskUpdate = iMode = SEARCH_UPDATE + + ResetBrowse($bTaskUpdate) + + $hTask = New CSearchTask As "SearchTask" + + If iMode = SEARCH_AFTER_REPLACE Then $bUseReplaceString = True + + With $hTask + + If $bUseReplaceString Then + .Search = ReplaceString + .IgnoreCase = False + .RegularExpression = False + .WordsOnly = False + Else + .Search = SearchString + .IgnoreCase = IgnoreCase + .RegularExpression = RegularExpression + .WordsOnly = WordsOnly + Endif + + If $bTaskUpdate Then + .Update = aPath + Else If radEverywhere.Value Then + .Where = CSearchTask.ALL_FILES + Else If radSourceFileOnly.Value Then + .Where = CSearchTask.SOURCE_FILES + Else If radDataFileOnly.Value Then + .Where = CSearchTask.DATA_FILES + Else + .Where = $hCurrent.Path + Endif + + End With + + $bReplaceAll = iMode = SEARCH_REPLACE + $iReplaceFrom = -1 + If iMode = SEARCH_STRING Or If iMode = SEARCH_REPLACE Then $nReplace = 0 + +End diff --git a/app/src/gambas3/.src/Search/FSearch.form b/app/src/gambas3/.src/Search/FSearch.form index 0adfd7fc7..6a1c8fee4 100644 --- a/app/src/gambas3/.src/Search/FSearch.form +++ b/app/src/gambas3/.src/Search/FSearch.form @@ -58,7 +58,7 @@ MoveScaled(0,3,25,4) Text = Shortcut(("Case sensitive"), "C") } - { chkWordOnly CheckBox + { chkWordsOnly CheckBox MoveScaled(0,6,25,4) Text = Shortcut(("Words only"), "W") } @@ -90,7 +90,7 @@ { radCurrentProcedure RadioButton radSearch Name = "radCurrentProcedure" MoveScaled(0,4,25,4) - Text = Shortcut(("Current procedure"), "u") + Text = Shortcut(("Current function"), "u") } { radCurrentFile RadioButton radSearch Name = "radCurrentFile" @@ -146,11 +146,11 @@ Picture = Picture["icon:/small/wizard"] } { Panel1 Panel - MoveScaled(7,22,3,3) + MoveScaled(7,28,3,3) Expand = True } { chkHighlight CheckBox - MoveScaled(0,29,25,4) + MoveScaled(0,30,25,4) Text = Shortcut(("Highlight search"), "H") } } @@ -158,6 +158,10 @@ #MoveScaled(53,2) Delay = 500 } + { timFillList #Timer + #MoveScaled(88,6) + Delay = 100 + } } # Gambas Action File 3.0 diff --git a/app/src/gambas3/img/module/class-dark.png b/app/src/gambas3/img/module/class-dark.png index ab3451d38dfbd9b7a29aa35a9da7a028ca1f5780..ddd179998af44d99017a45ed4f52a4ebae8cd408 100644 GIT binary patch literal 594 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1D@Z zPl&5~fzN{n5ANN&_a6*^Y#;zK@87=ANH2ge{-1m;}1H3R|=9 z^L?En^7vWDzxz*q=kW9^EaO~|{#NtyAGVVc$LGdfJ*8XxQ($%Di+f@GE6=JQe$)9a zX3E2-iOMtGy-a|n9`tl^46!)9_3}}nW&;t{0FAf>K*zmX_x->9ikZ`7C%l~UNi0$& z-RNX3=ixsK9aiQy{=K)3p_7ek^3SYQd8O70X+4|eZKf&ASIa(rcV^G&b*vd24WCjZ z{G^!@@3H(44EQsr;BvUge9oT6=+?5c>>Cz5D_||rn$Tz}8q**w`lj)B51WdZM)CX3 z3a@E@pDpl;Ti|Z=>?n%>Z-k3&#>5G)WgjWH=*(Vf+MA}@Z1y(q`l>9w)5o0b?IpzJ f*Iu6gbVJ-jyU+zgTe~DWM4f$dO!6 delta 284 zcmcb_vYlyyN(0r%1aiy*d_r6g9z3{b&z^nz z_8mBI;ONn#K=RO`Lq3^>`@sMx3lxE{f#lVzSC1V#1{8eEwK@=Jf>242UvRy+d#+fm zBm;|2bzwqH4x3QC*Q-Q%plqXOy^CXr#p$Dyz4;mxcwE~3H?n>#{(pK_1_$?nSsOOI zcDKH~Fk;Ffb_V^gq7vKwGa5YVm@|X%K+qQM?+kH*xe0t`$xrzdJpNU_5MIK{vq*n) zt<85ffg4)?Ut|<;yf@>t;as5{GLdcPtuwN-UoH9)x;pW0VZO_4gLn1+pS(%+jr%Uj ZI&;0~>d49L0YK+4c)I$ztaD0e0sy;+fMNgu diff --git a/app/src/gambas3/img/module/class.png b/app/src/gambas3/img/module/class.png index 0ffeadc3c694c2eb6a321ff5e253bb2e1d3aec5b..98a3a727aba54a500fea75f13817eedba5b67066 100644 GIT binary patch literal 594 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1D@Z zPl&5~floq0LVSFDXlQ7CeLavJ7Z(SV1Tr8X2@HUOKs7)SAOlDO*@=mXKr%Ns7s!RM z)6&u)S|DUrRu)7Vgc}S6Ba3KPA9_@5N!|#;`YMb-%?-NnH8x%ij0ffu{KTcv(5nEC8zB9#V+TUjjUdbgm7(F}6 zBES{l68mz(gxk806j*d;FE#B+TdHLC_Fd`hEW6Xk7TeoPh|90NJpbv2xDU~x3u5l( R`vX10;OXk;vd$@?2>?s??{NSC literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaO00(?STfix!Y$t=VaL>5VD-gg|x7b*$z3$7P;&lRhcWMJ{BE=;J&VH1k? zdX*>-lx_5MaSX9IeRQ%nUxNaVOS}I@){n*iPtVHW;65;G!-m)H)|VGXOgY5Pp#N1= zV%vX4gGU{6W-uNI+QR*vAx2I#J`OYSAL+k&Gi~^4L zW}G&hE0jYfvhBQeMt1hAMPEW!C*Cd0ce!owuKxd%H>tjH-&tp_7hN4WnLPmHbWc}5 Jmvv4FO#uCVTwwqJ diff --git a/app/src/gambas3/img/module/form-dark.png b/app/src/gambas3/img/module/form-dark.png index acbad0115747cfe827fee46d6189a8c3977f2ea0..ec09b35d73f569a3ac597ce93938284c14d36891 100644 GIT binary patch delta 119 zcmbQt*ugkKqJWW^fq}tu%Zu$minG8YvY3H^?+6GpPSxg<1`4tT_=LE+7x+AQ@ZiKA z*HoYgV@Z%-FoVOh8)-m}w5N+>2*>s0ga+o{|NsAgpvEI1QIX-Rkkib}aQ&oQ<^O%2 RcYw+mJYD@<);T3K0RS-tCa(Yh delta 130 zcmeBRoXj{uqMC`Bfq{WfWKueiVo7)Ob!1@J*w6hZkrl{iEDmyaVpw-h<|UBB8Q>G* z>XTXc|NsAnhK8S4h1)9AH?pFhRgUDOps4N0+Tl c-++NZ-YMhlirrgUfXWy=UHx3vIVCg!0ASQ6?EnA( diff --git a/app/src/gambas3/img/module/form.png b/app/src/gambas3/img/module/form.png index 431c9f619f22ed262b7ca09be42085c04a3057a3..cda077c348ae122a1d0efc7cde4c041618c09ce8 100644 GIT binary patch delta 119 zcmbQt*ugkKqJWW^fq}tu%Zu$minG8YvY3H^?+6GpPSxg<1`4tT_=LE+7x*M3B>dmx z+6NS2ED7=pW^j0RBMr!r_H=O!;kcfh(7^or|Ns9F)OaK$Dl&W(a+;YLuAh{v{J+oh Q4p13`r>mdKI;Vst0N!0Cg#Z8m delta 130 zcmeBRoXj{uqMC`Bfq{WfWKueiVo7)Ob!1@J*w6hZkrl{iEDmyaVpw-h<|UBB8Q>G* z>XTXc|Nnn2ZJqrq9WR1Zlmz(&GdMiEkp|>Qd%8G=NL)@%IKU9I`al9>XHS5EL=+EC cd;$YQ%KxaqLvH)SfXWy=UHx3vIVCg!07SAU4gdfE diff --git a/app/src/gambas3/img/module/module-dark.png b/app/src/gambas3/img/module/module-dark.png index 6a974e3bdbd6d2c5d15fa35b99776e4bb8290b3d..665d5596d563a6a26df73e0a372b346a33a5ff39 100644 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QV# zC&bmgz~=!NJbwK6;lqaz_Wk?!Aq=1hkp2Jve;^42$g&qNUIdEVyLS&r0+n64as?<0 zQgr|RwQJWPT7V)zDWJ&^jX=df#&X#cl|b87OM?7@8EULl1pjPrc=9Y%gOS4`=i9O* z?r^tP&TN4l29nG-G*3!*eXJEqG<^-!Q0(dA7-DfcIbi`)z)|Lo(1zPNtF#iHr6meZ z4M|CuFjf5F6H`0b0-C M>FVdQ&MBb@0I^K6u>b%7 literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNl1^9%x{>KJr<#f9eH_c8nik?5C{cr(L_Y_YT#}JFtcP}63 zJLJH_a^aw~ga`lL?Jf8I|9^g>C{wy- zhRYh>X>kUfJ8v$&U&-#P-2Rs&`{NqAirRS8Y>mSKieCgJkwwd<*>;4wk+vYxEpteb0C|fra>+9 z$s1iCrCqi&*~?DLA*Hi808b-J~;|aj9ju69dD$2gU~jD%&N1)-!mz`njxgN@xNACzg57 literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM)2Ka=y0%=U(lUaxL_G^L0|P^2NcwRg#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u67LKfou% z)hDy?|Ns9D4GmwveqFI*#fy3=Ly)?XAirP+hi5m^fE+_l7sn8d^T`PcJS>3>VT`IO z4bBH{vK(T*B*5sL*ugO2m}0}i)(yIg-#G{>NJtd7Ffer8(eFL*M7{^8o59o7&t;uc GLK6TC(=}rN diff --git a/app/src/gambas3/img/module/report.png b/app/src/gambas3/img/module/report.png index ab633aa35a5fe92852faf9451e22b9d65d422630..2fcba342da2a0603d24fd8fe2b2e2e6b509b35bc 100644 GIT binary patch delta 149 zcmdnQxRh~%L_HHT0|Nt}$fR^2#aZAHSq$VI0b$0e+I-SLL7o7g5LfpCpM->jxVShV z`7KpoEl`}fB*-tA;Z>kh_r6;|u7RhEV~E7%kU&U>cv7h@-A}f&3SRCZ;#IWw1%u66gD8MJg z)hDy?|NsA5+ByLN0f!D9a&U0CamX(bq_iZ+FPOpM*^M+H$I#QoF+}5ha)JWSlmLb> zMn{zf=L0uc4l!R6V7#2r!7$;NV#C7L4Z4fpIY9D>000DMK}|sb0I`n?{9y$E0004VQb$4nuFf3k z0002JP)t-sOlfiU_V)h%{_^tjwY9aLo}TaT@Bjb*fPjF(!NK_W_<@0e^z`(lrKQ%^ z)|Hi&*x1;-yu65rh>MGht*x!2qoe%%{HUm?`T63u&~L=$-=_In3$NEnVJ3l{o&!^l$4a~>+8V4z>tuT zhK7dG(b4+)`htRjot>SVo15I++=PULy}iAnqN3{R>YSXMiHV7dii+GepPT>y00DGT zPE!Ct=GbNc0Dl0tNkljM5CzZ_!AUdSuCe#t`~QEIL>F!t;t}8aa(E1& zD1S&^kZ%DX`2ha%-+--W03#;?>L?C_cxhsQhVSw#6#)Y{dFRLn=pkSXm$U=f`v~a6 z{VFV3VEaFA$1Q$};X3UY7#cbUb#vG;(hv@6LBJ|=fll3tX6Y$dl?oS_ZE&UxbO9)T ziz)tx>=H@?2|)4*0Y!WS(14IdOjQ^_O`||00000 LNkvXXu0mjfXg~aj diff --git a/app/src/gambas3/img/module/termform.png b/app/src/gambas3/img/module/termform.png index d382154c93719f6edb87edfa1c813cb1ef4d2e0f..9afe1ffef2b3c350997783829297cf8ac1177d8a 100644 GIT binary patch delta 145 zcmZ3$vXF6tL_H%j0|SHSmKWQB6lZ})WHAE+-w_aIoT|+y4HRSx@Ck8sFYrl7Ncg|W zwGSx5SQ6wH%;50sMjDV~;_2cT!f`!0p@I4L|Ns9TIGEYkv0iXns7=H)@0000)q>9D>000DMK}|sb0I`n?{9y$E0004VQb$4nuFf3k z0002zP)t-sOlfiX`T3ihn?XTAprD|&wY5!6P5=M@KtMn$D=dqPi-(7Y?Ck82kdV8( zyZHF{`}_OS($b%wpZ@;-=jZ1_LPAtjR9|0TX=!OlNJvUbN`F{bSb>3oc6N3}MMZ*w zf<#0_nwpx5ii&h}bn)@=mX?<7?d{~`FMd_=H`@?luS%a zs;a8v3K~y-)t<%L0!!Qs8&_a?)A%&EgnVFg4|G%e+dg#ULR88mnWbayIi{%e-aPlnx zkq?lW`3*E1e9*lOB^ubBeSNgHivk_Mda-IGPk%FJdp5CISPl&@-BHv-Wm<2TAPtz|cOeZ^_zyt|bZ?12#0c=c=1O_@# z0EG!+ZUjb4|GExeggryF`0k0g+x11qRc0Cf zTJS_v$rX6XwMgJOgMWgQu&X%Q~loCIF4yNnrp0 delta 157 zcmcb|c#v^|1Sbf@~`}6Wr9Cr!mi% z_;iQRqS&lkLLAMxS6Mik3#T$)dEzreR4K)Z=gff*nrsXVvZ~tEr#7*;0nO%Q@O1Ta JS?83{1OOPkFeCr~ diff --git a/app/src/gambas3/img/module/webform-dark.png b/app/src/gambas3/img/module/webform-dark.png index becf655f1fada909800352c0543c116dc83db3cc..e3c3a752bfbce6ff87bc0492516944c8237fb248 100644 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1Ekr zPl&5~fzSVu1RgwiFzvDR1)%o>N`m}?8CvHuDkU{7V2x;2Z=W}3LNedrb)_=KIy@FH4;nV;4!+A$$@8!_s zcvjlC{#bd=qWBAcr2mSXnE&^CLuP2dQtr_+j4ZF;n6E#^z~#isaocW9iR=E)AA>Hp zFll^U5A zr8g~<>71OrQ9|J)r*+;9c6(~M8ulg~R?rGdaoGKG(r2DExo;+He7&>C<9}aI7|V<3 z5Pe6!n{ENi%6KYXZ+YvuPtDLm+~)MosCz8I>!Per)LdcG2%kHxRe$B_s4H)O?VBC_ i{r|p`srA<;{bKP<3%X%n`Nba?1`M9AelF{r5}E)^TAYvo delta 573 zcmV-D0>b^F1=a+RB!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002qP)t-sOlfhR zo}S>~;E|D$?d|RA>gte?kpKVxfPjGV^78TV@$2jB*4Ea=#l^(L#G9L&?(Xi@)z#tQ z;k~`RFMdu&(GA<)PjP7;^N|*oSfL$*ngImmY<)W?Ck7?g@v=T zv$nRj@bK`7iHW79rLwZJ%gf7$hlj7PufM;))6>(;%*?*NzPPx!qobpaj*igK(5T6wtC*OW-{0TE!^5z!u%e=(v9YnL zs;cATrdO%)89TtqJ53vvsMD;;(P5b6K{;D7ebrjCksXNnUWKoI9IOD~W7 z=^l^;NIWPO`TZ2MLJLU0zm~IYnLKzFfMrI9AKF8-YXEEm8T$md^L2^ILEQz?AGWQ| z0&o zW0zf)SE_-U412Ws9l8hx3li-pirM@vO9O{ju_#Me!H@NdFZ%G5_!PhRo1@rQD-u7+JF4o3FpmDAK|u zu&p-WU6*6^m$1t%Od22JBtG^_&Q_~EmvW$I?gtCmeBZcVk4()}4_IZ+U1qng>RiQy zm?)uy`S(-mG!?V1^rnR}oy&V~lu$UyX`Oe&zncFd47-oEIfm$*ZuoXX^*Lk2-8+iO z=Zl|C_&1>^jOB%Nh`uA=O~-(RemoV~Ti!bEQ!}&>w>iBt?j}?4x+v>2HCLE4!skwF u)n9o!>dM<+`({Uf|G)2KYW=lIzgS#O1l@>zQxgvi0|rl5KbLh*2~7aX{>-HS delta 612 zcmV-q0-ODz1^on&B!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002|P)t-sOlfgd zRaNBVlr6{{DD) zc;@EjPft&vprGmL=}t~gd3kxp#>Qh~W6{ykX=!PLgM(93Q-9CT&;0!SpP!$0c6Rso z_ph(7S65f@@$svxt58r-#l^+2u&|4Zi}UmIwzjrgTU&pBf1RD3%gf7zgoLQ5sLagF zxVX4nTwGpWUTtk{e0+RoXJ^RB$cTuDn3$N^+1ZDOhh$`A{r&xKZ*S}C>yVI;y}i9< zWo63B%6)x(+ke~JhK7c+va)7oW>{EQyu7@Ul9Jrq+?JM>`uh5_v$J+g2U!3B00DGT zPE!Ct=GbNc009z7L_t(I%e9kdQvxv%hRI!ud)?!jbOh|ZcNFY`_5c4DlgOv!&T$5L zKkdvu*}S{iluG}gxnJ~GfE8#4K+|*)s+nE^V1y9uwSVJ&53(Q+pni0cp7Nmc82MBO z44)iBeOH7}V<2S>2mzlR%!_C^qOaIdfhIJruO?mw>Fp(W3Sgp6@{`|iLC8`7_x^6u z+k(tPO#!gk4!RG*16`2-R)Ltk0EC7pv9`IT1MV|h3l_$+Y=ms9I>VhT1g8C2Q|cRt9waG!HwSs6sQ{seK&HZR8)&mnh-mErd zJhb^lBvZ?QKr6$7CHrCzoMNqIx*||DDQjlc;wxdV4+kAzt9NF-x76(4n~hT0&3uGw UBYc@I0^P#k>FVdQ&MBb@0Q{YYiU0rr literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDl0X`wF|NsB@$t(nt_`%C3GlhU!cuIo&g7-79+>UdN`s|Z*>t+w@lC41T zJWm(L5RLQ60xrxvGnjZZ7*;dPVk=@*@nU5?EIpBBNNS%G}U;vjb? zhIQv;UIIDl0X`wFK-wp>5J=(&EJh2b16A;p1o;K;XJEM<=Nk3dC+XJB9@ZsWf#P|d zE{-7@=aU6on0aO}@n|rtW|+lR#H!-O%6eFOBFmJ1POfJXikv?fEKj)$Fgcm^H8m-< zi#}vZFpCh;VhH2C#xBZWsCX!#(N@@zY0~lsOxX%d%L}s)8i*W@;%QH`kiA?iac{YW f59cwNg*Vt4o&@N9`NLZ&339WitDnm{r-UW|+Ac$c