IDE Search Panel

Rund um die LCL und andere Komponenten
Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

IDE Search Panel

Beitrag von theo »

Hallo

Ich habe ja in diesem Forum schon mehrfach davon gesprochen, dass mir die Suchfunktion der Lazarus IDE nicht optimal und etwas altbacken erscheint.
Gerade wenn man in fremden Code nach einem nicht genau bekannten Begriff suchen möchte, ist mir das zu umständlich.
Allgemein ist mir die normale Suche "zu weit weg".
Deshalb habe ich Abhilfe programmiert:

idesearchpanel.png
idesearchpanel.png (129.04 KiB) 1462 mal betrachtet

Wer daran interessiert ist, kann das Lazarus Package hier herunterladen und installieren (IDE neu kompilieren).
Für mich würde der Zustand schon fast reichen, aber für die Allgemeinheit ist es wohl langsam "beta". :wink:
Fertig und "geputzt" ist es nicht, aber es funktioniert soweit, dass man beurteilen kann, ob man es mag.

Die Dokumentation für IDE Erweiterungen ist nicht gerade üppig. Wer also irgend etwas besser weiss, soll sich bitte melden. :oops:

Zur Funktion
Es gibt einen Menüeintrag unter "Suchen" namens "Suchpanel anzeigen". Dort kann man es ein und ausschalten.

Die Bedienung ist sehr einfach und intuitiv gehalten.
Man tippt den Suchbegriff ein und es wird sofort gesucht im aktuellen Editorfenster.
Durch die Pfeile kann man weitersuchen (Vorwärts, Rückwärts).
Weitersuchen kann man auch durch das Wiederholen der Eingabetaste während der Fokus auf dem Eingabe Edit ist.
Die normalen Suchfunktionen der IDE (F3, Strg+F etc.) werden nicht verändert und nicht verwendet.

Das Zahnrad Symbol öffnet das Optionsfenster.
Das sollte weitgehend selbsterklärend sein.
Gewisse Modi vertragen sich nicht mit "Beim Tippen suchen". Bei Regex wird es deshalb abgeschaltet.
Wer im markierten Bereich suchen möchte, sollte "Beim Tippen suchen" auch ausschalten.

Bei Fragen: fragen!
Wer Bugs findet: Bitte melden.
Wem die Idee nicht gefällt: Nicht installieren! :lol:

Getestet auf GTK2 und Qt6. Wenn es jemand auf Windows testen könnte...

Viel Spass!

dj_leinad
Beiträge: 33
Registriert: Sa 1. Okt 2022, 05:27
OS, Lazarus, FPC: Win10 pro (Laz 3.2 / FPC 3.2.2)
CPU-Target: Win 64Bit
Wohnort: CH

Re: IDE Search Panel

Beitrag von dj_leinad »

Unter Win8.1 pro werden die Images für 'Rückwärts' und 'Weitersuchen' nicht angezeigt. Zusätzlich dazu wird bei der Liste der Optionen am Beginn eine Leerzeile angezeigt.
screenshot.PNG
screenshot.PNG (28.65 KiB) 1438 mal betrachtet
Gruss Daniel
Erfahrung heißt gar nichts. Man kann eine Sache auch 35 Jahre schlecht machen.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: IDE Search Panel

Beitrag von theo »

dj_leinad hat geschrieben:
Fr 2. Dez 2022, 21:37
Unter Win8.1 pro werden die Images für 'Rückwärts' und 'Weitersuchen' nicht angezeigt. Zusätzlich dazu wird bei der Liste der Optionen am Beginn eine Leerzeile angezeigt.
Danke für die Rückmeldung.
Das Problem mit den fehlenden Icons sollte auf Github behoben sein.
Die Leerzeile bei den Optionen: Das ist einfach eine TCheckGroup ohne Caption. Die sieht offenbar so aus auf Win.
Auf GTK2 und Qt sieht die "normal" aus, deshalb habe ich nicht daran gedacht, dass das ein Problem sein könnte auf Windows.
Soll ich da lieber eine Caption hinschreiben?

EDIT: OK, jetzt mit Caption.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: IDE Search Panel

Beitrag von wp_xyz »

Ich hab eben längere Zeit gesucht, warum mir die IDE immer abstürzt, wenn ich sie minimiere. Bis ich das Logfile angesehen habe, und da ist dein SearchPanel aufgeführt.

Code: Alles auswählen

TApplication.HandleException: EAccessViolation
Access violation
  Stack trace:
  $00585D70  TCUSTOMSPEEDBUTTON__SETDOWN,  line 155 of ./include/speedbutton.inc
  $010B1ECA  TIDESEARCHPANEL__MAINWINDOWSTATECHANGE,  line 253 of idesearchpanel.pas
  $00438FAD  TCUSTOMFORM__RESIZING,  line 1152 of ./include/customform.inc
  $00A3D2BF  TMAINIDEBAR__RESIZING,  line 797 of mainbar.pas
  $00435711  TSCROLLINGWINCONTROL__WMSIZE,  line 187 of ./include/scrollingwincontrol.inc
  $00438003  TCUSTOMFORM__WMSIZE,  line 664 of ./include/customform.inc
  $00410A61
  $0056D7FB  TWINCONTROL__WNDPROC,  line 5427 of ./include/wincontrol.inc
  $00439A5F  TCUSTOMFORM__WNDPROC,  line 1441 of ./include/customform.inc
  $00A3C7EA  TMAINIDEBAR__WNDPROC,  line 603 of mainbar.pas
  $0063093A  DELIVERMESSAGE,  line 112 of lclmessageglue.pas
  $005539B5  TWINDOWPROCHELPER__DOWINDOWPROC,  line 2621 of ./win32/win32callback.inc
  $00554062  WINDOWPROC,  line 2786 of ./win32/win32callback.inc
  
und etwas weiter unten noch:

WARNING: TMainIDEBar.Destroy with LCLRefCount>0. Hint: Maybe the component is processing an event?
FreeFormEditor: FormEditor1=TFormEditor
[TJITComponentList.DestroyJITComponent] ERROR destroying component Error: Access violation
  Stack trace:
  $00801BC4  TCONTROLSELECTION__SETCUSTOMFORM,  line 1168 of C:/Lazarus/lazarus-main_fpc3.2.2/designer/controlselection.pp
  $00804C4E  TCONTROLSELECTION__DELETE,  line 2291 of C:/Lazarus/lazarus-main_fpc3.2.2/designer/controlselection.pp
  $00804B7E  TCONTROLSELECTION__REMOVE,  line 2272 of C:/Lazarus/lazarus-main_fpc3.2.2/designer/controlselection.pp
  $00802841  TCONTROLSELECTION__NOTIFICATION,  line 1456 of C:/Lazarus/lazarus-main_fpc3.2.2/designer/controlselection.pp
  $0049B1E9
  $0057D3C7  TCONTROL__DESTROY,  line 5201 of ./include/control.inc
  $0056F8F4  TWINCONTROL__DESTROY,  line 6651 of ./include/wincontrol.inc
  $0057F083  TCUSTOMCONTROL__DESTROY,  line 40 of ./include/customcontrol.inc
  $00435EB0  TSCROLLINGWINCONTROL__DESTROY,  line 354 of ./include/scrollingwincontrol.inc
  $0043702E  TCUSTOMFORM__DESTROY,  line 137 of ./include/customform.inc
  $004105A2
  $007E03AF  TJITCOMPONENTLIST__DESTROY,  line 731 of C:/Lazarus/lazarus-main_fpc3.2.2/designer/jitforms.pp
  $004105A2
  $004105A2
  $00450009  TMAINIDE__DESTROY,  line 1745 
  
Ich hab dann das SearchPanel deinstalliert, und dann war alles wieder in Ordnung. Also, da ist noch etwas faul. Ansonsten aber sehr schön und nützlich.

[EDIT]
Ach ja: Windows 11, Laz/main + fpc 3.2.2, 32 bit.

dj_leinad
Beiträge: 33
Registriert: Sa 1. Okt 2022, 05:27
OS, Lazarus, FPC: Win10 pro (Laz 3.2 / FPC 3.2.2)
CPU-Target: Win 64Bit
Wohnort: CH

Re: IDE Search Panel

Beitrag von dj_leinad »

Jetzt wird alles richtig angezeigt. Kann den Fehler von wp_xyz der beim minimieren der IDE auftritt nicht bestätigen. Bei mir geht das ohne Probleme.

Env.: Lazarus 2.2.5 (rev lazarus_2_2_4-4-g4893ac58f6) FPC 3.2.3 x86_64-win64-win32/win64
Erfahrung heißt gar nichts. Man kann eine Sache auch 35 Jahre schlecht machen.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: IDE Search Panel

Beitrag von theo »

wp_xyz hat geschrieben:
Fr 2. Dez 2022, 23:53
Ich hab eben längere Zeit gesucht, warum mir die IDE immer abstürzt, wenn ich sie minimiere. Bis ich das Logfile angesehen habe, und da ist dein SearchPanel aufgeführt.
Danke, das schaue ich mir morgen an.
Viel passiert dort nicht. Es geht nur darum, das Optionsfenster zu schliessen und den Options Button zu lösen, wenn die IDE einen WindowStateChange erfährt.

Code: Alles auswählen

procedure TIDESearchPanel.MainWindowStateChange(Sender: TObject);
begin
  fOptions.down := False;
  fOptionsForm.Visible := False;
end;     
Anscheinend muss ich da noch einen Test auf Nil machen oder so.
Das Problem ist mir aber bisher auf Linux noch nicht begegnet.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: IDE Search Panel

Beitrag von wp_xyz »

Bin jetzt unsicher, ob das nicht vielleicht ein Fehlalarm war. Habe das SearchPanel auch in Laz 2.2.4 und Laz/main/64bit installiert, und da gab es das Problem nicht. Und jetzt habe ich mir auch die 32-bit IDE neu gemacht, und habe den Fehler auch nicht mehr - aber ich habe jeweils unterschiedliche Packages drinnen, vielleicht liegt es auch an einem anderen Package...

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: IDE Search Panel

Beitrag von wennerer »

Hallo Theo,
für mich ein Klasse Tool! Werde es gerne nutzen.

Danke.
Bernd

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: IDE Search Panel

Beitrag von theo »

wennerer hat geschrieben:
Sa 3. Dez 2022, 08:23
Hallo Theo,
für mich ein Klasse Tool! Werde es gerne nutzen.
Danke!
wp_xyz hat geschrieben:
Sa 3. Dez 2022, 00:56
Bin jetzt unsicher, ob das nicht vielleicht ein Fehlalarm war. Habe das SearchPanel auch in Laz 2.2.4 und Laz/main/64bit installiert, und da gab es das Problem nicht. Und jetzt habe ich mir auch die 32-bit IDE neu gemacht, und habe den Fehler auch nicht mehr - aber ich habe jeweils unterschiedliche Packages drinnen, vielleicht liegt es auch an einem anderen Package...
Hast du vielleicht die fragliche IDE als Debug IDE gebaut?
Kann es sein, dass die dann etwas empfindlicher reagiert?
Allerdings sollte eine Access violation auch sonst nicht klaglos durchgehen....
Hmm...

EDIT: Ich habe das jetzt noch mit der Debug IDE auf Win 10 getestet und kann das Problem nicht nachvollziehen.
Auch rein logisch komme ich nicht dahinter.
Ein WindowStateChange sollte ja nichts freigeben und in procedure TIDESearchPanel.MainWindowStateChange() wird ja lediglich auf zwei (vorhandene) Komponenten mit Boolean zugegriffen. Keine Indizes etc.

Wenn du das Problem weiterhin hast, müsstest du die Ursache selber herausfinden.
Ich würde den geänderten Code dann selbstverständlich übernehmen.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: IDE Search Panel

Beitrag von wp_xyz »

Ja, ich halte dich auf dem Laufenden, wenn ich etwas finde.

Es gibt noch ein anderes, kleineres Problem, nämlich dass die Icons auf den Buttons nicht high-dpi-fähig sind, also sich nicht vergrößern, wenn der User einen Monitor mit mehr als 96ppi verwendet.

Am einfachsten geht das, wenn du die Icons nicht der Property Glyph zuweist, sondern die in Laz2.0 neuen Properties Images und ImageIndex verwendest. Wenn du die Unit IdeImagesIntf in die "uses"-Liste mit aufnimmst, hast du unter dem Namen IDEImages Zugriff auf alle von der IDE verwendeten Icons in drei Grundgrößen, IDEImages.Images_12, IDEImages.Images_16, IDEImages.Images_24. Die angehängten Zahlen sind die Icongrößen bei 96ppi. Für Button-Icons nimmt man üblicherweise die 16er-Reihe. Mit der Methode GetImageIndex(resource_name) bekommst du dann den ImageIndex, unter dem das Bild mit dem angegebenen Resource-Namen enthalten ist. Also:

Code: Alles auswählen

  fNext.Images := IDEImages.Images_16;
  fNext.ImageIndex := IDEImages.Images_16.GetImageIndex('arrow_down');
"arrow_down" ist der grüne Pfeil nach unten im Verzeichnis images/actions der Lazarus-Installation.

Du kannst natürlich auch eigene Icons in deinem Package verwenden. Ich weiß allerdings nicht, ob die von dir verwendete lrs-Resourcen gehen. Auf jeden Fall funktionieren die .res-resourcen, die du mit lazres genauso erzeugen kannst wie die lrs-Resourcen. Allerdings müssen die Bildernamen der Konvention der IDE entsprechen: das Grundbild für 96 ppi trägt keinen "Größenanhang", also statt "Arrow_28_16" muss das Bild "Arrow_28" heißen. Das Bild für 144ppi (150%) trägt den Anhang "_150", also statt "Arrow_28_25" heißt es "Arrow_28_150". Und das Bild für 192 ppi hat hinten "_200" statt "_32".

Die mit lazres erzeugte Resource-Datei, z.B. "searchpanel_images.res" wird dann noch mit {$R searchpanel_images.res} in die Unit reingehängt.

Nun kannst du den "Arrow_28" genauso ansprechen wie die anderen schon vorhandenen Bilder:

Code: Alles auswählen

unit idesearchpanel;
...
interface

uses
  ...
  IDEImagesIntf;
...
implementation
{$R searchpanel_images.res}
...
procedure TIDESearchPanel.AllocControls(AParent: TWinControl);
var
//  Pic: TPicture;
  PrevCtrl: TControl;
  Black:String;
begin
  {$IFDEF DebugSayt} DebugSayt('AllocControls', ''); {$ENDIF}
  if fState.BlackIcons then Black := '_black' else Black:='';
//  Pic := TPicture.Create;
  fPanel := TPanel.Create(AParent);
  fPanel.Parent := AParent;
  fPanel.BorderStyle := bsNone;
  fPanel.Align := alBottom;
  fPanel.OnChangeBounds := @PanelChangeBounds;

  fSearchEdit := TEdit.Create(fPanel);
  fSearchEdit.TextHint := spSearch;
  fSearchEdit.Top := 4;
  fSearchEdit.Left := 4;
  fSearchEdit.Width := 200;
  fSearchEdit.Parent := fPanel;
  fSearchEdit.OnChange := @AEditChange;
  fSearchEdit.OnKeyDown := @AEditKeyDown;

  PrevCtrl := fSearchEdit;
  fNext := TBitBtn.Create(fPanel);
  fNext.AutoSize := False;
  fNext.GlyphShowMode:=gsmAlways;
  fNext.Width := 50;
  fNext.Caption := '';
  fNext.Hint := spFindNext;
  fNext.ShowHint := True;
  fNext.Parent := fPanel;
  fNext.Images := IDEImages.Images_16;
  fNext.ImageIndex := IDEImages.Images_16.GetImageIndex('Arrow_28');
//  Pic.LoadFromLazarusResource('Arrow_28_16' + Black);
//  fNext.Glyph.Assign(Pic.Bitmap);
  fNext.OnClick := @NextClick;

  PrevCtrl := fNext;
  fPrev := TBitBtn.Create(fPanel);
  fPrev.AutoSize := False;
  fPrev.GlyphShowMode:=gsmAlways;
  fPrev.Caption := '';
  fPrev.Width := 50;
  fPrev.Hint := spFindPrev;
  fPrev.ShowHint := True;
  fPrev.Parent := fPanel;
  fPrev.Images := IDEImages.Images_16;
  fPrev.ImageIndex := IDEImages.Images_16.GetImageIndex('Arrow_27');
//  Pic.LoadFromLazarusResource('Arrow_27_16' + Black);
//  fPrev.Glyph.Assign(Pic.Bitmap);
  fPrev.OnClick := @PrevClick;

  PrevCtrl := fPrev;
  fOptions := TSpeedButton.Create(fpanel);
  fOptions.Hint := spSearchOptions;
  fOptions.ShowHint := True;
  fOptions.Parent := fPanel;
  fOptions.AllowAllUp := True;
  fOptions.GroupIndex := -1;
  fOptions.Images := IDEImages.Images_16;
  fOptions.ImageIndex := IDEImages.Images_16.GetImageIndex('Setup_06');
//  Pic.LoadFromLazarusResource('Setup_06_16' + Black);
//  fOptions.Glyph.Assign(Pic.Bitmap);
  fOptions.OnClick := @OptionsClick;

  PrevCtrl := fOptions;
  fLabel := TLabel.Create(fPanel);
  fLabel.Parent := fPanel;
  fLabel.Caption := '0/0';
  fLabel.AutoSize := True;
  fLabel.Width := 60;
  fLabel.Alignment := taCenter;
  fLabel.Caption := '0/0';

  fOptionsForm := TForm.CreateNew(fPanel);
  fOptionsForm.FormStyle := fsStayOnTop;
  fOptionsForm.ShowInTaskBar := stNever;
  fOptionsForm.BorderStyle := bsNone;
  fOptionsForm.Height := 100;
  fOptionsForm.Width := 300;

  fOptionsCheckGroup := TCheckGroup.Create(fOptionsForm);
  fOptionsCheckGroup.Caption:=spSearchOptions;
  fOptionsCheckGroup.Parent := fOptionsForm;
  fOptionsCheckGroup.Align := AlClient;
  fOptionsCheckGroup.Items.Add(spCaseSens);
  fOptionsCheckGroup.Items.Add(spWholeWords);
  fOptionsCheckGroup.Items.Add(spRegex);
  fOptionsCheckGroup.Items.Add(spSAYT);
  fOptionsCheckGroup.Items.Add(spFromCursor);
  fOptionsCheckGroup.Items.Add(spIncremental);
  fOptionsCheckGroup.OnItemClick := @OptionsCheckGroupItemClick;

  SyncButtonsFromSearchState;

  fClose := TImage.Create(fpanel);
  fClose.Parent := fPanel;
  fClose.Width := 16;
  fClose.Height := 16;
  fClose.Center:=true;
  fClose.OnClick := @CloseClick;
  fClose.Hint := spClose;
  fClose.ShowHint := True;
  fClose.Images := IDEImages.Images_16;
  fClose.ImageIndex := IDEImages.Images_16.GetImageIndex('laz_cancel');
//  fClose.Picture.LoadFromLazarusResource('close_laz');

  RealignControls;
//  Pic.Free;
end;
...
Die "black"-Icons habe ich oben noch nicht eingebaut, aber du weißt ja jetzt, wie es geht.

Wie du an den angehängten Screenshots von Win mit 96pp und 192 ppi siehst, skalieren die Icons nun gut. Es gibt aber noch das Problem, dass die Dimensionen und Abstände nicht skalieren (im 192er-Screenshot sollte alles um 50% größer sein). Das müsste ich mir noch überlegen, denn durch das explizite Positionieren mit RealignControls und fest vorgegebenen Dimensionen wird meiner Meinung nach das LCLScaling ausgehebelt. Einfacher wäre es, wenn die Controls per Anchoring aneinandergehängt wären.
Dateianhänge
lazsearchpanel_192ppi-wp.png
lazsearchpanel_192ppi-wp.png (4.2 KiB) 1289 mal betrachtet
lazsearchpanel_96ppi_wp.png
lazsearchpanel_96ppi_wp.png (2.9 KiB) 1289 mal betrachtet

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: IDE Search Panel

Beitrag von theo »

@wp_xyz: Danke!
Wenn du möchtest, kannst du das gerne machen.
Ich kann dir auch einen Github Zugang einrichten, falls du das möchtest und falls ich wieder herausfinde wie das geht. :wink:
Ich selber benutze kein High-DPI, deshalb kann ich das schlecht kontrollieren und deshalb hat das im Moment keine Priorität für mich.
Aber es kommt auf den Stapel! :wink:
wp_xyz hat geschrieben:
Sa 3. Dez 2022, 13:19
Das müsste ich mir noch überlegen, denn durch das explizite Positionieren mit RealignControls und fest vorgegebenen Dimensionen wird meiner Meinung nach das LCLScaling ausgehebelt. Einfacher wäre es, wenn die Controls per Anchoring aneinandergehängt wären.
Ich lasse dem Such-Edit die "natürliche" Höhe und richte den Rest daran aus.
Diese Höhe bestimme ich nicht selbst.


Es gibt für mich noch eine Sache, die mich wirklich stört:
Man kann keinen Text mit CTRL-V in das Suchfeld einfügen.
Die IDE "klaut" den Fokus und fügt die Zwischenablage ins Synedit ein.
Mit dem Kontextmenü geht es.

Hast du eine Idee, wie man da ran kommt?
Es gibt natürlich Sachen wie IDECommandList.FindCommandsByShortCut, aber ich habe noch kein Beispiel gefunden, wie man sich da einhängt ohne den normalen Ablauf zu stören.

Das ist im Moment, was mich beschäftigt.

Danke für die Tipps.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: IDE Search Panel

Beitrag von wp_xyz »

Ich könnte dir Pull-Requests schicken, wenn ich das hinkriege...

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: IDE Search Panel

Beitrag von theo »

wp_xyz hat geschrieben:
Sa 3. Dez 2022, 13:50
Ich könnte dir Pull-Requests schicken, wenn ich das hinkriege...
Oder so! Gerne.
Nur eine Bitte: Ich möchte gerne die schwarzen Icons als Standard drin haben.
Das Blau passt nicht zu jedem Kleid! :lol:

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: IDE Search Panel

Beitrag von wp_xyz »

Schon klar. Aber sollen die anderen trotzdem in der Resource bleiben? Ich hatte das "if fState.BlackIcons then Black := '_black' else Black:='';" so interpretiert, als würden beide Sets benötigt. Wenn nicht, nehme ich sie wieder raus - spart etwas Speicher.

Ein Problem haben die schwarzen Icons aber: Wenn der User ein Anhänger des Dark Mode ist, dann sieht er ... nichts.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: IDE Search Panel

Beitrag von theo »

wp_xyz hat geschrieben:
Sa 3. Dez 2022, 15:16
Ein Problem haben die schwarzen Icons aber: Wenn der User ein Anhänger des Dark Mode ist, dann sieht er ... nichts.
Das ist der Grund, warum die Blauen drin sind.
Ich selber benutze keinen Dark Mode, aber in der Config Datei (idesearchpanelconfig.xml) kannst du genau deswegen BlackIcons="True" oder "False" setzen.
So könnte jemand via Config Datei die Icon Farbe umschalten, falls er die schwarzen Icons nicht sieht.
Einen Konfigurationsdialog in der IDE habe ich mir dafür aber gespart.

Antworten